From nobody Tue Dec 16 13:28:02 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49C1E258ECB; Fri, 5 Dec 2025 12:19:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764937191; cv=none; b=QWrg7L9YpcA5pNfFYGpJ3LR0IANbPf+jH4Xjbon42+cvVAVE5TEfHe4CxKmC/z6HdrhjVepcmpPKIfd9CgmwgClj5NSZILk326DQuyTfG+3sEAbl+Muot70fgM18I9vMnM6+FsWg+0ZCmRA9kXzk9IV3a5oDi+XZEEFxirhiTuo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764937191; c=relaxed/simple; bh=bMm8M4cC+AW6SIhVjmCZX1nEqc8QuoD/EfzAFfNHZ6w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HBuKjM6060FvrIk5GmLVXvgNezoqtgvf9LyLQm4qF51rkLQMaZP241XQDwULdmtFrYLSugdJCC+XJKfa07d0M6BGmc5Z+sEh/5Cq/3YgNXtGrf7SalENvEyNarc7DuAwGSIH7LGPNCbKAvmOmIuOlNA+p+oJndQ879AhjzH8SrI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fxugB2iu; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fxugB2iu" Received: by smtp.kernel.org (Postfix) with ESMTPS id 9FFDCC116C6; Fri, 5 Dec 2025 12:19:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764937190; bh=bMm8M4cC+AW6SIhVjmCZX1nEqc8QuoD/EfzAFfNHZ6w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=fxugB2iuGetRKXi0KwzzNROoSRSeg4K6YWgSAQV/p3lCnrJ4ICWkDl+MPqZtxjLKK cA40VQ0PHpr2Jvsfm7q0RYz7tf6EWoHSLeUIv+Bn14GUXsaFwAg5S+jNcrMQPRBs+c dXQoI9YJ8hJzrojT3lTe87p7dq5yAEqHvb68wbk6Tae66SEOHjzGXqcu3Lj0DJkeQv zUWt3aoHY283yCd5eocX8bK07u9MbnvjgRm9YYJY1dD6M1ooBW1i2X1YahaHgTTchX GHvFL2vpxYGED+rmgFsEPSSJWBvS5YJyJCxrbi90gEG+L3/JruDKNYJ8ru3cT++fpI tqOMXH2j/LXfg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8E651D2F7EE; Fri, 5 Dec 2025 12:19:50 +0000 (UTC) From: Petri Karhula via B4 Relay Date: Fri, 05 Dec 2025 12:19:47 +0000 Subject: [PATCH v6 1/2] backlight: Add Congatec Board Controller (CGBC) backlight support 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="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251205-cgbc-backlight-v6-1-e4175b0bf406@novatron.fi> References: <20251205-cgbc-backlight-v6-0-e4175b0bf406@novatron.fi> In-Reply-To: <20251205-cgbc-backlight-v6-0-e4175b0bf406@novatron.fi> To: Thomas Richard , Lee Jones , Daniel Thompson , Jingoo Han , Helge Deller Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Petri Karhula X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1764937189; l=7676; i=petri.karhula@novatron.fi; s=20251118; h=from:subject:message-id; bh=n2dQl8ZBe7xgDjoa1R7z1DM3c3wAU2JOcDQTMlQOOMs=; b=/xFHvaZBry7tFeIPo7umQTcKLtLmiMexg38yZmRawr/hdac8t2K36pZEdnI8iJgjfmfErAD1w H3+3xFOWIjdAIS1lDU1Vz+rDvwxXhoaDH1Bmk0OT6GkTkCTdzdg+L+b X-Developer-Key: i=petri.karhula@novatron.fi; a=ed25519; pk=LRYJ99jPPsHJwdJEPkqlmzAMqo6oyw7I421aHEfDp7o= X-Endpoint-Received: by B4 Relay for petri.karhula@novatron.fi/20251118 with auth_id=567 X-Original-From: Petri Karhula Reply-To: petri.karhula@novatron.fi From: 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. Tested-by: Thomas Richard Reviewed-by: Thomas Richard Reviewed-by: Daniel Thompson (RISCstar) Signed-off-by: Petri Karhula --- drivers/video/backlight/Kconfig | 11 +++ drivers/video/backlight/Makefile | 1 + drivers/video/backlight/cgbc_bl.c | 180 ++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 192 insertions(+) diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kcon= fig 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. =20 +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/Mak= efile index dfbb169bf6ea..0169fd8873ed 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -27,6 +27,7 @@ obj-$(CONFIG_BACKLIGHT_APPLE_DWI) +=3D apple_dwi_bl.o obj-$(CONFIG_BACKLIGHT_AS3711) +=3D as3711_bl.o obj-$(CONFIG_BACKLIGHT_BD6107) +=3D bd6107.o obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) +=3D backlight.o +obj-$(CONFIG_BACKLIGHT_CGBC) +=3D cgbc_bl.o obj-$(CONFIG_BACKLIGHT_DA903X) +=3D da903x_bl.o obj-$(CONFIG_BACKLIGHT_DA9052) +=3D da9052_bl.o obj-$(CONFIG_BACKLIGHT_EP93XX) +=3D ep93xx_bl.o diff --git a/drivers/video/backlight/cgbc_bl.c b/drivers/video/backlight/cg= bc_bl.c new file mode 100644 index 000000000000..ab27e14338a8 --- /dev/null +++ b/drivers/video/backlight/cgbc_bl.c @@ -0,0 +1,180 @@ +// 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 throu= gh + * the cgbc-core module. + * + * Copyright (C) 2025 Novatron Oy + * + * Author: Petri Karhula + */ + +#include +#include +#include +#include +#include +#include + +#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] =3D { CGBC_CMD_BLT0_PWM }; + u8 reply_buf[3]; + int ret; + + ret =3D 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 =3D 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 =3D bl_get_data(bl); + u8 cmd_buf[4] =3D { CGBC_CMD_BLT0_PWM }; + u8 reply_buf[3]; + u8 brightness; + int ret; + + brightness =3D backlight_get_brightness(bl); + + if (brightness !=3D bl_data->current_brightness) { + /* Read the current values */ + ret =3D 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 cha= nged + * to set new brightness (PWM duty cycle %). Other values (polarity, fre= quency) + * are preserved from the read values. + */ + cmd_buf[1] =3D (reply_buf[0] & ~BLT_PWM_DUTY_MASK) | + FIELD_PREP(BLT_PWM_DUTY_MASK, brightness); + cmd_buf[2] =3D reply_buf[1]; + cmd_buf[3] =3D reply_buf[2]; + + ret =3D 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 =3D reply_buf[0] & BLT_PWM_DUTY_MASK; + + /* Verify the setting was applied correctly */ + if (bl_data->current_brightness !=3D brightness) { + dev_err(bl_data->dev, + "Brightness setting verification failed (got %u, expected %u)\n", + bl_data->current_brightness, (unsigned int)brightness); + return -EIO; + } + } + + return 0; +} + +static int cgbc_bl_get_brightness(struct backlight_device *bl) +{ + struct cgbc_bl_data *bl_data =3D bl_get_data(bl); + int ret; + + ret =3D 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 =3D { + .options =3D BL_CORE_SUSPENDRESUME, + .update_status =3D cgbc_bl_update_status, + .get_brightness =3D cgbc_bl_get_brightness, +}; + +static int cgbc_bl_probe(struct platform_device *pdev) +{ + struct cgbc_device_data *cgbc =3D dev_get_drvdata(pdev->dev.parent); + struct backlight_properties props =3D { }; + struct backlight_device *bl_dev; + struct cgbc_bl_data *bl_data; + int ret; + + bl_data =3D devm_kzalloc(&pdev->dev, sizeof(*bl_data), GFP_KERNEL); + if (!bl_data) + return -ENOMEM; + + bl_data->dev =3D &pdev->dev; + bl_data->cgbc =3D cgbc; + + ret =3D cgbc_bl_read_brightness(bl_data); + if (ret < 0) + return dev_err_probe(&pdev->dev, ret, + "Failed to read initial brightness\n"); + + props.type =3D BACKLIGHT_PLATFORM; + props.max_brightness =3D CGBC_BL_MAX_BRIGHTNESS; + props.brightness =3D bl_data->current_brightness; + props.scale =3D BACKLIGHT_SCALE_LINEAR; + + bl_dev =3D 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 =3D { + .driver =3D { + .name =3D "cgbc-backlight", + }, + .probe =3D cgbc_bl_probe, +}; + +module_platform_driver(cgbc_bl_driver); + +MODULE_AUTHOR("Petri Karhula "); +MODULE_DESCRIPTION("Congatec Board Controller (CGBC) Backlight Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:cgbc-backlight"); --=20 2.34.1 From nobody Tue Dec 16 13:28:02 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49CF5308F36; Fri, 5 Dec 2025 12:19:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764937191; cv=none; b=GIcYHdGRWOtV0ZXvZfkx0+4L37UYeOSFHoiPNBFJsrc3RA5z/cKSK9qp3CTdb8MsksPc5aXZ3/QfjKRfqonGEWSP1LTebpBCHujeiFo/a9atwRfTrR7Wi3t0dXsMCkVe3xGRDeyiDnUO+E2uEHhg/RF4X5pjI2DnDiHdS7CVyT0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764937191; c=relaxed/simple; bh=jcPepnZLZgpDua5txvocFEmcFpPGA3RIdeogtsflON8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I/hs0gdQqx+OLu8QJhYmpiuF8o+5eYKKi1ZhqBeSIjPtk5p24NDHucsPLb46nUlkd+yFNAqE4P7+wntCgEtowD0+CEWLPx1wo+pj6E9YccgvAGr+s7j84RG/JYN5eI01nKj/CoybBcvbG/doHkBKTrnxUqXJ+9slKvpo9egJBfY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=t6jgj9fC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="t6jgj9fC" Received: by smtp.kernel.org (Postfix) with ESMTPS id B16BAC16AAE; Fri, 5 Dec 2025 12:19:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764937190; bh=jcPepnZLZgpDua5txvocFEmcFpPGA3RIdeogtsflON8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=t6jgj9fCeMa0/Csw4Ha3dekc3fKmiEtasNWdlFzNiHYPCIxVzkt/FmQdTpGuzIdSz K5zPoINTZH3y0rjNs2KFiAKUP/p2ah7dwy514WvRbF2NgdJB7Ulz3kAHSoROoM9Skl /LZ/LPcVZ8h5X24rB3W1n8+Fg0t/1/96r81t14SbUeXukV8uf0lHFgKPqoLByFbs1k tXeVkd/MJo64GP/0MVXbubS7W2WeGU9uCKjYKO6wgShwelzfXq1hkVk+lLUlypuDH7 mKmFnXKCYK2NZHrXX+9kr4x3aNK4l7zfJEdXXz1e2k+ud1lPLDzgtkB0e00UF9Z9qK K47ZR+7EL2saA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A0D6DD2F7EB; Fri, 5 Dec 2025 12:19:50 +0000 (UTC) From: Petri Karhula via B4 Relay Date: Fri, 05 Dec 2025 12:19:48 +0000 Subject: [PATCH v6 2/2] mfd: cgbc: Add support for backlight 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="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251205-cgbc-backlight-v6-2-e4175b0bf406@novatron.fi> References: <20251205-cgbc-backlight-v6-0-e4175b0bf406@novatron.fi> In-Reply-To: <20251205-cgbc-backlight-v6-0-e4175b0bf406@novatron.fi> To: Thomas Richard , Lee Jones , Daniel Thompson , Jingoo Han , Helge Deller Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Petri Karhula X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1764937189; l=730; i=petri.karhula@novatron.fi; s=20251118; h=from:subject:message-id; bh=KPNSZCbWidPbzGQwgMCbuFj/C6Dnnhi7zAXThQ+Pso8=; b=Yi7moofqQcbmddXD6FGj979QkC2EfgDx8hONE6czwuiqUrrRllPRru9oRtY18aIZspfHZ70Nr 2o3sudaAVSeAgIkLNRcBLg+jFQ0MS8lnNRgQ3VNhJQB94+aKlYq01Hp X-Developer-Key: i=petri.karhula@novatron.fi; a=ed25519; pk=LRYJ99jPPsHJwdJEPkqlmzAMqo6oyw7I421aHEfDp7o= X-Endpoint-Received: by B4 Relay for petri.karhula@novatron.fi/20251118 with auth_id=567 X-Original-From: Petri Karhula Reply-To: petri.karhula@novatron.fi From: Petri Karhula 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 --- 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[] =3D { { .name =3D "cgbc-i2c", .id =3D 1 }, { .name =3D "cgbc-i2c", .id =3D 2 }, { .name =3D "cgbc-hwmon" }, + { .name =3D "cgbc-backlight" }, }; =20 static int cgbc_map(struct cgbc_device_data *cgbc) --=20 2.34.1