linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver
@ 2015-01-27 13:59 Andrew Lunn
  2015-01-27 13:59 ` [PATCHv6 1/2] leds: tlc591xx: Document binding for the TI " Andrew Lunn
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Andrew Lunn @ 2015-01-27 13:59 UTC (permalink / raw)
  To: linux-arm-kernel

This patchset is a driver for the TI tlc59116 16 Channel i2c LED
driver and tlc59108 8 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 v5:
      Hard code number of LEDs, rather than #define
      Moved common fields from led into priv
      Moved reg_ledout into priv, removed helper functions
      Cache brightness to avoid race conditions
      tlc591xx_led_set -> tlc591xx_set_brightness
      Be paranoid with of_match_device() and client->dev.of_node

Since v4:
      Fix Oops on module unload reported by Vignesh R

Since v3:
      Generalized and added support for tlc59108
      brightness == 0 and brightness == LED_FULL disable PWM and used
        fixed OFF/ON mode

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] 8+ messages in thread

* [PATCHv6 1/2] leds: tlc591xx: Document binding for the TI 8/16 Channel i2c LED driver
  2015-01-27 13:59 [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver Andrew Lunn
@ 2015-01-27 13:59 ` Andrew Lunn
  2015-01-27 13:59 ` [PATCHv6 2/2] leds: tlc591xx: Driver " Andrew Lunn
  2015-02-06  3:10 ` [PATCHv6 0/2] Driver for TI tlc591xx " Andrew Lunn
  2 siblings, 0 replies; 8+ messages in thread
From: Andrew Lunn @ 2015-01-27 13:59 UTC (permalink / raw)
  To: linux-arm-kernel

Document the binding for the TLC591xx LED driver.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Cc: Matthew.Fatheree at belkin.com
---
 .../devicetree/bindings/leds/leds-tlc591xx.txt     | 40 ++++++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-tlc591xx.txt

diff --git a/Documentation/devicetree/bindings/leds/leds-tlc591xx.txt b/Documentation/devicetree/bindings/leds/leds-tlc591xx.txt
new file mode 100644
index 000000000000..3bbbf7024411
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-tlc591xx.txt
@@ -0,0 +1,40 @@
+LEDs connected to tlc59116 or tlc59108
+
+Required properties
+- compatible: should be "ti,tlc59116" or "ti,tlc59108"
+- #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 or 0 to 7
+- 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";
+	};
+};
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCHv6 2/2] leds: tlc591xx: Driver for the TI 8/16 Channel i2c LED driver
  2015-01-27 13:59 [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver Andrew Lunn
  2015-01-27 13:59 ` [PATCHv6 1/2] leds: tlc591xx: Document binding for the TI " Andrew Lunn
@ 2015-01-27 13:59 ` Andrew Lunn
  2015-02-16 14:11   ` Imre Kaloz
  2015-02-06  3:10 ` [PATCHv6 0/2] Driver for TI tlc591xx " Andrew Lunn
  2 siblings, 1 reply; 8+ messages in thread
From: Andrew Lunn @ 2015-01-27 13:59 UTC (permalink / raw)
  To: linux-arm-kernel

The TLC59116 is an I2C bus controlled 16-channel LED driver.  The
TLC59108 is an I2C bus controlled 8-channel LED driver, which is very
similar to the TLC59116. Each LED output has its own 8-bit
fixed-frequency PWM controller to control the brightness of the LED.
The LEDs can also be fixed off and on, making them suitable for use as
GPOs.

This is based on a driver from Belkin, but has been extensively
rewritten and extended to support both 08 and 16 versions.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Cc: Matthew.Fatheree at belkin.com
---
 drivers/leds/Kconfig         |   8 ++
 drivers/leds/Makefile        |   1 +
 drivers/leds/leds-tlc591xx.c | 300 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 309 insertions(+)
 create mode 100644 drivers/leds/leds-tlc591xx.c

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index a6c3d2f153f3..67cba2032543 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_TLC591XX
+	tristate "LED driver for TLC59108 and TLC59116 controllers"
+	depends on LEDS_CLASS && I2C
+	select REGMAP_I2C
+	help
+	  This option enables support for Texas Instruments TLC59108
+	  and TLC59116 LED controllers.
+
 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..0558117a9407 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_TLC591XX)		+= leds-tlc591xx.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-tlc591xx.c b/drivers/leds/leds-tlc591xx.c
new file mode 100644
index 000000000000..de16c29d7895
--- /dev/null
+++ b/drivers/leds/leds-tlc591xx.c
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2014 Belkin Inc.
+ * Copyright 2015 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/of_device.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+#include <linux/workqueue.h>
+
+#define TLC591XX_MAX_LEDS	16
+
+#define TLC591XX_REG_MODE1	0x00
+#define MODE1_RESPON_ADDR_MASK	0xF0
+#define MODE1_NORMAL_MODE	(0 << 4)
+#define MODE1_SPEED_MODE	(1 << 4)
+
+#define TLC591XX_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 TLC591XX_REG_PWM(x)	(0x02 + (x))
+
+#define TLC591XX_REG_GRPPWM	0x12
+#define TLC591XX_REG_GRPFREQ	0x13
+
+/* LED Driver Output State, determine the source that drives LED outputs */
+#define LEDOUT_OFF		0x0	/* Output LOW */
+#define LEDOUT_ON		0x1	/* Output HI-Z */
+#define LEDOUT_DIM		0x2	/* Dimming */
+#define LEDOUT_BLINK		0x3	/* Blinking */
+#define LEDOUT_MASK		0x3
+
+#define ldev_to_led(c)		container_of(c, struct tlc591xx_led, ldev)
+#define work_to_led(work)	container_of(work, struct tlc591xx_led, work)
+
+struct tlc591xx_led {
+	bool active;
+	unsigned int led_no;
+	struct led_classdev ldev;
+	struct work_struct work;
+	struct tlc591xx_priv *priv;
+};
+
+struct tlc591xx_priv {
+	struct tlc591xx_led leds[TLC591XX_MAX_LEDS];
+	struct regmap *regmap;
+	unsigned int reg_ledout_offset;
+};
+
+struct tlc591xx {
+	unsigned int max_leds;
+	unsigned int reg_ledout_offset;
+};
+
+static const struct tlc591xx tlc59116 = {
+	.max_leds = 16,
+	.reg_ledout_offset = 0x14,
+};
+
+static const struct tlc591xx tlc59108 = {
+	.max_leds = 8,
+	.reg_ledout_offset = 0x0c,
+};
+
+static int
+tlc591xx_set_mode(struct regmap *regmap, u8 mode)
+{
+	int err;
+	u8 val;
+
+	err = regmap_write(regmap, TLC591XX_REG_MODE1, MODE1_NORMAL_MODE);
+	if (err)
+		return err;
+
+	val = MODE2_OCH_STOP | mode;
+
+	return regmap_write(regmap, TLC591XX_REG_MODE2, val);
+}
+
+static int
+tlc591xx_set_ledout(struct tlc591xx_priv *priv, struct tlc591xx_led *led,
+		    u8 val)
+{
+	unsigned int i = (led->led_no % 4) * 2;
+	unsigned int mask = LEDOUT_MASK << i;
+	unsigned int addr = priv->reg_ledout_offset + (led->led_no >> 2);
+
+	val = val << i;
+
+	return regmap_update_bits(priv->regmap, addr, mask, val);
+}
+
+static int
+tlc591xx_set_pwm(struct tlc591xx_priv *priv, struct tlc591xx_led *led,
+		 u8 brightness)
+{
+	u8 pwm = TLC591XX_REG_PWM(led->led_no);
+
+	return regmap_write(priv->regmap, pwm, brightness);
+}
+
+static void
+tlc591xx_led_work(struct work_struct *work)
+{
+	struct tlc591xx_led *led = work_to_led(work);
+	struct tlc591xx_priv *priv = led->priv;
+	enum led_brightness brightness = led->ldev.brightness;
+	int err;
+
+	switch (brightness) {
+	case 0:
+		err = tlc591xx_set_ledout(priv, led, LEDOUT_OFF);
+		break;
+	case LED_FULL:
+		err = tlc591xx_set_ledout(priv, led, LEDOUT_ON);
+		break;
+	default:
+		err = tlc591xx_set_ledout(priv, led, LEDOUT_DIM);
+		if (!err)
+			err = tlc591xx_set_pwm(priv, led, brightness);
+	}
+
+	if (err)
+		dev_err(led->ldev.dev, "Failed setting brightness\n");
+}
+
+static void
+tlc591xx_brightness_set(struct led_classdev *led_cdev,
+			enum led_brightness brightness)
+{
+	struct tlc591xx_led *led = ldev_to_led(led_cdev);
+
+	led->ldev.brightness = brightness;
+	schedule_work(&led->work);
+}
+
+static void
+tlc591xx_destroy_devices(struct tlc591xx_priv *priv, unsigned int j)
+{
+	int i = j;
+
+	while (--i >= 0) {
+		if (priv->leds[i].active) {
+			led_classdev_unregister(&priv->leds[i].ldev);
+			cancel_work_sync(&priv->leds[i].work);
+		}
+	}
+}
+
+static int
+tlc591xx_configure(struct device *dev,
+		   struct tlc591xx_priv *priv,
+		   const struct tlc591xx *tlc591xx)
+{
+	unsigned int i;
+	int err = 0;
+
+	tlc591xx_set_mode(priv->regmap, MODE2_DIM);
+	for (i = 0; i < TLC591XX_MAX_LEDS; i++) {
+		struct tlc591xx_led *led = &priv->leds[i];
+
+		if (!led->active)
+			continue;
+
+		led->priv = priv;
+		led->led_no = i;
+		led->ldev.brightness_set = tlc591xx_brightness_set;
+		led->ldev.max_brightness = LED_FULL;
+		INIT_WORK(&led->work, tlc591xx_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;
+		}
+	}
+
+	return 0;
+
+exit:
+	tlc591xx_destroy_devices(priv, i);
+	return err;
+}
+
+static const struct regmap_config tlc591xx_regmap = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.max_register = 0x1e,
+};
+
+static const struct of_device_id of_tlc591xx_leds_match[] = {
+	{ .compatible = "ti,tlc59116",
+	  .data = &tlc59116 },
+	{ .compatible = "ti,tlc59108",
+	  .data = &tlc59108 },
+	{},
+};
+MODULE_DEVICE_TABLE(of, of_tlc591xx_leds_match);
+
+static int
+tlc591xx_probe(struct i2c_client *client,
+	       const struct i2c_device_id *id)
+{
+	struct device_node *np = client->dev.of_node, *child;
+	struct device *dev = &client->dev;
+	const struct of_device_id *match;
+	const struct tlc591xx *tlc591xx;
+	struct tlc591xx_priv *priv;
+	int err, count, reg;
+
+	match = of_match_device(of_tlc591xx_leds_match, dev);
+	if (!match)
+		return -ENODEV;
+
+	tlc591xx = match->data;
+	if (!np)
+		return -ENODEV;
+
+	count = of_get_child_count(np);
+	if (!count || count > tlc591xx->max_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;
+
+	priv->regmap = devm_regmap_init_i2c(client, &tlc591xx_regmap);
+	if (IS_ERR(priv->regmap)) {
+		err = PTR_ERR(priv->regmap);
+		dev_err(dev, "Failed to allocate register map: %d\n", err);
+		return err;
+	}
+	priv->reg_ledout_offset = tlc591xx->reg_ledout_offset;
+
+	i2c_set_clientdata(client, priv);
+
+	for_each_child_of_node(np, child) {
+		err = of_property_read_u32(child, "reg", &reg);
+		if (err)
+			return err;
+		if (reg < 0 || reg >= tlc591xx->max_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 tlc591xx_configure(dev, priv, tlc591xx);
+}
+
+static int
+tlc591xx_remove(struct i2c_client *client)
+{
+	struct tlc591xx_priv *priv = i2c_get_clientdata(client);
+
+	tlc591xx_destroy_devices(priv, TLC591XX_MAX_LEDS);
+
+	return 0;
+}
+
+static const struct i2c_device_id tlc591xx_id[] = {
+	{ "tlc59116" },
+	{ "tlc59108" },
+	{},
+};
+MODULE_DEVICE_TABLE(i2c, tlc591xx_id);
+
+static struct i2c_driver tlc591xx_driver = {
+	.driver = {
+		.name = "tlc591xx",
+		.of_match_table = of_match_ptr(of_tlc591xx_leds_match),
+	},
+	.probe = tlc591xx_probe,
+	.remove = tlc591xx_remove,
+	.id_table = tlc591xx_id,
+};
+
+module_i2c_driver(tlc591xx_driver);
+
+MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("TLC591XX LED driver");
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver
  2015-01-27 13:59 [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver Andrew Lunn
  2015-01-27 13:59 ` [PATCHv6 1/2] leds: tlc591xx: Document binding for the TI " Andrew Lunn
  2015-01-27 13:59 ` [PATCHv6 2/2] leds: tlc591xx: Driver " Andrew Lunn
@ 2015-02-06  3:10 ` Andrew Lunn
  2015-02-09 11:50   ` Tomi Valkeinen
  2 siblings, 1 reply; 8+ messages in thread
From: Andrew Lunn @ 2015-02-06  3:10 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Jan 27, 2015 at 02:59:19PM +0100, Andrew Lunn wrote:
> This patchset is a driver for the TI tlc59116 16 Channel i2c LED
> driver and tlc59108 8 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.

Hi Bryan

Do you have any further comments on this driver? Are you likely to
queue it up for the next merge window?

      Thanks
	Andrew


> 
> Cc: Matthew.Fatheree at belkin.com
> 
> Since v5:
>       Hard code number of LEDs, rather than #define
>       Moved common fields from led into priv
>       Moved reg_ledout into priv, removed helper functions
>       Cache brightness to avoid race conditions
>       tlc591xx_led_set -> tlc591xx_set_brightness
>       Be paranoid with of_match_device() and client->dev.of_node
> 
> Since v4:
>       Fix Oops on module unload reported by Vignesh R
> 
> Since v3:
>       Generalized and added support for tlc59108
>       brightness == 0 and brightness == LED_FULL disable PWM and used
>         fixed OFF/ON mode
> 
> 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] 8+ messages in thread

* [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver
  2015-02-06  3:10 ` [PATCHv6 0/2] Driver for TI tlc591xx " Andrew Lunn
@ 2015-02-09 11:50   ` Tomi Valkeinen
  2015-02-09 14:13     ` Andrew Lunn
  0 siblings, 1 reply; 8+ messages in thread
From: Tomi Valkeinen @ 2015-02-09 11:50 UTC (permalink / raw)
  To: linux-arm-kernel

On 06/02/15 05:10, Andrew Lunn wrote:
> On Tue, Jan 27, 2015 at 02:59:19PM +0100, Andrew Lunn wrote:
>> This patchset is a driver for the TI tlc59116 16 Channel i2c LED
>> driver and tlc59108 8 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.
> 
> Hi Bryan
> 
> Do you have any further comments on this driver? Are you likely to
> queue it up for the next merge window?

Hi Andrew,

You didn't comment anything on my and Peter's questions on v5 thread
about this being a PWM driver.

 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/20150209/d8e8263b/attachment.sig>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver
  2015-02-09 11:50   ` Tomi Valkeinen
@ 2015-02-09 14:13     ` Andrew Lunn
  2015-02-09 14:25       ` Tomi Valkeinen
  0 siblings, 1 reply; 8+ messages in thread
From: Andrew Lunn @ 2015-02-09 14:13 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Feb 09, 2015 at 01:50:37PM +0200, Tomi Valkeinen wrote:
> On 06/02/15 05:10, Andrew Lunn wrote:
> > On Tue, Jan 27, 2015 at 02:59:19PM +0100, Andrew Lunn wrote:
> >> This patchset is a driver for the TI tlc59116 16 Channel i2c LED
> >> driver and tlc59108 8 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.
> > 
> > Hi Bryan
> > 
> > Do you have any further comments on this driver? Are you likely to
> > queue it up for the next merge window?
> 
> Hi Andrew,
> 
> You didn't comment anything on my and Peter's questions on v5 thread
> about this being a PWM driver.

Hi Tomi

I don't comment, because it is not our decision to make any more. We
have been around this argument many times, so we are not going to
resolve it. The LED and PWM maintainers need to decide, not us.

	Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver
  2015-02-09 14:13     ` Andrew Lunn
@ 2015-02-09 14:25       ` Tomi Valkeinen
  0 siblings, 0 replies; 8+ messages in thread
From: Tomi Valkeinen @ 2015-02-09 14:25 UTC (permalink / raw)
  To: linux-arm-kernel

On 09/02/15 16:13, Andrew Lunn wrote:
> On Mon, Feb 09, 2015 at 01:50:37PM +0200, Tomi Valkeinen wrote:
>> On 06/02/15 05:10, Andrew Lunn wrote:
>>> On Tue, Jan 27, 2015 at 02:59:19PM +0100, Andrew Lunn wrote:
>>>> This patchset is a driver for the TI tlc59116 16 Channel i2c LED
>>>> driver and tlc59108 8 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.
>>>
>>> Hi Bryan
>>>
>>> Do you have any further comments on this driver? Are you likely to
>>> queue it up for the next merge window?
>>
>> Hi Andrew,
>>
>> You didn't comment anything on my and Peter's questions on v5 thread
>> about this being a PWM driver.
> 
> Hi Tomi
> 
> I don't comment, because it is not our decision to make any more. We
> have been around this argument many times, so we are not going to
> resolve it. The LED and PWM maintainers need to decide, not us.

Well, I wasn't asking for decisions. I asked what are the technical
differences between the options. If this driver would be implemented as
a PWM driver, and you'd use pwm-leds, how would that affect your use case?

If I'm not mistaken, the only argument so far you've given was that the
device cannot implement the pwm_config() call correctly, but Peter
argued that it doesn't matter, other PWM devices cannot do that either.

I want the driver to work for all the users, and as I'm not that
familiar with leds and pwms I need to ask these questions.

 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/20150209/fad2fcb2/attachment.sig>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCHv6 2/2] leds: tlc591xx: Driver for the TI 8/16 Channel i2c LED driver
  2015-01-27 13:59 ` [PATCHv6 2/2] leds: tlc591xx: Driver " Andrew Lunn
@ 2015-02-16 14:11   ` Imre Kaloz
  0 siblings, 0 replies; 8+ messages in thread
From: Imre Kaloz @ 2015-02-16 14:11 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Andrew,

On Tue, 27 Jan 2015 14:59:21 +0100, Andrew Lunn <andrew@lunn.ch> wrote:

> The TLC59116 is an I2C bus controlled 16-channel LED driver.  The
> TLC59108 is an I2C bus controlled 8-channel LED driver, which is very
> similar to the TLC59116. Each LED output has its own 8-bit
> fixed-frequency PWM controller to control the brightness of the LED.
> The LEDs can also be fixed off and on, making them suitable for use as
> GPOs.
>
> This is based on a driver from Belkin, but has been extensively
> rewritten and extended to support both 08 and 16 versions.
>
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> Cc: Matthew.Fatheree at belkin.com

I've tested the driver on the Mamba (WRT1900AC) and it has been integrated  
to OpenWrt trunk for a while now, and no issues has been reported by the  
community either.

Please feel free to add Tested-by: Imre Kaloz <kaloz@openwrt.org>.


Thanks,

Imre

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-02-16 14:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-27 13:59 [PATCHv6 0/2] Driver for TI tlc591xx 8/16 Channel i2c LED driver Andrew Lunn
2015-01-27 13:59 ` [PATCHv6 1/2] leds: tlc591xx: Document binding for the TI " Andrew Lunn
2015-01-27 13:59 ` [PATCHv6 2/2] leds: tlc591xx: Driver " Andrew Lunn
2015-02-16 14:11   ` Imre Kaloz
2015-02-06  3:10 ` [PATCHv6 0/2] Driver for TI tlc591xx " Andrew Lunn
2015-02-09 11:50   ` Tomi Valkeinen
2015-02-09 14:13     ` Andrew Lunn
2015-02-09 14:25       ` Tomi Valkeinen

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).