On Wed, Jun 26, 2013 at 7:17 AM, Tony Lindgren <tony@xxxxxxxxxxx> wrote: > Similar to tca6507, we can just parse the standard LED > properties for pca9633. > > Tested on a pca9632, which is compatible with pca9633. > > Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx> > > --- /dev/null > +++ b/Documentation/devicetree/bindings/leds/pca9633.txt > @@ -0,0 +1,42 @@ > +LEDs connected to pca9633 or pca9632 > + > +Required properties: > +- compatible : should be : "nxp,pca963x" > + > +Each led is represented as a sub-node of the nxp,pca9633 device. > + > +LED sub-node properties: > +- label : (optional) see Documentation/devicetree/bindings/leds/common.txt > +- reg : number of LED line (could be from 0 to 4) > +- linux,default-trigger : (optional) > + see Documentation/devicetree/bindings/leds/common.txt > + > +Examples: > + > +pca9632: pca9632 { > + compatible = "nxp,pca9632", "nxp,pca963x"; > + #address-cells = <1>; > + #size-cells = <0>; > + reg = <0x62>; > + > + red@0 { > + label = "red"; > + reg = <0>; > + linux,default-trigger = "none"; > + }; > + green@1 { > + label = "green"; > + reg = <1>; > + linux,default-trigger = "none"; > + }; > + blue@2 { > + label = "blue"; > + reg = <2>; > + linux,default-trigger = "none"; > + }; > + unused@3 { > + label = "unused"; > + reg = <3>; > + linux,default-trigger = "none"; > + }; > +}; > --- a/drivers/leds/leds-pca9633.c > +++ b/drivers/leds/leds-pca9633.c > @@ -22,6 +22,7 @@ > #include <linux/i2c.h> > #include <linux/workqueue.h> > #include <linux/slab.h> > +#include <linux/of.h> > #include <linux/platform_data/leds-pca9633.h> > > /* LED select registers determine the source that drives LED outputs */ > @@ -93,6 +94,61 @@ static void pca9633_led_set(struct led_classdev *led_cdev, > schedule_work(&pca9633->work); > } > > +#ifdef CONFIG_OF Shall we use "#if IS_ENABLED(CONFIG_OF)", as Grant pointed out recently. -Bryan > +static struct pca9633_platform_data * > +pca9633_dt_init(struct i2c_client *client) > +{ > + struct device_node *np = client->dev.of_node, *child; > + struct pca9633_platform_data *pdata; > + struct led_info *pca9633_leds; > + int count; > + > + count = of_get_child_count(np); > + if (!count || count > 4) > + return ERR_PTR(-ENODEV); > + > + pca9633_leds = devm_kzalloc(&client->dev, > + sizeof(struct led_info) * count, GFP_KERNEL); > + if (!pca9633_leds) > + return ERR_PTR(-ENOMEM); > + > + for_each_child_of_node(np, child) { > + struct led_info led; > + u32 reg; > + int res; > + > + led.name = > + of_get_property(child, "label", NULL) ? : child->name; > + led.default_trigger = > + of_get_property(child, "linux,default-trigger", NULL); > + res = of_property_read_u32(child, "reg", ®); > + if (res != 0) > + continue; > + pca9633_leds[reg] = led; > + } > + pdata = devm_kzalloc(&client->dev, > + sizeof(struct pca9633_platform_data), GFP_KERNEL); > + if (!pdata) > + return ERR_PTR(-ENOMEM); > + > + pdata->leds.leds = pca9633_leds; > + pdata->leds.num_leds = count; > + > + return pdata; > +} > + > +static const struct of_device_id of_pca9633_match[] = { > + { .compatible = "nxp,pca963x", }, > + {}, > +}; > +#else > +static struct pca9633_platform_data * > +pca9633_dt_init(struct i2c_client *client) > +{ > + return ERR_PTR(-ENODEV); > +} > +#endif > + > static int pca9633_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > @@ -102,6 +158,14 @@ static int pca9633_probe(struct i2c_client *client, > > pdata = client->dev.platform_data; > > + if (!pdata) { > + pdata = pca9633_dt_init(client); > + if (IS_ERR(pdata)) { > + dev_warn(&client->dev, "could not parse configuration\n"); > + pdata = NULL; > + } > + } > + > if (pdata) { > if (pdata->leds.num_leds <= 0 || pdata->leds.num_leds > 4) { > dev_err(&client->dev, "board info must claim at most 4 LEDs"); > @@ -181,6 +245,7 @@ static struct i2c_driver pca9633_driver = { > .driver = { > .name = "leds-pca9633", > .owner = THIS_MODULE, > + .of_match_table = of_match_ptr(of_pca9633_match), > }, > .probe = pca9633_probe, > .remove = pca9633_remove, -- To unsubscribe from this list: send the line "unsubscribe linux-leds" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html