From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC7DC2F2914 for ; Mon, 5 Jan 2026 10:09:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767607799; cv=none; b=mGtYu8zxGE3hsMrxoMqguXWngEXWGXS0aQth+u5b2yOx4au6DVkcycTxAsl6R5Iyb+A4RY25c2GQH15MA5I1fGTAQRxVSfUaovAM3D4pFs/631QqGN6BhhupXqd0R3y1TcH7MmlM6mcZKHoJmcy+cUlC18O2I5YdeQOOHZpwqpM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767607799; c=relaxed/simple; bh=ICOP+8Za83UzCsn5kdwRY8IkW7lPTMB1vK8m7RWky24=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=pqwyNdNzlbEGuhckKiorM5yDZuiDB4WGDtOLhP3Nk691ZZucWrwG6P3h8ECd5dh/nWFnLxtOGRD9msnix2oR5TgPOMuqQHbjJBcSvztMOTMhzrEn66MKyjMPEJzTLk/GXSjdGz5xpGVkBc+vARzYT+d10o1/lYIR5ie3Pqpkdxw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com; spf=pass smtp.mailfrom=riscstar.com; dkim=pass (2048-bit key) header.d=riscstar-com.20230601.gappssmtp.com header.i=@riscstar-com.20230601.gappssmtp.com header.b=c0+7lofq; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=riscstar.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=riscstar-com.20230601.gappssmtp.com header.i=@riscstar-com.20230601.gappssmtp.com header.b="c0+7lofq" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4775895d69cso59055595e9.0 for ; Mon, 05 Jan 2026 02:09:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=riscstar-com.20230601.gappssmtp.com; s=20230601; t=1767607794; x=1768212594; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=NvKDos4fJsou+PSfhxPxHl5xgEuLiCmh0jj1etHYyZs=; b=c0+7lofqKzRH+51D5Evl9eKmSFpCd46cftezD96WfH8SdDgCmLrINPBnEQjT0QZBGa PIwKg1fLMyOg53E8eyyo8PAHaGHQ40EsxeiIBklEQgIskhrZW39LwBuZ9xLNvBjzmulA sm9RzEv784pM5qg/4x9ImpOQWr20KBmr2C/bpFnCuDu5/QctFSbkaw8YNfJqhyPfCD64 Jr17pGzx/+UdugnGEWim+7PM7qrOy5RCri1tTO38bPEJlsa3R8EE6Qe7VBF8ffDOUvrY PGTalnEob3gI5eVXWvs0ugNpApaX97fNfrvtlgDYYkMjgwLIe3Iz6uWfKMdfVK0fksfE zr2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767607794; x=1768212594; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NvKDos4fJsou+PSfhxPxHl5xgEuLiCmh0jj1etHYyZs=; b=JQIEyHM+BEAPRTbD3k4NKoOdjwW6SNdFps1gVTmuVYwe+FhlxU5YG8UTuhdrHIS/Hu yaNztBldRmk+FkaZenb7vBMMdPqkau1ivVkXzGclm65xsjtWDvkTWIGaHonZadJbmL/V SkMDjYYkjF7exwRM+7lZAdkIriipvqZfXO17usNkgl5r6uLx4aOiXl8nXdtcD2PMoIFL rSqESM0K8bYomnXo0f08RQil6d63KO8vReiVjmKavNaimmgLXRspM1x5jBmnLBh/FtA6 gjOm8Fwa6mnhFnyejjQhWjjptRSyhOBv7fTLdqynofLs6AX5I8tDrN01eyyFUsepPyXi XCVg== X-Forwarded-Encrypted: i=1; AJvYcCW5+VKWeVnCP/FELxTHkRc4k6+BmQbDWgyZkmi66KZWvTeiOdPiHaxYI6kMjqRxiE4xEstPpBdBlfcCqiQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwcmJygmZCfYHDcGb1A91lIO7oUaBUogvxwWYwbpozKiU3VRJBx RrNE6RGXjqYJnGqtUrXm76UdjafdjWgWoixYE2fmmdpFIlkC2fonudq4hNt+HXm1KBk= X-Gm-Gg: AY/fxX5yHbSe3WSyvlgMTH3k2c8gU+wO1tOsUj00MJdtVZYdqg+O0hm+etjph/+JBkD woWsDAh08V8ZHZQdqYDNmscNZFZHETdo6oUY+/thAzOvSKtnaTtym2sf5QdjRWOn3nhuz8VKbha /mpWQHQJyERTr5rL5FTWQ5XoxGfUsbKApY9PyHhmbD4RbJffS1jIZJLHXiQzkntNYQTlHf2y7uI QMjBaV6eI8baDUsoefe0Yuuy88zOAvO0k65TzbNN8UdRuemkL5hT5BrGNoUBoS7CS+GgnTOuzwP yVqC0SmlRay7q+xwTz8uP/BlMK20w69qbXD2C4TOYjXDn2C4CKrcfT/WzAMxYhMjCd6G3fTWf7L zO60wu72wkrg+ZTZh1iJFchcShEacCExM41/5kufZvL25kxHdWKFEo1o0OqTOooIfAEbIc1z/zN VYoT2iGsUPAsIhvQS6BK7lX+Mv29zYZ0I0r5g4vWI2VSQuOeMnIhGDYrA7tk52BSe5VD9nxc8cx JdmTMNHPj1cEaRt23coi1kG+XhWQV5zIu9FIfpr3e6v7bt0s7c0qxkiqeJJViJKcR60dgrw X-Google-Smtp-Source: AGHT+IGE2qcg6xcM7QfR3K1EbPQJ77qbf+cnZNCN9Ov6K1/H31yxXIcb9M1Xw2mnMf6vzDPPoCfzWA== X-Received: by 2002:a05:600c:4e90:b0:46e:4e6d:79f4 with SMTP id 5b1f17b1804b1-47d19557183mr677320615e9.15.1767607794105; Mon, 05 Jan 2026 02:09:54 -0800 (PST) Received: from aspen.lan (aztw-34-b2-v4wan-166919-cust780.vm26.cable.virginm.net. [82.37.195.13]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47d6d13e2e0sm176557595e9.1.2026.01.05.02.09.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 02:09:53 -0800 (PST) Date: Mon, 5 Jan 2026 10:09:51 +0000 From: Daniel Thompson To: Sudarshan Shetty Cc: lee@kernel.org, danielt@kernel.org, jingoohan1@gmail.com, deller@gmx.de, pavel@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v1 2/2] backlight: gpio: add support for multiple GPIOs for backlight control Message-ID: References: <20260105085120.230862-1-tessolveupstream@gmail.com> <20260105085120.230862-3-tessolveupstream@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260105085120.230862-3-tessolveupstream@gmail.com> On Mon, Jan 05, 2026 at 02:21:20PM +0530, Sudarshan Shetty wrote: > Extend the gpio-backlight driver to handle multiple GPIOs instead of a > single one. This allows panels that require driving several enable pins > to be controlled by the backlight framework. > > Signed-off-by: Sudarshan Shetty > --- > drivers/video/backlight/gpio_backlight.c | 61 +++++++++++++++++------- > 1 file changed, 45 insertions(+), 16 deletions(-) > > diff --git a/drivers/video/backlight/gpio_backlight.c b/drivers/video/backlight/gpio_backlight.c > index 728a546904b0..037e1c111e48 100644 > --- a/drivers/video/backlight/gpio_backlight.c > +++ b/drivers/video/backlight/gpio_backlight.c > @@ -17,14 +17,18 @@ > > struct gpio_backlight { > struct device *dev; > - struct gpio_desc *gpiod; > + struct gpio_desc **gpiods; > + unsigned int num_gpios; Why not use struct gpio_descs for this? Once you do that, then most of the gbl->num_gpios loops can be replaced with calls to the array based accessors. > }; > > static int gpio_backlight_update_status(struct backlight_device *bl) > { > struct gpio_backlight *gbl = bl_get_data(bl); > + unsigned int i; > + int br = backlight_get_brightness(bl); > > - gpiod_set_value_cansleep(gbl->gpiod, backlight_get_brightness(bl)); > + for (i = 0; i < gbl->num_gpios; i++) > + gpiod_set_value_cansleep(gbl->gpiods[i], br); > > return 0; > } > @@ -52,6 +56,7 @@ static int gpio_backlight_probe(struct platform_device *pdev) > struct backlight_device *bl; > struct gpio_backlight *gbl; > int ret, init_brightness, def_value; > + unsigned int i; > > gbl = devm_kzalloc(dev, sizeof(*gbl), GFP_KERNEL); > if (gbl == NULL) > @@ -62,10 +67,22 @@ static int gpio_backlight_probe(struct platform_device *pdev) > > def_value = device_property_read_bool(dev, "default-on"); > > - gbl->gpiod = devm_gpiod_get(dev, NULL, GPIOD_ASIS); > - if (IS_ERR(gbl->gpiod)) > - return dev_err_probe(dev, PTR_ERR(gbl->gpiod), > - "The gpios parameter is missing or invalid\n"); > + gbl->num_gpios = gpiod_count(dev, NULL); > + if (gbl->num_gpios == 0) > + return dev_err_probe(dev, -EINVAL, > + "The gpios parameter is missing or invalid\n"); > + gbl->gpiods = devm_kcalloc(dev, gbl->num_gpios, sizeof(*gbl->gpiods), > + GFP_KERNEL); > + if (!gbl->gpiods) > + return -ENOMEM; This is definitely easier if you simply use devm_get_array(). > + > + for (i = 0; i < gbl->num_gpios; i++) { > + gbl->gpiods[i] = > + devm_gpiod_get_index(dev, NULL, i, GPIOD_ASIS); > + if (IS_ERR(gbl->gpiods[i])) > + return dev_err_probe(dev, PTR_ERR(gbl->gpiods[i]), > + "Failed to get GPIO at index %u\n", i); > + } > > memset(&props, 0, sizeof(props)); > props.type = BACKLIGHT_RAW; > @@ -78,22 +95,34 @@ static int gpio_backlight_probe(struct platform_device *pdev) > } > > /* Set the initial power state */ > - if (!of_node || !of_node->phandle) > + if (!of_node || !of_node->phandle) { > /* Not booted with device tree or no phandle link to the node */ > bl->props.power = def_value ? BACKLIGHT_POWER_ON > - : BACKLIGHT_POWER_OFF; > - else if (gpiod_get_value_cansleep(gbl->gpiod) == 0) > - bl->props.power = BACKLIGHT_POWER_OFF; > - else > - bl->props.power = BACKLIGHT_POWER_ON; > + : BACKLIGHT_POWER_OFF; > + } else { > + bool all_high = true; > + > + for (i = 0; i < gbl->num_gpios; i++) { > + if (gpiod_get_value_cansleep(gbl->gpiods[i]) != 0) { Why is there a != here? > + all_high = false; > + break; > + } > + } > + > + bl->props.power = > + all_high ? BACKLIGHT_POWER_ON : BACKLIGHT_POWER_OFF; > + } > > bl->props.brightness = 1; > > init_brightness = backlight_get_brightness(bl); > - ret = gpiod_direction_output(gbl->gpiod, init_brightness); > - if (ret) { > - dev_err(dev, "failed to set initial brightness\n"); > - return ret; > + > + for (i = 0; i < gbl->num_gpios; i++) { > + ret = gpiod_direction_output(gbl->gpiods[i], init_brightness); > + if (ret) > + return dev_err_probe(dev, ret, > + "failed to set gpio %u direction\n", > + i); > } > > platform_set_drvdata(pdev, bl); Daniel.