* [PATCH v4 0/2] Backlight driver to control backlight behind Congatec Board Controller.
@ 2025-11-27 15:21 Petri Karhula via B4 Relay
2025-11-27 15:21 ` [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support Petri Karhula via B4 Relay
2025-11-27 15:22 ` [PATCH v4 2/2] mfd: cgbc: Add support for backlight Petri Karhula via B4 Relay
0 siblings, 2 replies; 6+ messages in thread
From: Petri Karhula via B4 Relay @ 2025-11-27 15:21 UTC (permalink / raw)
To: Thomas Richard, Lee Jones, Daniel Thompson, Jingoo Han,
Helge Deller
Cc: linux-kernel, dri-devel, linux-fbdev, Petri Karhula
This driver provides backlight brightness control through the Linux
backlight subsystem. It communicates with the board controller to
adjust LCD backlight using PWM signals. Communication is done
through Congatec Board Controller core driver.
Signed-off-by: Petri Karhula <petri.karhula@novatron.fi>
---
Changes in v4:
- Factor out brightness read into a helper
- Set backlight_properties.scale to BACKLIGHT_SCALE_LINEAR
- Link to v3: https://lore.kernel.org/r/20251125-cgbc-backlight-v3-0-18ae42689411@novatron.fi
Changes in v3:
- Fixed review comments and simplified the structure of the driver
- Link to v2: https://lore.kernel.org/r/20251119-cgbc-backlight-v2-0-4d4edd7ca662@novatron.fi
Changes in v2:
- Separated Board Controller core driver change into its own patch
- Link to v1: https://lore.kernel.org/r/20251118-cgbc-backlight-v1-1-cc6ac5301034@novatron.fi
---
Petri Karhula (2):
backlight: Add Congatec Board Controller (CGBC) backlight support
mfd: cgbc: Add support for backlight
drivers/mfd/cgbc-core.c | 1 +
drivers/video/backlight/Kconfig | 11 +++
drivers/video/backlight/Makefile | 1 +
drivers/video/backlight/cgbc_bl.c | 179 ++++++++++++++++++++++++++++++++++++++
4 files changed, 192 insertions(+)
---
base-commit: ac3fd01e4c1efce8f2c054cdeb2ddd2fc0fb150d
change-id: 20251118-cgbc-backlight-35c1109db0b8
Best regards,
--
Petri Karhula <petri.karhula@novatron.fi>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support
2025-11-27 15:21 [PATCH v4 0/2] Backlight driver to control backlight behind Congatec Board Controller Petri Karhula via B4 Relay
@ 2025-11-27 15:21 ` Petri Karhula via B4 Relay
2025-11-27 15:55 ` Daniel Thompson
` (2 more replies)
2025-11-27 15:22 ` [PATCH v4 2/2] mfd: cgbc: Add support for backlight Petri Karhula via B4 Relay
1 sibling, 3 replies; 6+ messages in thread
From: Petri Karhula via B4 Relay @ 2025-11-27 15:21 UTC (permalink / raw)
To: Thomas Richard, Lee Jones, Daniel Thompson, Jingoo Han,
Helge Deller
Cc: linux-kernel, dri-devel, linux-fbdev, Petri Karhula
From: Petri Karhula <petri.karhula@novatron.fi>
This driver provides backlight brightness control through the Linux
backlight subsystem. It communicates with the board controller to
adjust LCD backlight using PWM signals. Communication is done
through Congatec Board Controller core driver.
Signed-off-by: Petri Karhula <petri.karhula@novatron.fi>
---
drivers/video/backlight/Kconfig | 11 +++
drivers/video/backlight/Makefile | 1 +
drivers/video/backlight/cgbc_bl.c | 179 ++++++++++++++++++++++++++++++++++++++
3 files changed, 191 insertions(+)
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index d9374d208cee..702f3b8ed036 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -249,6 +249,17 @@ config BACKLIGHT_PWM
If you have a LCD backlight adjustable by PWM, say Y to enable
this driver.
+config BACKLIGHT_CGBC
+ tristate "Congatec Board Controller (CGBC) backlight support"
+ depends on MFD_CGBC && X86
+ help
+ Say Y here to enable support for LCD backlight control on Congatec
+ x86-based boards via the CGBC (Congatec Board Controller).
+
+ This driver provides backlight brightness control through the Linux
+ backlight subsystem. It communicates with the board controller to
+ adjust LCD backlight using PWM signals.
+
config BACKLIGHT_DA903X
tristate "Backlight Driver for DA9030/DA9034 using WLED"
depends on PMIC_DA903X
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index dfbb169bf6ea..0169fd8873ed 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -27,6 +27,7 @@ obj-$(CONFIG_BACKLIGHT_APPLE_DWI) += apple_dwi_bl.o
obj-$(CONFIG_BACKLIGHT_AS3711) += as3711_bl.o
obj-$(CONFIG_BACKLIGHT_BD6107) += bd6107.o
obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
+obj-$(CONFIG_BACKLIGHT_CGBC) += cgbc_bl.o
obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
obj-$(CONFIG_BACKLIGHT_DA9052) += da9052_bl.o
obj-$(CONFIG_BACKLIGHT_EP93XX) += ep93xx_bl.o
diff --git a/drivers/video/backlight/cgbc_bl.c b/drivers/video/backlight/cgbc_bl.c
new file mode 100644
index 000000000000..74f80222d789
--- /dev/null
+++ b/drivers/video/backlight/cgbc_bl.c
@@ -0,0 +1,179 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Congatec Board Controller (CGBC) Backlight Driver
+ *
+ * This driver provides backlight control for LCD displays connected to
+ * Congatec boards via the CGBC (Congatec Board Controller). It integrates
+ * with the Linux backlight subsystem and communicates with hardware through
+ * the cgbc-core module.
+ *
+ * Copyright (C) 2025 Novatron Oy
+ *
+ * Author: Petri Karhula <petri.karhula@novatron.fi>
+ */
+
+#include <linux/backlight.h>
+#include <linux/bitfield.h>
+#include <linux/bits.h>
+#include <linux/mfd/cgbc.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#define BLT_PWM_DUTY_MASK GENMASK(6, 0)
+
+/* CGBC command for PWM brightness control*/
+#define CGBC_CMD_BLT0_PWM 0x75
+
+#define CGBC_BL_MAX_BRIGHTNESS 100
+
+/**
+ * CGBC backlight driver data
+ * @dev: Pointer to the platform device
+ * @cgbc: Pointer to the parent CGBC device data
+ * @current_brightness: Current brightness level (0-100)
+ */
+struct cgbc_bl_data {
+ struct device *dev;
+ struct cgbc_device_data *cgbc;
+ unsigned int current_brightness;
+};
+
+static int cgbc_bl_read_brightness(struct cgbc_bl_data *bl_data)
+{
+ u8 cmd_buf[4] = { CGBC_CMD_BLT0_PWM };
+ u8 reply_buf[3];
+ int ret;
+
+ ret = cgbc_command(bl_data->cgbc, cmd_buf, sizeof(cmd_buf),
+ reply_buf, sizeof(reply_buf), NULL);
+ if (ret < 0)
+ return ret;
+
+ /*
+ * Get only PWM duty factor percentage,
+ * ignore polarity inversion bit (bit 7)
+ */
+ bl_data->current_brightness = FIELD_GET(BLT_PWM_DUTY_MASK, reply_buf[0]);
+
+ return 0;
+}
+
+static int cgbc_bl_update_status(struct backlight_device *bl)
+{
+ struct cgbc_bl_data *bl_data = bl_get_data(bl);
+ u8 cmd_buf[4] = { CGBC_CMD_BLT0_PWM };
+ u8 reply_buf[3];
+ u8 brightness;
+ int ret;
+
+ brightness = backlight_get_brightness(bl);
+
+ if (brightness != bl_data->current_brightness) {
+ /* Read the current values */
+ ret = cgbc_command(bl_data->cgbc, cmd_buf, sizeof(cmd_buf), reply_buf,
+ sizeof(reply_buf), NULL);
+ if (ret < 0) {
+ dev_err(bl_data->dev, "Failed to read PWM settings: %d\n", ret);
+ return ret;
+ }
+
+ /*
+ * Prepare command buffer for writing new settings. Only 2nd byte is changed
+ * to set new brightness (PWM duty cycle %). Other values (polarity, frequency)
+ * are preserved from the read values.
+ */
+ cmd_buf[1] = (reply_buf[0] & ~BLT_PWM_DUTY_MASK) |
+ FIELD_PREP(BLT_PWM_DUTY_MASK, brightness);
+ cmd_buf[2] = reply_buf[1];
+ cmd_buf[3] = reply_buf[2];
+
+ ret = cgbc_command(bl_data->cgbc, cmd_buf, sizeof(cmd_buf), reply_buf,
+ sizeof(reply_buf), NULL);
+ if (ret < 0) {
+ dev_err(bl_data->dev, "Failed to set brightness: %d\n", ret);
+ return ret;
+ }
+
+ bl_data->current_brightness = reply_buf[0] & BLT_PWM_DUTY_MASK;
+
+ /* Verify the setting was applied correctly */
+ if (bl_data->current_brightness != brightness) {
+ dev_err(bl_data->dev,
+ "Brightness setting verification failed\n");
+ return -EIO;
+ }
+ }
+
+ return 0;
+}
+
+static int cgbc_bl_get_brightness(struct backlight_device *bl)
+{
+ struct cgbc_bl_data *bl_data = bl_get_data(bl);
+ int ret;
+
+ ret = cgbc_bl_read_brightness(bl_data);
+ if (ret < 0) {
+ dev_err(bl_data->dev, "Failed to read brightness: %d\n", ret);
+ return ret;
+ }
+
+ return bl_data->current_brightness;
+}
+
+static const struct backlight_ops cgbc_bl_ops = {
+ .options = BL_CORE_SUSPENDRESUME,
+ .update_status = cgbc_bl_update_status,
+ .get_brightness = cgbc_bl_get_brightness,
+};
+
+static int cgbc_bl_probe(struct platform_device *pdev)
+{
+ struct cgbc_device_data *cgbc = dev_get_drvdata(pdev->dev.parent);
+ struct backlight_properties props = { };
+ struct backlight_device *bl_dev;
+ struct cgbc_bl_data *bl_data;
+ int ret;
+
+ bl_data = devm_kzalloc(&pdev->dev, sizeof(*bl_data), GFP_KERNEL);
+ if (!bl_data)
+ return -ENOMEM;
+
+ bl_data->dev = &pdev->dev;
+ bl_data->cgbc = cgbc;
+
+ ret = cgbc_bl_read_brightness(bl_data);
+ if (ret < 0)
+ return dev_err_probe(&pdev->dev, ret,
+ "Failed to read initial brightness\n");
+
+ props.type = BACKLIGHT_PLATFORM;
+ props.max_brightness = CGBC_BL_MAX_BRIGHTNESS;
+ props.brightness = bl_data->current_brightness;
+ props.scale = BACKLIGHT_SCALE_LINEAR;
+
+ bl_dev = devm_backlight_device_register(&pdev->dev, "cgbc-backlight",
+ &pdev->dev, bl_data,
+ &cgbc_bl_ops, &props);
+ if (IS_ERR(bl_dev))
+ return dev_err_probe(&pdev->dev, PTR_ERR(bl_dev),
+ "Failed to register backlight device\n");
+
+ platform_set_drvdata(pdev, bl_data);
+
+ return 0;
+}
+
+static struct platform_driver cgbc_bl_driver = {
+ .driver = {
+ .name = "cgbc-backlight",
+ },
+ .probe = cgbc_bl_probe,
+};
+
+module_platform_driver(cgbc_bl_driver);
+
+MODULE_AUTHOR("Petri Karhula <petri.karhula@novatron.fi>");
+MODULE_DESCRIPTION("Congatec Board Controller (CGBC) Backlight Driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:cgbc-backlight");
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 2/2] mfd: cgbc: Add support for backlight
2025-11-27 15:21 [PATCH v4 0/2] Backlight driver to control backlight behind Congatec Board Controller Petri Karhula via B4 Relay
2025-11-27 15:21 ` [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support Petri Karhula via B4 Relay
@ 2025-11-27 15:22 ` Petri Karhula via B4 Relay
1 sibling, 0 replies; 6+ messages in thread
From: Petri Karhula via B4 Relay @ 2025-11-27 15:22 UTC (permalink / raw)
To: Thomas Richard, Lee Jones, Daniel Thompson, Jingoo Han,
Helge Deller
Cc: linux-kernel, dri-devel, linux-fbdev, Petri Karhula
From: Petri Karhula <petri.karhula@novatron.fi>
The Board Controller has control for display backlight.
Add backlight cell for the cgbc-backlight driver which
adds support for backlight brightness control.
Signed-off-by: Petri Karhula <petri.karhula@novatron.fi>
---
drivers/mfd/cgbc-core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/mfd/cgbc-core.c b/drivers/mfd/cgbc-core.c
index 4782ff1114a9..10bb4b414c34 100644
--- a/drivers/mfd/cgbc-core.c
+++ b/drivers/mfd/cgbc-core.c
@@ -237,6 +237,7 @@ static struct mfd_cell cgbc_devs[] = {
{ .name = "cgbc-i2c", .id = 1 },
{ .name = "cgbc-i2c", .id = 2 },
{ .name = "cgbc-hwmon" },
+ { .name = "cgbc-backlight" },
};
static int cgbc_map(struct cgbc_device_data *cgbc)
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support
2025-11-27 15:21 ` [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support Petri Karhula via B4 Relay
@ 2025-11-27 15:55 ` Daniel Thompson
2025-11-29 10:27 ` Thomas Richard
2025-12-01 13:13 ` Thomas Richard
2 siblings, 0 replies; 6+ messages in thread
From: Daniel Thompson @ 2025-11-27 15:55 UTC (permalink / raw)
To: petri.karhula
Cc: Thomas Richard, Lee Jones, Jingoo Han, Helge Deller, linux-kernel,
dri-devel, linux-fbdev
On Thu, Nov 27, 2025 at 03:21:59PM +0000, Petri Karhula via B4 Relay wrote:
> From: Petri Karhula <petri.karhula@novatron.fi>
>
> This driver provides backlight brightness control through the Linux
> backlight subsystem. It communicates with the board controller to
> adjust LCD backlight using PWM signals. Communication is done
> through Congatec Board Controller core driver.
>
> Signed-off-by: Petri Karhula <petri.karhula@novatron.fi>
Reviewed-by: Daniel Thompson (RISCstar) <danielt@kernel.org>
Daniel.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support
2025-11-27 15:21 ` [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support Petri Karhula via B4 Relay
2025-11-27 15:55 ` Daniel Thompson
@ 2025-11-29 10:27 ` Thomas Richard
2025-12-01 13:13 ` Thomas Richard
2 siblings, 0 replies; 6+ messages in thread
From: Thomas Richard @ 2025-11-29 10:27 UTC (permalink / raw)
To: petri.karhula, Lee Jones, Daniel Thompson, Jingoo Han,
Helge Deller
Cc: linux-kernel, dri-devel, linux-fbdev
On 11/27/25 4:21 PM, Petri Karhula via B4 Relay wrote:
> From: Petri Karhula <petri.karhula@novatron.fi>
>
> This driver provides backlight brightness control through the Linux
> backlight subsystem. It communicates with the board controller to
> adjust LCD backlight using PWM signals. Communication is done
> through Congatec Board Controller core driver.
>
[...]
> + bl_data->current_brightness = reply_buf[0] & BLT_PWM_DUTY_MASK;
> +
> + /* Verify the setting was applied correctly */
> + if (bl_data->current_brightness != brightness) {
> + dev_err(bl_data->dev,
> + "Brightness setting verification failed\n");
> + return -EIO;
> + }
I'm still not really convinced by other error messages, but okay let's
keep them. Maybe add current and requested brightnesses in this message,
it could be useful for debugging.
"Brightness setting verification failed (X instead of Y)"
Otherwise looks good to me. I will test your series
Reviewed-by: Thomas Richard <thomas.richard@bootlin.com>
Best Regards,
Thomas
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support
2025-11-27 15:21 ` [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support Petri Karhula via B4 Relay
2025-11-27 15:55 ` Daniel Thompson
2025-11-29 10:27 ` Thomas Richard
@ 2025-12-01 13:13 ` Thomas Richard
2 siblings, 0 replies; 6+ messages in thread
From: Thomas Richard @ 2025-12-01 13:13 UTC (permalink / raw)
To: petri.karhula, Lee Jones, Daniel Thompson, Jingoo Han,
Helge Deller
Cc: linux-kernel, dri-devel, linux-fbdev
On 11/27/25 4:21 PM, Petri Karhula via B4 Relay wrote:
> From: Petri Karhula <petri.karhula@novatron.fi>
>
> This driver provides backlight brightness control through the Linux
> backlight subsystem. It communicates with the board controller to
> adjust LCD backlight using PWM signals. Communication is done
> through Congatec Board Controller core driver.
Tested on a conga-SA7 module with conga-SEVAL carrier board.
Tested-by: Thomas Richard <thomas.richard@bootlin.com>
Best Regards,
Thomas
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-12-01 13:13 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-27 15:21 [PATCH v4 0/2] Backlight driver to control backlight behind Congatec Board Controller Petri Karhula via B4 Relay
2025-11-27 15:21 ` [PATCH v4 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support Petri Karhula via B4 Relay
2025-11-27 15:55 ` Daniel Thompson
2025-11-29 10:27 ` Thomas Richard
2025-12-01 13:13 ` Thomas Richard
2025-11-27 15:22 ` [PATCH v4 2/2] mfd: cgbc: Add support for backlight Petri Karhula via B4 Relay
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).