From nobody Tue Feb 10 03:00:04 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 30CF042DFF8 for ; Tue, 20 Jan 2026 12:50:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768913459; cv=none; b=S+xI4VC2vEfBI7XrMXGMUC4Nf1D46gloi9Sk9uYtnNrQJRfCGyvtTOjRI9VuOsNlqK3QDo3zTsiMecgd99jrMbQcObta6ueu6h4ZcNfm+ivGkuLo2y3z5NdpEdgAdK8tm8zISpT70dQmfBc5pU9enfPp+my1v2IF1OFsq4DnX6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768913459; c=relaxed/simple; bh=wBaSoSs4KKPmkdnBbVJ5VE0QtVfyigKXSTnVZqKJ2eg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=QRxbitTKzNzEaHFJoeVpy+I2AWT6k+79DyNeZwPxP98kJsfw1yxsPc+kw7gz7YcIbq27OHhtJzMw1cc+pVssJNsvrDDMcc0N9pHpT+OnubK1Cxh21aPhl8O+bTuNE6tunjh1bFD6ewW8Mhb3ZLFEyIDzeAJ5zA5ru2pMyV+t4FE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kmVqMRh7; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kmVqMRh7" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2a07fac8aa1so39988655ad.1 for ; Tue, 20 Jan 2026 04:50:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768913457; x=1769518257; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LroXmq9J3VVORG7m8L/kGtxBgy95TWF72WU3KxUKLtI=; b=kmVqMRh72Z60zhUkUYNVVeacAqTKAHaAjF0av00kQCpVIhwQ347S9De5LAtrBCWeVu qxxDzdq1U+Ge1MmJJsxvgLdI/BDmRXk1QBbiMj7PY2Jd7In1g+6SzzesT5QKmv0l+eaV CxTz6JXMrdj9rzUzeuSCfcI/k5xb00ULWBme3a/Z3QjGB+nMabhn3wRsZBytqOSndHhT f6CNURMn7oTbtm1fD5G+wXgLYLgfHOSA6KUaX3P6kcGbNhESxYWjurAsDI3DClprKxV4 LwTAXo3PPPTGrIqpTt1okiFHAL9g5Zo8HsP1mbOSwN7G1sBO3G8FtDlcNvtrfbIyIAVI QH8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768913457; x=1769518257; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LroXmq9J3VVORG7m8L/kGtxBgy95TWF72WU3KxUKLtI=; b=Kf0B56nnSIausdr/zXO4FWpcW6dg6p5EPE8GbNjkaZCu72o4aqa33X9QlOiFidUHHQ RBEqvlbNA+hZBXbL+wnz4DNhHBz6bmgCUmVXyhmqkyuTqL1QlM68L4mV39soU4Mm0Hnq 4lIgSmoaGLdeh8eX7R2EUWpi67VpVQ73N2B1YKhlRXUvcjwYDsdVPTzbvh/I+qXiS4Mt HqlPMIOjWR6URa1uSxGLrtJeYrGpWafHrJ3oqOuhcNFlBjGamUluSPyZnnvlrEqeQ5nD DQKtvGGfdQPaa853keLdvSCliP2bke3u4HvflAQgA6xgWmFohruTD8PBYUoC1WDWOWU4 FsDA== X-Forwarded-Encrypted: i=1; AJvYcCVCnJkMtNVCONh+hx+y1kv6mvSZI9YLWCYf+KCsJR/fK+1XZoy1HcjcZnL1S7d9700lTd8Xq2Pe0di/dxQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9VmtJveF94K9LOfoSqXLGFEtVXNIluZGfO+IMw8S74SxTQMfk Od8NXXzLh2Pl/cu8QhVNX4Ph5FvsIGfhAUVDuUfBHt1gW8USbtIB5WI7KwBmiQ== X-Gm-Gg: AZuq6aK0uu/r6ImQAGSNUjMo0Og5NwSouCljE5ZH3lrxV1f5qzqtaElcafe8eI7WvQE Q4HKdT0rUW8li2ApAAQX4BqNPdaLwxQlJzpE26+zZCyQIVMrMCCmBqAAQjQgp4GSr8ey9KboiZS SrE4g5Mdp2QIg8wjaj7OCa/sBqFphvocL3kEwCRW1QR1vqbBbRNTNS36vlW+WVO20nNFSW6Y5V8 HLzdvAqTUyzPDArJjlza11/h82vVRs968q/JW9AoV4sihEHCMqwmMc+W8w25D+macPvozwDvsUj N6dO9DjUYRFi+nZkqUTZCkp5G2HIO9HN2pOfEQPAjPF8XBFb45zyeloqj4haS+Hff7IBNRwrFw8 5kN0A6GS1Qd5TqxfLuKW/DnJb/DjmbAvM4SbG7RnzN8+L/0QbZb42/1qhzjBGXk4bl8DjnxTZZN 4RABw7jQtFuKvRARfv/8PWVHlNiMOC+GYgKQkt X-Received: by 2002:a17:903:2ec5:b0:2a0:8859:3722 with SMTP id d9443c01a7336-2a769ae664fmr16859025ad.25.1768913457332; Tue, 20 Jan 2026 04:50:57 -0800 (PST) Received: from test-HP-Desktop-Pro-G3.. ([103.218.174.23]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a7193dd582sm124973815ad.52.2026.01.20.04.50.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Jan 2026 04:50:56 -0800 (PST) From: Sudarshan Shetty To: lee@kernel.org, danielt@kernel.org, jingoohan1@gmail.com Cc: 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, Sudarshan Shetty Subject: [PATCH v2 2/2] backlight: gpio: add support for multiple GPIOs for backlight control Date: Tue, 20 Jan 2026 18:20:36 +0530 Message-Id: <20260120125036.2203995-3-tessolveupstream@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260120125036.2203995-1-tessolveupstream@gmail.com> References: <20260120125036.2203995-1-tessolveupstream@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The gpio-backlight driver currently supports only a single GPIO to enable or disable a backlight device. Some panels require multiple enable GPIOs to be asserted together. Extend the driver to support an array of GPIOs for a single backlight instance. All configured GPIOs are toggled together based on the backlight state. Existing single-GPIO Device Tree users remain unaffected. Signed-off-by: Sudarshan Shetty --- drivers/video/backlight/gpio_backlight.c | 66 ++++++++++++++++-------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/drivers/video/backlight/gpio_backlight.c b/drivers/video/backl= ight/gpio_backlight.c index 728a546904b0..11d21de82cf5 100644 --- a/drivers/video/backlight/gpio_backlight.c +++ b/drivers/video/backlight/gpio_backlight.c @@ -14,17 +14,29 @@ #include #include #include +#include =20 struct gpio_backlight { struct device *dev; - struct gpio_desc *gpiod; + struct gpio_descs *gpiods; + unsigned long *bitmap; }; =20 static int gpio_backlight_update_status(struct backlight_device *bl) { struct gpio_backlight *gbl =3D bl_get_data(bl); + unsigned int n =3D gbl->gpiods->ndescs; + int br =3D backlight_get_brightness(bl); =20 - gpiod_set_value_cansleep(gbl->gpiod, backlight_get_brightness(bl)); + if (br) + bitmap_fill(gbl->bitmap, n); + else + bitmap_zero(gbl->bitmap, n); + + gpiod_set_array_value_cansleep(n, + gbl->gpiods->desc, + gbl->gpiods->info, + gbl->bitmap); =20 return 0; } @@ -48,26 +60,43 @@ static int gpio_backlight_probe(struct platform_device = *pdev) struct device *dev =3D &pdev->dev; struct gpio_backlight_platform_data *pdata =3D dev_get_platdata(dev); struct device_node *of_node =3D dev->of_node; - struct backlight_properties props; + struct backlight_properties props =3D { }; struct backlight_device *bl; struct gpio_backlight *gbl; - int ret, init_brightness, def_value; + bool def_value; + enum gpiod_flags flags; + unsigned int n; + int words; =20 - gbl =3D devm_kzalloc(dev, sizeof(*gbl), GFP_KERNEL); - if (gbl =3D=3D NULL) + gbl =3D devm_kcalloc(dev, 1, sizeof(*gbl), GFP_KERNEL); + if (!gbl) return -ENOMEM; =20 if (pdata) gbl->dev =3D pdata->dev; =20 def_value =3D device_property_read_bool(dev, "default-on"); + flags =3D def_value ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; + + gbl->gpiods =3D devm_gpiod_get_array(dev, NULL, flags); + if (IS_ERR(gbl->gpiods)) { + if (PTR_ERR(gbl->gpiods) =3D=3D -ENODEV) + return dev_err_probe(dev, -EINVAL, + "The gpios parameter is missing or invalid\n"); + return PTR_ERR(gbl->gpiods); + } =20 - gbl->gpiod =3D 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"); + n =3D gbl->gpiods->ndescs; + if (!n) + return dev_err_probe(dev, -EINVAL, + "No GPIOs provided\n"); + + words =3D BITS_TO_LONGS(n); + gbl->bitmap =3D devm_kcalloc(dev, words, sizeof(unsigned long), + GFP_KERNEL); + if (!gbl->bitmap) + return -ENOMEM; =20 - memset(&props, 0, sizeof(props)); props.type =3D BACKLIGHT_RAW; props.max_brightness =3D 1; bl =3D devm_backlight_device_register(dev, dev_name(dev), dev, gbl, @@ -81,21 +110,16 @@ static int gpio_backlight_probe(struct platform_device= *pdev) if (!of_node || !of_node->phandle) /* Not booted with device tree or no phandle link to the node */ bl->props.power =3D def_value ? BACKLIGHT_POWER_ON - : BACKLIGHT_POWER_OFF; - else if (gpiod_get_value_cansleep(gbl->gpiod) =3D=3D 0) + : BACKLIGHT_POWER_OFF; + else if (gpiod_get_value_cansleep(gbl->gpiods->desc[0]) =3D=3D 0) bl->props.power =3D BACKLIGHT_POWER_OFF; else bl->props.power =3D BACKLIGHT_POWER_ON; =20 - bl->props.brightness =3D 1; - - init_brightness =3D backlight_get_brightness(bl); - ret =3D gpiod_direction_output(gbl->gpiod, init_brightness); - if (ret) { - dev_err(dev, "failed to set initial brightness\n"); - return ret; - } + bl->props.brightness =3D def_value ? 1 : 0; =20 + gpio_backlight_update_status(bl); + platform_set_drvdata(pdev, bl); return 0; } --=20 2.34.1