Skip to contentSkip to conversation

Driver for TI tlc59116 16 Channel i2c LED driver

PATCH Superseded Andrew Lunn 4 participants 13 messages Jan 14, 2015 – Jan 20, 2015

Subsystems (2)

v3 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

This patchset is a driver for the TI tlc59116 16 Channel i2c LED driver. This driver is used on the Belkin WRT1900AC access point and the C code is derived from code Belkin contributed to OpenWRT. However it has been extensively re-written, and a device tree binding added to replace platform data.

Cc Matthew.Fatheree at belkin.com

Since v2:
Remove incorrect /* Mode register ? */ comment Parenthesis around the macro arguments Converted many signed variables into unsigned Saved an initialization

Since v1:
s/uint8_t/u8/g
Remove empty line
Removed #gpio-cells
Added select REGMAP_I2C
Sorted #includes into alphabetic order
Added missing MODULE_DEVICE_TABLE(of, ...)
Check return value of regmap_write()
Simplified tlc59116_set_mode()

Andrew Lunn (2):
leds: tlc59116: Document binding for the TI 16 Channel i2c LED driver
leds: tlc59116: Driver for the TI 16 Channel i2c LED driver

 .../devicetree/bindings/leds/leds-tlc59116.txt     |  41 ++++
 drivers/leds/Kconfig                               |   7 +
 drivers/leds/Makefile                              |   1 +
 drivers/leds/leds-tlc59116.c                       | 253 +++++++++++++++++++++
 4 files changed, 302 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-tlc59116.txt
 create mode 100644 drivers/leds/leds-tlc59116.c
Signature · 1 line
2.1.3
#1 lore raw

PATCH v3 1/2 leds: tlc59116: Document binding for the TI 16 Channel i2c LED driver

Document the binding for the TLC59116 LED driver.

Cc Matthew.Fatheree at belkin.com
---
 .../devicetree/bindings/leds/leds-tlc59116.txt     | 40 ++++++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-tlc59116.txt
Documentation/devicetree/bindings/leds/leds-tlc59116.txt new file +40 -0
new file mode 100644
index 000000000000..45c2123774d3
@@ -0,0 +1,40 @@
+LEDs connected to tcl59116
+
+Required properties
+- compatible: should be "ti,tlc59116"
+- #address-cells: must be 1
+- #size-cells: must be 0
+- reg: typically 0x68
+
+Each led is represented as a sub-node of the ti,,tlc59116.
+See Documentation/devicetree/bindings/leds/common.txt
+
+LED sub-node properties:
+- reg: number of LED line, 0 to 15
+- label: (optional) name of LED
+- linux,default-trigger : (optional)
+
+Examples:
+
+tlc59116 at 68 {
+	#address-cells = <1>;
+	#size-cells = <0>;
+	compatible = "ti,tlc59116";
+	reg = <0x68>;
+
+	wan at 0 {
+		label = "wrt1900ac:amber:wan";
+		reg = <0x0>;
+	};
+
+	2g at 2 {
+		label = "wrt1900ac:white:2g";
+		reg = <0x2>;
+	};
+
+	alive at 9 {
+		label = "wrt1900ac:green:alive";
+		reg = <0x9>;
+		linux,default_trigger = "heartbeat";
+	};
+};
Signature · 1 line
2.1.4
#2 lore raw

PATCH v3 2/2 leds: tlc59116: Driver for the TI 16 Channel i2c LED driver

In reply to Andrew Lunn

The TLC59116 is an I2C bus controlled 16-channel LED driver. Each LED output has its own 8-bit fixed-frequency PWM controller to control the brightness of the LED.

This is based on a driver from Belkin, but has been extensively rewritten.

Cc Matthew.Fatheree at belkin.com
---
 drivers/leds/Kconfig         |   8 ++
 drivers/leds/Makefile        |   1 +
 drivers/leds/leds-tlc59116.c | 252 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 261 insertions(+)
 create mode 100644 drivers/leds/leds-tlc59116.c
drivers/leds/Kconfig +8 -0
index a6c3d2f153f3..8fc283c01673 100644
@@ -457,6 +457,14 @@ config LEDS_TCA6507
 	  LED driver chips accessed via the I2C bus.
 	  Driver support brightness control and hardware-assisted blinking.
 
+config LEDS_TLC59116
+	tristate "LED driver for TLC59116F controllers"
+	depends on LEDS_CLASS && I2C
+	select REGMAP_I2C
+	help
+	  This option enables support for Texas Instruments TLC59116F
+	  LED controller.
+
 config LEDS_MAX8997
 	tristate "LED support for MAX8997 PMIC"
 	depends on LEDS_CLASS && MFD_MAX8997
drivers/leds/Makefile +1 -0
index 1c65a191d907..8e7d20acfa7b 100644
@@ -30,6 +30,7 @@ obj-$(CONFIG_LEDS_LP8501)		+= leds-lp8501.o
 obj-$(CONFIG_LEDS_LP8788)		+= leds-lp8788.o
 obj-$(CONFIG_LEDS_LP8860)		+= leds-lp8860.o
 obj-$(CONFIG_LEDS_TCA6507)		+= leds-tca6507.o
+obj-$(CONFIG_LEDS_TLC59116)		+= leds-tlc59116.o
 obj-$(CONFIG_LEDS_CLEVO_MAIL)		+= leds-clevo-mail.o
 obj-$(CONFIG_LEDS_IPAQ_MICRO)		+= leds-ipaq-micro.o
 obj-$(CONFIG_LEDS_HP6XX)		+= leds-hp6xx.o
drivers/leds/leds-tlc59116.c new file +252 -0

252 lines not on this page · raw message

Signature · 1 line
2.1.4
#3 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

In reply to Andrew Lunn

Hi,

Quoted 5 lines · Andrew Lunn

This patchset is a driver for the TI tlc59116 16 Channel i2c LED driver. This driver is used on the Belkin WRT1900AC access point and the C code is derived from code Belkin contributed to OpenWRT. However it has been extensively re-written, and a device tree binding added to replace platform data.

We have a TLC59108 on one of our boards, and with a quick glance it looks about the same as TLC59116, except the amount of outputs. Vignesh wrote a driver for it and was about to send it for review.

However, Vignesh implemented it as a PWM driver. We use it for LCD backlight (via pwm-backlight).

I'm not very familiar with LED and PWM drivers, but doesn't implementing this as a LED driver prevent us from using it as a backlight? Whereas it looks like PWM can be used as a led via pwm-leds (I think).

Tomi

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150116/dcd6c719/attachment.sig>

#4 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

Quoted 13 lines · Tomi Valkeinen

Hi,

Quoted 5 lines · Andrew Lunn

This patchset is a driver for the TI tlc59116 16 Channel i2c LED driver. This driver is used on the Belkin WRT1900AC access point and the C code is derived from code Belkin contributed to OpenWRT. However it has been extensively re-written, and a device tree binding added to replace platform data.

We have a TLC59108 on one of our boards, and with a quick glance it looks about the same as TLC59116, except the amount of outputs. Vignesh wrote a driver for it and was about to send it for review.

Quoted 7 lines

However, Vignesh implemented it as a PWM driver. We use it for LCD backlight (via pwm-backlight).

I'm not very familiar with LED and PWM drivers, but doesn't implementing this as a LED driver prevent us from using it as a backlight? Whereas it looks like PWM can be used as a led via pwm-leds (I think).

Hi Tomi

I've no idea about backlighting....

But the driver does fully implement brightness. So on my board:

echo 128 > /sys/class/leds/wrt1900ac\:white\:wan/brightness

will set that LED to 128/256 brightness. You have 255 steps of brightness.

The reason i did not model it as a PWM, is that it cannot fulfil the PWM interface. The configure interface is:

int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);

However with this device, you have no control over the period. It is fixed, from a 97-kHz clock. All you can change is the duty as a ratio between 0 and 256. There is the group PWM, where you do have control over the period. But as the name implies, this PWM is shared for all outputs, which is not what the PWM interface expects, it wants to be able to control them individually. Also, it only has a range of 24 Hz to 10.73 s. Again, i have no idea about backlights, but i suspect if it is driven at 24Hz, i'm going to get a headache.

The LED interface can be fully implemented. So that is what i have done.

So i think modeling this as an LED driver is correct, and maybe you need to implemented an led_bl.c driver?

Andrew

#5 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

Quoted 46 lines · Andrew Lunn
Quoted 13 lines · Tomi Valkeinen

Hi,

Quoted 5 lines · Andrew Lunn

This patchset is a driver for the TI tlc59116 16 Channel i2c LED driver. This driver is used on the Belkin WRT1900AC access point and the C code is derived from code Belkin contributed to OpenWRT. However it has been extensively re-written, and a device tree binding added to replace platform data.

We have a TLC59108 on one of our boards, and with a quick glance it looks about the same as TLC59116, except the amount of outputs. Vignesh wrote a driver for it and was about to send it for review.

Quoted 7 lines

However, Vignesh implemented it as a PWM driver. We use it for LCD backlight (via pwm-backlight).

I'm not very familiar with LED and PWM drivers, but doesn't implementing this as a LED driver prevent us from using it as a backlight? Whereas it looks like PWM can be used as a led via pwm-leds (I think).

Hi Tomi

I've no idea about backlighting....

But the driver does fully implement brightness. So on my board:

echo 128 > /sys/class/leds/wrt1900ac\:white\:wan/brightness

will set that LED to 128/256 brightness. You have 255 steps of brightness.

The reason i did not model it as a PWM, is that it cannot fulfil the PWM interface. The configure interface is:

int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);

However with this device, you have no control over the period. It is fixed, from a 97-kHz clock. All you can change is the duty as a ratio between 0 and 256. There is the group PWM, where you do have control over the period. But as the name implies, this PWM is shared for all outputs, which is not what the PWM interface expects, it wants to be able to control them individually. Also, it only has a range of 24 Hz to 10.73 s. Again, i have no idea about backlights, but i suspect if it is driven at 24Hz, i'm going to get a headache.

Quoted 2 lines

The LED interface can be fully implemented. So that is what i have done.

I understand that period of TLC chip cannot be changed and hence cannot fully implement PWM interface. But, suppose I want to control brightness of an LCD screen, with your current design, my LCD driver can never can do something like:

	pwm_get(chip);
	pwm_update_brightness();
	pwm_remove();

I will always have to rely on sysfs entries to control brightness.

If the driver is implemented as pwm-backlight, then brightness can be controlled both via sysfs entries and pwm-core callbacks(in kernel).

Quoted 4 lines

So i think modeling this as an LED driver is correct, and maybe you need to implemented an led_bl.c driver?

But, as far as I understand, leds-pwm.c does almost similar function.

Regards
Vignesh R

#6 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

Quoted 2 lines

I understand that period of TLC chip cannot be changed and hence cannot fully implement PWM interface.

O.K, so that is agreed.

Quoted 7 lines

But, suppose I want to control brightness
of an LCD screen, with your current design, my LCD driver can never can do something like:

	pwm_get(chip);
	pwm_update_brightness();
	pwm_remove();

I will always have to rely on sysfs entries to control brightness.

Or you can use the kernel API for controlling leds. There is a hint in

Documentation/devicetree/bindings/leds/common.txt

- linux,default-trigger : This parameter, if present, is a string defining the trigger assigned to the LED. Current triggers are:
"backlight" - LED will act as a back-light, controlled by the framebuffer
system

So somebody has at least thought about this, and there is

drivers/leds/trigger/ledtrig-backlight.c

What i also find interesting is:

drivers/video/backlight/adp8860_bl.c
drivers/video/backlight/adp8870_bl.c
drivers/video/backlight/lm3639_bl.c

all implement an led_class driver. So it does seem some people think backlight LEDs can be models using the led class.

Andrew

#7 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

In reply to Tomi Valkeinen
Quoted 11 lines · Tomi Valkeinen

Hi,

Quoted 5 lines · Andrew Lunn

This patchset is a driver for the TI tlc59116 16 Channel i2c LED driver. This driver is used on the Belkin WRT1900AC access point and the C code is derived from code Belkin contributed to OpenWRT. However it has been extensively re-written, and a device tree binding added to replace platform data.

We have a TLC59108 on one of our boards, and with a quick glance it looks about the same as TLC59116, except the amount of outputs.

Hi Tomi

I took a look at the TLC59108. The hardware designs have not made it easy, but it does look similar enough that my driver can be extended to cover both. These extensions It will not change the DT binding, it will just gain a new compatibility string. So i would prefer my driver is first fully reviewed and accepted, and then i will take a stab at extending it for the TLC59108. I will need help testing it, but i hope you can help there.

Andrew

#8 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

Quoted 15 lines · Andrew Lunn
Quoted 11 lines · Tomi Valkeinen

Hi,

Quoted 5 lines · Andrew Lunn

This patchset is a driver for the TI tlc59116 16 Channel i2c LED driver. This driver is used on the Belkin WRT1900AC access point and the C code is derived from code Belkin contributed to OpenWRT. However it has been extensively re-written, and a device tree binding added to replace platform data.

We have a TLC59108 on one of our boards, and with a quick glance it looks about the same as TLC59116, except the amount of outputs.

Hi Tomi

Quoted 7 lines

I took a look at the TLC59108. The hardware designs have not made it easy, but it does look similar enough that my driver can be extended to cover both. These extensions It will not change the DT binding, it will just gain a new compatibility string. So i would prefer my driver is first fully reviewed and accepted, and then i will take a stab at extending it for the TLC59108. I will need help testing it, but i hope you can help there.

Ok.

I'm not familiar with the LED/PWM frameworks, so I want to summarize our use case and how I guess this should be done:

We use the TLC59108 to provide backlight to a LCD, but in addition to that, it is used as a GPIO expander (or GPO, as it cannot do input). In your earlier patch versions there were some 'gpio' leftovers. Does your board have such GPIO use also?

So my current thinking is that TLC591xx should be a LED driver (as it sounded to me that PWM is not quite suitable for it). On top of that, we need generic 'led-backlight' and 'led-gpio' drivers, each of which uses the given LED driver to do the hardware manipulation, and they expose a backlight device and gpio device, respectively.

Another option would be an mfd device, but that doesn't sound good as I think the backlight and gpio functionality here is not related to TLC591xx as such, but to a LED device in general.

Does this sound sane?

Tomi

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150120/b78d1571/attachment.sig>

#9 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

Quoted 7 lines

I'm not familiar with the LED/PWM frameworks, so I want to summarize our use case and how I guess this should be done:

We use the TLC59108 to provide backlight to a LCD, but in addition to that, it is used as a GPIO expander (or GPO, as it cannot do input). In your earlier patch versions there were some 'gpio' leftovers. Does your board have such GPIO use also?

No, only LEDs.

Quoted 5 lines

So my current thinking is that TLC591xx should be a LED driver (as it sounded to me that PWM is not quite suitable for it). On top of that, we need generic 'led-backlight' and 'led-gpio' drivers, each of which uses the given LED driver to do the hardware manipulation, and they expose a backlight device and gpio device, respectively.

That sounds sensible. led-backlight seems to be mostly implemented already via the led trigger code. Adding a minimal backlight_ops does not look too hard. You might also be able to do some cleanup of the other led based backlight drivers.

led-gpio looks like more work, but i don't see why it should not be possible. One thing i do need to check is that if the brightness is set to 255 the output is not set to 255/256 on and you have a regular glitch. For an LED that does not really matter, but for GPIO it would not be good.

Andrew

#10 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

Quoted 21 lines · Andrew Lunn
Quoted 7 lines

I'm not familiar with the LED/PWM frameworks, so I want to summarize our use case and how I guess this should be done:

We use the TLC59108 to provide backlight to a LCD, but in addition to that, it is used as a GPIO expander (or GPO, as it cannot do input). In your earlier patch versions there were some 'gpio' leftovers. Does your board have such GPIO use also?

No, only LEDs.

Quoted 5 lines

So my current thinking is that TLC591xx should be a LED driver (as it sounded to me that PWM is not quite suitable for it). On top of that, we need generic 'led-backlight' and 'led-gpio' drivers, each of which uses the given LED driver to do the hardware manipulation, and they expose a backlight device and gpio device, respectively.

That sounds sensible. led-backlight seems to be mostly implemented already via the led trigger code. Adding a minimal backlight_ops does not look too hard. You might also be able to do some cleanup of the other led based backlight drivers.

Quoted 5 lines

led-gpio looks like more work, but i don't see why it should not be possible. One thing i do need to check is that if the brightness is set to 255 the output is not set to 255/256 on and you have a regular glitch. For an LED that does not really matter, but for GPIO it would not be good.

Right. TLC591xx has the constant output mode which should be used for GPIO. Perhaps that mode could be always used when the brightness is turned to maximum. I haven't read the spec carefully enough to know if there are some downsides.

Tomi

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150120/07a8a6d4/attachment.sig>

#11 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

Quoted 4 lines

Right. TLC591xx has the constant output mode which should be used for GPIO. Perhaps that mode could be always used when the brightness is turned to maximum. I haven't read the spec carefully enough to know if there are some downsides.

The original Belkin code did use that mode for full brightness. But it added complexity to the code which i did not see a need for. Now you need gpio support, i can add it back.

Andrew

#12 lore raw

v3 cover Driver for TI tlc59116 16 Channel i2c LED driver

In reply to Andrew Lunn
Quoted 3 lines · Andrew Lunn

led-gpio looks like more work, but i don't see why it should not be possible. One thing i do need to check is that if the brightness is set to 255 the output is not set to 255/256 on and you have a regular

is set to 255/256?

Quoted 2 lines

glitch. For an LED that does not really matter, but for GPIO it would not be good.

Indeed.

Gr{oetje,eeting}s,

Geert, who had a quick look at the data sheet recently

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds