* [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver @ 2015-01-14 23:15 Andrew Lunn 2015-01-14 23:15 ` [PATCHv3 1/2] leds: tlc59116: Document binding for the TI " Andrew Lunn ` (2 more replies) 0 siblings, 3 replies; 13+ messages in thread From: Andrew Lunn @ 2015-01-14 23:15 UTC (permalink / raw) To: cooloney, rpurdie Cc: linux-leds, devicetree, linux ARM, kaloz, Andrew Lunn, Matthew.Fatheree 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@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 -- 2.1.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv3 1/2] leds: tlc59116: Document binding for the TI 16 Channel i2c LED driver 2015-01-14 23:15 [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver Andrew Lunn @ 2015-01-14 23:15 ` Andrew Lunn 2015-01-14 23:15 ` [PATCHv3 2/2] leds: tlc59116: Driver " Andrew Lunn 2015-01-16 14:52 ` [PATCHv3 0/2] Driver for TI tlc59116 " Tomi Valkeinen 2 siblings, 0 replies; 13+ messages in thread From: Andrew Lunn @ 2015-01-14 23:15 UTC (permalink / raw) To: cooloney, rpurdie Cc: linux-leds, devicetree, linux ARM, kaloz, Andrew Lunn, Matthew.Fatheree Document the binding for the TLC59116 LED driver. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Cc: Matthew.Fatheree@belkin.com --- .../devicetree/bindings/leds/leds-tlc59116.txt | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Documentation/devicetree/bindings/leds/leds-tlc59116.txt diff --git a/Documentation/devicetree/bindings/leds/leds-tlc59116.txt b/Documentation/devicetree/bindings/leds/leds-tlc59116.txt new file mode 100644 index 000000000000..45c2123774d3 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/leds-tlc59116.txt @@ -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@68 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "ti,tlc59116"; + reg = <0x68>; + + wan@0 { + label = "wrt1900ac:amber:wan"; + reg = <0x0>; + }; + + 2g@2 { + label = "wrt1900ac:white:2g"; + reg = <0x2>; + }; + + alive@9 { + label = "wrt1900ac:green:alive"; + reg = <0x9>; + linux,default_trigger = "heartbeat"; + }; +}; -- 2.1.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCHv3 2/2] leds: tlc59116: Driver for the TI 16 Channel i2c LED driver 2015-01-14 23:15 [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver Andrew Lunn 2015-01-14 23:15 ` [PATCHv3 1/2] leds: tlc59116: Document binding for the TI " Andrew Lunn @ 2015-01-14 23:15 ` Andrew Lunn 2015-01-16 14:52 ` [PATCHv3 0/2] Driver for TI tlc59116 " Tomi Valkeinen 2 siblings, 0 replies; 13+ messages in thread From: Andrew Lunn @ 2015-01-14 23:15 UTC (permalink / raw) To: cooloney, rpurdie Cc: linux-leds, devicetree, linux ARM, kaloz, Andrew Lunn, Matthew.Fatheree 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. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Cc: Matthew.Fatheree@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 diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index a6c3d2f153f3..8fc283c01673 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -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 diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index 1c65a191d907..8e7d20acfa7b 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -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 diff --git a/drivers/leds/leds-tlc59116.c b/drivers/leds/leds-tlc59116.c new file mode 100644 index 000000000000..fddad1f45c87 --- /dev/null +++ b/drivers/leds/leds-tlc59116.c @@ -0,0 +1,252 @@ +/* + * Copyright 2014 Belkin Inc. + * Copyright 2014 Andrew Lunn <andrew@lunn.ch> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + */ + +#include <linux/i2c.h> +#include <linux/leds.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include <linux/workqueue.h> + +#define TLC59116_LEDS 16 + +#define TLC59116_REG_MODE1 0x00 +#define MODE1_RESPON_ADDR_MASK 0xF0 +#define MODE1_NORMAL_MODE (0 << 4) +#define MODE1_SPEED_MODE (1 << 4) + +#define TLC59116_REG_MODE2 0x01 +#define MODE2_DIM (0 << 5) +#define MODE2_BLINK (1 << 5) +#define MODE2_OCH_STOP (0 << 3) +#define MODE2_OCH_ACK (1 << 3) + +#define TLC59116_REG_PWM(x) (0x02 + (x)) + +#define TLC59116_REG_GRPPWM 0x12 +#define TLC59116_REG_GRPFREQ 0x13 + +/* LED Driver Output State, determine the source that drives LED outputs */ +#define TLC59116_REG_LEDOUT(x) (0x14 + ((x) >> 2)) +#define TLC59116_LED_OFF 0x0 /* Output LOW */ +#define TLC59116_LED_ON 0x1 /* Output HI-Z */ +#define TLC59116_DIM 0x2 /* Dimming */ +#define TLC59116_BLINK 0x3 /* Blinking */ +#define LED_MASK 0x3 + +#define ldev_to_led(c) container_of(c, struct tlc59116_led, ldev) +#define work_to_led(work) container_of(work, struct tlc59116_led, work) + +struct tlc59116_led { + bool active; + struct regmap *regmap; + unsigned int led_no; + struct led_classdev ldev; + struct work_struct work; +}; + +struct tlc59116_priv { + struct tlc59116_led leds[TLC59116_LEDS]; +}; + +static int +tlc59116_set_mode(struct regmap *regmap, u8 mode) +{ + int err; + u8 val; + + if ((mode != MODE2_DIM) && (mode != MODE2_BLINK)) + mode = MODE2_DIM; + + /* Configure MODE1 register */ + err = regmap_write(regmap, TLC59116_REG_MODE1, MODE1_NORMAL_MODE); + if (err) + return err; + + /* Configure MODE2 Reg */ + val = MODE2_OCH_STOP | mode; + + return regmap_write(regmap, TLC59116_REG_MODE2, val); +} + +static int +tlc59116_set_led(struct tlc59116_led *led, u8 val) +{ + struct regmap *regmap = led->regmap; + unsigned int i = (led->led_no % 4) * 2; + unsigned int addr = TLC59116_REG_LEDOUT(led->led_no); + unsigned int mask = LED_MASK << i; + + val = val << i; + + return regmap_update_bits(regmap, addr, mask, val); +} + +static void +tlc59116_led_work(struct work_struct *work) +{ + struct tlc59116_led *led = work_to_led(work); + struct regmap *regmap = led->regmap; + int err; + u8 pwm; + + pwm = TLC59116_REG_PWM(led->led_no); + err = regmap_write(regmap, pwm, led->ldev.brightness); + if (err) + dev_err(led->ldev.dev, "Failed setting brightness\n"); +} + +static void +tlc59116_led_set(struct led_classdev *led_cdev, enum led_brightness value) +{ + struct tlc59116_led *led = ldev_to_led(led_cdev); + + led->ldev.brightness = value; + schedule_work(&led->work); +} + +static void +tlc59116_destroy_devices(struct tlc59116_priv *priv, unsigned int i) +{ + while (--i >= 0) { + if (priv->leds[i].active) { + led_classdev_unregister(&priv->leds[i].ldev); + cancel_work_sync(&priv->leds[i].work); + } + } +} + +static int +tlc59116_configure(struct device *dev, + struct tlc59116_priv *priv, + struct regmap *regmap) +{ + unsigned int i; + int err = 0; + + tlc59116_set_mode(regmap, MODE2_DIM); + for (i = 0; i < TLC59116_LEDS; i++) { + struct tlc59116_led *led = &priv->leds[i]; + + if (!led->active) + continue; + + led->regmap = regmap; + led->led_no = i; + led->ldev.brightness_set = tlc59116_led_set; + led->ldev.max_brightness = LED_FULL; + INIT_WORK(&led->work, tlc59116_led_work); + err = led_classdev_register(dev, &led->ldev); + if (err < 0) { + dev_err(dev, "couldn't register LED %s\n", + led->ldev.name); + goto exit; + } + tlc59116_set_led(led, TLC59116_DIM); + } + + return 0; + +exit: + tlc59116_destroy_devices(priv, i); + return err; +} + +static const struct regmap_config tlc59116_regmap = { + .reg_bits = 8, + .val_bits = 8, + .max_register = 0x1e, +}; + +static int +tlc59116_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct tlc59116_priv *priv = i2c_get_clientdata(client); + struct device *dev = &client->dev; + struct device_node *np = client->dev.of_node, *child; + struct regmap *regmap; + int err, count, reg; + + count = of_get_child_count(np); + if (!count || count > TLC59116_LEDS) + return -EINVAL; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA)) + return -EIO; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + regmap = devm_regmap_init_i2c(client, &tlc59116_regmap); + if (IS_ERR(regmap)) { + err = PTR_ERR(regmap); + dev_err(dev, "Failed to allocate register map: %d\n", err); + return err; + } + + i2c_set_clientdata(client, priv); + + for_each_child_of_node(np, child) { + err = of_property_read_u32(child, "reg", ®); + if (err) + return err; + if (reg < 0 || reg >= TLC59116_LEDS) + return -EINVAL; + if (priv->leds[reg].active) + return -EINVAL; + priv->leds[reg].active = true; + priv->leds[reg].ldev.name = + of_get_property(child, "label", NULL) ? : child->name; + priv->leds[reg].ldev.default_trigger = + of_get_property(child, "linux,default-trigger", NULL); + } + return tlc59116_configure(dev, priv, regmap); +} + +static int +tlc59116_remove(struct i2c_client *client) +{ + struct tlc59116_priv *priv = i2c_get_clientdata(client); + + tlc59116_destroy_devices(priv, TLC59116_LEDS); + + return 0; +} + +static const struct of_device_id of_tlc59116_leds_match[] = { + { .compatible = "ti,tlc59116", }, + {}, +}; +MODULE_DEVICE_TABLE(of, of_tlc59116_leds_match); + +static const struct i2c_device_id tlc59116_id[] = { + { "tlc59116" }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, tlc59116_id); + +static struct i2c_driver tlc59116_driver = { + .driver = { + .name = "tlc59116", + .of_match_table = of_match_ptr(of_tlc59116_leds_match), + }, + .probe = tlc59116_probe, + .remove = tlc59116_remove, + .id_table = tlc59116_id, +}; + +module_i2c_driver(tlc59116_driver); + +MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("TLC59116 LED driver"); -- 2.1.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-14 23:15 [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver Andrew Lunn 2015-01-14 23:15 ` [PATCHv3 1/2] leds: tlc59116: Document binding for the TI " Andrew Lunn 2015-01-14 23:15 ` [PATCHv3 2/2] leds: tlc59116: Driver " Andrew Lunn @ 2015-01-16 14:52 ` Tomi Valkeinen [not found] ` <54B9259C.3070403-l0cyMroinI0@public.gmane.org> 2015-01-16 19:17 ` Andrew Lunn 2 siblings, 2 replies; 13+ messages in thread From: Tomi Valkeinen @ 2015-01-16 14:52 UTC (permalink / raw) To: Andrew Lunn, cooloney, rpurdie, R, Vignesh Cc: devicetree, Matthew.Fatheree, Sekhar Nori, linux-leds, kaloz, linux ARM [-- Attachment #1.1: Type: text/plain, Size: 890 bytes --] Hi, On 15/01/15 01:15, Andrew Lunn wrote: > 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 [-- Attachment #1.2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] [-- Attachment #2: Type: text/plain, Size: 176 bytes --] _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <54B9259C.3070403-l0cyMroinI0@public.gmane.org>]
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver [not found] ` <54B9259C.3070403-l0cyMroinI0@public.gmane.org> @ 2015-01-16 15:55 ` Andrew Lunn 2015-01-16 17:50 ` R, Vignesh 0 siblings, 1 reply; 13+ messages in thread From: Andrew Lunn @ 2015-01-16 15:55 UTC (permalink / raw) To: Tomi Valkeinen Cc: cooloney-Re5JQEeQqe8AvxtiuMwx3w, rpurdie-Fm38FmjxZ/leoWH0uzbU5w, R, Vignesh, linux-leds-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux ARM, kaloz-p3rKhJxN3npAfugRpC6u6w, Matthew.Fatheree-REUqjI8E1xrQT0dZR+AlfA, Sekhar Nori On Fri, Jan 16, 2015 at 04:52:12PM +0200, Tomi Valkeinen wrote: > Hi, > > On 15/01/15 01:15, Andrew Lunn wrote: > > 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). > 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 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-16 15:55 ` Andrew Lunn @ 2015-01-16 17:50 ` R, Vignesh 2015-01-16 19:10 ` Andrew Lunn 0 siblings, 1 reply; 13+ messages in thread From: R, Vignesh @ 2015-01-16 17:50 UTC (permalink / raw) To: Andrew Lunn, Tomi Valkeinen Cc: cooloney, rpurdie, linux-leds, devicetree, linux ARM, kaloz, Matthew.Fatheree, Sekhar Nori On 1/16/2015 9:25 PM, Andrew Lunn wrote: > On Fri, Jan 16, 2015 at 04:52:12PM +0200, Tomi Valkeinen wrote: >> Hi, >> >> On 15/01/15 01:15, Andrew Lunn wrote: >>> 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). >> > 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. 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). > > 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 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-16 17:50 ` R, Vignesh @ 2015-01-16 19:10 ` Andrew Lunn 0 siblings, 0 replies; 13+ messages in thread From: Andrew Lunn @ 2015-01-16 19:10 UTC (permalink / raw) To: R, Vignesh Cc: Tomi Valkeinen, cooloney, rpurdie, linux-leds, devicetree, linux ARM, kaloz, Matthew.Fatheree, Sekhar Nori > I understand that period of TLC chip cannot be changed and hence cannot > fully implement PWM interface. O.K, so that is agreed. > 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 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-16 14:52 ` [PATCHv3 0/2] Driver for TI tlc59116 " Tomi Valkeinen [not found] ` <54B9259C.3070403-l0cyMroinI0@public.gmane.org> @ 2015-01-16 19:17 ` Andrew Lunn 2015-01-20 9:53 ` Tomi Valkeinen 1 sibling, 1 reply; 13+ messages in thread From: Andrew Lunn @ 2015-01-16 19:17 UTC (permalink / raw) To: Tomi Valkeinen Cc: cooloney, rpurdie, R, Vignesh, linux-leds, devicetree, linux ARM, kaloz, Matthew.Fatheree, Sekhar Nori On Fri, Jan 16, 2015 at 04:52:12PM +0200, Tomi Valkeinen wrote: > Hi, > > On 15/01/15 01:15, Andrew Lunn wrote: > > 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 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-16 19:17 ` Andrew Lunn @ 2015-01-20 9:53 ` Tomi Valkeinen 2015-01-20 13:26 ` Andrew Lunn 0 siblings, 1 reply; 13+ messages in thread From: Tomi Valkeinen @ 2015-01-20 9:53 UTC (permalink / raw) To: Andrew Lunn Cc: cooloney, rpurdie, R, Vignesh, linux-leds, devicetree, linux ARM, kaloz, Matthew.Fatheree, Sekhar Nori [-- Attachment #1: Type: text/plain, Size: 2061 bytes --] On 16/01/15 21:17, Andrew Lunn wrote: > On Fri, Jan 16, 2015 at 04:52:12PM +0200, Tomi Valkeinen wrote: >> Hi, >> >> On 15/01/15 01:15, Andrew Lunn wrote: >>> 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. 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 [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-20 9:53 ` Tomi Valkeinen @ 2015-01-20 13:26 ` Andrew Lunn [not found] ` <20150120132613.GJ2938-g2DYL2Zd6BY@public.gmane.org> 2015-01-20 13:33 ` Geert Uytterhoeven 0 siblings, 2 replies; 13+ messages in thread From: Andrew Lunn @ 2015-01-20 13:26 UTC (permalink / raw) To: Tomi Valkeinen Cc: cooloney, rpurdie, R, Vignesh, linux-leds, devicetree, linux ARM, kaloz, Matthew.Fatheree, Sekhar Nori > 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. > 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 ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20150120132613.GJ2938-g2DYL2Zd6BY@public.gmane.org>]
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver [not found] ` <20150120132613.GJ2938-g2DYL2Zd6BY@public.gmane.org> @ 2015-01-20 13:32 ` Tomi Valkeinen 2015-01-20 13:40 ` Andrew Lunn 0 siblings, 1 reply; 13+ messages in thread From: Tomi Valkeinen @ 2015-01-20 13:32 UTC (permalink / raw) To: Andrew Lunn Cc: cooloney-Re5JQEeQqe8AvxtiuMwx3w, rpurdie-Fm38FmjxZ/leoWH0uzbU5w, R, Vignesh, linux-leds-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux ARM, kaloz-p3rKhJxN3npAfugRpC6u6w, Matthew.Fatheree-REUqjI8E1xrQT0dZR+AlfA, Sekhar Nori [-- Attachment #1: Type: text/plain, Size: 1632 bytes --] On 20/01/15 15:26, Andrew Lunn wrote: >> 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. > >> 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. 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 [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-20 13:32 ` Tomi Valkeinen @ 2015-01-20 13:40 ` Andrew Lunn 0 siblings, 0 replies; 13+ messages in thread From: Andrew Lunn @ 2015-01-20 13:40 UTC (permalink / raw) To: Tomi Valkeinen Cc: cooloney, rpurdie, R, Vignesh, linux-leds, devicetree, linux ARM, kaloz, Matthew.Fatheree, Sekhar Nori > 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 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver 2015-01-20 13:26 ` Andrew Lunn [not found] ` <20150120132613.GJ2938-g2DYL2Zd6BY@public.gmane.org> @ 2015-01-20 13:33 ` Geert Uytterhoeven 1 sibling, 0 replies; 13+ messages in thread From: Geert Uytterhoeven @ 2015-01-20 13:33 UTC (permalink / raw) To: Andrew Lunn Cc: Tomi Valkeinen, Bryan Wu, Richard Purdie, R, Vignesh, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux ARM, Imre Kaloz, Matthew.Fatheree, Sekhar Nori On Tue, Jan 20, 2015 at 2:26 PM, Andrew Lunn <andrew@lunn.ch> wrote: > 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? > 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@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 ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2015-01-20 13:40 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-01-14 23:15 [PATCHv3 0/2] Driver for TI tlc59116 16 Channel i2c LED driver Andrew Lunn 2015-01-14 23:15 ` [PATCHv3 1/2] leds: tlc59116: Document binding for the TI " Andrew Lunn 2015-01-14 23:15 ` [PATCHv3 2/2] leds: tlc59116: Driver " Andrew Lunn 2015-01-16 14:52 ` [PATCHv3 0/2] Driver for TI tlc59116 " Tomi Valkeinen [not found] ` <54B9259C.3070403-l0cyMroinI0@public.gmane.org> 2015-01-16 15:55 ` Andrew Lunn 2015-01-16 17:50 ` R, Vignesh 2015-01-16 19:10 ` Andrew Lunn 2015-01-16 19:17 ` Andrew Lunn 2015-01-20 9:53 ` Tomi Valkeinen 2015-01-20 13:26 ` Andrew Lunn [not found] ` <20150120132613.GJ2938-g2DYL2Zd6BY@public.gmane.org> 2015-01-20 13:32 ` Tomi Valkeinen 2015-01-20 13:40 ` Andrew Lunn 2015-01-20 13:33 ` Geert Uytterhoeven
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).