[PATCH v2 1/2] Revert "leds: Only descend into leds directory when CONFIG_NEW_LEDS is set"

2024-02-16 Thread Duje Mihanović
This reverts commit b1ae40a5db6191c42e2e45d726407096f030ee08.

The ExpressWire library introduced in commit 25ae5f5f4168 ("leds:
Introduce ExpressWire library") does not depend on NEW_LEDS, but without
this revert it would never get compiled if NEW_LEDS is not enabled.
Revert this commit to allow the library to be compiled.

Link: 
https://lore.kernel.org/2cacd8dc-6150-4aa2-af9e-830a202fb...@app.fastmail.com
Suggested-by: Arnd Bergmann 
Reviewed-by: Daniel Thompson 
Signed-off-by: Duje Mihanović 
---
Changes in v2:
- Add "commit" before hash to silence checkpatch
---
 drivers/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/Makefile b/drivers/Makefile
index 37fd6ce3bd7f..3bf5cab4b451 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -135,7 +135,7 @@ obj-$(CONFIG_CPU_IDLE)  += cpuidle/
 obj-y  += mmc/
 obj-y  += ufs/
 obj-$(CONFIG_MEMSTICK) += memstick/
-obj-$(CONFIG_NEW_LEDS) += leds/
+obj-y  += leds/
 obj-$(CONFIG_INFINIBAND)   += infiniband/
 obj-y  += firmware/
 obj-$(CONFIG_CRYPTO)   += crypto/

-- 
2.43.1




[PATCH v2 0/2] leds: expresswire: Fix dependencies

2024-02-16 Thread Duje Mihanović
LEDS_EXPRESSWIRE does not depend on NEW_LEDS in practice but still does
in Kconfig. Fix up its Kconfig entry to reflect this and fix a Kconfig
warning.

Signed-off-by: Duje Mihanović 
---
Changes in v2:
- Fix checkpatch errors
- Pull Daniel's Reviewed-by
- Link to v1: 
https://lore.kernel.org/r/20240212-expresswire-deps-v1-0-685ad10cd...@skole.hr

---
Duje Mihanović (2):
  Revert "leds: Only descend into leds directory when CONFIG_NEW_LEDS is 
set"
  leds: expresswire: don't depend on NEW_LEDS

 drivers/Makefile |  2 +-
 drivers/leds/Kconfig | 10 ++
 2 files changed, 7 insertions(+), 5 deletions(-)
---
base-commit: ae00c445390b349e070a64dc62f08aa878db7248
change-id: 20240212-expresswire-deps-e895e8da8ea3

Best regards,
-- 
Duje Mihanović 




[PATCH v2 2/2] leds: expresswire: don't depend on NEW_LEDS

2024-02-16 Thread Duje Mihanović
The ExpressWire library does not depend on NEW_LEDS and selecting it
from a subsystem other than LEDs may cause Kconfig warnings:

WARNING: unmet direct dependencies detected for LEDS_EXPRESSWIRE
  Depends on [n]: NEW_LEDS [=n] && GPIOLIB [=y]
  Selected by [y]:
  - BACKLIGHT_KTD2801 [=y] && HAS_IOMEM [=y] && BACKLIGHT_CLASS_DEVICE [=y]

Move it out of the "if NEW_LEDS" block to allow selection from other
subsystems (in particular backlight) without raising this warning.

Reported-by: Arnd Bergmann 
Closes: https://lore.kernel.org/20240212111819.936815-1-a...@kernel.org
Reported-by: kernel test robot 
Closes: 
https://lore.kernel.org/oe-kbuild-all/202402161410.ig9i4odj-...@intel.com/
Suggested-by: Daniel Thompson 
Fixes: 25ae5f5f4168 ("leds: Introduce ExpressWire library")
Reviewed-by: Daniel Thompson 
Signed-off-by: Duje Mihanović 
---
Changes in v2:
- Change Link: to Closes: to silence checkpatch
- Add kernel test robot's error report
---
 drivers/leds/Kconfig | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 52328d295b4e..66998b938ed3 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -6,6 +6,12 @@ config LEDS_GPIO_REGISTER
  As this function is used by arch code it must not be compiled as a
  module.
 
+# This library does not depend on NEW_LEDS and must be independent so it can be
+# selected from other subsystems (specifically backlight).
+config LEDS_EXPRESSWIRE
+   bool
+   depends on GPIOLIB
+
 menuconfig NEW_LEDS
bool "LED Support"
help
@@ -186,10 +192,6 @@ config LEDS_EL15203000
  To compile this driver as a module, choose M here: the module
  will be called leds-el15203000.
 
-config LEDS_EXPRESSWIRE
-   bool
-   depends on GPIOLIB
-
 config LEDS_TURRIS_OMNIA
tristate "LED support for CZ.NIC's Turris Omnia"
depends on LEDS_CLASS_MULTICOLOR

-- 
2.43.1




Re: [PATCH] backlight: ktd2801: depend on GPIOLIB

2024-02-15 Thread Duje Mihanović
On Thursday, February 15, 2024 2:31:37 PM CET Linus Walleij wrote:
> On Tue, Feb 13, 2024 at 7:13 PM Duje Mihanović  
wrote:
> > LEDS_EXPRESSWIRE depends on GPIOLIB, and so must anything selecting it:
> > 
> > WARNING: unmet direct dependencies detected for LEDS_EXPRESSWIRE
> > 
> >   Depends on [n]: NEW_LEDS [=y] && GPIOLIB [=n]
> >   Selected by [m]:
> >   - BACKLIGHT_KTD2801 [=m] && HAS_IOMEM [=y] && BACKLIGHT_CLASS_DEVICE 
[=m]
> > 
> > Fixes: 66c76c1cd984 ("backlight: Add Kinetic KTD2801 backlight support")
> > Signed-off-by: Duje Mihanović 
> 
> Acked-by: Linus Walleij 
> 
> Technically you can also select GPIOLIB, because it is available on
> all platforms, so it may be easier for users, but then you never know
> which GPIOs you get in practice.

Now that I think of it, wouldn't that be the better solution? I opted for 
"depends on" only because Arnd did the same in his KTD2692 patch, but if 
select is better (and it seems to be for users) then I'd go for that in both 
patches.

Regards,
-- 
Duje





Re: [PATCH 2/2] leds: expresswire: don't depend on NEW_LEDS

2024-02-15 Thread Duje Mihanović
On Thursday, February 15, 2024 12:48:31 PM CET Daniel Thompson wrote:
> On Mon, Feb 12, 2024 at 09:03:26PM +0100, Duje Mihanović wrote:
...
> > Link: https://lore.kernel.org/20240212111819.936815-1-a...@kernel.org
> > Reported-by: Arnd Bergmann 
> > Suggested-by: Daniel Thompson 
> > Fixes: 25ae5f5f4168 ("leds: Introduce ExpressWire library")
> > Signed-off-by: Duje Mihanović 
> 
> Reviewed-by: Daniel Thompson 

I must note that checkpatch actually complains about this patch (I may have 
hit send too early):

0002-leds-expresswire-don-t-depend-on-NEW_LEDS.patch

WARNING: Reported-by: should be immediately followed by Closes: with a URL to 
the report
#21: 
Reported-by: Arnd Bergmann 
Suggested-by: Daniel Thompson 

total: 0 errors, 1 warnings, 22 lines checked

Could that Link: above be transformed into a Closes:?

Regards,
-- 
Duje





[PATCH] backlight: ktd2801: depend on GPIOLIB

2024-02-13 Thread Duje Mihanović
LEDS_EXPRESSWIRE depends on GPIOLIB, and so must anything selecting it:

WARNING: unmet direct dependencies detected for LEDS_EXPRESSWIRE
  Depends on [n]: NEW_LEDS [=y] && GPIOLIB [=n]
  Selected by [m]:
  - BACKLIGHT_KTD2801 [=m] && HAS_IOMEM [=y] && BACKLIGHT_CLASS_DEVICE [=m]

Fixes: 66c76c1cd984 ("backlight: Add Kinetic KTD2801 backlight support")
Signed-off-by: Duje Mihanović 
---
 drivers/video/backlight/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 230bca07b09d..8bd88017d945 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -185,6 +185,7 @@ config BACKLIGHT_KTD253
 
 config BACKLIGHT_KTD2801
tristate "Backlight Driver for Kinetic KTD2801"
+   depends on GPIOLIB
select LEDS_EXPRESSWIRE
help
  Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire

---
base-commit: 46d4e2eb58e14c8935fa0e27d16d4c62ef82849a
change-id: 20240213-ktd2801-deps-0f571c09b824

Best regards,
-- 
Duje Mihanović 




[PATCH 0/2] leds: expresswire: Fix dependencies

2024-02-12 Thread Duje Mihanović
LEDS_EXPRESSWIRE does not depend on NEW_LEDS in practice but still does
in Kconfig. Fix up its Kconfig entry to reflect this and fix a Kconfig
warning.

Signed-off-by: Duje Mihanović 
---
Duje Mihanović (2):
  Revert "leds: Only descend into leds directory when CONFIG_NEW_LEDS is 
set"
  leds: expresswire: don't depend on NEW_LEDS

 drivers/Makefile |  2 +-
 drivers/leds/Kconfig | 10 ++
 2 files changed, 7 insertions(+), 5 deletions(-)
---
base-commit: ae00c445390b349e070a64dc62f08aa878db7248
change-id: 20240212-expresswire-deps-e895e8da8ea3

Best regards,
-- 
Duje Mihanović 




[PATCH 1/2] Revert "leds: Only descend into leds directory when CONFIG_NEW_LEDS is set"

2024-02-12 Thread Duje Mihanović
This reverts commit b1ae40a5db6191c42e2e45d726407096f030ee08.

The ExpressWire library introduced in 25ae5f5f4168 ("leds: Introduce
ExpressWire library") does not depend on NEW_LEDS, but without this
revert it would never get compiled if NEW_LEDS is not enabled. Revert
this commit to allow the library to be compiled.

Link: 
https://lore.kernel.org/2cacd8dc-6150-4aa2-af9e-830a202fb...@app.fastmail.com
Suggested-by: Arnd Bergmann 
Signed-off-by: Duje Mihanović 
---
 drivers/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/Makefile b/drivers/Makefile
index 37fd6ce3bd7f..3bf5cab4b451 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -135,7 +135,7 @@ obj-$(CONFIG_CPU_IDLE)  += cpuidle/
 obj-y  += mmc/
 obj-y  += ufs/
 obj-$(CONFIG_MEMSTICK) += memstick/
-obj-$(CONFIG_NEW_LEDS) += leds/
+obj-y  += leds/
 obj-$(CONFIG_INFINIBAND)   += infiniband/
 obj-y  += firmware/
 obj-$(CONFIG_CRYPTO)   += crypto/

-- 
2.43.1




[PATCH 2/2] leds: expresswire: don't depend on NEW_LEDS

2024-02-12 Thread Duje Mihanović
The ExpressWire library does not depend on NEW_LEDS and selecting it
from a subsystem other than LEDs may cause Kconfig warnings:

WARNING: unmet direct dependencies detected for LEDS_EXPRESSWIRE
  Depends on [n]: NEW_LEDS [=n] && GPIOLIB [=y]
  Selected by [y]:
  - BACKLIGHT_KTD2801 [=y] && HAS_IOMEM [=y] && BACKLIGHT_CLASS_DEVICE [=y]

Move it out of the "if NEW_LEDS" block to allow selection from other
subsystems (in particular backlight) without raising this warning.

Link: https://lore.kernel.org/20240212111819.936815-1-a...@kernel.org
Reported-by: Arnd Bergmann 
Suggested-by: Daniel Thompson 
Fixes: 25ae5f5f4168 ("leds: Introduce ExpressWire library")
Signed-off-by: Duje Mihanović 
---
 drivers/leds/Kconfig | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 52328d295b4e..66998b938ed3 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -6,6 +6,12 @@ config LEDS_GPIO_REGISTER
  As this function is used by arch code it must not be compiled as a
  module.
 
+# This library does not depend on NEW_LEDS and must be independent so it can be
+# selected from other subsystems (specifically backlight).
+config LEDS_EXPRESSWIRE
+   bool
+   depends on GPIOLIB
+
 menuconfig NEW_LEDS
bool "LED Support"
help
@@ -186,10 +192,6 @@ config LEDS_EL15203000
  To compile this driver as a module, choose M here: the module
  will be called leds-el15203000.
 
-config LEDS_EXPRESSWIRE
-   bool
-   depends on GPIOLIB
-
 config LEDS_TURRIS_OMNIA
tristate "LED support for CZ.NIC's Turris Omnia"
depends on LEDS_CLASS_MULTICOLOR

-- 
2.43.1




Re: [PATCH] backlight: ktd2801: fix LED dependency

2024-02-12 Thread Duje Mihanović
On Monday, February 12, 2024 1:44:28 PM CET Daniel Thompson wrote:
> On Mon, Feb 12, 2024 at 12:18:12PM +0100, Arnd Bergmann wrote:
> > From: Arnd Bergmann 
> > 
> > The new backlight driver unconditionally selects LEDS_EXPRESSWIRE, which
> > is in a different subsystem that may be disabled here:
> > 
> > WARNING: unmet direct dependencies detected for LEDS_EXPRESSWIRE
> > 
> >   Depends on [n]: NEW_LEDS [=n] && GPIOLIB [=y]
> >   Selected by [y]:
> >   - BACKLIGHT_KTD2801 [=y] && HAS_IOMEM [=y] && BACKLIGHT_CLASS_DEVICE 
[=y]
> > 
> > Change the select to depends, to ensure the indirect dependency is
> > met as well even when LED support is disabled.
> > 
> > Fixes: 66c76c1cd984 ("backlight: Add Kinetic KTD2801 backlight support")
> > Signed-off-by: Arnd Bergmann 
> > ---
> > 
> >  drivers/video/backlight/Kconfig | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/video/backlight/Kconfig
> > b/drivers/video/backlight/Kconfig index 230bca07b09d..f83f9ef037fc 100644
> > --- a/drivers/video/backlight/Kconfig
> > +++ b/drivers/video/backlight/Kconfig
> > @@ -185,7 +185,7 @@ config BACKLIGHT_KTD253
> > 
> >  config BACKLIGHT_KTD2801
> >  
> > tristate "Backlight Driver for Kinetic KTD2801"
> > 
> > -   select LEDS_EXPRESSWIRE
> > +   depends on LEDS_EXPRESSWIRE
> 
> As far as I can tell this resolves the warning by making it impossible
> to enable BACKLIGHT_KTD2801 unless a largely unrelated driver
> (LEDS_KTD2692) is also enabled!
> 
> A better way to resolve this problem might be to eliminate the NEW_LEDS
> dependency entirely:

I believe this would be the best thing to do here. Making LEDS_EXPRESSWIRE 
user selectable doesn't make much sense to me as the library is rather low-
level (a quick grep turns up BTREE as an example of something similar) and IMO 
the GPIOLIB dependency should be handled by LEDS_EXPRESSWIRE as it's the one 
actually using the GPIO interface (except maybe for KTD2692 as it has some 
extra GPIOs not present in the other one and thus handles them itself).

Regards,
-- 
Duje





[PATCH] backlight: ktd2801: make timing struct static

2024-02-10 Thread Duje Mihanović
The struct containing the KTD2801 timing can be made static as it's not
referenced outside the KTD2801 driver. Do this to prevent sparse
complaints.

Reported-by: kernel test robot 
Closes: 
https://lore.kernel.org/oe-kbuild-all/202402100625.m0rkjhmh-...@intel.com/
Signed-off-by: Duje Mihanović 
---
 drivers/video/backlight/ktd2801-backlight.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/backlight/ktd2801-backlight.c 
b/drivers/video/backlight/ktd2801-backlight.c
index c020acff40f1..d295c2766025 100644
--- a/drivers/video/backlight/ktd2801-backlight.c
+++ b/drivers/video/backlight/ktd2801-backlight.c
@@ -13,7 +13,7 @@
 #define KTD2801_MAX_BRIGHTNESS 255
 
 /* These values have been extracted from Samsung's driver. */
-const struct expresswire_timing ktd2801_timing = {
+static const struct expresswire_timing ktd2801_timing = {
.poweroff_us = 2600,
.detect_delay_us = 150,
.detect_us = 270,

---
base-commit: 66c76c1cd984c14660453dfa2118014817924375
change-id: 20240210-ktd2801-static-e1c23d19600c

Best regards,
-- 
Duje Mihanović 




[PATCH v5 3/4] dt-bindings: backlight: add Kinetic KTD2801 binding

2024-01-25 Thread Duje Mihanović
KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte.
The brightness can be set using PWM or the ExpressWire protocol. Add
a DT binding for the KTD2801.

Reviewed-by: Krzysztof Kozlowski 
Reviewed-by: Linus Walleij 
Reviewed-by: Daniel Thompson 
Signed-off-by: Duje Mihanović 
---
 .../bindings/leds/backlight/kinetic,ktd2801.yaml   | 46 ++
 1 file changed, 46 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml 
b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
new file mode 100644
index ..b005065e0f48
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/backlight/kinetic,ktd2801.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Kinetic Technologies KTD2801 one-wire backlight
+
+maintainers:
+  - Duje Mihanović 
+
+description: |
+  The Kinetic Technologies KTD2801 is a LED backlight driver controlled
+  by a single GPIO line. The driver can be controlled with a PWM signal
+  or by pulsing the GPIO line to set the backlight level. This is called
+  "ExpressWire".
+
+allOf:
+  - $ref: common.yaml#
+
+properties:
+  compatible:
+const: kinetic,ktd2801
+
+  ctrl-gpios:
+maxItems: 1
+
+  default-brightness: true
+  max-brightness: true
+
+required:
+  - compatible
+  - ctrl-gpios
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+
+backlight {
+compatible = "kinetic,ktd2801";
+ctrl-gpios = <&gpio 97 GPIO_ACTIVE_HIGH>;
+max-brightness = <210>;
+default-brightness = <100>;
+};

-- 
2.43.0




[PATCH v5 4/4] backlight: Add Kinetic KTD2801 backlight support

2024-01-25 Thread Duje Mihanović
KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte.
The brightness can be set using PWM or the ExpressWire protocol. Add
support for the KTD2801.

Reviewed-by: Linus Walleij 
Reviewed-by: Daniel Thompson 
Signed-off-by: Duje Mihanović 
---
 MAINTAINERS |   6 ++
 drivers/video/backlight/Kconfig |   7 ++
 drivers/video/backlight/Makefile|   1 +
 drivers/video/backlight/ktd2801-backlight.c | 128 
 4 files changed, 142 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index e1c83e0e837a..01cd1a460907 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12052,6 +12052,12 @@ S: Maintained
 F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml
 F: drivers/video/backlight/ktd253-backlight.c
 
+KTD2801 BACKLIGHT DRIVER
+M: Duje Mihanović 
+S: Maintained
+F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
+F: drivers/video/backlight/ktd2801-backlight.c
+
 KTEST
 M: Steven Rostedt 
 M: John Hawley 
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index ea2d0d69bd8c..230bca07b09d 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -183,6 +183,13 @@ config BACKLIGHT_KTD253
  which is a 1-wire GPIO-controlled backlight found in some mobile
  phones.
 
+config BACKLIGHT_KTD2801
+   tristate "Backlight Driver for Kinetic KTD2801"
+   select LEDS_EXPRESSWIRE
+   help
+ Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire
+ GPIO-controlled backlight found in Samsung Galaxy Core Prime VE LTE.
+
 config BACKLIGHT_KTZ8866
tristate "Backlight Driver for Kinetic KTZ8866"
depends on I2C
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 06966cb20459..8d2cb252042d 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -34,6 +34,7 @@ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
 obj-$(CONFIG_BACKLIGHT_HP700)  += jornada720_bl.o
 obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o
 obj-$(CONFIG_BACKLIGHT_KTD253) += ktd253-backlight.o
+obj-$(CONFIG_BACKLIGHT_KTD2801)+= ktd2801-backlight.o
 obj-$(CONFIG_BACKLIGHT_KTZ8866)+= ktz8866.o
 obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3630A)+= lm3630a_bl.o
diff --git a/drivers/video/backlight/ktd2801-backlight.c 
b/drivers/video/backlight/ktd2801-backlight.c
new file mode 100644
index ..c020acff40f1
--- /dev/null
+++ b/drivers/video/backlight/ktd2801-backlight.c
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Datasheet:
+ * https://www.kinet-ic.com/uploads/web/KTD2801/KTD2801-04b.pdf
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define KTD2801_DEFAULT_BRIGHTNESS 100
+#define KTD2801_MAX_BRIGHTNESS 255
+
+/* These values have been extracted from Samsung's driver. */
+const struct expresswire_timing ktd2801_timing = {
+   .poweroff_us = 2600,
+   .detect_delay_us = 150,
+   .detect_us = 270,
+   .data_start_us = 5,
+   .short_bitset_us = 5,
+   .long_bitset_us = 15,
+   .end_of_data_low_us = 10,
+   .end_of_data_high_us = 350
+};
+
+struct ktd2801_backlight {
+   struct expresswire_common_props props;
+   struct backlight_device *bd;
+   bool was_on;
+};
+
+static int ktd2801_update_status(struct backlight_device *bd)
+{
+   struct ktd2801_backlight *ktd2801 = bl_get_data(bd);
+   u8 brightness = (u8) backlight_get_brightness(bd);
+
+   if (backlight_is_blank(bd)) {
+   expresswire_power_off(&ktd2801->props);
+   ktd2801->was_on = false;
+   return 0;
+   }
+
+   if (!ktd2801->was_on) {
+   expresswire_enable(&ktd2801->props);
+   ktd2801->was_on = true;
+   }
+
+   expresswire_write_u8(&ktd2801->props, brightness);
+
+   return 0;
+}
+
+static const struct backlight_ops ktd2801_backlight_ops = {
+   .update_status = ktd2801_update_status,
+};
+
+static int ktd2801_backlight_probe(struct platform_device *pdev)
+{
+   struct device *dev = &pdev->dev;
+   struct backlight_device *bd;
+   struct ktd2801_backlight *ktd2801;
+   u32 brightness, max_brightness;
+   int ret;
+
+   ktd2801 = devm_kzalloc(dev, sizeof(*ktd2801), GFP_KERNEL);
+   if (!ktd2801)
+   return -ENOMEM;
+   ktd2801->was_on = true;
+   ktd2801->props.timing = ktd2801_timing;
+
+   ret = device_property_read_u32(dev, "max-brightness", &max_brightness);
+   if (ret)
+   max_brightness = KTD2801_MAX_BRIGHTNESS;
+   if (max_brightness > KTD2801_MAX_BRIGHTNESS) {
+

[PATCH v5 0/4] Kinetic ExpressWire library and KTD2801 backlight driver

2024-01-25 Thread Duje Mihanović
Hello,

This series adds support for the Kinetic KTD2801 LED backlight driver
IC found in samsung,coreprimevelte.

Support is already upstream for the somewhat similar KTD2692 flash
driver, and this series since v3 also moves its ExpressWire code into a
separate library and converts the KTD2692 driver to use that library.

Signed-off-by: Duje Mihanović 
---
Changes in v5:
- Split up ExpressWire library and KTD2692 conversion
- Rebase on v6.8-rc1
- Link to v4: 
https://lore.kernel.org/r/20240122-ktd2801-v4-0-33c986a3e...@skole.hr

Changes in v4:
- Drop 'extern' keywords in leds-expresswire.h
- Add 'expresswire_write_u8' to leds-expresswire.c and use it in the two
  drivers
- Move GPIOLIB dependency to LEDS_EXPRESSWIRE instead of letting clients
  handle it
- Drop time constant macros
- Drop delay.h include in ktd2692
- Drop bits.h and delay.h includes in ktd2801
- Link to v3: 
https://lore.kernel.org/r/20240120-ktd2801-v3-0-fe2cbafff...@skole.hr

Changes in v3:
- Split ExpressWire code into library (and convert KTD2692 to use this
  library)
- Rewrite commit messages
- Add link to datasheet
- Drop of.h include in ktd2801
- Use _cansleep and usleep_range when powering off
- Clean up bitwise operation in update_status
- Link to v2: 
https://lore.kernel.org/r/20240118-ktd2801-v2-0-425cf32e0...@skole.hr

Changes in v2:
- Address maintainer comments:
  - Drop MODULE_ALIAS
  - Rename enable-gpios to ctrl-gpios
  - Rename ktd2801_backlight->desc to ktd2801_backlight->gpiod
  - Give time constants more descriptive names and note their origins in
Samsung driver
  - Convert to GPIO_ACTIVE_HIGH
- Update trailers
- Link to v1: 
https://lore.kernel.org/r/20231005-ktd2801-v1-0-43cd85b06...@skole.hr

---
Duje Mihanović (4):
  leds: introduce ExpressWire library
  leds: ktd2692: convert to use ExpressWire library
  dt-bindings: backlight: add Kinetic KTD2801 binding
  backlight: Add Kinetic KTD2801 backlight support

 .../bindings/leds/backlight/kinetic,ktd2801.yaml   |  46 
 MAINTAINERS|  13 +++
 drivers/leds/Kconfig   |   4 +
 drivers/leds/Makefile  |   3 +
 drivers/leds/flash/Kconfig |   2 +-
 drivers/leds/flash/leds-ktd2692.c  | 116 +--
 drivers/leds/leds-expresswire.c|  68 +++
 drivers/video/backlight/Kconfig|   7 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/ktd2801-backlight.c| 128 +
 include/linux/leds-expresswire.h   |  36 ++
 11 files changed, 334 insertions(+), 90 deletions(-)
---
base-commit: 6613476e225e090cc9aad49be7fa504e290dd33d
change-id: 20231004-ktd2801-0f3883cb59d0

Best regards,
-- 
Duje Mihanović 




[PATCH v5 2/4] leds: ktd2692: convert to use ExpressWire library

2024-01-25 Thread Duje Mihanović
The KTD2692 uses the ExpressWire protocol implemented in the newly
introduced ExpressWire library. Convert the driver to use the library.

Suggested-by: Daniel Thompson 
Reviewed-by: Linus Walleij 
Reviewed-by: Daniel Thompson 
Signed-off-by: Duje Mihanović 
---
 drivers/leds/flash/Kconfig|   2 +-
 drivers/leds/flash/leds-ktd2692.c | 116 +-
 2 files changed, 28 insertions(+), 90 deletions(-)

diff --git a/drivers/leds/flash/Kconfig b/drivers/leds/flash/Kconfig
index 4e08dbc05709..a0fb755b58dc 100644
--- a/drivers/leds/flash/Kconfig
+++ b/drivers/leds/flash/Kconfig
@@ -23,7 +23,7 @@ config LEDS_AS3645A
 config LEDS_KTD2692
tristate "LED support for Kinetic KTD2692 flash LED controller"
depends on OF
-   depends on GPIOLIB || COMPILE_TEST
+   select LEDS_EXPRESSWIRE
help
  This option enables support for Kinetic KTD2692 LED flash connected
  through ExpressWire interface.
diff --git a/drivers/leds/flash/leds-ktd2692.c 
b/drivers/leds/flash/leds-ktd2692.c
index 598eee5daa52..7bb0aa2753e3 100644
--- a/drivers/leds/flash/leds-ktd2692.c
+++ b/drivers/leds/flash/leds-ktd2692.c
@@ -6,9 +6,9 @@
  * Ingi Kim 
  */
 
-#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -37,22 +37,9 @@
 #define KTD2692_REG_FLASH_CURRENT_BASE 0x80
 #define KTD2692_REG_MODE_BASE  0xA0
 
-/* Set bit coding time for expresswire interface */
-#define KTD2692_TIME_RESET_US  700
-#define KTD2692_TIME_DATA_START_TIME_US10
-#define KTD2692_TIME_HIGH_END_OF_DATA_US   350
-#define KTD2692_TIME_LOW_END_OF_DATA_US10
-#define KTD2692_TIME_SHORT_BITSET_US   4
-#define KTD2692_TIME_LONG_BITSET_US12
-
 /* KTD2692 default length of name */
 #define KTD2692_NAME_LENGTH20
 
-enum ktd2692_bitset {
-   KTD2692_LOW = 0,
-   KTD2692_HIGH,
-};
-
 /* Movie / Flash Mode Control */
 enum ktd2692_led_mode {
KTD2692_MODE_DISABLE = 0,   /* default */
@@ -71,7 +58,19 @@ struct ktd2692_led_config_data {
enum led_brightness max_brightness;
 };
 
+const struct expresswire_timing ktd2692_timing = {
+   .poweroff_us = 700,
+   .data_start_us = 10,
+   .end_of_data_low_us = 10,
+   .end_of_data_high_us = 350,
+   .short_bitset_us = 4,
+   .long_bitset_us = 12
+};
+
 struct ktd2692_context {
+   /* Common ExpressWire properties (ctrl GPIO and timing) */
+   struct expresswire_common_props props;
+
/* Related LED Flash class device */
struct led_classdev_flash fled_cdev;
 
@@ -80,7 +79,6 @@ struct ktd2692_context {
struct regulator *regulator;
 
struct gpio_desc *aux_gpio;
-   struct gpio_desc *ctrl_gpio;
 
enum ktd2692_led_mode mode;
enum led_brightness torch_brightness;
@@ -92,67 +90,6 @@ static struct ktd2692_context *fled_cdev_to_led(
return container_of(fled_cdev, struct ktd2692_context, fled_cdev);
 }
 
-static void ktd2692_expresswire_start(struct ktd2692_context *led)
-{
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH);
-   udelay(KTD2692_TIME_DATA_START_TIME_US);
-}
-
-static void ktd2692_expresswire_reset(struct ktd2692_context *led)
-{
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW);
-   udelay(KTD2692_TIME_RESET_US);
-}
-
-static void ktd2692_expresswire_end(struct ktd2692_context *led)
-{
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW);
-   udelay(KTD2692_TIME_LOW_END_OF_DATA_US);
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH);
-   udelay(KTD2692_TIME_HIGH_END_OF_DATA_US);
-}
-
-static void ktd2692_expresswire_set_bit(struct ktd2692_context *led, bool bit)
-{
-   /*
-* The Low Bit(0) and High Bit(1) is based on a time detection
-* algorithm between time low and time high
-* Time_(L_LB) : Low time of the Low Bit(0)
-* Time_(H_LB) : High time of the LOW Bit(0)
-* Time_(L_HB) : Low time of the High Bit(1)
-* Time_(H_HB) : High time of the High Bit(1)
-*
-* It can be simplified to:
-* Low Bit(0) : 2 * Time_(H_LB) < Time_(L_LB)
-* High Bit(1) : 2 * Time_(L_HB) < Time_(H_HB)
-* HIGH  ___   _.. ____
-*  |_||_..  || |__|
-* LOW 
-*  [  Low Bit (0) ] [  High Bit(1) ]
-*/
-   if (bit) {
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW);
-   udelay(KTD2692_TIME_SHORT_BITSET_US);
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH);
-   udelay(KTD2692_TIME_LONG_BITSET_US);
-   } else {
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW);
-   udelay(KTD2692_TIME_LONG_BITSET_US);
-   gpiod_directio

[PATCH v5 1/4] leds: introduce ExpressWire library

2024-01-25 Thread Duje Mihanović
The ExpressWire protocol is shared between at least KTD2692 and KTD2801
with slight differences such as timings and the former not having a
defined set of pulses for enabling the protocol (possibly because it
does not support PWM unlike KTD2801). Despite these differences the
ExpressWire handling code can be shared between the two, so in
preparation for adding KTD2801 support introduce a library implementing
this protocol.

Suggested-by: Daniel Thompson 
Reviewed-by: Linus Walleij 
Reviewed-by: Daniel Thompson 
Signed-off-by: Duje Mihanović 
---
 MAINTAINERS  |  7 +
 drivers/leds/Kconfig |  4 +++
 drivers/leds/Makefile|  3 ++
 drivers/leds/leds-expresswire.c  | 68 
 include/linux/leds-expresswire.h | 36 +
 5 files changed, 118 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 8d1052fa6a69..e1c83e0e837a 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7979,6 +7979,13 @@ S:   Maintained
 T: git git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat.git
 F: fs/exfat/
 
+EXPRESSWIRE PROTOCOL LIBRARY
+M: Duje Mihanović 
+L: linux-l...@vger.kernel.org
+S: Maintained
+F: drivers/leds/leds-expresswire.c
+F: include/linux/leds-expresswire.h
+
 EXT2 FILE SYSTEM
 M: Jan Kara 
 L: linux-e...@vger.kernel.org
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index d721b254e1e4..64bb2de237e9 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -186,6 +186,10 @@ config LEDS_EL15203000
  To compile this driver as a module, choose M here: the module
  will be called leds-el15203000.
 
+config LEDS_EXPRESSWIRE
+   bool
+   depends on GPIOLIB
+
 config LEDS_TURRIS_OMNIA
tristate "LED support for CZ.NIC's Turris Omnia"
depends on LEDS_CLASS_MULTICOLOR
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index ce07dc295ff0..effdfc6f1e95 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -91,6 +91,9 @@ obj-$(CONFIG_LEDS_WM831X_STATUS)  += leds-wm831x-status.o
 obj-$(CONFIG_LEDS_WM8350)  += leds-wm8350.o
 obj-$(CONFIG_LEDS_WRAP)+= leds-wrap.o
 
+# Kinetic ExpressWire Protocol
+obj-$(CONFIG_LEDS_EXPRESSWIRE) += leds-expresswire.o
+
 # LED SPI Drivers
 obj-$(CONFIG_LEDS_CR0014114)   += leds-cr0014114.o
 obj-$(CONFIG_LEDS_DAC124S085)  += leds-dac124s085.o
diff --git a/drivers/leds/leds-expresswire.c b/drivers/leds/leds-expresswire.c
new file mode 100644
index ..89e147b0e019
--- /dev/null
+++ b/drivers/leds/leds-expresswire.c
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Shared library for Kinetic's ExpressWire protocol.
+ * This protocol works by pulsing the ExpressWire IC's control GPIO.
+ * ktd2692 and ktd2801 are known to use this protocol.
+ */
+
+#include 
+#include 
+#include 
+
+void expresswire_power_off(struct expresswire_common_props *props)
+{
+   gpiod_set_value_cansleep(props->ctrl_gpio, 0);
+   usleep_range(props->timing.poweroff_us, props->timing.poweroff_us * 2);
+}
+EXPORT_SYMBOL_NS_GPL(expresswire_power_off, EXPRESSWIRE);
+
+void expresswire_enable(struct expresswire_common_props *props)
+{
+   gpiod_set_value(props->ctrl_gpio, 1);
+   udelay(props->timing.detect_delay_us);
+   gpiod_set_value(props->ctrl_gpio, 0);
+   udelay(props->timing.detect_us);
+   gpiod_set_value(props->ctrl_gpio, 1);
+}
+EXPORT_SYMBOL_NS_GPL(expresswire_enable, EXPRESSWIRE);
+
+void expresswire_start(struct expresswire_common_props *props)
+{
+   gpiod_set_value(props->ctrl_gpio, 1);
+   udelay(props->timing.data_start_us);
+}
+EXPORT_SYMBOL_NS_GPL(expresswire_start, EXPRESSWIRE);
+
+void expresswire_end(struct expresswire_common_props *props)
+{
+   gpiod_set_value(props->ctrl_gpio, 0);
+   udelay(props->timing.end_of_data_low_us);
+   gpiod_set_value(props->ctrl_gpio, 1);
+   udelay(props->timing.end_of_data_high_us);
+}
+EXPORT_SYMBOL_NS_GPL(expresswire_end, EXPRESSWIRE);
+
+void expresswire_set_bit(struct expresswire_common_props *props, bool bit)
+{
+   if (bit) {
+   gpiod_set_value(props->ctrl_gpio, 0);
+   udelay(props->timing.short_bitset_us);
+   gpiod_set_value(props->ctrl_gpio, 1);
+   udelay(props->timing.long_bitset_us);
+   } else {
+   gpiod_set_value(props->ctrl_gpio, 0);
+   udelay(props->timing.long_bitset_us);
+   gpiod_set_value(props->ctrl_gpio, 1);
+   udelay(props->timing.short_bitset_us);
+   }
+}
+EXPORT_SYMBOL_NS_GPL(expresswire_set_bit, EXPRESSWIRE);
+
+void expresswire_write_u8(struct expresswire_common_props *props, u8 val)
+{
+   expresswire_start(props);
+   for (int i = 7; i >= 0; i--)
+   expr

[PATCH v4 1/3] leds: ktd2692: move ExpressWire code to library

2024-01-22 Thread Duje Mihanović
The ExpressWire protocol is shared between at least KTD2692 and KTD2801
with slight differences such as timings and the former not having a
defined set of pulses for enabling the protocol (possibly because it
does not support PWM unlike KTD2801). Despite these differences the
ExpressWire handling code can be shared between the two, so move it into
a library in preparation for adding KTD2801 support.

Suggested-by: Daniel Thompson 
Reviewed-by: Linus Walleij 
Signed-off-by: Duje Mihanović 
---
 MAINTAINERS   |   7 +++
 drivers/leds/Kconfig  |   4 ++
 drivers/leds/Makefile |   3 +
 drivers/leds/flash/Kconfig|   2 +-
 drivers/leds/flash/leds-ktd2692.c | 116 +-
 drivers/leds/leds-expresswire.c   |  68 ++
 include/linux/leds-expresswire.h  |  36 
 7 files changed, 146 insertions(+), 90 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index a7c4cf8201e0..87b12d2448a0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7902,6 +7902,13 @@ S:   Maintained
 T: git git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat.git
 F: fs/exfat/
 
+EXPRESSWIRE PROTOCOL LIBRARY
+M: Duje Mihanović 
+L: linux-l...@vger.kernel.org
+S: Maintained
+F: drivers/leds/leds-expresswire.c
+F: include/linux/leds-expresswire.h
+
 EXT2 FILE SYSTEM
 M: Jan Kara 
 L: linux-e...@vger.kernel.org
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 6292fddcc55c..15e1c3c238ab 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -181,6 +181,10 @@ config LEDS_EL15203000
  To compile this driver as a module, choose M here: the module
  will be called leds-el15203000.
 
+config LEDS_EXPRESSWIRE
+   bool
+   depends on GPIOLIB
+
 config LEDS_TURRIS_OMNIA
tristate "LED support for CZ.NIC's Turris Omnia"
depends on LEDS_CLASS_MULTICOLOR
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index d7348e8bc019..a63a07d01c6f 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -89,6 +89,9 @@ obj-$(CONFIG_LEDS_WM831X_STATUS)  += leds-wm831x-status.o
 obj-$(CONFIG_LEDS_WM8350)  += leds-wm8350.o
 obj-$(CONFIG_LEDS_WRAP)+= leds-wrap.o
 
+# Kinetic ExpressWire Protocol
+obj-$(CONFIG_LEDS_EXPRESSWIRE) += leds-expresswire.o
+
 # LED SPI Drivers
 obj-$(CONFIG_LEDS_CR0014114)   += leds-cr0014114.o
 obj-$(CONFIG_LEDS_DAC124S085)  += leds-dac124s085.o
diff --git a/drivers/leds/flash/Kconfig b/drivers/leds/flash/Kconfig
index 4e08dbc05709..a0fb755b58dc 100644
--- a/drivers/leds/flash/Kconfig
+++ b/drivers/leds/flash/Kconfig
@@ -23,7 +23,7 @@ config LEDS_AS3645A
 config LEDS_KTD2692
tristate "LED support for Kinetic KTD2692 flash LED controller"
depends on OF
-   depends on GPIOLIB || COMPILE_TEST
+   select LEDS_EXPRESSWIRE
help
  This option enables support for Kinetic KTD2692 LED flash connected
  through ExpressWire interface.
diff --git a/drivers/leds/flash/leds-ktd2692.c 
b/drivers/leds/flash/leds-ktd2692.c
index 598eee5daa52..7bb0aa2753e3 100644
--- a/drivers/leds/flash/leds-ktd2692.c
+++ b/drivers/leds/flash/leds-ktd2692.c
@@ -6,9 +6,9 @@
  * Ingi Kim 
  */
 
-#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -37,22 +37,9 @@
 #define KTD2692_REG_FLASH_CURRENT_BASE 0x80
 #define KTD2692_REG_MODE_BASE  0xA0
 
-/* Set bit coding time for expresswire interface */
-#define KTD2692_TIME_RESET_US  700
-#define KTD2692_TIME_DATA_START_TIME_US10
-#define KTD2692_TIME_HIGH_END_OF_DATA_US   350
-#define KTD2692_TIME_LOW_END_OF_DATA_US10
-#define KTD2692_TIME_SHORT_BITSET_US   4
-#define KTD2692_TIME_LONG_BITSET_US12
-
 /* KTD2692 default length of name */
 #define KTD2692_NAME_LENGTH20
 
-enum ktd2692_bitset {
-   KTD2692_LOW = 0,
-   KTD2692_HIGH,
-};
-
 /* Movie / Flash Mode Control */
 enum ktd2692_led_mode {
KTD2692_MODE_DISABLE = 0,   /* default */
@@ -71,7 +58,19 @@ struct ktd2692_led_config_data {
enum led_brightness max_brightness;
 };
 
+const struct expresswire_timing ktd2692_timing = {
+   .poweroff_us = 700,
+   .data_start_us = 10,
+   .end_of_data_low_us = 10,
+   .end_of_data_high_us = 350,
+   .short_bitset_us = 4,
+   .long_bitset_us = 12
+};
+
 struct ktd2692_context {
+   /* Common ExpressWire properties (ctrl GPIO and timing) */
+   struct expresswire_common_props props;
+
/* Related LED Flash class device */
struct led_classdev_flash fled_cdev;
 
@@ -80,7 +79,6 @@ struct ktd2692_context {
struct regulator *regulator;
 
struct gpio_desc *aux_gpio;
-   struct gpio_desc *ctrl_gpio;
 
enum ktd2692_led_mode mode;
enum led_br

[PATCH v4 2/3] dt-bindings: backlight: add Kinetic KTD2801 binding

2024-01-22 Thread Duje Mihanović
KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte.
The brightness can be set using PWM or the ExpressWire protocol. Add
a DT binding for the KTD2801.

Reviewed-by: Krzysztof Kozlowski 
Reviewed-by: Linus Walleij 
Signed-off-by: Duje Mihanović 
---
 .../bindings/leds/backlight/kinetic,ktd2801.yaml   | 46 ++
 1 file changed, 46 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml 
b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
new file mode 100644
index ..b005065e0f48
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/backlight/kinetic,ktd2801.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Kinetic Technologies KTD2801 one-wire backlight
+
+maintainers:
+  - Duje Mihanović 
+
+description: |
+  The Kinetic Technologies KTD2801 is a LED backlight driver controlled
+  by a single GPIO line. The driver can be controlled with a PWM signal
+  or by pulsing the GPIO line to set the backlight level. This is called
+  "ExpressWire".
+
+allOf:
+  - $ref: common.yaml#
+
+properties:
+  compatible:
+const: kinetic,ktd2801
+
+  ctrl-gpios:
+maxItems: 1
+
+  default-brightness: true
+  max-brightness: true
+
+required:
+  - compatible
+  - ctrl-gpios
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+
+backlight {
+compatible = "kinetic,ktd2801";
+ctrl-gpios = <&gpio 97 GPIO_ACTIVE_HIGH>;
+max-brightness = <210>;
+default-brightness = <100>;
+};

-- 
2.43.0




[PATCH v4 3/3] backlight: Add Kinetic KTD2801 backlight support

2024-01-22 Thread Duje Mihanović
KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte.
The brightness can be set using PWM or the ExpressWire protocol. Add
support for the KTD2801.

Reviewed-by: Linus Walleij 
Signed-off-by: Duje Mihanović 
---
 MAINTAINERS |   6 ++
 drivers/video/backlight/Kconfig |   7 ++
 drivers/video/backlight/Makefile|   1 +
 drivers/video/backlight/ktd2801-backlight.c | 128 
 4 files changed, 142 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 87b12d2448a0..dddffbd8d2a0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11891,6 +11891,12 @@ S: Maintained
 F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml
 F: drivers/video/backlight/ktd253-backlight.c
 
+KTD2801 BACKLIGHT DRIVER
+M: Duje Mihanović 
+S: Maintained
+F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
+F: drivers/video/backlight/ktd2801-backlight.c
+
 KTEST
 M: Steven Rostedt 
 M: John Hawley 
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 51387b1ef012..bba9d8ffccff 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -183,6 +183,13 @@ config BACKLIGHT_KTD253
  which is a 1-wire GPIO-controlled backlight found in some mobile
  phones.
 
+config BACKLIGHT_KTD2801
+   tristate "Backlight Driver for Kinetic KTD2801"
+   select LEDS_EXPRESSWIRE
+   help
+ Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire
+ GPIO-controlled backlight found in Samsung Galaxy Core Prime VE LTE.
+
 config BACKLIGHT_KTZ8866
tristate "Backlight Driver for Kinetic KTZ8866"
depends on I2C
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index f72e1c3c59e9..b33b647f31ca 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -35,6 +35,7 @@ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
 obj-$(CONFIG_BACKLIGHT_HP700)  += jornada720_bl.o
 obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o
 obj-$(CONFIG_BACKLIGHT_KTD253) += ktd253-backlight.o
+obj-$(CONFIG_BACKLIGHT_KTD2801)+= ktd2801-backlight.o
 obj-$(CONFIG_BACKLIGHT_KTZ8866)+= ktz8866.o
 obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3630A)+= lm3630a_bl.o
diff --git a/drivers/video/backlight/ktd2801-backlight.c 
b/drivers/video/backlight/ktd2801-backlight.c
new file mode 100644
index ..c020acff40f1
--- /dev/null
+++ b/drivers/video/backlight/ktd2801-backlight.c
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Datasheet:
+ * https://www.kinet-ic.com/uploads/web/KTD2801/KTD2801-04b.pdf
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define KTD2801_DEFAULT_BRIGHTNESS 100
+#define KTD2801_MAX_BRIGHTNESS 255
+
+/* These values have been extracted from Samsung's driver. */
+const struct expresswire_timing ktd2801_timing = {
+   .poweroff_us = 2600,
+   .detect_delay_us = 150,
+   .detect_us = 270,
+   .data_start_us = 5,
+   .short_bitset_us = 5,
+   .long_bitset_us = 15,
+   .end_of_data_low_us = 10,
+   .end_of_data_high_us = 350
+};
+
+struct ktd2801_backlight {
+   struct expresswire_common_props props;
+   struct backlight_device *bd;
+   bool was_on;
+};
+
+static int ktd2801_update_status(struct backlight_device *bd)
+{
+   struct ktd2801_backlight *ktd2801 = bl_get_data(bd);
+   u8 brightness = (u8) backlight_get_brightness(bd);
+
+   if (backlight_is_blank(bd)) {
+   expresswire_power_off(&ktd2801->props);
+   ktd2801->was_on = false;
+   return 0;
+   }
+
+   if (!ktd2801->was_on) {
+   expresswire_enable(&ktd2801->props);
+   ktd2801->was_on = true;
+   }
+
+   expresswire_write_u8(&ktd2801->props, brightness);
+
+   return 0;
+}
+
+static const struct backlight_ops ktd2801_backlight_ops = {
+   .update_status = ktd2801_update_status,
+};
+
+static int ktd2801_backlight_probe(struct platform_device *pdev)
+{
+   struct device *dev = &pdev->dev;
+   struct backlight_device *bd;
+   struct ktd2801_backlight *ktd2801;
+   u32 brightness, max_brightness;
+   int ret;
+
+   ktd2801 = devm_kzalloc(dev, sizeof(*ktd2801), GFP_KERNEL);
+   if (!ktd2801)
+   return -ENOMEM;
+   ktd2801->was_on = true;
+   ktd2801->props.timing = ktd2801_timing;
+
+   ret = device_property_read_u32(dev, "max-brightness", &max_brightness);
+   if (ret)
+   max_brightness = KTD2801_MAX_BRIGHTNESS;
+   if (max_brightness > KTD2801_MAX_BRIGHTNESS) {
+   dev_err(dev, "ill

[PATCH v4 0/3] Kinetic ExpressWire library and KTD2801 backlight driver

2024-01-22 Thread Duje Mihanović
Hello,

This series adds support for the Kinetic KTD2801 LED backlight driver
IC found in samsung,coreprimevelte.

Support is already upstream for the somewhat similar KTD2692 flash
driver, and this series since v3 also moves its ExpressWire code into a
separate library and converts the KTD2692 driver to use that library.

Signed-off-by: Duje Mihanović 
---
Changes in v4:
- Drop 'extern' keywords in leds-expresswire.h
- Add 'expresswire_write_u8' to leds-expresswire.c and use it in the two
  drivers
- Move GPIOLIB dependency to LEDS_EXPRESSWIRE instead of letting clients
  handle it
- Drop time constant macros
- Drop delay.h include in ktd2692
- Drop bits.h and delay.h includes in ktd2801
- Link to v3: 
https://lore.kernel.org/r/20240120-ktd2801-v3-0-fe2cbafff...@skole.hr

Changes in v3:
- Split ExpressWire code into library (and convert KTD2692 to use this
  library)
- Rewrite commit messages
- Add link to datasheet
- Drop of.h include in ktd2801
- Use _cansleep and usleep_range when powering off
- Clean up bitwise operation in update_status
- Link to v2: 
https://lore.kernel.org/r/20240118-ktd2801-v2-0-425cf32e0...@skole.hr

Changes in v2:
- Address maintainer comments:
  - Drop MODULE_ALIAS
  - Rename enable-gpios to ctrl-gpios
  - Rename ktd2801_backlight->desc to ktd2801_backlight->gpiod
  - Give time constants more descriptive names and note their origins in
Samsung driver
  - Convert to GPIO_ACTIVE_HIGH
- Update trailers
- Link to v1: 
https://lore.kernel.org/r/20231005-ktd2801-v1-0-43cd85b06...@skole.hr

---
Duje Mihanović (3):
  leds: ktd2692: move ExpressWire code to library
  dt-bindings: backlight: add Kinetic KTD2801 binding
  backlight: Add Kinetic KTD2801 backlight support

 .../bindings/leds/backlight/kinetic,ktd2801.yaml   |  46 
 MAINTAINERS|  13 +++
 drivers/leds/Kconfig   |   4 +
 drivers/leds/Makefile  |   3 +
 drivers/leds/flash/Kconfig |   2 +-
 drivers/leds/flash/leds-ktd2692.c  | 116 +--
 drivers/leds/leds-expresswire.c|  68 +++
 drivers/video/backlight/Kconfig|   7 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/ktd2801-backlight.c| 128 +
 include/linux/leds-expresswire.h   |  36 ++
 11 files changed, 334 insertions(+), 90 deletions(-)
---
base-commit: 0dd3ee31125508cd67f7e7172247f05b7fd1753a
change-id: 20231004-ktd2801-0f3883cb59d0

Best regards,
-- 
Duje Mihanović 




Re: [PATCH v3 1/3] leds: ktd2692: move ExpressWire code to library

2024-01-22 Thread Duje Mihanović
On Monday, January 22, 2024 6:50:31 PM CET Daniel Thompson wrote:
> On Mon, Jan 22, 2024 at 06:26:04PM +0100, Duje Mihanović wrote:
> > On Monday, January 22, 2024 5:57:53 PM CET Duje Mihanović wrote:
> > > On Monday, January 22, 2024 5:50:11 PM CET Daniel Thompson wrote:
> > > > AFAICT nothing will inhibit setting GPIOLIB so allyes- and 
allmodconfig
> > > > builds will always end up with GPIOLIB enabled. If we are happy to
> > > > select it then I think that is enough!
> > > 
> > > In that case I guess I'll just make it select GPIOLIB.
> > 
> > Nevermind that, it'll have to be 'depends on' after all:
> > 
> > drivers/gpio/Kconfig:6:error: recursive dependency detected!
> > drivers/gpio/Kconfig:6: symbol GPIOLIB is selected by LEDS_EXPRESSWIRE
> > drivers/leds/Kconfig:184:   symbol LEDS_EXPRESSWIRE depends on 
NEW_LEDS
> 
> Can this dependency could be broken by declaring LEDS_EXPRESSWIRE at
> the top (or bottom) of the KConfig file (it's an option without a UI
> and does not need to be within the if NEW_LEDS block).

Nope, the only change is that the dependency graph is somewhat shorter:

drivers/gpio/Kconfig:6:error: recursive dependency detected!
drivers/gpio/Kconfig:6: symbol GPIOLIB is selected by LEDS_EXPRESSWIRE
drivers/leds/Kconfig:9: symbol LEDS_EXPRESSWIRE is selected by 
BACKLIGHT_KTD2801
drivers/video/backlight/Kconfig:186:symbol BACKLIGHT_KTD2801 depends on 
BACKLIGHT_CLASS_DEVICE
drivers/video/backlight/Kconfig:136:symbol BACKLIGHT_CLASS_DEVICE is 
selected by FB_BACKLIGHT
drivers/video/fbdev/core/Kconfig:180:   symbol FB_BACKLIGHT is selected by 
FB_SSD1307
drivers/video/fbdev/Kconfig:1934:   symbol FB_SSD1307 depends on GPIOLIB
For a resolution refer to Documentation/kbuild/kconfig-language.rst
subsection "Kconfig recursive dependency limitations"

Regards,
--
Duje





Re: [PATCH v3 1/3] leds: ktd2692: move ExpressWire code to library

2024-01-22 Thread Duje Mihanović
On Monday, January 22, 2024 5:57:53 PM CET Duje Mihanović wrote:
> On Monday, January 22, 2024 5:50:11 PM CET Daniel Thompson wrote:
> > AFAICT nothing will inhibit setting GPIOLIB so allyes- and allmodconfig
> > builds will always end up with GPIOLIB enabled. If we are happy to
> > select it then I think that is enough!
> 
> In that case I guess I'll just make it select GPIOLIB.

Nevermind that, it'll have to be 'depends on' after all:

drivers/gpio/Kconfig:6:error: recursive dependency detected!
drivers/gpio/Kconfig:6: symbol GPIOLIB is selected by LEDS_EXPRESSWIRE
drivers/leds/Kconfig:184:   symbol LEDS_EXPRESSWIRE depends on NEW_LEDS
drivers/leds/Kconfig:9: symbol NEW_LEDS is selected by SENSORS_APPLESMC
drivers/hwmon/Kconfig:348:  symbol SENSORS_APPLESMC depends on HWMON
drivers/hwmon/Kconfig:6:symbol HWMON is selected by EEEPC_LAPTOP
drivers/platform/x86/Kconfig:325:   symbol EEEPC_LAPTOP depends on 
ACPI_VIDEO
drivers/acpi/Kconfig:209:   symbol ACPI_VIDEO depends on 
BACKLIGHT_CLASS_DEVICE
drivers/video/backlight/Kconfig:136:symbol BACKLIGHT_CLASS_DEVICE is 
selected by FB_BACKLIGHT
drivers/video/fbdev/core/Kconfig:180:   symbol FB_BACKLIGHT is selected by 
FB_SSD1307
drivers/video/fbdev/Kconfig:1934:   symbol FB_SSD1307 depends on GPIOLIB
For a resolution refer to Documentation/kbuild/kconfig-language.rst
subsection "Kconfig recursive dependency limitations"

Regards,
--
Duje





Re: [PATCH v3 1/3] leds: ktd2692: move ExpressWire code to library

2024-01-22 Thread Duje Mihanović
On Monday, January 22, 2024 5:50:11 PM CET Daniel Thompson wrote:
> On Mon, Jan 22, 2024 at 05:24:51PM +0100, Duje Mihanović wrote:
> > I believe a "select" would be more appropriate here unless these 
backlights
> > should be hidden if GPIOLIB is disabled. The catch with "select" is that
> > there seems to be no way to throw in the "|| COMPILE_TEST" other GPIO-
based
> > backlights have and I'm not sure what to do about that.
> 
> I think the "|| COMPILE_TEST" might just be a copy 'n paste'ism (in fact I
> may even have been guilty off propagating it in reviews when checking
> for inconsistencies).
> 
> AFAICT nothing will inhibit setting GPIOLIB so allyes- and allmodconfig
> builds will always end up with GPIOLIB enabled. If we are happy to
> select it then I think that is enough!

In that case I guess I'll just make it select GPIOLIB.

Regards,
--
Duje





Re: [PATCH v3 3/3] backlight: Add Kinetic KTD2801 backlight support

2024-01-22 Thread Duje Mihanović
On Monday, January 22, 2024 11:28:05 AM CET Daniel Thompson wrote:
> On Sat, Jan 20, 2024 at 10:26:45PM +0100, Duje Mihanović wrote:
> > diff --git a/drivers/video/backlight/ktd2801-backlight.c
> > b/drivers/video/backlight/ktd2801-backlight.c new file mode 100644
> > index ..7b9d1a93aa71
> > --- /dev/null
> > 
> > +/* These values have been extracted from Samsung's driver. */
> > +#define KTD2801_EXPRESSWIRE_DETECT_DELAY_US150
> > +#define KTD2801_EXPRESSWIRE_DETECT_US  270
> > +#define KTD2801_SHORT_BITSET_US5
> > +#define KTD2801_LONG_BITSET_US (3 * 
KTD2801_SHORT_BITSET_US)
> > +#define KTD2801_DATA_START_US  5
> > +#define KTD2801_END_OF_DATA_LOW_US 10
> > +#define KTD2801_END_OF_DATA_HIGH_US350
> > +#define KTD2801_PWR_DOWN_DELAY_US  2600
> 
> These are a little pointless now. They are all single use constants
> and have little documentary value.
> 
> The lack of documentary value is because, for example,
> KTD2801_EXPRESSWIRE_DETECT_DELAY_US, is assigned to a structure
> field called detect_delay_us.
> 
> Likewise I doubt that explicitly stating that long_bitset_us is 3x
> bigger than short_bitset_us is important for future driver maintainance.

Does this apply for ktd2692 as well?

Regards,
--
Duje





Re: [PATCH v3 1/3] leds: ktd2692: move ExpressWire code to library

2024-01-22 Thread Duje Mihanović
On Monday, January 22, 2024 11:19:26 AM CET Daniel Thompson wrote:
> On Sat, Jan 20, 2024 at 10:26:43PM +0100, Duje Mihanović wrote:
> > diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> > index 6292fddcc55c..d29b6823e7d1 100644
> > --- a/drivers/leds/Kconfig
> > +++ b/drivers/leds/Kconfig
> > @@ -181,6 +181,9 @@ config LEDS_EL15203000
> > 
> >   To compile this driver as a module, choose M here: the module
> >   will be called leds-el15203000.
> > 
> > +config LEDS_EXPRESSWIRE
> > +   bool
> > +
> 
> Shouldn't there be a "select GPIOLIB" here? It seems odd to make the
> clients responsible for the dependencies.
> 
> BTW there seems to be very little consistency across the kernel between
> "depends on GPIOLIB" and "select GPIOLIB".. but select is marginally
> more popular (283 vs. 219 in the kernel I checked).

I believe a "select" would be more appropriate here unless these backlights 
should be hidden if GPIOLIB is disabled. The catch with "select" is that there 
seems to be no way to throw in the "|| COMPILE_TEST" other GPIO-based 
backlights have and I'm not sure what to do about that.

> > diff --git a/drivers/leds/flash/leds-ktd2692.c
> > b/drivers/leds/flash/leds-ktd2692.c index 598eee5daa52..8c17de3d621f 
100644
> > --- a/drivers/leds/flash/leds-ktd2692.c
> > +++ b/drivers/leds/flash/leds-ktd2692.c
> > 
> >  
> >  static void ktd2692_expresswire_write(struct ktd2692_context *led, u8
> >  value)
> >  {
> >  
> > int i;
> > 
> > -   ktd2692_expresswire_start(led);
> > +   expresswire_start(&led->props);
> > 
> > for (i = 7; i >= 0; i--)
> > 
> > -   ktd2692_expresswire_set_bit(led, value & BIT(i));
> > -   ktd2692_expresswire_end(led);
> > +   expresswire_set_bit(&led->props, value & BIT(i));
> > +   expresswire_end(&led->props);
> > 
> >  }
> 
> Is there any reason not to have an expresswire_write_u8() method in the
> library code? It is a concept that appears in both drivers.

Not really, I'll add it in v4.

Regards,
--
Duje





Re: [PATCH v3 1/3] leds: ktd2692: move ExpressWire code to library

2024-01-21 Thread Duje Mihanović
On Sunday, January 21, 2024 3:35:46 PM CET Linus Walleij wrote:
> > +extern void expresswire_power_off(struct expresswire_common_props 
*props);
> > +extern void expresswire_enable(struct expresswire_common_props *props);
> > +extern void expresswire_start(struct expresswire_common_props *props);
> > +extern void expresswire_end(struct expresswire_common_props *props);
> > +extern void expresswire_set_bit(struct expresswire_common_props *props,
> > bool bit);
> I would skip the keyword "extern" since it is default I think even
> checkpatch complains about it these days?

Doesn't seem to, I tried it myself:

$ git format-patch HEAD~3
0001-leds-ktd2692-move-ExpressWire-code-to-library.patch
0002-dt-bindings-backlight-add-Kinetic-KTD2801-binding.patch
0003-backlight-Add-Kinetic-KTD2801-backlight-support.patch
$ ./scripts/checkpatch.pl 0001-leds-ktd2692-move-ExpressWire-code-to-
library.patch
total: 0 errors, 0 warnings, 291 lines checked

0001-leds-ktd2692-move-ExpressWire-code-to-library.patch has no obvious style 
problems and is ready for submission.

I'll keep that in mind if a v4 is needed though.

Regards,
--
Duje





[PATCH v3 1/3] leds: ktd2692: move ExpressWire code to library

2024-01-20 Thread Duje Mihanović
The ExpressWire protocol is shared between at least KTD2692 and KTD2801
with slight differences such as timings and the former not having a
defined set of pulses for enabling the protocol (possibly because it
does not support PWM unlike KTD2801). Despite these differences the
ExpressWire handling code can be shared between the two, so move it into
a library in preparation for adding KTD2801 support.

Suggested-by: Daniel Thompson 
Signed-off-by: Duje Mihanović 
---
 MAINTAINERS   |  7 +++
 drivers/leds/Kconfig  |  3 ++
 drivers/leds/Makefile |  3 ++
 drivers/leds/flash/Kconfig|  1 +
 drivers/leds/flash/leds-ktd2692.c | 91 +++
 drivers/leds/leds-expresswire.c   | 59 +
 include/linux/leds-expresswire.h  | 35 +++
 7 files changed, 132 insertions(+), 67 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index a7c4cf8201e0..87b12d2448a0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7902,6 +7902,13 @@ S:   Maintained
 T: git git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat.git
 F: fs/exfat/
 
+EXPRESSWIRE PROTOCOL LIBRARY
+M: Duje Mihanović 
+L: linux-l...@vger.kernel.org
+S: Maintained
+F: drivers/leds/leds-expresswire.c
+F: include/linux/leds-expresswire.h
+
 EXT2 FILE SYSTEM
 M: Jan Kara 
 L: linux-e...@vger.kernel.org
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 6292fddcc55c..d29b6823e7d1 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -181,6 +181,9 @@ config LEDS_EL15203000
  To compile this driver as a module, choose M here: the module
  will be called leds-el15203000.
 
+config LEDS_EXPRESSWIRE
+   bool
+
 config LEDS_TURRIS_OMNIA
tristate "LED support for CZ.NIC's Turris Omnia"
depends on LEDS_CLASS_MULTICOLOR
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index d7348e8bc019..a63a07d01c6f 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -89,6 +89,9 @@ obj-$(CONFIG_LEDS_WM831X_STATUS)  += leds-wm831x-status.o
 obj-$(CONFIG_LEDS_WM8350)  += leds-wm8350.o
 obj-$(CONFIG_LEDS_WRAP)+= leds-wrap.o
 
+# Kinetic ExpressWire Protocol
+obj-$(CONFIG_LEDS_EXPRESSWIRE) += leds-expresswire.o
+
 # LED SPI Drivers
 obj-$(CONFIG_LEDS_CR0014114)   += leds-cr0014114.o
 obj-$(CONFIG_LEDS_DAC124S085)  += leds-dac124s085.o
diff --git a/drivers/leds/flash/Kconfig b/drivers/leds/flash/Kconfig
index 4e08dbc05709..526c1d063cd8 100644
--- a/drivers/leds/flash/Kconfig
+++ b/drivers/leds/flash/Kconfig
@@ -24,6 +24,7 @@ config LEDS_KTD2692
tristate "LED support for Kinetic KTD2692 flash LED controller"
depends on OF
depends on GPIOLIB || COMPILE_TEST
+   select LEDS_EXPRESSWIRE
help
  This option enables support for Kinetic KTD2692 LED flash connected
  through ExpressWire interface.
diff --git a/drivers/leds/flash/leds-ktd2692.c 
b/drivers/leds/flash/leds-ktd2692.c
index 598eee5daa52..8c17de3d621f 100644
--- a/drivers/leds/flash/leds-ktd2692.c
+++ b/drivers/leds/flash/leds-ktd2692.c
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -48,11 +49,6 @@
 /* KTD2692 default length of name */
 #define KTD2692_NAME_LENGTH20
 
-enum ktd2692_bitset {
-   KTD2692_LOW = 0,
-   KTD2692_HIGH,
-};
-
 /* Movie / Flash Mode Control */
 enum ktd2692_led_mode {
KTD2692_MODE_DISABLE = 0,   /* default */
@@ -71,7 +67,19 @@ struct ktd2692_led_config_data {
enum led_brightness max_brightness;
 };
 
+const struct expresswire_timing ktd2692_timing = {
+   .poweroff_us = KTD2692_TIME_RESET_US,
+   .data_start_us = KTD2692_TIME_DATA_START_TIME_US,
+   .end_of_data_low_us = KTD2692_TIME_LOW_END_OF_DATA_US,
+   .end_of_data_high_us = KTD2692_TIME_HIGH_END_OF_DATA_US,
+   .short_bitset_us = KTD2692_TIME_SHORT_BITSET_US,
+   .long_bitset_us = KTD2692_TIME_LONG_BITSET_US
+};
+
 struct ktd2692_context {
+   /* Common ExpressWire properties (ctrl GPIO and timing) */
+   struct expresswire_common_props props;
+
/* Related LED Flash class device */
struct led_classdev_flash fled_cdev;
 
@@ -80,7 +88,6 @@ struct ktd2692_context {
struct regulator *regulator;
 
struct gpio_desc *aux_gpio;
-   struct gpio_desc *ctrl_gpio;
 
enum ktd2692_led_mode mode;
enum led_brightness torch_brightness;
@@ -92,65 +99,14 @@ static struct ktd2692_context *fled_cdev_to_led(
return container_of(fled_cdev, struct ktd2692_context, fled_cdev);
 }
 
-static void ktd2692_expresswire_start(struct ktd2692_context *led)
-{
-   gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH);
-   udelay(KTD2692_TIME_DATA_START_TIME_US);
-}
-
-static void ktd2692_expresswire_reset

[PATCH v3 2/3] dt-bindings: backlight: add Kinetic KTD2801 binding

2024-01-20 Thread Duje Mihanović
KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte.
The brightness can be set using PWM or the ExpressWire protocol. Add
a DT binding for the KTD2801.

Reviewed-by: Krzysztof Kozlowski 
Reviewed-by: Linus Walleij 
Signed-off-by: Duje Mihanović 
---
 .../bindings/leds/backlight/kinetic,ktd2801.yaml   | 46 ++
 1 file changed, 46 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml 
b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
new file mode 100644
index ..b005065e0f48
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/backlight/kinetic,ktd2801.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Kinetic Technologies KTD2801 one-wire backlight
+
+maintainers:
+  - Duje Mihanović 
+
+description: |
+  The Kinetic Technologies KTD2801 is a LED backlight driver controlled
+  by a single GPIO line. The driver can be controlled with a PWM signal
+  or by pulsing the GPIO line to set the backlight level. This is called
+  "ExpressWire".
+
+allOf:
+  - $ref: common.yaml#
+
+properties:
+  compatible:
+const: kinetic,ktd2801
+
+  ctrl-gpios:
+maxItems: 1
+
+  default-brightness: true
+  max-brightness: true
+
+required:
+  - compatible
+  - ctrl-gpios
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+
+backlight {
+compatible = "kinetic,ktd2801";
+ctrl-gpios = <&gpio 97 GPIO_ACTIVE_HIGH>;
+max-brightness = <210>;
+default-brightness = <100>;
+};

-- 
2.43.0





[PATCH v3 3/3] backlight: Add Kinetic KTD2801 backlight support

2024-01-20 Thread Duje Mihanović
KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte.
The brightness can be set using PWM or the ExpressWire protocol. Add
support for the KTD2801.

Signed-off-by: Duje Mihanović 
---
 MAINTAINERS |   6 ++
 drivers/video/backlight/Kconfig |   8 ++
 drivers/video/backlight/Makefile|   1 +
 drivers/video/backlight/ktd2801-backlight.c | 143 
 4 files changed, 158 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 87b12d2448a0..dddffbd8d2a0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11891,6 +11891,12 @@ S: Maintained
 F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml
 F: drivers/video/backlight/ktd253-backlight.c
 
+KTD2801 BACKLIGHT DRIVER
+M: Duje Mihanović 
+S: Maintained
+F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
+F: drivers/video/backlight/ktd2801-backlight.c
+
 KTEST
 M: Steven Rostedt 
 M: John Hawley 
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 51387b1ef012..585a5a713759 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -183,6 +183,14 @@ config BACKLIGHT_KTD253
  which is a 1-wire GPIO-controlled backlight found in some mobile
  phones.
 
+config BACKLIGHT_KTD2801
+   tristate "Backlight Driver for Kinetic KTD2801"
+   depends on GPIOLIB || COMPILE_TEST
+   select LEDS_EXPRESSWIRE
+   help
+ Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire
+ GPIO-controlled backlight found in Samsung Galaxy Core Prime VE LTE.
+
 config BACKLIGHT_KTZ8866
tristate "Backlight Driver for Kinetic KTZ8866"
depends on I2C
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index f72e1c3c59e9..b33b647f31ca 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -35,6 +35,7 @@ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
 obj-$(CONFIG_BACKLIGHT_HP700)  += jornada720_bl.o
 obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o
 obj-$(CONFIG_BACKLIGHT_KTD253) += ktd253-backlight.o
+obj-$(CONFIG_BACKLIGHT_KTD2801)+= ktd2801-backlight.o
 obj-$(CONFIG_BACKLIGHT_KTZ8866)+= ktz8866.o
 obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3630A)+= lm3630a_bl.o
diff --git a/drivers/video/backlight/ktd2801-backlight.c 
b/drivers/video/backlight/ktd2801-backlight.c
new file mode 100644
index ..7b9d1a93aa71
--- /dev/null
+++ b/drivers/video/backlight/ktd2801-backlight.c
@@ -0,0 +1,143 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Datasheet:
+ * https://www.kinet-ic.com/uploads/web/KTD2801/KTD2801-04b.pdf
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/* These values have been extracted from Samsung's driver. */
+#define KTD2801_EXPRESSWIRE_DETECT_DELAY_US150
+#define KTD2801_EXPRESSWIRE_DETECT_US  270
+#define KTD2801_SHORT_BITSET_US5
+#define KTD2801_LONG_BITSET_US (3 * KTD2801_SHORT_BITSET_US)
+#define KTD2801_DATA_START_US  5
+#define KTD2801_END_OF_DATA_LOW_US 10
+#define KTD2801_END_OF_DATA_HIGH_US350
+#define KTD2801_PWR_DOWN_DELAY_US  2600
+
+#define KTD2801_DEFAULT_BRIGHTNESS 100
+#define KTD2801_MAX_BRIGHTNESS 255
+
+const struct expresswire_timing ktd2801_timing = {
+   .poweroff_us = KTD2801_PWR_DOWN_DELAY_US,
+   .detect_delay_us = KTD2801_EXPRESSWIRE_DETECT_DELAY_US,
+   .detect_us = KTD2801_EXPRESSWIRE_DETECT_US,
+   .data_start_us = KTD2801_DATA_START_US,
+   .short_bitset_us = KTD2801_SHORT_BITSET_US,
+   .long_bitset_us = KTD2801_LONG_BITSET_US,
+   .end_of_data_low_us = KTD2801_END_OF_DATA_LOW_US,
+   .end_of_data_high_us = KTD2801_END_OF_DATA_HIGH_US
+};
+
+struct ktd2801_backlight {
+   struct expresswire_common_props props;
+   struct backlight_device *bd;
+   bool was_on;
+};
+
+static int ktd2801_update_status(struct backlight_device *bd)
+{
+   struct ktd2801_backlight *ktd2801 = bl_get_data(bd);
+   u8 brightness = (u8) backlight_get_brightness(bd);
+
+   if (backlight_is_blank(bd)) {
+   expresswire_power_off(&ktd2801->props);
+   ktd2801->was_on = false;
+   return 0;
+   }
+
+   if (!ktd2801->was_on) {
+   expresswire_enable(&ktd2801->props);
+   ktd2801->was_on = true;
+   }
+
+   expresswire_start(&ktd2801->props);
+
+   for (int i = 7; i >= 0; i--)
+   expresswire_set_bit(&ktd2801->props, !!(brightness & BIT(i)));
+
+   expresswire_end(&ktd2801->props);
+   return 0;
+}
+
+static

[PATCH v3 0/3] Kinetic ExpressWire library and KTD2801 backlight driver

2024-01-20 Thread Duje Mihanović
Hello,

This series adds support for the Kinetic KTD2801 LED backlight driver
IC found in samsung,coreprimevelte.

Support is already upstream for the somewhat similar KTD2692 flash
driver, and this series since v3 also moves its ExpressWire code into a
separate library and converts the KTD2692 driver to use that library.

Signed-off-by: Duje Mihanović 
---
Changes in v3:
- Split ExpressWire code into library (and convert KTD2692 to use this
  library)
- Rewrite commit messages
- Add link to datasheet
- Drop of.h include in ktd2801
- Use _cansleep and usleep_range when powering off
- Clean up bitwise operation in update_status
- Link to v2: 
https://lore.kernel.org/r/20240118-ktd2801-v2-0-425cf32e0...@skole.hr

Changes in v2:
- Address maintainer comments:
  - Drop MODULE_ALIAS
  - Rename enable-gpios to ctrl-gpios
  - Rename ktd2801_backlight->desc to ktd2801_backlight->gpiod
  - Give time constants more descriptive names and note their origins in
Samsung driver
  - Convert to GPIO_ACTIVE_HIGH
- Update trailers
- Link to v1: 
https://lore.kernel.org/r/20231005-ktd2801-v1-0-43cd85b06...@skole.hr

---
Duje Mihanović (3):
  leds: ktd2692: move ExpressWire code to library
  dt-bindings: backlight: add Kinetic KTD2801 binding
  backlight: Add Kinetic KTD2801 backlight support

 .../bindings/leds/backlight/kinetic,ktd2801.yaml   |  46 +++
 MAINTAINERS|  13 ++
 drivers/leds/Kconfig   |   3 +
 drivers/leds/Makefile  |   3 +
 drivers/leds/flash/Kconfig |   1 +
 drivers/leds/flash/leds-ktd2692.c  |  91 -
 drivers/leds/leds-expresswire.c|  59 +
 drivers/video/backlight/Kconfig|   8 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/ktd2801-backlight.c| 143 +
 include/linux/leds-expresswire.h   |  35 +
 11 files changed, 336 insertions(+), 67 deletions(-)
---
base-commit: 0dd3ee31125508cd67f7e7172247f05b7fd1753a
change-id: 20231004-ktd2801-0f3883cb59d0

Best regards,
-- 
Duje Mihanović 





Re: [PATCH v2 2/2] backlight: Add Kinetic KTD2801 driver

2024-01-19 Thread Duje Mihanović
On Friday, January 19, 2024 6:29:21 PM CET Christophe JAILLET wrote:
> Le 18/01/2024 à 18:32, Duje Mihanović a écrit :
> > Add driver for the Kinetic KTD2801 backlight driver.
> > 
> > Signed-off-by: Duje Mihanović 
> > 
> > ---
> 
> ...
> 
> > +   ktd2801->gpiod = devm_gpiod_get(dev, "ctrl", GPIOD_OUT_HIGH);
> > +   if (IS_ERR(ktd2801->gpiod))
> > +   return dev_err_probe(dev, PTR_ERR(dev),
> 
> PTR_ERR(ktd2801->gpiod); ?

Good catch, I'll fix it in v3.

Regards,
--
Duje





Re: [PATCH v2 2/2] backlight: Add Kinetic KTD2801 driver

2024-01-19 Thread Duje Mihanović
On Friday, January 19, 2024 11:07:09 AM CET Daniel Thompson wrote:
> On Thu, Jan 18, 2024 at 06:32:39PM +0100, Duje Mihanović wrote:
> > Add driver for the Kinetic KTD2801 backlight driver.
> > 
> > Signed-off-by: Duje Mihanović 
> > 
> > ---
> > Shared ExpressWire handling code and preemption watchdogs haven't been
> > implemented in this version as my questions regarding these two weren't
> > answered.
> > ---
> 
> The last mail I saw on this topic was of the "do you have any better
> ideas?" variety. I (mis)read that as "unless you have any
> better ideas" and didn't realize you were waiting for anything.
> 
> I didn't have any better ideas!

My apologies, I'll write the library as I proposed in that email.

Regards,
--
Duje





Re: [PATCH v2 2/2] backlight: Add Kinetic KTD2801 driver

2024-01-19 Thread Duje Mihanović
On Friday, January 19, 2024 10:02:33 AM CET Linus Walleij wrote:
> Hi Duje,
> 
> thanks for your patch!
> 
> On Thu, Jan 18, 2024 at 6:33 PM Duje Mihanović  
wrote:
> > Add driver for the Kinetic KTD2801 backlight driver.>
> > Signed-off-by: Duje Mihanović 
> 
> Add some commit message?

Besides the usual short explanation of the hardware I'd also add a link to the 
datasheet in the commit message if that's appropriate.

> > +#include 
> > +#include 
> > +#include 
> > +#include 
> 
> I don't think you need , the compatible table works without
> that (is in the device driver core).

Can confirm it compiles without.

> > +/* These values have been extracted from Samsung's driver. */
> > +#define KTD2801_EXPRESSWIRE_DETECT_DELAY_US150
> > +#define KTD2801_EXPRESSWIRE_DETECT_US  270
> > +#define KTD2801_LOW_BIT_HIGH_TIME_US   5
> > +#define KTD2801_LOW_BIT_LOW_TIME_US(4 *
> > KTD2801_HIGH_BIT_LOW_TIME_US) +#define KTD2801_HIGH_BIT_LOW_TIME_US
> >   5
> > +#define KTD2801_HIGH_BIT_HIGH_TIME_US  (4 *
> > KTD2801_HIGH_BIT_LOW_TIME_US) +#define KTD2801_DATA_START_US   
> >   5
> > +#define KTD2801_END_OF_DATA_LOW_US 10
> > +#define KTD2801_END_OF_DATA_HIGH_US350
> > +#define KTD2801_PWR_DOWN_DELAY_US  2600
> > +
> > +#define KTD2801_DEFAULT_BRIGHTNESS 100
> > +#define KTD2801_MAX_BRIGHTNESS 255
> > +
> > +struct ktd2801_backlight {
> > +   struct backlight_device *bd;
> > +   struct gpio_desc *gpiod;
> > +   bool was_on;
> > +};
> > +
> > +static int ktd2801_update_status(struct backlight_device *bd)
> > +{
> > +   struct ktd2801_backlight *ktd2801 = bl_get_data(bd);
> > +   u8 brightness = (u8) backlight_get_brightness(bd);
> > +
> > +   if (backlight_is_blank(bd)) {
> > +   gpiod_set_value(ktd2801->gpiod, 0);
> > +   udelay(KTD2801_PWR_DOWN_DELAY_US);
> 
> That's 2600 us, a pretty long delay in a hard loop or delay timer!
> 
> Can you use usleep_range() instead, at least for this one?

Sounds like a good idea. Should I also make that GPIO pulldown _cansleep while 
at it?

> > +   for (int i = 0; i < 8; i++) {
> > +   u8 next_bit = (brightness & 0x80) >> 7;
> 
> I would just:
> 
> #include 
> 
> bool next_bit = !!(brightness & BIT(7));

Will do.

Regards,
--
Duje





[PATCH v2 2/2] backlight: Add Kinetic KTD2801 driver

2024-01-18 Thread Duje Mihanović
Add driver for the Kinetic KTD2801 backlight driver.

Signed-off-by: Duje Mihanović 

---
Shared ExpressWire handling code and preemption watchdogs haven't been
implemented in this version as my questions regarding these two weren't
answered.
---
 MAINTAINERS |   6 ++
 drivers/video/backlight/Kconfig |   7 ++
 drivers/video/backlight/Makefile|   1 +
 drivers/video/backlight/ktd2801-backlight.c | 149 
 4 files changed, 163 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index a7c4cf8201e0..1e25d760f312 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11884,6 +11884,12 @@ S: Maintained
 F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml
 F: drivers/video/backlight/ktd253-backlight.c
 
+KTD2801 BACKLIGHT DRIVER
+M: Duje Mihanović 
+S: Maintained
+F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
+F: drivers/video/backlight/ktd2801-backlight.c
+
 KTEST
 M: Steven Rostedt 
 M: John Hawley 
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 51387b1ef012..a2b268293345 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -183,6 +183,13 @@ config BACKLIGHT_KTD253
  which is a 1-wire GPIO-controlled backlight found in some mobile
  phones.
 
+config BACKLIGHT_KTD2801
+   tristate "Backlight Driver for Kinetic KTD2801"
+   depends on GPIOLIB || COMPILE_TEST
+   help
+ Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire
+ GPIO-controlled backlight found in Samsung Galaxy Core Prime VE LTE.
+
 config BACKLIGHT_KTZ8866
tristate "Backlight Driver for Kinetic KTZ8866"
depends on I2C
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index f72e1c3c59e9..b33b647f31ca 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -35,6 +35,7 @@ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
 obj-$(CONFIG_BACKLIGHT_HP700)  += jornada720_bl.o
 obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o
 obj-$(CONFIG_BACKLIGHT_KTD253) += ktd253-backlight.o
+obj-$(CONFIG_BACKLIGHT_KTD2801)+= ktd2801-backlight.o
 obj-$(CONFIG_BACKLIGHT_KTZ8866)+= ktz8866.o
 obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3630A)+= lm3630a_bl.o
diff --git a/drivers/video/backlight/ktd2801-backlight.c 
b/drivers/video/backlight/ktd2801-backlight.c
new file mode 100644
index ..bbcb2e2059a2
--- /dev/null
+++ b/drivers/video/backlight/ktd2801-backlight.c
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/* These values have been extracted from Samsung's driver. */
+#define KTD2801_EXPRESSWIRE_DETECT_DELAY_US150
+#define KTD2801_EXPRESSWIRE_DETECT_US  270
+#define KTD2801_LOW_BIT_HIGH_TIME_US   5
+#define KTD2801_LOW_BIT_LOW_TIME_US(4 * 
KTD2801_HIGH_BIT_LOW_TIME_US)
+#define KTD2801_HIGH_BIT_LOW_TIME_US   5
+#define KTD2801_HIGH_BIT_HIGH_TIME_US  (4 * 
KTD2801_HIGH_BIT_LOW_TIME_US)
+#define KTD2801_DATA_START_US  5
+#define KTD2801_END_OF_DATA_LOW_US 10
+#define KTD2801_END_OF_DATA_HIGH_US350
+#define KTD2801_PWR_DOWN_DELAY_US  2600
+
+#define KTD2801_DEFAULT_BRIGHTNESS 100
+#define KTD2801_MAX_BRIGHTNESS 255
+
+struct ktd2801_backlight {
+   struct backlight_device *bd;
+   struct gpio_desc *gpiod;
+   bool was_on;
+};
+
+static int ktd2801_update_status(struct backlight_device *bd)
+{
+   struct ktd2801_backlight *ktd2801 = bl_get_data(bd);
+   u8 brightness = (u8) backlight_get_brightness(bd);
+
+   if (backlight_is_blank(bd)) {
+   gpiod_set_value(ktd2801->gpiod, 0);
+   udelay(KTD2801_PWR_DOWN_DELAY_US);
+   ktd2801->was_on = false;
+   return 0;
+   }
+
+   if (!ktd2801->was_on) {
+   gpiod_set_value(ktd2801->gpiod, 1);
+   udelay(KTD2801_EXPRESSWIRE_DETECT_DELAY_US);
+   gpiod_set_value(ktd2801->gpiod, 0);
+   udelay(KTD2801_EXPRESSWIRE_DETECT_US);
+   gpiod_set_value(ktd2801->gpiod, 1);
+   ktd2801->was_on = true;
+   }
+
+   gpiod_set_value(ktd2801->gpiod, 1);
+   udelay(KTD2801_DATA_START_US);
+
+   for (int i = 0; i < 8; i++) {
+   u8 next_bit = (brightness & 0x80) >> 7;
+
+   if (!next_bit) {
+   gpiod_set_value(ktd2801->gpiod, 0);
+   udelay(KTD2801_LOW_BIT_LOW_TIME_US);
+   gpiod_set_value(ktd2801->gpiod, 1);
+   udelay(KTD2801_LOW_BIT_H

[PATCH v2 0/2] Kinetic KTD2801 backlight driver

2024-01-18 Thread Duje Mihanović
Hello,

This small series adds a driver for the Kinetic KTD2801 backlight IC.
The driver has been tested on the samsung,coreprimevelte for which
support is still out-of-tree.

Signed-off-by: Duje Mihanović 
---
Changes in v2:
- Address maintainer comments:
  - Drop MODULE_ALIAS
  - Rename enable-gpios to ctrl-gpios
  - Rename ktd2801_backlight->desc to ktd2801_backlight->gpiod
  - Give time constants more descriptive names and note their origins in
Samsung driver
  - Convert to GPIO_ACTIVE_HIGH
- Update trailers
- Link to v1: 
https://lore.kernel.org/r/20231005-ktd2801-v1-0-43cd85b06...@skole.hr

---
Duje Mihanović (2):
  dt-bindings: backlight: add Kinetic KTD2801 binding
  backlight: Add Kinetic KTD2801 driver

 .../bindings/leds/backlight/kinetic,ktd2801.yaml   |  46 +++
 MAINTAINERS|   6 +
 drivers/video/backlight/Kconfig|   7 +
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/ktd2801-backlight.c| 149 +
 5 files changed, 209 insertions(+)
---
base-commit: 0dd3ee31125508cd67f7e7172247f05b7fd1753a
change-id: 20231004-ktd2801-0f3883cb59d0

Best regards,
-- 
Duje Mihanović 




[PATCH v2 1/2] dt-bindings: backlight: add Kinetic KTD2801 binding

2024-01-18 Thread Duje Mihanović
Add the dt binding for the Kinetic KTD2801 backlight driver.

Reviewed-by: Krzysztof Kozlowski 
Signed-off-by: Duje Mihanović 
---
 .../bindings/leds/backlight/kinetic,ktd2801.yaml   | 46 ++
 1 file changed, 46 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml 
b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
new file mode 100644
index ..b005065e0f48
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/backlight/kinetic,ktd2801.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Kinetic Technologies KTD2801 one-wire backlight
+
+maintainers:
+  - Duje Mihanović 
+
+description: |
+  The Kinetic Technologies KTD2801 is a LED backlight driver controlled
+  by a single GPIO line. The driver can be controlled with a PWM signal
+  or by pulsing the GPIO line to set the backlight level. This is called
+  "ExpressWire".
+
+allOf:
+  - $ref: common.yaml#
+
+properties:
+  compatible:
+const: kinetic,ktd2801
+
+  ctrl-gpios:
+maxItems: 1
+
+  default-brightness: true
+  max-brightness: true
+
+required:
+  - compatible
+  - ctrl-gpios
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+
+backlight {
+compatible = "kinetic,ktd2801";
+ctrl-gpios = <&gpio 97 GPIO_ACTIVE_HIGH>;
+max-brightness = <210>;
+default-brightness = <100>;
+};

-- 
2.43.0




Re: [PATCH 2/2] backlight: Add Kinetic KTD2801 driver

2023-10-09 Thread Duje Mihanović
On Monday, October 9, 2023 11:21:03 AM CEST Daniel Thompson wrote:
> On Thu, Oct 05, 2023 at 08:49:09PM +0200, Duje Mihanović wrote:
> > +#define EW_DELAY   150
> > +#define EW_DET 270
> > +#define LOW_BIT_HIGH   5
> > +#define LOW_BIT_LOW(4 * HIGH_BIT_LOW)
> > +#define HIGH_BIT_LOW   5
> > +#define HIGH_BIT_HIGH  (4 * HIGH_BIT_LOW)
> 
> These names are pretty cryptic (they don't even mention that they
> are time values and that the unit is microseconds). They also look
> like they were derived by tuning so comments would be nice explaining
> where they come from (or, failing that, why they are correct).

These values are taken from Samsung's driver, which themselves are datasheet 
values with a couple of us added for I presume safety. The datasheet is 
publicly available [1] and I can add a link to it to the binding patch in v2.

> > +   if (!ktd2801->was_on) {
> > +   gpiod_set_value(ktd2801->desc, 0);
> > +   udelay(EW_DELAY);
> > +   gpiod_set_value(ktd2801->desc, 1);
> > +   udelay(EW_DET);
> > +   gpiod_set_value(ktd2801->desc, 0);
> > +   ktd2801->was_on = true;
> > +   }
> 
> Isn't this implementing the same single GPIO line protocol used by
> drivers/leds/flash/leds-ktd2692.c?
> 
> If so, it would be good to pull the expresswire handling into a library
> so it can be shared between drivers. leds-ktd2692.c does a pretty
> good job of decomposing the expresswire management into functions (e.g.
> separating data framing from setting of control values). Expresswire is
> a data framing protocol rather than a bus so I think just implementing
> it as library code is probably sufficient.

KTD2801 and 2692 indeed seem to share the protocol and I can write a library 
just for this. I believe such a library could go in drivers/leds/leds-
expresswire.c and include/linux/leds-expresswire.h (or perhaps even just in a 
header), do you have any better ideas?

> Also, can the expresswire code have protocol-violation watchdogs that
> trigger a re-transmit of the message if we get pre-empted in the middle
> of sending a message to the backlight (see calls to ktime_get_ns() in
> ktd253-backlight.c ).

The Samsung driver does not have such watchdogs, but if you think they are 
needed I can add them.

[1] https://www.mouser.com/datasheet/2/936/KTD2801-04b-1391831.pdf

Regards,
Duje





Re: [PATCH 2/2] backlight: Add Kinetic KTD2801 driver

2023-10-06 Thread Duje Mihanović
On Thursday, October 5, 2023 10:40:41 PM CEST Krzysztof Kozlowski wrote:
> On 05/10/2023 20:49, Duje Mihanović wrote:
> > +   gpiod_set_value(ktd2801->desc, 0);
> > +   udelay(EOD_H);
> 
> Hm, why device is kept off after this? Setting 0 means enable GPIO is
> logical 0.
...
> > +   ktd2801->desc = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
> 
> OUT_LOW is keep it disabled, so is this intentional?

I initially wrote the driver to expect GPIO_ACTIVE_LOW, a decision which in 
retrospect indeed makes no sense. If you have no objections, I'll change it to 
expect GPIO_ACTIVE_HIGH.

Regards,
Duje






Re: [PATCH 1/2] dt-bindings: backlight: add Kinetic KTD2801 binding

2023-10-06 Thread Duje Mihanović
On Friday, October 6, 2023 2:30:14 PM CEST Daniel Thompson wrote:
> On Thu, Oct 05, 2023 at 08:49:08PM +0200, Duje Mihanović wrote:
> > +  enable-gpios:
> > +maxItems: 1
> 
> Why "enable"? This is the line we are going to us to bitbang the
> ExpressWire protocol. Doesn't that make it a control or data pin?

I named it "enable" because the KTD253 driver does so too, but also because 
that pin is also used to power down the IC. If "enable" isn't right 
regardless, is just "gpios" fine for this?

Regards,
Duje





[PATCH 2/2] backlight: Add Kinetic KTD2801 driver

2023-10-05 Thread Duje Mihanović
Add driver for the Kinetic KTD2801 backlight driver.

Signed-off-by: Duje Mihanović 
---
 MAINTAINERS |   6 ++
 drivers/video/backlight/Kconfig |   7 ++
 drivers/video/backlight/Makefile|   1 +
 drivers/video/backlight/ktd2801-backlight.c | 151 
 4 files changed, 165 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 35977b269d5e..7da78f06a65d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11777,6 +11777,12 @@ S: Maintained
 F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml
 F: drivers/video/backlight/ktd253-backlight.c
 
+KTD2801 BACKLIGHT DRIVER
+M: Duje Mihanović 
+S: Maintained
+F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
+F: drivers/video/backlight/ktd2801-backlight.c
+
 KTEST
 M: Steven Rostedt 
 M: John Hawley 
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 51387b1ef012..a2b268293345 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -183,6 +183,13 @@ config BACKLIGHT_KTD253
  which is a 1-wire GPIO-controlled backlight found in some mobile
  phones.
 
+config BACKLIGHT_KTD2801
+   tristate "Backlight Driver for Kinetic KTD2801"
+   depends on GPIOLIB || COMPILE_TEST
+   help
+ Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire
+ GPIO-controlled backlight found in Samsung Galaxy Core Prime VE LTE.
+
 config BACKLIGHT_KTZ8866
tristate "Backlight Driver for Kinetic KTZ8866"
depends on I2C
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index f72e1c3c59e9..b33b647f31ca 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -35,6 +35,7 @@ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
 obj-$(CONFIG_BACKLIGHT_HP700)  += jornada720_bl.o
 obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o
 obj-$(CONFIG_BACKLIGHT_KTD253) += ktd253-backlight.o
+obj-$(CONFIG_BACKLIGHT_KTD2801)+= ktd2801-backlight.o
 obj-$(CONFIG_BACKLIGHT_KTZ8866)+= ktz8866.o
 obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3630A)+= lm3630a_bl.o
diff --git a/drivers/video/backlight/ktd2801-backlight.c 
b/drivers/video/backlight/ktd2801-backlight.c
new file mode 100644
index ..24a5f9e5d606
--- /dev/null
+++ b/drivers/video/backlight/ktd2801-backlight.c
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define EW_DELAY   150
+#define EW_DET 270
+#define LOW_BIT_HIGH   5
+#define LOW_BIT_LOW(4 * HIGH_BIT_LOW)
+#define HIGH_BIT_LOW   5
+#define HIGH_BIT_HIGH  (4 * HIGH_BIT_LOW)
+#define DS 5
+#define EOD_L  10
+#define EOD_H  350
+#define PWR_DOWN_DELAY 2600
+
+#define KTD2801_DEFAULT_BRIGHTNESS 100
+#define KTD2801_MAX_BRIGHTNESS 255
+
+struct ktd2801_backlight {
+   struct device *dev;
+   struct backlight_device *bd;
+   struct gpio_desc *desc;
+   bool was_on;
+};
+
+static int ktd2801_update_status(struct backlight_device *bd)
+{
+   struct ktd2801_backlight *ktd2801 = bl_get_data(bd);
+   u8 brightness = (u8) backlight_get_brightness(bd);
+
+   if (backlight_is_blank(bd)) {
+   gpiod_set_value(ktd2801->desc, 1);
+   udelay(PWR_DOWN_DELAY);
+   ktd2801->was_on = false;
+   return 0;
+   }
+
+   if (!ktd2801->was_on) {
+   gpiod_set_value(ktd2801->desc, 0);
+   udelay(EW_DELAY);
+   gpiod_set_value(ktd2801->desc, 1);
+   udelay(EW_DET);
+   gpiod_set_value(ktd2801->desc, 0);
+   ktd2801->was_on = true;
+   }
+
+   gpiod_set_value(ktd2801->desc, 0);
+   udelay(DS);
+
+   for (int i = 0; i < 8; i++) {
+   u8 next_bit = (brightness & 0x80) >> 7;
+
+   if (!next_bit) {
+   gpiod_set_value(ktd2801->desc, 1);
+   udelay(LOW_BIT_LOW);
+   gpiod_set_value(ktd2801->desc, 0);
+   udelay(LOW_BIT_HIGH);
+   } else {
+   gpiod_set_value(ktd2801->desc, 1);
+   udelay(HIGH_BIT_LOW);
+   gpiod_set_value(ktd2801->desc, 0);
+   udelay(HIGH_BIT_HIGH);
+   }
+   brightness <<= 1;
+   }
+   gpiod_set_value(ktd2801->desc, 1);
+   udelay(EOD_L);
+   gpiod_set_value(ktd2801->desc, 0);
+   udelay(EOD_H);
+   return 0;
+}
+
+static const struct backlight_ops ktd2801_backlight_ops = {
+   .update_status = ktd2801_update_status,
+};
+
+s

[PATCH 0/2] Kinetic KTD2801 backlight driver

2023-10-05 Thread Duje Mihanović
Hello,

This small series adds a driver for the Kinetic KTD2801 backlight IC.
The driver has been tested on the samsung,coreprimevelte for which
support is still out-of-tree.

Signed-off-by: Duje Mihanović 
---
Duje Mihanović (2):
  dt-bindings: backlight: add Kinetic KTD2801 binding
  backlight: Add Kinetic KTD2801 driver

 .../bindings/leds/backlight/kinetic,ktd2801.yaml   |  46 +++
 MAINTAINERS|   6 +
 drivers/video/backlight/Kconfig|   7 +
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/ktd2801-backlight.c| 151 +
 5 files changed, 211 insertions(+)
---
base-commit: 8a749fd1a8720d4619c91c8b6e7528c0a355c0aa
change-id: 20231004-ktd2801-0f3883cb59d0

Best regards,
-- 
Duje Mihanović 




[PATCH 1/2] dt-bindings: backlight: add Kinetic KTD2801 binding

2023-10-05 Thread Duje Mihanović
Add the dt binding for the Kinetic KTD2801 backlight driver.

Signed-off-by: Duje Mihanović 
---
 .../bindings/leds/backlight/kinetic,ktd2801.yaml   | 46 ++
 1 file changed, 46 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml 
b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
new file mode 100644
index ..970d54bac18e
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/backlight/kinetic,ktd2801.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Kinetic Technologies KTD2801 one-wire backlight
+
+maintainers:
+  - Duje Mihanović 
+
+description: |
+  The Kinetic Technologies KTD2801 is a LED backlight driver controlled
+  by a single GPIO line. The driver can be controlled with a PWM signal
+  or by pulsing the GPIO line to set the backlight level. This is called
+  "ExpressWire".
+
+allOf:
+  - $ref: common.yaml#
+
+properties:
+  compatible:
+const: kinetic,ktd2801
+
+  enable-gpios:
+maxItems: 1
+
+  default-brightness: true
+  max-brightness: true
+
+required:
+  - compatible
+  - enable-gpios
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+
+backlight {
+compatible = "kinetic,ktd2801";
+enable-gpios = <&gpio 97 GPIO_ACTIVE_LOW>;
+max-brightness = <210>;
+default-brightness = <100>;
+};

-- 
2.42.0