Skip to contentSkip to conversation

media: i2c/adp1653: devicetree support for adp1653

PATCH Superseded Pavel Machek 5 participants 33 messages Apr 2, 2015 – Apr 13, 2015

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 media: i2c/adp1653: devicetree support for adp1653

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

---

I'm not sure if it is device tree or media framework, either everyone waits for someone else, or noone really cares.

Andrew, can you just merge it?

Please apply,
Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +37 -0
new file mode 100644
index 0000000..0fc28a9
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - gpios: References to the GPIO that controls the power for the chip.
+
+There are two led outputs available - flash and indicator. One led is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
drivers/media/i2c/adp1653.c +81 -9

148 lines not on this page · raw message

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#1 lore raw

Hi Pawel,

My apologies for the very late reply.

Quoted 6 lines · Pavel Machek

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

Quoted 6 lines

---

I'm not sure if it is device tree or media framework, either everyone waits for someone else, or noone really cares.

Neither. Some people are unfortuantely very busy with many other things as well. :-P

Quoted 3 lines

Andrew, can you just merge it?

Please apply,

Please wait just a while.

I think we can merge this eventually through the linux-media tree, but please first see the comments below.

Quoted 18 lines

Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +10 -0
new file mode 100644
index 0000000..0fc28a9
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - gpios: References to the GPIO that controls the power for the chip.
+

Documentation/devicetree/bindings/media/i2c/adp1653.txt line 20

Quoted 10 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +10 -0
+There are two led outputs available - flash and indicator. One led is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt

The documentation says that the maximum value is used if these values are not specified. I think I'd make these optional.

Quoted 39 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +17 -0
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
drivers/media/i2c/adp1653.c +3 -0
index 873fe19..0341009 100644
@@ -8,6 +8,7 @@
  * Contributors:
  *	Sakari Ailus <[email protected]>
  *	Tuukka Toivonen <[email protected]>
+ *	Pavel Machek <[email protected]>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -34,6 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 

drivers/media/i2c/adp1653.c adp1653_init_device(struct adp1653_flash *flash) · line 315

Quoted 8 lines
drivers/media/i2c/adp1653.c +4 -1
@@ -306,9 +309,17 @@ adp1653_init_device(struct adp1653_flash *flash)
 static int
 __adp1653_set_power(struct adp1653_flash *flash, int on)
 {
-	int ret;
+	int ret = 0;
+
+	if (flash->platform_data->power) {
+		ret = flash->platform_data->power(&flash->subdev, on);

The power() callback should be dropped. It's controlling a GPIO. But that can be done later on. The alternative is a patch before this one.

Quoted 91 lines
drivers/media/i2c/adp1653.c +67 -2
+	} else {
+		gpio_set_value(flash->platform_data->power_gpio, on);
+		if (on)
+			/* Some delay is apparently required. */
+			udelay(20);
+	}
 
-	ret = flash->platform_data->power(&flash->subdev, on);
 	if (ret < 0)
 		return ret;
 
@@ -316,8 +327,13 @@ __adp1653_set_power(struct adp1653_flash *flash, int on)
 		return 0;
 
 	ret = adp1653_init_device(flash);
-	if (ret < 0)
+	if (ret >= 0)
+		return ret;
+
+	if (flash->platform_data->power)
 		flash->platform_data->power(&flash->subdev, 0);
+	else
+		gpio_set_value(flash->platform_data->power_gpio, 0);
 
 	return ret;
 }
@@ -407,21 +423,77 @@ static int adp1653_resume(struct device *dev)
 
 #endif /* CONFIG_PM */
 
+static int adp1653_of_init(struct i2c_client *client,
+			   struct adp1653_flash *flash,
+			   struct device_node *node)
+{
+	u32 val;
+	struct adp1653_platform_data *pd;
+	enum of_gpio_flags flags;
+	int gpio;
+	struct device_node *child;
+
+	if (!node)
+		return -EINVAL;
+
+	pd = devm_kzalloc(&client->dev, sizeof(*pd), GFP_KERNEL);
+	if (!pd)
+		return -ENOMEM;
+	flash->platform_data = pd;
+
+	child = of_get_child_by_name(node, "flash");
+	if (!child)
+		return -EINVAL;
+	if (of_property_read_u32(child, "flash-timeout-microsec", &val))
+		return -EINVAL;
+
+	pd->max_flash_timeout = val;
+	if (of_property_read_u32(child, "flash-max-microamp", &val))
+		return -EINVAL;
+	pd->max_flash_intensity = val/1000;
+
+	if (of_property_read_u32(child, "max-microamp", &val))
+		return -EINVAL;
+	pd->max_torch_intensity = val/1000;
+
+	child = of_get_child_by_name(node, "indicator");
+	if (!child)
+		return -EINVAL;
+	if (of_property_read_u32(child, "max-microamp", &val))
+		return -EINVAL;
+	pd->max_indicator_intensity = val;
+
+	if (!of_find_property(node, "gpios", NULL)) {
+		dev_err(&client->dev, "No gpio node\n");
+		return -EINVAL;
+	}
+
+	pd->power_gpio = of_get_gpio_flags(node, 0, &flags);
+	if (pd->power_gpio < 0) {
+		dev_err(&client->dev, "Error getting GPIO\n");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+
 static int adp1653_probe(struct i2c_client *client,
 			 const struct i2c_device_id *devid)
 {
 	struct adp1653_flash *flash;
 	int ret;
 

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 492

Quoted 10 lines
drivers/media/i2c/adp1653.c +1 -4
-	/* we couldn't work without platform data */
-	if (client->dev.platform_data == NULL)
-		return -ENODEV;
-
 	flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
 	if (flash == NULL)
 		return -ENOMEM;
 
 	flash->platform_data = client->dev.platform_data;
+	if (!flash->platform_data) {

I'd check whether dev->of_node is non-NULL instead.

drivers/media/i2c/adp1653.c static int adp1653_probe(struct i2c_client *client, · line 441

Quoted 12 lines
drivers/media/i2c/adp1653.c +4 -1
+		ret = adp1653_of_init(client, flash, client->dev.of_node);
+		if (ret)
+			return ret;
+	}
 
 	mutex_init(&flash->power_lock);
 
@@ -438,10 +510,10 @@ static int adp1653_probe(struct i2c_client *client,
 		goto free_and_quit;
 
 	flash->subdev.entity.type = MEDIA_ENT_T_V4L2_SUBDEV_FLASH;
-

I rather liked the newline here. Please don't remove it. :-)

Quoted 10 lines
drivers/media/i2c/adp1653.c +1 -0
 	return 0;
 
 free_and_quit:
+	dev_err(&client->dev, "adp1653: failed to register device\n");
 	v4l2_ctrl_handler_free(&flash->ctrls);
 	return ret;
 }

drivers/media/i2c/adp1653.c static const struct i2c_device_id adp1653_id_table[] = { · line 542

Quoted 8 lines
drivers/media/i2c/adp1653.c +1 -1
@@ -464,7 +536,7 @@ static const struct i2c_device_id adp1653_id_table[] = {
 };
 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
 
-static struct dev_pm_ops adp1653_pm_ops = {
+static const struct dev_pm_ops adp1653_pm_ops = {
 	.suspend	= adp1653_suspend,
 	.resume		= adp1653_resume,
 };

A corresponding change to the N900 dts would be very nice.

I think you're missing change to adp1653_i2c_driver.driver.of_match_table.

Signature · 4 lines
Kind regards,

Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#2 lore raw

Hi!

Quoted 13 lines

Hi Pawel,

My apologies for the very late reply.

Quoted 8 lines · Pavel Machek

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

Quoted 7 lines
Quoted 4 lines

---

I'm not sure if it is device tree or media framework, either everyone waits for someone else, or noone really cares.

Neither. Some people are unfortuantely very busy with many other things as well. :-P

Well.. Being busy is ok. Nitpicking is also ok. But both at the same time... is not good.

Quoted 10 lines
Quoted 3 lines

Andrew, can you just merge it?

Please apply,

Please wait just a while.

I think we can merge this eventually through the linux-media tree, but please first see the comments below.

Quoted 7 lines

Documentation/devicetree/bindings/media/i2c/adp1653.txt line 20

Quoted 4 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +4 -0
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt

The documentation says that the maximum value is used if these values are not specified. I think I'd make these optional.

I'd rather not: when you make a typo in dts, it would supply maximum available current, potentially damaging the LED. You will not be able to tell brightness difference with naked eye...

Quoted 10 lines

drivers/media/i2c/adp1653.c adp1653_init_device(struct adp1653_flash *flash) · line 315

Quoted 7 lines

__adp1653_set_power(struct adp1653_flash *flash, int on) {

drivers/media/i2c/adp1653.c +4 -1
-	int ret;
+	int ret = 0;
+
+	if (flash->platform_data->power) {
+		ret = flash->platform_data->power(&flash->subdev, on);

The power() callback should be dropped. It's controlling a GPIO. But that can be done later on. The alternative is a patch before this one.

I'd prefer to do it later; we want to keep functionality on N900 without DTS, too.

Quoted 8 lines

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 492

Quoted 6 lines
drivers/media/i2c/adp1653.c +1 -0
 	flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
 	if (flash == NULL)
 		return -ENOMEM;
 
 	flash->platform_data = client->dev.platform_data;
+	if (!flash->platform_data) {

I'd check whether dev->of_node is non-NULL instead.

Ok.

Quoted 7 lines

drivers/media/i2c/adp1653.c static int adp1653_probe(struct i2c_client *client, · line 441

Quoted 5 lines
drivers/media/i2c/adp1653.c +0 -1
@@ -438,10 +510,10 @@ static int adp1653_probe(struct i2c_client *client,
 		goto free_and_quit;
 
 	flash->subdev.entity.type = MEDIA_ENT_T_V4L2_SUBDEV_FLASH;
-

I rather liked the newline here. Please don't remove it. :-)

Ok.

Quoted 4 lines
Quoted 4 lines
drivers/media/i2c/adp1653.c +0 -0
@@ -464,7 +536,7 @@ static const struct i2c_device_id adp1653_id_table[] = {
 };
 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
 
Quoted 9 lines

drivers/media/i2c/adp1653.c static const struct i2c_device_id adp1653_id_table[] = { · line 542

Quoted 7 lines
drivers/media/i2c/adp1653.c +1 -1
-static struct dev_pm_ops adp1653_pm_ops = {
+static const struct dev_pm_ops adp1653_pm_ops = {
 	.suspend	= adp1653_suspend,
 	.resume		= adp1653_resume,
 };

A corresponding change to the N900 dts would be very nice.

Corresponding change to the dts will come in separate patch. Or do you have n900 for testing?

Quoted 1 line

I think you're missing change to adp1653_i2c_driver.driver.of_match_table.

It actually worked for me, which means device tree somehow does it magic.

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#3 lore raw

Hi Pawel,

Quoted 17 lines · Pavel Machek

Hi!

Quoted 15 lines

Hi Pawel,

My apologies for the very late reply.

Quoted 10 lines · Pavel Machek

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

---

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

I'm not sure if it is device tree or media framework, either everyone waits for someone else, or noone really cares.

Neither. Some people are unfortuantely very busy with many other things as well. :-P

Well.. Being busy is ok. Nitpicking is also ok. But both at the same time... is not good.

Good. Then we should be fine. :-)

Quoted 19 lines
Quoted 11 lines
Quoted 4 lines

Andrew, can you just merge it?

Please apply,

Please wait just a while.

I think we can merge this eventually through the linux-media tree, but please first see the comments below.

Quoted 7 lines

Documentation/devicetree/bindings/media/i2c/adp1653.txt line 20

Quoted 4 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +4 -0
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt

The documentation says that the maximum value is used if these values are not specified. I think I'd make these optional.

Quoted 3 lines

I'd rather not: when you make a typo in dts, it would supply maximum available current, potentially damaging the LED. You will not be able to tell brightness difference with naked eye...

Fine for me.

Quoted 11 lines
Quoted 10 lines

drivers/media/i2c/adp1653.c adp1653_init_device(struct adp1653_flash *flash) · line 315

Quoted 7 lines

__adp1653_set_power(struct adp1653_flash *flash, int on) {

drivers/media/i2c/adp1653.c +4 -1
-	int ret;
+	int ret = 0;
+
+	if (flash->platform_data->power) {
+		ret = flash->platform_data->power(&flash->subdev, on);

The power() callback should be dropped. It's controlling a GPIO. But that can be done later on. The alternative is a patch before this one.

Quoted 2 lines

I'd prefer to do it later; we want to keep functionality on N900 without DTS, too.

Fine as well.

Quoted 35 lines
Quoted 8 lines

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 492

Quoted 6 lines
drivers/media/i2c/adp1653.c +1 -0
 	flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
 	if (flash == NULL)
 		return -ENOMEM;
 
 	flash->platform_data = client->dev.platform_data;
+	if (!flash->platform_data) {

I'd check whether dev->of_node is non-NULL instead.

Ok.

Quoted 7 lines

drivers/media/i2c/adp1653.c static int adp1653_probe(struct i2c_client *client, · line 441

Quoted 5 lines
drivers/media/i2c/adp1653.c +0 -1
@@ -438,10 +510,10 @@ static int adp1653_probe(struct i2c_client *client,
 		goto free_and_quit;
 
 	flash->subdev.entity.type = MEDIA_ENT_T_V4L2_SUBDEV_FLASH;
-

I rather liked the newline here. Please don't remove it. :-)

Ok.

Quoted 4 lines
Quoted 4 lines
drivers/media/i2c/adp1653.c +0 -0
@@ -464,7 +536,7 @@ static const struct i2c_device_id adp1653_id_table[] = {
 };
 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
 
Quoted 9 lines

drivers/media/i2c/adp1653.c static const struct i2c_device_id adp1653_id_table[] = { · line 542

Quoted 7 lines
drivers/media/i2c/adp1653.c +1 -1
-static struct dev_pm_ops adp1653_pm_ops = {
+static const struct dev_pm_ops adp1653_pm_ops = {
 	.suspend	= adp1653_suspend,
 	.resume		= adp1653_resume,
 };

A corresponding change to the N900 dts would be very nice.

Quoted 2 lines

Corresponding change to the dts will come in separate patch. Or do you have n900 for testing?

Yes, it should be a separate patch, I agree.

I do have one but I can't say when I'd have time to test it. I'm fine with you having tested it though.

Quoted 4 lines
Quoted 1 line

I think you're missing change to adp1653_i2c_driver.driver.of_match_table.

It actually worked for me, which means device tree somehow does it magic.

By magic? :-) It probably just ends up comparing the device and the driver names. How about adding the of_match_table?

Signature · 4 lines
Regards,

Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#4 lore raw

Hi!

Quoted 1 line

Hi Pawel,

I'm still Pavel. v, not w.

Quoted 12 lines
Quoted 6 lines
Quoted 3 lines

Hi Pawel,

A corresponding change to the N900 dts would be very nice.

Corresponding change to the dts will come in separate patch. Or do you have n900 for testing?

Yes, it should be a separate patch, I agree.

I do have one but I can't say when I'd have time to test it. I'm fine with you having tested it though.

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

I think you're missing change to adp1653_i2c_driver.driver.of_match_table.

It actually worked for me, which means device tree somehow does it magic.

By magic? :-) It probably just ends up comparing the device and the driver names. How about adding the of_match_table?

I guess it uses adp1653_id_table. I'd hade to add redundand information, because if it would just mask the errors if the code changed...

Thanks,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#5 lore raw

Hi Pavel,

Quoted 5 lines · Pavel Machek

Hi!

Quoted 1 line

Hi Pawel,

I'm still Pavel. v, not w.

I know too many Pawels. Sorry about that. :-)

Quoted 18 lines
Quoted 18 lines
Quoted 7 lines
Quoted 4 lines

Hi Pawel,

A corresponding change to the N900 dts would be very nice.

Corresponding change to the dts will come in separate patch. Or do you have n900 for testing?

Yes, it should be a separate patch, I agree.

I do have one but I can't say when I'd have time to test it. I'm fine with you having tested it though.

Quoted 4 lines
Quoted 1 line

I think you're missing change to adp1653_i2c_driver.driver.of_match_table.

It actually worked for me, which means device tree somehow does it magic.

Quoted 6 lines
Quoted 2 lines

By magic? :-) It probably just ends up comparing the device and the driver names. How about adding the of_match_table?

I guess it uses adp1653_id_table. I'd hade to add redundand information, because if it would just mask the errors if the code changed...

Indeed, that's true. This is comparing "adp1653" vs. comparing "adi,adp1653". I think I still prefer the latter since it's got also the vendor prefix included.

Suppose we change this later and someone misspelled the vendor prefix --- their board would break.

Signature · 4 lines
Regards,

Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#6 lore raw
Quoted 16 lines · Sakari Ailus

Hi Pavel,

Quoted 5 lines · Pavel Machek

Hi!

Quoted 1 line

Hi Pawel,

I'm still Pavel. v, not w.

I know too many Pawels. Sorry about that. :-)

Quoted 3 lines

I guess it uses adp1653_id_table. I'd hade to add redundand information, because if it would just mask the errors if the code changed...

Quoted 6 lines

Indeed, that's true. This is comparing "adp1653" vs. comparing "adi,adp1653". I think I still prefer the latter since it's got also the vendor prefix included.

Suppose we change this later and someone misspelled the vendor prefix --- their board would break.

Suppose we do what you suggest. That does not fix the problem, since code will still match the "adp1653" in case someone misspells it.

If you want to change how i2c device matching works, well, you can do it, but my patch is not right place to do that.

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#7 lore raw
Quoted 21 lines · Pavel Machek
Quoted 20 lines · Sakari Ailus

Hi Pavel,

Quoted 5 lines · Pavel Machek

Hi!

Quoted 1 line

Hi Pawel,

I'm still Pavel. v, not w.

I know too many Pawels. Sorry about that. :-)

Quoted 3 lines

I guess it uses adp1653_id_table. I'd hade to add redundand information, because if it would just mask the errors if the code changed...

Indeed, that's true. This is comparing "adp1653" vs. comparing "adi,adp1653". I think I still prefer the latter since it's got also the vendor prefix included.

Quoted 8 lines
Quoted 2 lines

Suppose we change this later and someone misspelled the vendor prefix --- their board would break.

Suppose we do what you suggest. That does not fix the problem, since code will still match the "adp1653" in case someone misspells it.

If you want to change how i2c device matching works, well, you can do it, but my patch is not right place to do that.

Good point. Let's leave it as-is.

Signature · 2 lines
Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#8 lore raw

PATCH v4 1/1 media: i2c/adp1653: devicetree support for adp1653

In reply to Pavel Machek

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

---

Fixed feedback by Sakari.

Please apply,
Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +37 -0
new file mode 100644
index 0000000..0fc28a9
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - gpios: References to the GPIO that controls the power for the chip.
+
+There are two led outputs available - flash and indicator. One led is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
drivers/media/i2c/adp1653.c +80 -8

143 lines not on this page · raw message

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#9 lore raw

Hello Pavel,

I haven't reviewed the patch since I'm not familiar with the hardware but just wanted to point out a couple of things that I spot:

Quoted 6 lines · Pavel Machek

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

Quoted 7 lines

---

Fixed feedback by Sakari.

Please apply,

There is no need to ask for patches to be applied IMHO. It is expected that people post patches wanting them to be applied unless there is an RFC prefix in the subject or say explicitly that the patch is for testing and should not be picked.

Documentation/devicetree/bindings/media/i2c/adp1653.txt

Quoted 3 lines

Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt +0 -0

When adding DT bindings, the Documentation portion should be in a separate patch and should come in the series before the patch implementing the binding. That makes the change easier to review, please take a look to points 1 and 3 in Documentation/devicetree/bindings/submitting-patches.txt.

Quoted 5 lines

new file mode 100644
index 0000000..0fc28a9

Documentation/devicetree/bindings/media/i2c/adp1653.txt line 9

Quoted 9 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +9 -0
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - gpios: References to the GPIO that controls the power for the chip.

The convention nowadays is to not use unnamed DT properties for GPIOs but instead use a prefix that explains what those GPIOs are used for. So something like "power-gpios" or "power-gpio" (if there is only one GPIO) will be more suitable. Please take a look to Documentation/gpio/board.txt for more details.

Quoted 123 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +28 -0
+
+There are two led outputs available - flash and indicator. One led is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+       adp1653: led-controller at 30 {
+               compatible = "adi,adp1653";
+               reg = <0x30>;
+               gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+               flash {
+                       flash-timeout-us = <500000>;
+                       flash-max-microamp = <320000>;
+                       max-microamp = <50000>;
+               };
+               indicator {
+                       max-microamp = <17500>;
+               };
+       };
drivers/media/i2c/adp1653.c +54 -3
index 873fe19..6d57b16 100644
@@ -8,6 +8,7 @@
  * Contributors:
  *     Sakari Ailus <[email protected]>
  *     Tuukka Toivonen <[email protected]>
+ *     Pavel Machek <[email protected]>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -34,6 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 
@@ -306,9 +309,17 @@ adp1653_init_device(struct adp1653_flash *flash)
 static int
 __adp1653_set_power(struct adp1653_flash *flash, int on)
 {
-       int ret;
+       int ret = 0;
+
+       if (flash->platform_data->power) {
+               ret = flash->platform_data->power(&flash->subdev, on);
+       } else {
+               gpio_set_value(flash->platform_data->power_gpio, on);
+               if (on)
+                       /* Some delay is apparently required. */
+                       udelay(20);
+       }
 
-       ret = flash->platform_data->power(&flash->subdev, on);
        if (ret < 0)
                return ret;
 
@@ -316,8 +327,13 @@ __adp1653_set_power(struct adp1653_flash *flash, int on)
                return 0;
 
        ret = adp1653_init_device(flash);
-       if (ret < 0)
+       if (ret >= 0)
+               return ret;
+
+       if (flash->platform_data->power)
                flash->platform_data->power(&flash->subdev, 0);
+       else
+               gpio_set_value(flash->platform_data->power_gpio, 0);
 
        return ret;
 }
@@ -407,21 +423,76 @@ static int adp1653_resume(struct device *dev)
 
 #endif /* CONFIG_PM */
 
+static int adp1653_of_init(struct i2c_client *client,
+                          struct adp1653_flash *flash,
+                          struct device_node *node)
+{
+       u32 val;
+       struct adp1653_platform_data *pd;
+       enum of_gpio_flags flags;
+       struct device_node *child;
+
+       if (!node)
+               return -EINVAL;
+
+       pd = devm_kzalloc(&client->dev, sizeof(*pd), GFP_KERNEL);
+       if (!pd)
+               return -ENOMEM;
+       flash->platform_data = pd;
+
+       child = of_get_child_by_name(node, "flash");
+       if (!child)
+               return -EINVAL;
+       if (of_property_read_u32(child, "flash-timeout-microsec", &val))
+               return -EINVAL;
+
+       pd->max_flash_timeout = val;
+       if (of_property_read_u32(child, "flash-max-microamp", &val))
+               return -EINVAL;
+       pd->max_flash_intensity = val/1000;
+
+       if (of_property_read_u32(child, "max-microamp", &val))
+               return -EINVAL;
+       pd->max_torch_intensity = val/1000;
+
+       child = of_get_child_by_name(node, "indicator");
+       if (!child)
+               return -EINVAL;

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 470

Quoted 10 lines
drivers/media/i2c/adp1653.c +10 -0
+       if (of_property_read_u32(child, "max-microamp", &val))
+               return -EINVAL;
+       pd->max_indicator_intensity = val;
+
+       if (!of_find_property(node, "gpios", NULL)) {
+               dev_err(&client->dev, "No gpio node\n");
+               return -EINVAL;
+       }
+
+       pd->power_gpio = of_get_gpio_flags(node, 0, &flags);

The old integer-based GPIO interface is deprecated and we want to get rid of it so please use the descriptor-based for new code. For example you want to use gpiod_get() instead of of_get_gpio_flags(). Documentation/gpio/gpio.txt describes the new interface.

Quoted 42 lines
drivers/media/i2c/adp1653.c +15 -4
+       if (pd->power_gpio < 0) {
+               dev_err(&client->dev, "Error getting GPIO\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+
 static int adp1653_probe(struct i2c_client *client,
                         const struct i2c_device_id *devid)
 {
        struct adp1653_flash *flash;
        int ret;
 
-       /* we couldn't work without platform data */
-       if (client->dev.platform_data == NULL)
-               return -ENODEV;
-
        flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
        if (flash == NULL)
                return -ENOMEM;
 
        flash->platform_data = client->dev.platform_data;
+       if (client->dev.of_node) {
+               ret = adp1653_of_init(client, flash, client->dev.of_node);
+               if (ret)
+                       return ret;
+       }
 
        mutex_init(&flash->power_lock);
 
@@ -442,6 +513,7 @@ static int adp1653_probe(struct i2c_client *client,
        return 0;
 
 free_and_quit:
+       dev_err(&client->dev, "adp1653: failed to register device\n");
        v4l2_ctrl_handler_free(&flash->ctrls);
        return ret;
 }

drivers/media/i2c/adp1653.c static const struct i2c_device_id adp1653_id_table[] = { · line 542

Quoted 8 lines
drivers/media/i2c/adp1653.c +1 -1
@@ -464,7 +536,7 @@ static const struct i2c_device_id adp1653_id_table[] = {
 };
 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
 
-static struct dev_pm_ops adp1653_pm_ops = {
+static const struct dev_pm_ops adp1653_pm_ops = {
        .suspend        = adp1653_suspend,
        .resume         = adp1653_resume,
 };

Best regards,
Javier

#10 lore raw

Hi!

Quoted 8 lines
Quoted 3 lines

Fixed feedback by Sakari.

Please apply,

There is no need to ask for patches to be applied IMHO. It is expected that people post patches wanting them to be applied unless there is an RFC prefix in the subject or say explicitly that the patch is for testing and should not be picked.

See history of this patch.

Quoted 7 lines

Documentation/devicetree/bindings/media/i2c/adp1653.txt

Quoted 1 line
Documentation/devicetree/bindings/media/i2c/adp1653.txt +0 -0

When adding DT bindings, the Documentation portion should be in a separate patch and should come in the series before the patch implementing the binding. That makes the change easier to review, please take a look to points 1 and 3 in Documentation/devicetree/bindings/submitting-patches.txt.

Because actual patch at the end of email is too much eye clutter for the poor device tree people, I can prepare nice series... producing more work for me and more noise on the lists? No, thanks.

Quoted 5 lines
Quoted 5 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt +5 -0
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
Quoted 8 lines

Documentation/devicetree/bindings/media/i2c/adp1653.txt

Quoted 2 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt +2 -0
+
+  - gpios: References to the GPIO that controls the power for the chip.

The convention nowadays is to not use unnamed DT properties for GPIOs but instead use a prefix that explains what those GPIOs are used for. So something like "power-gpios" or "power-gpio" (if there is only one GPIO) will be more suitable. Please take a look to Documentation/gpio/board.txt for more details.

Ok. Actually, reading docs below, "power-gpio" will not work, and it needs to be "power-gpios", right?

Quoted 11 lines

Documentation/devicetree/bindings/media/i2c/adp1653.txt

Quoted 6 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt +6 -0
+       if (!of_find_property(node, "gpios", NULL)) {
+               dev_err(&client->dev, "No gpio node\n");
+               return -EINVAL;
+       }
+
+       pd->power_gpio = of_get_gpio_flags(node, 0, &flags);

The old integer-based GPIO interface is deprecated and we want to get rid of it so please use the descriptor-based for new code. For example you want to use gpiod_get() instead of of_get_gpio_flags(). Documentation/gpio/gpio.txt describes the new interface.

Ok.
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#11 lore raw

Hello Pavel,

Quoted 21 lines · Pavel Machek

Hi!

Quoted 8 lines
Quoted 3 lines

Fixed feedback by Sakari.

Please apply,

There is no need to ask for patches to be applied IMHO. It is expected that people post patches wanting them to be applied unless there is an RFC prefix in the subject or say explicitly that the patch is for testing and should not be picked.

See history of this patch.

Quoted 7 lines

Documentation/devicetree/bindings/media/i2c/adp1653.txt

Quoted 1 line
Documentation/devicetree/bindings/media/i2c/adp1653.txt +0 -0

When adding DT bindings, the Documentation portion should be in a separate patch and should come in the series before the patch implementing the binding. That makes the change easier to review, please take a look to points 1 and 3 in Documentation/devicetree/bindings/submitting-patches.txt.

Quoted 4 lines

Because actual patch at the end of email is too much eye clutter for the poor device tree people, I can prepare nice series... producing more work for me and more noise on the lists? No, thanks.

I wonder then what's the point of having written rules if people are not going to follow...

Quoted 14 lines
Quoted 5 lines
Quoted 5 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt +5 -0
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
Quoted 8 lines

Documentation/devicetree/bindings/media/i2c/adp1653.txt

Quoted 2 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt +2 -0
+
+  - gpios: References to the GPIO that controls the power for the chip.

The convention nowadays is to not use unnamed DT properties for GPIOs but instead use a prefix that explains what those GPIOs are used for. So something like "power-gpios" or "power-gpio" (if there is only one GPIO) will be more suitable. Please take a look to Documentation/gpio/board.txt for more details.

Quoted 3 lines

Ok. Actually, reading docs below, "power-gpio" will not work, and it needs to be "power-gpios", right?

No, the documentation is not updated. People used <function>-gpio so at the end it was added as another supported suffix, see commit:
dd34c37aa3e8 ("gpio: of: Allow -gpio suffix for property names").

But I guess it doesn't matter if -gpio or -gpios is used.

Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt +6 -0
+       if (!of_find_property(node, "gpios", NULL)) {
+               dev_err(&client->dev, "No gpio node\n");
+               return -EINVAL;
+       }
+
+       pd->power_gpio = of_get_gpio_flags(node, 0, &flags);
Quoted 8 lines
Quoted 4 lines

The old integer-based GPIO interface is deprecated and we want to get rid of it so please use the descriptor-based for new code. For example you want to use gpiod_get() instead of of_get_gpio_flags(). Documentation/gpio/gpio.txt describes the new interface.

Ok.
Pavel
--

Best regards,
Javier

#12 lore raw

Hi,

Quoted 10 lines · Javier Martinez Canillas
Quoted 9 lines
Quoted 5 lines

The convention nowadays is to not use unnamed DT properties for GPIOs but instead use a prefix that explains what those GPIOs are used for. So something like "power-gpios" or "power-gpio" (if there is only one GPIO) will be more suitable. Please take a look to Documentation/gpio/board.txt for more details.

Ok. Actually, reading docs below, "power-gpio" will not work, and it needs to be "power-gpios", right?

Quoted 5 lines

No, the documentation is not updated. People used <function>-gpio so at the end it was added as another supported suffix, see commit:
dd34c37aa3e8 ("gpio: of: Allow -gpio suffix for property names").

But I guess it doesn't matter if -gpio or -gpios is used.

I suggest to use enable-gpio(s), since the pin is called "enable" in the datasheet.

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

#13 lore raw

PATCH v5 1/1 media: i2c/adp1653: devicetree support for adp1653

In reply to Pavel Machek

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

---

Switched to gpiod_, as requested by Javier.

Please apply,
Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +37 -0
new file mode 100644
index 0000000..da9934a
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - power-gpios: Reference to the GPIO that controls the power for the chip.
+
+There are two LED outputs available - flash and indicator. One LED is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		power-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
drivers/media/i2c/adp1653.c +79 -8

142 lines not on this page · raw message

include/media/adp1653.h +5 -3
index 1d9b48a..34b505e 100644
@@ -100,9 +100,11 @@ struct adp1653_platform_data {
 	int (*power)(struct v4l2_subdev *sd, int on);
 
 	u32 max_flash_timeout;		/* flash light timeout in us */
-	u32 max_flash_intensity;	/* led intensity, flash mode */
-	u32 max_torch_intensity;	/* led intensity, torch mode */
-	u32 max_indicator_intensity;	/* indicator led intensity */
+	u32 max_flash_intensity;	/* led intensity, flash mode, mA */
+	u32 max_torch_intensity;	/* led intensity, torch mode, mA */
+	u32 max_indicator_intensity;	/* indicator led intensity, uA */
+
+	struct gpio_desc *power_gpio;	/* for device-tree based boot */
 };
 
 #define to_adp1653_flash(sd)	container_of(sd, struct adp1653_flash, subdev)
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#14 lore raw

Hi Pavel,

Thanks for the update.

Quoted 5 lines · Pavel Machek

We are moving to device tree support on OMAP3, but that currently breaks ADP1653 driver. This adds device tree support, plus required documentation.

Quoted 7 lines

---

Switched to gpiod_, as requested by Javier.

Please apply,

Let's properly review this first.

Documentation/devicetree/bindings/media/i2c/adp1653.txt

Quoted 7 lines

Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +0 -0
new file mode 100644
index 0000000..da9934a

Please split this as Javier suggested. I'd think both could go through the media-tree unless someone objects.

Documentation/devicetree/bindings/media/i2c/adp1653.txt line 9

Quoted 10 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +9 -0
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - power-gpios: Reference to the GPIO that controls the power for the chip.

You're using power-gpios in documentation only.

The spec refers to this by "EN". How about "en-gpios" instead? This definitely isn't about power, but about resetting the chip. It gets the power through another pin.

Quoted 108 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +28 -0
+
+There are two LED outputs available - flash and indicator. One LED is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		power-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
drivers/media/i2c/adp1653.c +39 -3
index 873fe19..ba7f43d 100644
@@ -8,6 +8,7 @@
  * Contributors:
  *	Sakari Ailus <[email protected]>
  *	Tuukka Toivonen <[email protected]>
+ *	Pavel Machek <[email protected]>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -34,6 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 
@@ -306,9 +309,17 @@ adp1653_init_device(struct adp1653_flash *flash)
 static int
 __adp1653_set_power(struct adp1653_flash *flash, int on)
 {
-	int ret;
+	int ret = 0;
+
+	if (flash->platform_data->power) {
+		ret = flash->platform_data->power(&flash->subdev, on);
+	} else {
+		gpiod_set_value(flash->platform_data->power_gpio, on);
+		if (on)
+			/* Some delay is apparently required. */
+			udelay(20);
+	}
 
-	ret = flash->platform_data->power(&flash->subdev, on);
 	if (ret < 0)
 		return ret;
 
@@ -316,8 +327,13 @@ __adp1653_set_power(struct adp1653_flash *flash, int on)
 		return 0;
 
 	ret = adp1653_init_device(flash);
-	if (ret < 0)
+	if (ret >= 0)
+		return ret;
+
+	if (flash->platform_data->power)
 		flash->platform_data->power(&flash->subdev, 0);
+	else
+		gpiod_set_value(flash->platform_data->power_gpio, 0);
 
 	return ret;
 }
@@ -407,21 +423,75 @@ static int adp1653_resume(struct device *dev)
 
 #endif /* CONFIG_PM */
 
+static int adp1653_of_init(struct i2c_client *client,
+			   struct adp1653_flash *flash,
+			   struct device_node *node)
+{
+	u32 val;
+	struct adp1653_platform_data *pd;
+	struct device_node *child;
+
+	if (!node)
+		return -EINVAL;
+
+	pd = devm_kzalloc(&client->dev, sizeof(*pd), GFP_KERNEL);
+	if (!pd)
+		return -ENOMEM;
+	flash->platform_data = pd;
+
+	child = of_get_child_by_name(node, "flash");
+	if (!child)
+		return -EINVAL;
+	if (of_property_read_u32(child, "flash-timeout-microsec", &val))

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 455

Quoted 10 lines
drivers/media/i2c/adp1653.c +10 -0
+		return -EINVAL;
+
+	pd->max_flash_timeout = val;
+	if (of_property_read_u32(child, "flash-max-microamp", &val))
+		return -EINVAL;
+	pd->max_flash_intensity = val/1000;
+
+	if (of_property_read_u32(child, "max-microamp", &val))
+		return -EINVAL;
+	pd->max_torch_intensity = val/1000;

I think you need to do of_node_put(child) here and after you're done with indicator below.

Quoted 83 lines
drivers/media/i2c/adp1653.c +30 -5
+
+	child = of_get_child_by_name(node, "indicator");
+	if (!child)
+		return -EINVAL;
+	if (of_property_read_u32(child, "max-microamp", &val))
+		return -EINVAL;
+	pd->max_indicator_intensity = val;
+
+	if (!of_find_property(node, "gpios", NULL)) {
+		dev_err(&client->dev, "No gpio node\n");
+		return -EINVAL;
+	}
+
+	pd->power_gpio = devm_gpiod_get(&client->dev, "power");
+	if (!pd->power_gpio) {
+		dev_err(&client->dev, "Error getting GPIO\n");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+
 static int adp1653_probe(struct i2c_client *client,
 			 const struct i2c_device_id *devid)
 {
 	struct adp1653_flash *flash;
 	int ret;
 
-	/* we couldn't work without platform data */
-	if (client->dev.platform_data == NULL)
-		return -ENODEV;
-
 	flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
 	if (flash == NULL)
 		return -ENOMEM;
 
 	flash->platform_data = client->dev.platform_data;
+	if (client->dev.of_node) {
+		ret = adp1653_of_init(client, flash, client->dev.of_node);
+		if (ret)
+			return ret;
+	}
 
 	mutex_init(&flash->power_lock);
 
@@ -442,6 +512,7 @@ static int adp1653_probe(struct i2c_client *client,
 	return 0;
 
 free_and_quit:
+	dev_err(&client->dev, "adp1653: failed to register device\n");
 	v4l2_ctrl_handler_free(&flash->ctrls);
 	return ret;
 }
@@ -464,7 +535,7 @@ static const struct i2c_device_id adp1653_id_table[] = {
 };
 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
 
-static struct dev_pm_ops adp1653_pm_ops = {
+static const struct dev_pm_ops adp1653_pm_ops = {
 	.suspend	= adp1653_suspend,
 	.resume		= adp1653_resume,
 };
include/media/adp1653.h +5 -3
index 1d9b48a..34b505e 100644
@@ -100,9 +100,11 @@ struct adp1653_platform_data {
 	int (*power)(struct v4l2_subdev *sd, int on);
 
 	u32 max_flash_timeout;		/* flash light timeout in us */
-	u32 max_flash_intensity;	/* led intensity, flash mode */
-	u32 max_torch_intensity;	/* led intensity, torch mode */
-	u32 max_indicator_intensity;	/* indicator led intensity */
+	u32 max_flash_intensity;	/* led intensity, flash mode, mA */
+	u32 max_torch_intensity;	/* led intensity, torch mode, mA */
+	u32 max_indicator_intensity;	/* indicator led intensity, uA */
+
+	struct gpio_desc *power_gpio;	/* for device-tree based boot */
 };
 
 #define to_adp1653_flash(sd)	container_of(sd, struct adp1653_flash, subdev)
Signature · 4 lines
Kind regards,

Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#15 lore raw

PATCH v6 1/1 media: i2c/adp1653: Documentation for devicetree support for adp1653

Documentation for adp1653 binding.

---

Quoted 2 lines

Please split this as Javier suggested. I'd think both could go through the media-tree unless someone objects.

Please apply.

Quoted 3 lines
Quoted 1 line

+ - power-gpios: Reference to the GPIO that controls the power for the chip.

You're using power-gpios in documentation only.

Which is ok, because generic code adds "-gpios" itself.

Quoted 3 lines

The spec refers to this by "EN". How about "en-gpios" instead? This definitely isn't about power, but about resetting the chip. It gets the power through another pin.

It controls power of the chip. Noone gets _power_ through gpios, hopefully. Yes, I can rename it. "en-gpios" is too ugly to live. Sebastian suggested "enable". Hope that's okay with you.

Pavel

new file mode 100644
index 0000000..da9934a

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +37 -0
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - power-gpios: Reference to the GPIO that controls the power for the chip.
+
+There are two LED outputs available - flash and indicator. One LED is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		power-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#16 lore raw

Re: [PATCHv6] media: i2c/adp1653: Documentation for devicetree support for adp1653

Hi Pavel,

Quoted 16 lines · Pavel Machek

Documentation for adp1653 binding.

---

Quoted 2 lines

Please split this as Javier suggested. I'd think both could go through the media-tree unless someone objects.

Please apply.

Quoted 3 lines
Quoted 1 line

+ - power-gpios: Reference to the GPIO that controls the power for the chip.

You're using power-gpios in documentation only.

Which is ok, because generic code adds "-gpios" itself.

Quoted 7 lines
Quoted 3 lines

The spec refers to this by "EN". How about "en-gpios" instead? This definitely isn't about power, but about resetting the chip. It gets the power through another pin.

It controls power of the chip. Noone gets _power_ through gpios, hopefully. Yes, I can rename it. "en-gpios" is too ugly to live. Sebastian suggested "enable". Hope that's okay with you.

"enable-gpios" sounds fine for me.

Quoted 46 lines

Pavel

new file mode 100644
index 0000000..da9934a

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +37 -0
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - power-gpios: Reference to the GPIO that controls the power for the chip.
+
+There are two LED outputs available - flash and indicator. One LED is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		power-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
Signature · 4 lines
Regards,

Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#17 lore raw

Re: [PATCHv6] media: i2c/adp1653: Documentation for devicetree support for adp1653

Documentation for adp1653 binding.

---

Please apply.

Sorry, wrong version of patch was sent last time.
Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +37 -0
new file mode 100644
index 0000000..4607ce3
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"
+
+  - reg: I2C slave address
+
+  - enable-gpios: Reference to the GPIO that controls the power for the chip.
+
+There are two LED outputs available - flash and indicator. One LED is
+represented by one child node, nodes need to be named "flash" and "indicator".
+
+Required properties of the LED child node:
+- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+
+Required properties of the flash LED child node:
+
+- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
+- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	adp1653: led-controller at 30 {
+		compatible = "adi,adp1653";
+		reg = <0x30>;
+		enable-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; /* 88 */
+
+		flash {
+			flash-timeout-us = <500000>;
+			flash-max-microamp = <320000>;
+			max-microamp = <50000>;
+		};
+		indicator {
+			max-microamp = <17500>;
+		};
+	};
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#18 lore raw

Re: [PATCHv6] media: i2c/adp1653: Documentation for devicetree support for adp1653

Hi Pavel,

Quoted 2 lines · Pavel Machek

Documentation for adp1653 binding.

s/binding/bindings/

Quoted 16 lines

---

Please apply.

Sorry, wrong version of patch was sent last time.
Pavel

Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +0 -0
new file mode 100644
index 0000000..4607ce3

Documentation/devicetree/bindings/media/i2c/adp1653.txt line 5

Quoted 5 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +5 -0
@@ -0,0 +1,37 @@
+* Analog Devices ADP1653 flash LED driver
+
+Required Properties:
+
+  - compatible: Must contain be "adi,adp1653"

s/be //

Documentation/devicetree/bindings/media/i2c/adp1653.txt line 9

Quoted 4 lines
Documentation/devicetree/bindings/media/i2c/adp1653.txt new file +4 -0
+
+  - reg: I2C slave address
+
+  - enable-gpios: Reference to the GPIO that controls the power for the chip.

How about:

enable-gpios: Specifier of the GPIO connected to EN pin

I can make the changes if you're ok with that, otherwise please send v7. Then I'll apply that to my tree.

Signature · 4 lines
Kind regards,

Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#19 lore raw

Re: [PATCHv6] media: i2c/adp1653: Documentation for devicetree support for adp1653

Hi!

Quoted 4 lines

enable-gpios: Specifier of the GPIO connected to EN pin

I can make the changes if you're ok with that, otherwise please send v7. Then I'll apply that to my tree.

I'm ok with that.

Thanks,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#20 lore raw

Re: [PATCHv6] media: i2c/adp1653: Documentation for devicetree support for adp1653

Quoted 8 lines · Pavel Machek

Hi!

Quoted 4 lines

enable-gpios: Specifier of the GPIO connected to EN pin

I can make the changes if you're ok with that, otherwise please send v7. Then I'll apply that to my tree.

I'm ok with that.

Thanks. The patch is applied here:

git://linuxtv.org/sailus/media_tree.git, branch adp1653

Signature · 2 lines
Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#21 lore raw

PATCH v7 1/1 media: i2c/adp1653: Devicetree support for adp1653

Add device tree support for adp1653 flash LED driver.

---

Second part of a patch after documentation was merged.

Please apply,
Pavel

drivers/media/i2c/adp1653.c +82 -8
index 873fe19..d703636 100644
@@ -8,6 +8,7 @@
  * Contributors:
  *	Sakari Ailus <[email protected]>
  *	Tuukka Toivonen <[email protected]>
+ *	Pavel Machek <[email protected]>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -34,6 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 
@@ -306,9 +309,17 @@ adp1653_init_device(struct adp1653_flash *flash)
 static int
 __adp1653_set_power(struct adp1653_flash *flash, int on)
 {
-	int ret;
+	int ret = 0;
+
+	if (flash->platform_data->power) {
+		ret = flash->platform_data->power(&flash->subdev, on);
+	} else {
+		gpiod_set_value(flash->platform_data->enable_gpio, on);
+		if (on)
+			/* Some delay is apparently required. */
+			udelay(20);
+	}
 
-	ret = flash->platform_data->power(&flash->subdev, on);
 	if (ret < 0)
 		return ret;
 
@@ -316,8 +327,13 @@ __adp1653_set_power(struct adp1653_flash *flash, int on)
 		return 0;
 
 	ret = adp1653_init_device(flash);
-	if (ret < 0)
+	if (ret >= 0)
+		return ret;
+
+	if (flash->platform_data->power)
 		flash->platform_data->power(&flash->subdev, 0);
+	else
+		gpiod_set_value(flash->platform_data->enable_gpio, 0);
 
 	return ret;
 }
@@ -407,21 +423,78 @@ static int adp1653_resume(struct device *dev)
 
 #endif /* CONFIG_PM */
 
+static int adp1653_of_init(struct i2c_client *client,
+			   struct adp1653_flash *flash,
+			   struct device_node *node)
+{
+	u32 val;
+	struct adp1653_platform_data *pd;
+	struct device_node *child = NULL;
+
+	if (!node)
+		return -EINVAL;
+
+	pd = devm_kzalloc(&client->dev, sizeof(*pd), GFP_KERNEL);
+	if (!pd)
+		return -ENOMEM;
+	flash->platform_data = pd;
+
+	child = of_get_child_by_name(node, "flash");
+	if (!child)
+		return -EINVAL;
+
+	if (of_property_read_u32(child, "flash-timeout-us", &val))
+		goto err;
+
+	pd->max_flash_timeout = val;
+	if (of_property_read_u32(child, "flash-max-microamp", &val))
+		goto err;
+	pd->max_flash_intensity = val/1000;
+
+	if (of_property_read_u32(child, "max-microamp", &val))
+		goto err;
+	pd->max_torch_intensity = val/1000;
+	of_node_put(child);
+
+	child = of_get_child_by_name(node, "indicator");
+	if (!child)
+		return -EINVAL;
+	if (of_property_read_u32(child, "max-microamp", &val))
+		goto err;
+	pd->max_indicator_intensity = val;
+
+	of_node_put(child);
+
+	pd->enable_gpio = devm_gpiod_get(&client->dev, "enable");
+	if (!pd->enable_gpio) {
+		dev_err(&client->dev, "Error getting GPIO\n");
+		return -EINVAL;
+	}
+
+	return 0;
+err:
+	dev_err(&client->dev, "Required property not found\n");
+	of_node_put(child);
+	return -EINVAL;
+}
+
+
 static int adp1653_probe(struct i2c_client *client,
 			 const struct i2c_device_id *devid)
 {
 	struct adp1653_flash *flash;
 	int ret;
 
-	/* we couldn't work without platform data */
-	if (client->dev.platform_data == NULL)
-		return -ENODEV;
-
 	flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
 	if (flash == NULL)
 		return -ENOMEM;
 
 	flash->platform_data = client->dev.platform_data;
+	if (client->dev.of_node) {
+		ret = adp1653_of_init(client, flash, client->dev.of_node);
+		if (ret)
+			return ret;
+	}
 
 	mutex_init(&flash->power_lock);
 
@@ -442,6 +515,7 @@ static int adp1653_probe(struct i2c_client *client,
 	return 0;
 
 free_and_quit:
+	dev_err(&client->dev, "adp1653: failed to register device\n");
 	v4l2_ctrl_handler_free(&flash->ctrls);
 	return ret;
 }
@@ -464,7 +538,7 @@ static const struct i2c_device_id adp1653_id_table[] = {
 };
 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
 
-static struct dev_pm_ops adp1653_pm_ops = {
+static const struct dev_pm_ops adp1653_pm_ops = {
 	.suspend	= adp1653_suspend,
 	.resume		= adp1653_resume,
 };
include/media/adp1653.h +5 -3
index 1d9b48a..34b505e 100644
@@ -100,9 +100,11 @@ struct adp1653_platform_data {
 	int (*power)(struct v4l2_subdev *sd, int on);
 
 	u32 max_flash_timeout;		/* flash light timeout in us */
-	u32 max_flash_intensity;	/* led intensity, flash mode */
-	u32 max_torch_intensity;	/* led intensity, torch mode */
-	u32 max_indicator_intensity;	/* indicator led intensity */
+	u32 max_flash_intensity;	/* led intensity, flash mode, mA */
+	u32 max_torch_intensity;	/* led intensity, torch mode, mA */
+	u32 max_indicator_intensity;	/* indicator led intensity, uA */
+
+	struct gpio_desc *enable_gpio;	/* for device-tree based boot */
 };
 
 #define to_adp1653_flash(sd)	container_of(sd, struct adp1653_flash, subdev)
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#22 lore raw

Re: [PATCHv7] media: i2c/adp1653: Devicetree support for adp1653

Hi,

drivers/media/i2c/adp1653.c line 39

Quoted 4 lines · Pavel Machek

[...]

drivers/media/i2c/adp1653.c +2 -0
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
[...]

This should probably be

#include <linux/of.h>
#include <linux/gpio/consumer.h>

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

#23 lore raw

Re: [PATCHv7] media: i2c/adp1653: Devicetree support for adp1653

Quoted 10 lines · Sebastian Reichel

Hi,

drivers/media/i2c/adp1653.c line 39

Quoted 4 lines · Pavel Machek

[...]

drivers/media/i2c/adp1653.c +2 -0
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
[...]

This should probably be

Quoted 2 lines

#include <linux/of.h>
#include <linux/gpio/consumer.h>

And I thought people would only bikesched paint on the Documentation. Sakari, feel free to change that, but a) I don't see why Sebastian's version is better and b) am pretty sure there is about infinite number of possibilities there.

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#24 lore raw

Re: [PATCHv7] media: i2c/adp1653: Devicetree support for adp1653

Quoted 9 lines · Pavel Machek
Quoted 8 lines · Sebastian Reichel

drivers/media/i2c/adp1653.c line 39

Quoted 4 lines · Pavel Machek

[...]

drivers/media/i2c/adp1653.c +2 -0
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
[...]

This should probably be

Quoted 7 lines
Quoted 2 lines

#include <linux/of.h>
#include <linux/gpio/consumer.h>

And I thought people would only bikesched paint on the Documentation. Sakari, feel free to change that, but

a) I don't see why Sebastian's version is better

You neither use <linux/of_gpio.h> nor <linux/gpio.h>.

Well "include/linux/gpio.h" describes the old gpio API. The new gpiod gpiod API is described in "include/linux/gpio/consumer.h" and you use it, so the include should be included ;)

You don't use anything from "include/linux/of_gpio.h", but it includes "include/linux/of.h", which you are using. So you should include <linux/of.h> instead ;)

Quoted 2 lines

b) am pretty sure there is about infinite number of possibilities there.

Yes, but most are wrong. You should include all headers, that are used by you - nothing more and nothing less.

-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150409/8604f8c9/attachment.sig>

#25 lore raw

PATCH v7 1/1 media: i2c/adp1653: fix includes

Fix includes according to Sebastian.

---

Quoted 20 lines · Sebastian Reichel
Quoted 9 lines · Pavel Machek
Quoted 8 lines · Sebastian Reichel

Review

Quoted 4 lines · Pavel Machek

[...]

(quoted diff) +2 -0
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
[...]

This should probably be

Quoted 7 lines
Quoted 2 lines

#include <linux/of.h>
#include <linux/gpio/consumer.h>

And I thought people would only bikesched paint on the Documentation. Sakari, feel free to change that, but

a) I don't see why Sebastian's version is better

You neither use <linux/of_gpio.h> nor <linux/gpio.h>.

Quoted 7 lines

Well "include/linux/gpio.h" describes the old gpio API. The new gpiod gpiod API is described in "include/linux/gpio/consumer.h" and you use it, so the include should be included ;)

You don't use anything from "include/linux/of_gpio.h", but it includes "include/linux/of.h", which you are using. So you should include <linux/of.h> instead ;)

drivers/media/i2c/adp1653.c +2 -2
index d703636..7107ac2 100644
@@ -35,8 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
-#include <linux/of_gpio.h>
-#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/gpio/consumer.h>
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#26 lore raw

Re: [PATCHv7] media: i2c/adp1653: fix includes

Hello Pavel,

Quoted 40 lines · Pavel Machek

Fix includes according to Sebastian.

---

Quoted 27 lines · Sebastian Reichel
Quoted 9 lines · Pavel Machek
Quoted 8 lines · Sebastian Reichel

Review

Quoted 4 lines · Pavel Machek

[...]

(quoted diff) +2 -0
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
[...]

This should probably be

Quoted 7 lines
Quoted 2 lines

#include <linux/of.h>
#include <linux/gpio/consumer.h>

And I thought people would only bikesched paint on the Documentation. Sakari, feel free to change that, but

a) I don't see why Sebastian's version is better

You neither use <linux/of_gpio.h> nor <linux/gpio.h>.

Well "include/linux/gpio.h" describes the old gpio API. The new gpiod gpiod API is described in "include/linux/gpio/consumer.h" and you use it, so the include should be included ;)

You don't use anything from "include/linux/of_gpio.h", but it includes "include/linux/of.h", which you are using. So you should include <linux/of.h> instead ;)

drivers/media/i2c/adp1653.c +0 -0
index d703636..7107ac2 100644

drivers/media/i2c/adp1653.c line 42

Quoted 10 lines
drivers/media/i2c/adp1653.c +2 -2
@@ -35,8 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
-#include <linux/of_gpio.h>
-#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/gpio/consumer.h>
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 

Please re-spin your previous patch and submit it properly.

Best regards,
Javier

#27 lore raw

Re: [PATCHv7] media: i2c/adp1653: fix includes

Quoted 21 lines · On Thursday 09 April 2015 14:43:59 Javier Martinez Canillas wrote:

Hello Pavel,

Quoted 6 lines
drivers/media/i2c/adp1653.c +0 -0
index d703636..7107ac2 100644

drivers/media/i2c/adp1653.c line 42

Quoted 10 lines
drivers/media/i2c/adp1653.c +2 -2
@@ -35,8 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
-#include <linux/of_gpio.h>
-#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/gpio/consumer.h>
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 

Please re-spin your previous patch and submit it properly.

Quoted 2 lines

Best regards,
Javier

Hi all! What about stopping this meaningless discussion about resending full patch series when everybody know how to fix is quickly in editor (e.g with sed under 5s) and not wasting another 10 minutes to generate new unified diff sent via SMTP protocol?

Signature · 2 lines
Pali Roh?r
pali.rohar at gmail.com
#28 lore raw

Re: [PATCHv7] media: i2c/adp1653: fix includes

Hello Pali,

Quoted 4 lines · Pali Roh?r
Quoted 3 lines · On Thursday 09 April 2015 14:43:59 Javier Martinez Canillas wrote:

Please re-spin your previous patch and submit it properly.

Quoted 8 lines
Quoted 2 lines

Best regards,
Javier

Hi all! What about stopping this meaningless discussion about resending full patch series when everybody know how to fix is quickly in editor (e.g with sed under 5s) and not wasting another 10 minutes to generate new unified diff sent via SMTP protocol?

No, there is a reason why we have written rules on how patches should be submitted. Everyone in the kernel community is expected to optimize their workflow according to these rules to make life easier for people reviewing and merging the patches.

As you said now someone has to fix this using an editor and that is an error prone process. Besides, why it would take 10 minutes to generate a proper patch-set? git is very good on this regard (i.e: git commit ---fixup && git rebase -i && git format-patch && git send-email).

I won't argue anymore but I find very sad that people who have been in the kernel community for years don't follow the basic rules we have documented it. So I wonder why we have the documentation in the first place and how can we expect newcomers to follow if even experienced kernel hackers don't.

Quoted 3 lines

--
Pali Roh?r
pali.rohar at gmail.com

Best regards,
Javier

maintainer
#29 lore raw

Re: [PATCHv7] media: i2c/adp1653: Devicetree support for adp1653

In reply to Pavel Machek

Hi Pavel,

(Cc linux-media. Media related patches should be sent there.)

Quoted 25 lines · Pavel Machek

Add device tree support for adp1653 flash LED driver.

---

Second part of a patch after documentation was merged.

Please apply,
Pavel

drivers/media/i2c/adp1653.c +1 -0
index 873fe19..d703636 100644
@@ -8,6 +8,7 @@
  * Contributors:
  *	Sakari Ailus <[email protected]>
  *	Tuukka Toivonen <[email protected]>
+ *	Pavel Machek <[email protected]>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License

drivers/media/i2c/adp1653.c line 39

Quoted 5 lines
drivers/media/i2c/adp1653.c +2 -0
@@ -34,6 +35,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>

As Sebastian suggested, linux/of.h and linux/gpio/consumer.h should be used.

Quoted 12 lines
drivers/media/i2c/adp1653.c +4 -1
 #include <media/adp1653.h>
 #include <media/v4l2-device.h>
 
@@ -306,9 +309,17 @@ adp1653_init_device(struct adp1653_flash *flash)
 static int
 __adp1653_set_power(struct adp1653_flash *flash, int on)
 {
-	int ret;
+	int ret = 0;
+
+	if (flash->platform_data->power) {
+		ret = flash->platform_data->power(&flash->subdev, on);

drivers/media/i2c/adp1653.c adp1653_init_device(struct adp1653_flash *flash) · line 324

Quoted 10 lines
drivers/media/i2c/adp1653.c +6 -1
+	} else {
+		gpiod_set_value(flash->platform_data->enable_gpio, on);
+		if (on)
+			/* Some delay is apparently required. */
+			udelay(20);
+	}
 
-	ret = flash->platform_data->power(&flash->subdev, on);
 	if (ret < 0)
 		return ret;

Please check ret after assigning it. The assignment in declaration is unnecessary.

Quoted 17 lines
drivers/media/i2c/adp1653.c +6 -1
@@ -316,8 +327,13 @@ __adp1653_set_power(struct adp1653_flash *flash, int on)
 		return 0;
 
 	ret = adp1653_init_device(flash);
-	if (ret < 0)
+	if (ret >= 0)
+		return ret;
+
+	if (flash->platform_data->power)
 		flash->platform_data->power(&flash->subdev, 0);
+	else
+		gpiod_set_value(flash->platform_data->enable_gpio, 0);
 
 	return ret;
 }

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 432

Quoted 10 lines
drivers/media/i2c/adp1653.c +7 -0
@@ -407,21 +423,78 @@ static int adp1653_resume(struct device *dev)
 
 #endif /* CONFIG_PM */
 
+static int adp1653_of_init(struct i2c_client *client,
+			   struct adp1653_flash *flash,
+			   struct device_node *node)
+{
+	u32 val;
+	struct adp1653_platform_data *pd;
+	struct device_node *child = NULL;

The NULL assignment can be removed.

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 435

Quoted 3 lines
drivers/media/i2c/adp1653.c +3 -0
+
+	if (!node)
+		return -EINVAL;

node is always non-NULL here; no need to check.

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 446

Quoted 11 lines
drivers/media/i2c/adp1653.c +11 -0
+
+	pd = devm_kzalloc(&client->dev, sizeof(*pd), GFP_KERNEL);
+	if (!pd)
+		return -ENOMEM;
+	flash->platform_data = pd;
+
+	child = of_get_child_by_name(node, "flash");
+	if (!child)
+		return -EINVAL;
+
+	if (of_property_read_u32(child, "flash-timeout-us", &val))

You could read the values directly to the appropriate struct adp1653_platform_data field.

Quoted 6 lines
drivers/media/i2c/adp1653.c +6 -0
+		goto err;
+
+	pd->max_flash_timeout = val;
+	if (of_property_read_u32(child, "flash-max-microamp", &val))
+		goto err;
+	pd->max_flash_intensity = val/1000;

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 462

Quoted 10 lines
drivers/media/i2c/adp1653.c +10 -0
+
+	if (of_property_read_u32(child, "max-microamp", &val))
+		goto err;
+	pd->max_torch_intensity = val/1000;
+	of_node_put(child);
+
+	child = of_get_child_by_name(node, "indicator");
+	if (!child)
+		return -EINVAL;
+	if (of_property_read_u32(child, "max-microamp", &val))

Let's wait a bit the resolution of the property name. I'm in principle fine with both. I can do the change once it's been decided, hopefully very soon.

Quoted 24 lines
drivers/media/i2c/adp1653.c +19 -0
+		goto err;
+	pd->max_indicator_intensity = val;
+
+	of_node_put(child);
+
+	pd->enable_gpio = devm_gpiod_get(&client->dev, "enable");
+	if (!pd->enable_gpio) {
+		dev_err(&client->dev, "Error getting GPIO\n");
+		return -EINVAL;
+	}
+
+	return 0;
+err:
+	dev_err(&client->dev, "Required property not found\n");
+	of_node_put(child);
+	return -EINVAL;
+}
+
+
 static int adp1653_probe(struct i2c_client *client,
 			 const struct i2c_device_id *devid)
 {
 	struct adp1653_flash *flash;
 	int ret;

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 492

Quoted 10 lines
drivers/media/i2c/adp1653.c +0 -4
 
-	/* we couldn't work without platform data */
-	if (client->dev.platform_data == NULL)
-		return -ENODEV;
-
 	flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
 	if (flash == NULL)
 		return -ENOMEM;
 
 	flash->platform_data = client->dev.platform_data;

I think it'd be cleaner to make the assignment only if not using of, i.e. add else branch to the if below.

Quoted 35 lines
drivers/media/i2c/adp1653.c +7 -1
+	if (client->dev.of_node) {
+		ret = adp1653_of_init(client, flash, client->dev.of_node);
+		if (ret)
+			return ret;
+	}
 
 	mutex_init(&flash->power_lock);
 
@@ -442,6 +515,7 @@ static int adp1653_probe(struct i2c_client *client,
 	return 0;
 
 free_and_quit:
+	dev_err(&client->dev, "adp1653: failed to register device\n");
 	v4l2_ctrl_handler_free(&flash->ctrls);
 	return ret;
 }
@@ -464,7 +538,7 @@ static const struct i2c_device_id adp1653_id_table[] = {
 };
 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
 
-static struct dev_pm_ops adp1653_pm_ops = {
+static const struct dev_pm_ops adp1653_pm_ops = {
 	.suspend	= adp1653_suspend,
 	.resume		= adp1653_resume,
 };
include/media/adp1653.h +0 -1
index 1d9b48a..34b505e 100644
@@ -100,9 +100,11 @@ struct adp1653_platform_data {
 	int (*power)(struct v4l2_subdev *sd, int on);
 
 	u32 max_flash_timeout;		/* flash light timeout in us */
-	u32 max_flash_intensity;	/* led intensity, flash mode */

include/media/adp1653.h struct adp1653_platform_data { · line 110

Quoted 10 lines
include/media/adp1653.h +5 -2
-	u32 max_torch_intensity;	/* led intensity, torch mode */
-	u32 max_indicator_intensity;	/* indicator led intensity */
+	u32 max_flash_intensity;	/* led intensity, flash mode, mA */
+	u32 max_torch_intensity;	/* led intensity, torch mode, mA */
+	u32 max_indicator_intensity;	/* indicator led intensity, uA */
+
+	struct gpio_desc *enable_gpio;	/* for device-tree based boot */
 };
 
 #define to_adp1653_flash(sd)	container_of(sd, struct adp1653_flash, subdev)

Let me know if you're going to send v8 or if I can make the changes. I think we're pretty much done then.

Signature · 4 lines
Kind regards,

Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#30 lore raw

Re: [PATCHv7] media: i2c/adp1653: Devicetree support for adp1653

Hi!

Quoted 5 lines
Quoted 2 lines

#define to_adp1653_flash(sd) container_of(sd, struct adp1653_flash, subdev)

Let me know if you're going to send v8 or if I can make the changes. I think we're pretty much done then.

You are free to make the changes.

Thanks,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#31 lore raw

Re: [PATCHv6] media: i2c/adp1653: Documentation for devicetree support for adp1653

In reply to Pavel Machek
Quoted 5 lines · Pavel Machek
Quoted 3 lines
Quoted 1 line

+ - power-gpios: Reference to the GPIO that controls the power for the chip.

You're using power-gpios in documentation only.

Which is ok, because generic code adds "-gpios" itself.

Do you think you need this part:

+ if (!of_find_property(node, "gpios", NULL)) {
+ dev_err(&client->dev, "No gpio node\n");
+ return -EINVAL;
+ }

Signature · 2 lines
Sakari Ailus
e-mail: sakari.ailus at iki.fi	XMPP: sailus at retiisi.org.uk
#32 lore raw
In reply to Sakari Ailus

Hi!

Quoted 8 lines

drivers/media/i2c/adp1653.c static int adp1653_resume(struct device *dev) · line 455

Quoted 5 lines
drivers/media/i2c/adp1653.c +5 -0
+	pd->max_flash_intensity = val/1000;
+
+	if (of_property_read_u32(child, "max-microamp", &val))
+		return -EINVAL;
+	pd->max_torch_intensity = val/1000;

I think you need to do of_node_put(child) here and after you're done with indicator below.

...and in most of the error paths. Ok. Will submit the updated patch when the documentation one is accepted.

Best regards,

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html