linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] leds: leds-pwm: Device tree support
@ 2012-11-12 14:41 Peter Ujfalusi
  2012-11-12 14:41 ` [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm Peter Ujfalusi
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Peter Ujfalusi @ 2012-11-12 14:41 UTC (permalink / raw)
  To: Bryan Wu, Richard Purdie; +Cc: linux-leds, linux-kernel, devicetree-discuss

Hello,

The patch:
https://lkml.org/lkml/2012/11/7/187
grown to be a series to add DeviceTree support for the leds-pwm driver.

Changes since v1:
- As suggested by Bryan Wu: the legacy pwm_request() has been removed from
  patch 1
- Device tree bindings added for leds-pwm driver.

When we boot with Device tree we handle one LED per device to be more aligned
with PWM core's DT implementation.
An example of the DT usage is provided in the new DT binding documentation for
leds-pwm.

Tested on OMAP4 Blaze (SDP) with legacy and DT boot.

Regards,
Peter
---
Peter Ujfalusi (3):
  leds: leds-pwm: Convert to use devm_get_pwm
  leds: leds-pwm: Preparing the driver for device tree support
  leds: leds-pwm: Add device tree bindings

 .../devicetree/bindings/leds/leds-pwm.txt          |  34 +++++
 drivers/leds/leds-pwm.c                            | 161 ++++++++++++++-------
 include/linux/leds_pwm.h                           |   2 +-
 3 files changed, 146 insertions(+), 51 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm.txt

-- 
1.8.0


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

* [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-11-12 14:41 [PATCH v2 0/3] leds: leds-pwm: Device tree support Peter Ujfalusi
@ 2012-11-12 14:41 ` Peter Ujfalusi
  2012-11-14  1:14   ` Bryan Wu
  2012-11-12 14:41 ` [PATCH v2 2/3] leds: leds-pwm: Preparing the driver for device tree support Peter Ujfalusi
  2012-11-12 14:41 ` [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings Peter Ujfalusi
  2 siblings, 1 reply; 16+ messages in thread
From: Peter Ujfalusi @ 2012-11-12 14:41 UTC (permalink / raw)
  To: Bryan Wu, Richard Purdie; +Cc: linux-leds, linux-kernel, devicetree-discuss

Update the driver to use the new API for requesting pwm so we can take
advantage of the pwm_lookup table to find the correct pwm to be used for the
LED functionality.
If the devm_get_pwm fails we fall back to legacy mode to try to get the pwm.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/leds/leds-pwm.c  | 19 ++++++-------------
 include/linux/leds_pwm.h |  2 +-
 2 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index f2e44c7..c953c75 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -67,12 +67,11 @@ static int led_pwm_probe(struct platform_device *pdev)
 		cur_led = &pdata->leds[i];
 		led_dat = &leds_data[i];
 
-		led_dat->pwm = pwm_request(cur_led->pwm_id,
-				cur_led->name);
+		led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
 		if (IS_ERR(led_dat->pwm)) {
 			ret = PTR_ERR(led_dat->pwm);
-			dev_err(&pdev->dev, "unable to request PWM %d\n",
-					cur_led->pwm_id);
+			dev_err(&pdev->dev, "unable to request PWM for %s\n",
+				cur_led->name);
 			goto err;
 		}
 
@@ -86,10 +85,8 @@ static int led_pwm_probe(struct platform_device *pdev)
 		led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
 
 		ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
-		if (ret < 0) {
-			pwm_free(led_dat->pwm);
+		if (ret < 0)
 			goto err;
-		}
 	}
 
 	platform_set_drvdata(pdev, leds_data);
@@ -98,10 +95,8 @@ static int led_pwm_probe(struct platform_device *pdev)
 
 err:
 	if (i > 0) {
-		for (i = i - 1; i >= 0; i--) {
+		for (i = i - 1; i >= 0; i--)
 			led_classdev_unregister(&leds_data[i].cdev);
-			pwm_free(leds_data[i].pwm);
-		}
 	}
 
 	return ret;
@@ -115,10 +110,8 @@ static int __devexit led_pwm_remove(struct platform_device *pdev)
 
 	leds_data = platform_get_drvdata(pdev);
 
-	for (i = 0; i < pdata->num_leds; i++) {
+	for (i = 0; i < pdata->num_leds; i++)
 		led_classdev_unregister(&leds_data[i].cdev);
-		pwm_free(leds_data[i].pwm);
-	}
 
 	return 0;
 }
diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
index 33a0711..a65e964 100644
--- a/include/linux/leds_pwm.h
+++ b/include/linux/leds_pwm.h
@@ -7,7 +7,7 @@
 struct led_pwm {
 	const char	*name;
 	const char	*default_trigger;
-	unsigned	pwm_id;
+	unsigned	pwm_id __deprecated;
 	u8 		active_low;
 	unsigned 	max_brightness;
 	unsigned	pwm_period_ns;
-- 
1.8.0


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

* [PATCH v2 2/3] leds: leds-pwm: Preparing the driver for device tree support
  2012-11-12 14:41 [PATCH v2 0/3] leds: leds-pwm: Device tree support Peter Ujfalusi
  2012-11-12 14:41 ` [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm Peter Ujfalusi
@ 2012-11-12 14:41 ` Peter Ujfalusi
  2012-11-12 14:41 ` [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings Peter Ujfalusi
  2 siblings, 0 replies; 16+ messages in thread
From: Peter Ujfalusi @ 2012-11-12 14:41 UTC (permalink / raw)
  To: Bryan Wu, Richard Purdie; +Cc: linux-leds, linux-kernel, devicetree-discuss

In order to be able to add device tree support for leds-pwm driver we need
to rearrange the data structures used by the drivers.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/leds/leds-pwm.c | 39 +++++++++++++++++++++++----------------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index c953c75..b219ea9 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -30,6 +30,11 @@ struct led_pwm_data {
 	unsigned int		period;
 };
 
+struct led_pwm_priv {
+	int num_leds;
+	struct led_pwm_data leds[];
+};
+
 static void led_pwm_set(struct led_classdev *led_cdev,
 	enum led_brightness brightness)
 {
@@ -47,25 +52,29 @@ static void led_pwm_set(struct led_classdev *led_cdev,
 	}
 }
 
+static inline int sizeof_pwm_leds_priv(int num_leds)
+{
+	return sizeof(struct led_pwm_priv) +
+		      (sizeof(struct led_pwm_data) * num_leds);
+}
+
 static int led_pwm_probe(struct platform_device *pdev)
 {
 	struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
-	struct led_pwm *cur_led;
-	struct led_pwm_data *leds_data, *led_dat;
+	struct led_pwm_priv *priv;
 	int i, ret = 0;
 
 	if (!pdata)
 		return -EBUSY;
 
-	leds_data = devm_kzalloc(&pdev->dev,
-			sizeof(struct led_pwm_data) * pdata->num_leds,
-				GFP_KERNEL);
-	if (!leds_data)
+	priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(pdata->num_leds),
+			    GFP_KERNEL);
+	if (!priv)
 		return -ENOMEM;
 
 	for (i = 0; i < pdata->num_leds; i++) {
-		cur_led = &pdata->leds[i];
-		led_dat = &leds_data[i];
+		struct led_pwm *cur_led = &pdata->leds[i];
+		struct led_pwm_data *led_dat = &priv->leds[i];
 
 		led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
 		if (IS_ERR(led_dat->pwm)) {
@@ -88,15 +97,16 @@ static int led_pwm_probe(struct platform_device *pdev)
 		if (ret < 0)
 			goto err;
 	}
+	priv->num_leds = pdata->num_leds;
 
-	platform_set_drvdata(pdev, leds_data);
+	platform_set_drvdata(pdev, priv);
 
 	return 0;
 
 err:
 	if (i > 0) {
 		for (i = i - 1; i >= 0; i--)
-			led_classdev_unregister(&leds_data[i].cdev);
+			led_classdev_unregister(&priv->leds[i].cdev);
 	}
 
 	return ret;
@@ -104,14 +114,11 @@ err:
 
 static int __devexit led_pwm_remove(struct platform_device *pdev)
 {
+	struct led_pwm_priv *priv = platform_get_drvdata(pdev);
 	int i;
-	struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
-	struct led_pwm_data *leds_data;
-
-	leds_data = platform_get_drvdata(pdev);
 
-	for (i = 0; i < pdata->num_leds; i++)
-		led_classdev_unregister(&leds_data[i].cdev);
+	for (i = 0; i < priv->num_leds; i++)
+		led_classdev_unregister(&priv->leds[i].cdev);
 
 	return 0;
 }
-- 
1.8.0


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

* [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings
  2012-11-12 14:41 [PATCH v2 0/3] leds: leds-pwm: Device tree support Peter Ujfalusi
  2012-11-12 14:41 ` [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm Peter Ujfalusi
  2012-11-12 14:41 ` [PATCH v2 2/3] leds: leds-pwm: Preparing the driver for device tree support Peter Ujfalusi
@ 2012-11-12 14:41 ` Peter Ujfalusi
  2012-12-06 10:00   ` Grant Likely
  2 siblings, 1 reply; 16+ messages in thread
From: Peter Ujfalusi @ 2012-11-12 14:41 UTC (permalink / raw)
  To: Bryan Wu, Richard Purdie; +Cc: linux-leds, linux-kernel, devicetree-discuss

Support for device tree booted kernel.
When the kernel is booted with DeviceTree blob we support one led per
leds-pwm device to have cleaner integration with the PWM subsystem.

For usage see:
Documentation/devicetree/bindings/leds/leds-pwm.txt

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 .../devicetree/bindings/leds/leds-pwm.txt          |  34 ++++++
 drivers/leds/leds-pwm.c                            | 125 +++++++++++++++------
 2 files changed, 127 insertions(+), 32 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm.txt

diff --git a/Documentation/devicetree/bindings/leds/leds-pwm.txt b/Documentation/devicetree/bindings/leds/leds-pwm.txt
new file mode 100644
index 0000000..9fe3040
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-pwm.txt
@@ -0,0 +1,34 @@
+LED connected to PWM
+
+Required properties:
+- compatible : should be "pwm-leds".
+- pwms : PWM property, please refer to: 
+  Documentation/devicetree/bindings/pwm/pwm.txt
+- pwm-names : (optional) Name to be used by the PWM subsystem for the PWM device
+- label : (optional) The label for this LED.  If omitted, the label is
+  taken from the node name (excluding the unit address).
+- max-brightness : Maximum brightness possible for the LED
+- linux,default-trigger :  (optional) This parameter, if present, is a
+  string defining the trigger assigned to the LED.  Current triggers are:
+    "backlight" - LED will act as a back-light, controlled by the framebuffer
+		  system
+    "default-on" - LED will turn on, but see "default-state" below
+    "heartbeat" - LED "double" flashes at a load average based rate
+    "ide-disk" - LED indicates disk activity
+    "timer" - LED flashes at a fixed, configurable rate
+
+Example:
+
+twl_pwm: pwm {
+	compatible = "ti,twl6030-pwm";
+	#pwm-cells = <2>;
+};
+
+pwmled_keypad {
+	compatible = "pwm-leds";
+	pwms = <&twl_pwm 0 7812500>;
+	pwm-names = "Keypad LED";
+
+	label = "omap4::keypad";
+	max-brightness = <127>;
+};
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index b219ea9..333c942 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -16,6 +16,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/of_platform.h>
 #include <linux/fb.h>
 #include <linux/leds.h>
 #include <linux/err.h>
@@ -58,46 +59,98 @@ static inline int sizeof_pwm_leds_priv(int num_leds)
 		      (sizeof(struct led_pwm_data) * num_leds);
 }
 
+static struct led_pwm_priv *led_pwm_create_of(struct platform_device *pdev)
+{
+	struct device_node *node = pdev->dev.of_node;
+	struct led_pwm_priv *priv;
+	struct led_pwm_data *led_dat;
+	int ret;
+
+	/* With DT boot we support one LED per leds-pwm device */
+	priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(1),
+			    GFP_KERNEL);
+	if (!priv)
+		return NULL;
+
+	led_dat = &priv->leds[priv->num_leds];
+	led_dat->cdev.name = of_get_property(node, "label", NULL) ? : node->name;
+	led_dat->pwm = devm_pwm_get(&pdev->dev, NULL);
+	if (IS_ERR(led_dat->pwm)) {
+		dev_err(&pdev->dev, "unable to request PWM for %s\n",
+			led_dat->cdev.name);
+		return NULL;
+	}
+	/* Get the period from PWM core when n*/
+	led_dat->period = pwm_get_period(led_dat->pwm);
+
+	led_dat->cdev.default_trigger = of_get_property(node,
+							"linux,default-trigger",
+							NULL);
+	of_property_read_u32(node, "max-brightness",
+			     &led_dat->cdev.max_brightness);
+
+	led_dat->cdev.brightness_set = led_pwm_set;
+	led_dat->cdev.brightness = LED_OFF;
+	led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+
+	ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "failed to register for %s\n",
+			led_dat->cdev.name);
+		of_node_put(node);
+		return NULL;
+	}
+
+	priv->num_leds = 1;
+
+	return priv;
+}
+
 static int led_pwm_probe(struct platform_device *pdev)
 {
 	struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
 	struct led_pwm_priv *priv;
 	int i, ret = 0;
 
-	if (!pdata)
-		return -EBUSY;
-
-	priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(pdata->num_leds),
-			    GFP_KERNEL);
-	if (!priv)
-		return -ENOMEM;
-
-	for (i = 0; i < pdata->num_leds; i++) {
-		struct led_pwm *cur_led = &pdata->leds[i];
-		struct led_pwm_data *led_dat = &priv->leds[i];
-
-		led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
-		if (IS_ERR(led_dat->pwm)) {
-			ret = PTR_ERR(led_dat->pwm);
-			dev_err(&pdev->dev, "unable to request PWM for %s\n",
-				cur_led->name);
-			goto err;
+	if (pdata && pdata->num_leds) {
+		priv = devm_kzalloc(&pdev->dev,
+				    sizeof_pwm_leds_priv(pdata->num_leds),
+				    GFP_KERNEL);
+		if (!priv)
+			return -ENOMEM;
+
+		for (i = 0; i < pdata->num_leds; i++) {
+			struct led_pwm *cur_led = &pdata->leds[i];
+			struct led_pwm_data *led_dat = &priv->leds[i];
+
+			led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
+			if (IS_ERR(led_dat->pwm)) {
+				ret = PTR_ERR(led_dat->pwm);
+				dev_err(&pdev->dev,
+					"unable to request PWM for %s\n",
+					cur_led->name);
+				goto err;
+			}
+
+			led_dat->cdev.name = cur_led->name;
+			led_dat->cdev.default_trigger = cur_led->default_trigger;
+			led_dat->active_low = cur_led->active_low;
+			led_dat->period = cur_led->pwm_period_ns;
+			led_dat->cdev.brightness_set = led_pwm_set;
+			led_dat->cdev.brightness = LED_OFF;
+			led_dat->cdev.max_brightness = cur_led->max_brightness;
+			led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+
+			ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
+			if (ret < 0)
+				goto err;
 		}
-
-		led_dat->cdev.name = cur_led->name;
-		led_dat->cdev.default_trigger = cur_led->default_trigger;
-		led_dat->active_low = cur_led->active_low;
-		led_dat->period = cur_led->pwm_period_ns;
-		led_dat->cdev.brightness_set = led_pwm_set;
-		led_dat->cdev.brightness = LED_OFF;
-		led_dat->cdev.max_brightness = cur_led->max_brightness;
-		led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
-
-		ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
-		if (ret < 0)
-			goto err;
+		priv->num_leds = pdata->num_leds;
+	} else {
+		priv = led_pwm_create_of(pdev);
+		if (!priv)
+			return -ENODEV;
 	}
-	priv->num_leds = pdata->num_leds;
 
 	platform_set_drvdata(pdev, priv);
 
@@ -123,12 +176,20 @@ static int __devexit led_pwm_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static const struct of_device_id of_pwm_leds_match[] = {
+	{ .compatible = "pwm-leds", },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, of_pwm_leds_match);
+
 static struct platform_driver led_pwm_driver = {
 	.probe		= led_pwm_probe,
 	.remove		= __devexit_p(led_pwm_remove),
 	.driver		= {
 		.name	= "leds_pwm",
 		.owner	= THIS_MODULE,
+		.of_match_table = of_match_ptr(of_pwm_leds_match),
 	},
 };
 
-- 
1.8.0


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

* Re: [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-11-12 14:41 ` [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm Peter Ujfalusi
@ 2012-11-14  1:14   ` Bryan Wu
  2012-11-14  7:13     ` Peter Ujfalusi
  2012-12-03 14:13     ` Peter Ujfalusi
  0 siblings, 2 replies; 16+ messages in thread
From: Bryan Wu @ 2012-11-14  1:14 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: Richard Purdie, linux-leds, linux-kernel, devicetree-discuss

On Mon, Nov 12, 2012 at 6:41 AM, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> Update the driver to use the new API for requesting pwm so we can take
> advantage of the pwm_lookup table to find the correct pwm to be used for the
> LED functionality.
> If the devm_get_pwm fails we fall back to legacy mode to try to get the pwm.
>
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> ---
>  drivers/leds/leds-pwm.c  | 19 ++++++-------------
>  include/linux/leds_pwm.h |  2 +-
>  2 files changed, 7 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
> index f2e44c7..c953c75 100644
> --- a/drivers/leds/leds-pwm.c
> +++ b/drivers/leds/leds-pwm.c
> @@ -67,12 +67,11 @@ static int led_pwm_probe(struct platform_device *pdev)
>                 cur_led = &pdata->leds[i];
>                 led_dat = &leds_data[i];
>
> -               led_dat->pwm = pwm_request(cur_led->pwm_id,
> -                               cur_led->name);
> +               led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
>                 if (IS_ERR(led_dat->pwm)) {
>                         ret = PTR_ERR(led_dat->pwm);
> -                       dev_err(&pdev->dev, "unable to request PWM %d\n",
> -                                       cur_led->pwm_id);
> +                       dev_err(&pdev->dev, "unable to request PWM for %s\n",
> +                               cur_led->name);
>                         goto err;
>                 }
>
> @@ -86,10 +85,8 @@ static int led_pwm_probe(struct platform_device *pdev)
>                 led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
>
>                 ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
> -               if (ret < 0) {
> -                       pwm_free(led_dat->pwm);
> +               if (ret < 0)
>                         goto err;
> -               }
>         }
>
>         platform_set_drvdata(pdev, leds_data);
> @@ -98,10 +95,8 @@ static int led_pwm_probe(struct platform_device *pdev)
>
>  err:
>         if (i > 0) {
> -               for (i = i - 1; i >= 0; i--) {
> +               for (i = i - 1; i >= 0; i--)
>                         led_classdev_unregister(&leds_data[i].cdev);
> -                       pwm_free(leds_data[i].pwm);
> -               }
>         }
>
>         return ret;
> @@ -115,10 +110,8 @@ static int __devexit led_pwm_remove(struct platform_device *pdev)
>
>         leds_data = platform_get_drvdata(pdev);
>
> -       for (i = 0; i < pdata->num_leds; i++) {
> +       for (i = 0; i < pdata->num_leds; i++)
>                 led_classdev_unregister(&leds_data[i].cdev);
> -               pwm_free(leds_data[i].pwm);
> -       }
>
>         return 0;
>  }
> diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
> index 33a0711..a65e964 100644
> --- a/include/linux/leds_pwm.h
> +++ b/include/linux/leds_pwm.h
> @@ -7,7 +7,7 @@
>  struct led_pwm {
>         const char      *name;
>         const char      *default_trigger;
> -       unsigned        pwm_id;
> +       unsigned        pwm_id __deprecated;

I suggest we remove this later, we can provide patches from this from
platform data of board file. And I think this patch is good for me to
merge, will do it soon.

Thanks,
-Bryan

>         u8              active_low;
>         unsigned        max_brightness;
>         unsigned        pwm_period_ns;
> --
> 1.8.0
>

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

* Re: [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-11-14  1:14   ` Bryan Wu
@ 2012-11-14  7:13     ` Peter Ujfalusi
  2012-12-03 14:13     ` Peter Ujfalusi
  1 sibling, 0 replies; 16+ messages in thread
From: Peter Ujfalusi @ 2012-11-14  7:13 UTC (permalink / raw)
  To: Bryan Wu; +Cc: Richard Purdie, linux-leds, linux-kernel, devicetree-discuss

Hi Bryan,

On 11/14/2012 02:14 AM, Bryan Wu wrote:
>> diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
>> index 33a0711..a65e964 100644
>> --- a/include/linux/leds_pwm.h
>> +++ b/include/linux/leds_pwm.h
>> @@ -7,7 +7,7 @@
>>  struct led_pwm {
>>         const char      *name;
>>         const char      *default_trigger;
>> -       unsigned        pwm_id;
>> +       unsigned        pwm_id __deprecated;
> 
> I suggest we remove this later, we can provide patches from this from
> platform data of board file. And I think this patch is good for me to
> merge, will do it soon.

Yes, we can remove it in 3.9. I marked it as deprecated for now to avoid
breakage - if any - in 3.8.

Thank you,
Péter

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

* Re: [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-11-14  1:14   ` Bryan Wu
  2012-11-14  7:13     ` Peter Ujfalusi
@ 2012-12-03 14:13     ` Peter Ujfalusi
  2012-12-03 18:32       ` Bryan Wu
  1 sibling, 1 reply; 16+ messages in thread
From: Peter Ujfalusi @ 2012-12-03 14:13 UTC (permalink / raw)
  To: Bryan Wu; +Cc: Richard Purdie, linux-leds, linux-kernel, devicetree-discuss

Hi Bryan,

On 11/14/2012 02:14 AM, Bryan Wu wrote:
> On Mon, Nov 12, 2012 at 6:41 AM, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
>> Update the driver to use the new API for requesting pwm so we can take
>> advantage of the pwm_lookup table to find the correct pwm to be used for the
>> LED functionality.
>> If the devm_get_pwm fails we fall back to legacy mode to try to get the pwm.
>>
>> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
>> ---
>>  drivers/leds/leds-pwm.c  | 19 ++++++-------------
>>  include/linux/leds_pwm.h |  2 +-
>>  2 files changed, 7 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
>> index f2e44c7..c953c75 100644
>> --- a/drivers/leds/leds-pwm.c
>> +++ b/drivers/leds/leds-pwm.c
>> @@ -67,12 +67,11 @@ static int led_pwm_probe(struct platform_device *pdev)
>>                 cur_led = &pdata->leds[i];
>>                 led_dat = &leds_data[i];
>>
>> -               led_dat->pwm = pwm_request(cur_led->pwm_id,
>> -                               cur_led->name);
>> +               led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
>>                 if (IS_ERR(led_dat->pwm)) {
>>                         ret = PTR_ERR(led_dat->pwm);
>> -                       dev_err(&pdev->dev, "unable to request PWM %d\n",
>> -                                       cur_led->pwm_id);
>> +                       dev_err(&pdev->dev, "unable to request PWM for %s\n",
>> +                               cur_led->name);
>>                         goto err;
>>                 }
>>
>> @@ -86,10 +85,8 @@ static int led_pwm_probe(struct platform_device *pdev)
>>                 led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
>>
>>                 ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
>> -               if (ret < 0) {
>> -                       pwm_free(led_dat->pwm);
>> +               if (ret < 0)
>>                         goto err;
>> -               }
>>         }
>>
>>         platform_set_drvdata(pdev, leds_data);
>> @@ -98,10 +95,8 @@ static int led_pwm_probe(struct platform_device *pdev)
>>
>>  err:
>>         if (i > 0) {
>> -               for (i = i - 1; i >= 0; i--) {
>> +               for (i = i - 1; i >= 0; i--)
>>                         led_classdev_unregister(&leds_data[i].cdev);
>> -                       pwm_free(leds_data[i].pwm);
>> -               }
>>         }
>>
>>         return ret;
>> @@ -115,10 +110,8 @@ static int __devexit led_pwm_remove(struct platform_device *pdev)
>>
>>         leds_data = platform_get_drvdata(pdev);
>>
>> -       for (i = 0; i < pdata->num_leds; i++) {
>> +       for (i = 0; i < pdata->num_leds; i++)
>>                 led_classdev_unregister(&leds_data[i].cdev);
>> -               pwm_free(leds_data[i].pwm);
>> -       }
>>
>>         return 0;
>>  }
>> diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
>> index 33a0711..a65e964 100644
>> --- a/include/linux/leds_pwm.h
>> +++ b/include/linux/leds_pwm.h
>> @@ -7,7 +7,7 @@
>>  struct led_pwm {
>>         const char      *name;
>>         const char      *default_trigger;
>> -       unsigned        pwm_id;
>> +       unsigned        pwm_id __deprecated;
> 
> I suggest we remove this later, we can provide patches from this from
> platform data of board file. And I think this patch is good for me to
> merge, will do it soon.

I have marked the pwm_id as deprecated for now to allow one kernel cycle for
external (?) drivers to adopt. We can remove it for 3.9 I think.

I just checked linux-next today and this series is still not there. Do you
want me to resend it for you? I can rebase the patches on top of linux-next or
if you have preference on which tree should I use please let me know.

> 
> Thanks,
> -Bryan
> 
>>         u8              active_low;
>>         unsigned        max_brightness;
>>         unsigned        pwm_period_ns;
>> --
>> 1.8.0
>>


Thanks,
Péter

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

* Re: [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-12-03 14:13     ` Peter Ujfalusi
@ 2012-12-03 18:32       ` Bryan Wu
  2012-12-04  8:11         ` Peter Ujfalusi
  0 siblings, 1 reply; 16+ messages in thread
From: Bryan Wu @ 2012-12-03 18:32 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: Richard Purdie, linux-leds, linux-kernel, devicetree-discuss

On Mon, Dec 3, 2012 at 6:13 AM, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> Hi Bryan,
>
> On 11/14/2012 02:14 AM, Bryan Wu wrote:
>> On Mon, Nov 12, 2012 at 6:41 AM, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
>>> Update the driver to use the new API for requesting pwm so we can take
>>> advantage of the pwm_lookup table to find the correct pwm to be used for the
>>> LED functionality.
>>> If the devm_get_pwm fails we fall back to legacy mode to try to get the pwm.
>>>
>>> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
>>> ---
>>>  drivers/leds/leds-pwm.c  | 19 ++++++-------------
>>>  include/linux/leds_pwm.h |  2 +-
>>>  2 files changed, 7 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
>>> index f2e44c7..c953c75 100644
>>> --- a/drivers/leds/leds-pwm.c
>>> +++ b/drivers/leds/leds-pwm.c
>>> @@ -67,12 +67,11 @@ static int led_pwm_probe(struct platform_device *pdev)
>>>                 cur_led = &pdata->leds[i];
>>>                 led_dat = &leds_data[i];
>>>
>>> -               led_dat->pwm = pwm_request(cur_led->pwm_id,
>>> -                               cur_led->name);
>>> +               led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
>>>                 if (IS_ERR(led_dat->pwm)) {
>>>                         ret = PTR_ERR(led_dat->pwm);
>>> -                       dev_err(&pdev->dev, "unable to request PWM %d\n",
>>> -                                       cur_led->pwm_id);
>>> +                       dev_err(&pdev->dev, "unable to request PWM for %s\n",
>>> +                               cur_led->name);
>>>                         goto err;
>>>                 }
>>>
>>> @@ -86,10 +85,8 @@ static int led_pwm_probe(struct platform_device *pdev)
>>>                 led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
>>>
>>>                 ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
>>> -               if (ret < 0) {
>>> -                       pwm_free(led_dat->pwm);
>>> +               if (ret < 0)
>>>                         goto err;
>>> -               }
>>>         }
>>>
>>>         platform_set_drvdata(pdev, leds_data);
>>> @@ -98,10 +95,8 @@ static int led_pwm_probe(struct platform_device *pdev)
>>>
>>>  err:
>>>         if (i > 0) {
>>> -               for (i = i - 1; i >= 0; i--) {
>>> +               for (i = i - 1; i >= 0; i--)
>>>                         led_classdev_unregister(&leds_data[i].cdev);
>>> -                       pwm_free(leds_data[i].pwm);
>>> -               }
>>>         }
>>>
>>>         return ret;
>>> @@ -115,10 +110,8 @@ static int __devexit led_pwm_remove(struct platform_device *pdev)
>>>
>>>         leds_data = platform_get_drvdata(pdev);
>>>
>>> -       for (i = 0; i < pdata->num_leds; i++) {
>>> +       for (i = 0; i < pdata->num_leds; i++)
>>>                 led_classdev_unregister(&leds_data[i].cdev);
>>> -               pwm_free(leds_data[i].pwm);
>>> -       }
>>>
>>>         return 0;
>>>  }
>>> diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
>>> index 33a0711..a65e964 100644
>>> --- a/include/linux/leds_pwm.h
>>> +++ b/include/linux/leds_pwm.h
>>> @@ -7,7 +7,7 @@
>>>  struct led_pwm {
>>>         const char      *name;
>>>         const char      *default_trigger;
>>> -       unsigned        pwm_id;
>>> +       unsigned        pwm_id __deprecated;
>>
>> I suggest we remove this later, we can provide patches from this from
>> platform data of board file. And I think this patch is good for me to
>> merge, will do it soon.
>
> I have marked the pwm_id as deprecated for now to allow one kernel cycle for
> external (?) drivers to adopt. We can remove it for 3.9 I think.
>
> I just checked linux-next today and this series is still not there. Do you
> want me to resend it for you? I can rebase the patches on top of linux-next or
> if you have preference on which tree should I use please let me know.
>

Actually, I'm waiting for some feedback from DT maintainers about this
new binding. But it looks find to me.
I plan to put this series into my -devel branch and target for 3.9, is
that OK for you? Right now, it's -rc7. It's better to put this new
thing for next cycle.

-Bryan

>>
>> Thanks,
>> -Bryan
>>
>>>         u8              active_low;
>>>         unsigned        max_brightness;
>>>         unsigned        pwm_period_ns;
>>> --
>>> 1.8.0
>>>
>
>
> Thanks,
> Péter

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

* Re: [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-12-03 18:32       ` Bryan Wu
@ 2012-12-04  8:11         ` Peter Ujfalusi
  2012-12-04 17:34           ` Bryan Wu
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Ujfalusi @ 2012-12-04  8:11 UTC (permalink / raw)
  To: Bryan Wu; +Cc: Richard Purdie, linux-leds, linux-kernel, devicetree-discuss

Hi Bryan,

On 12/03/2012 07:32 PM, Bryan Wu wrote:
> On Mon, Dec 3, 2012 at 6:13 AM, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> Actually, I'm waiting for some feedback from DT maintainers about this
> new binding. But it looks find to me.

Would it be possible to have the first (or even better the first two) patch
going for 3.8 and we can leave the DT bindings for 3.9?
I would like to clean up, fix some of the OMAP related board files for 3.9
which would need the patches for the leds-pwm driver itself.

Thank you,
Péter

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

* Re: [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-12-04  8:11         ` Peter Ujfalusi
@ 2012-12-04 17:34           ` Bryan Wu
  2012-12-05 15:36             ` Peter Ujfalusi
  0 siblings, 1 reply; 16+ messages in thread
From: Bryan Wu @ 2012-12-04 17:34 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: Richard Purdie, linux-leds, linux-kernel, devicetree-discuss

On Tue, Dec 4, 2012 at 12:11 AM, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> Hi Bryan,
>
> On 12/03/2012 07:32 PM, Bryan Wu wrote:
>> On Mon, Dec 3, 2012 at 6:13 AM, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
>> Actually, I'm waiting for some feedback from DT maintainers about this
>> new binding. But it looks find to me.
>
> Would it be possible to have the first (or even better the first two) patch
> going for 3.8 and we can leave the DT bindings for 3.9?
> I would like to clean up, fix some of the OMAP related board files for 3.9
> which would need the patches for the leds-pwm driver itself.
>

What's best thing I can do is I can merge these patchset into my
-devel branch, after 3.8 merge window close I will move this -devel
branch to my for-next branch for 3.9 merge window.

Does this make sense to you?

Thanks,
-Bryan

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

* Re: [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm
  2012-12-04 17:34           ` Bryan Wu
@ 2012-12-05 15:36             ` Peter Ujfalusi
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Ujfalusi @ 2012-12-05 15:36 UTC (permalink / raw)
  To: Bryan Wu; +Cc: Richard Purdie, linux-leds, linux-kernel, devicetree-discuss

On 12/04/2012 06:34 PM, Bryan Wu wrote:
> What's best thing I can do is I can merge these patchset into my
> -devel branch, after 3.8 merge window close I will move this -devel
> branch to my for-next branch for 3.9 merge window.
> 
> Does this make sense to you?

Not sure if I can get changes related to leds-pwm through linux-omap in this
way. The practice is that l-o should be 'in a working condition' alone -
without linux-next.

But I'll find something else while waiting for 3.10 to clean up the omap board
files related to this.

-- 
Péter

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

* Re: [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings
  2012-11-12 14:41 ` [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings Peter Ujfalusi
@ 2012-12-06 10:00   ` Grant Likely
  2012-12-06 12:36     ` Peter Ujfalusi
  0 siblings, 1 reply; 16+ messages in thread
From: Grant Likely @ 2012-12-06 10:00 UTC (permalink / raw)
  To: Peter Ujfalusi, Bryan Wu, Richard Purdie
  Cc: linux-leds, linux-kernel, devicetree-discuss

On Mon, 12 Nov 2012 15:41:10 +0100, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> Support for device tree booted kernel.
> When the kernel is booted with DeviceTree blob we support one led per
> leds-pwm device to have cleaner integration with the PWM subsystem.
> 
> For usage see:
> Documentation/devicetree/bindings/leds/leds-pwm.txt
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> ---
>  .../devicetree/bindings/leds/leds-pwm.txt          |  34 ++++++
>  drivers/leds/leds-pwm.c                            | 125 +++++++++++++++------
>  2 files changed, 127 insertions(+), 32 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm.txt
> 
> diff --git a/Documentation/devicetree/bindings/leds/leds-pwm.txt b/Documentation/devicetree/bindings/leds/leds-pwm.txt
> new file mode 100644
> index 0000000..9fe3040
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/leds/leds-pwm.txt
> @@ -0,0 +1,34 @@
> +LED connected to PWM
> +
> +Required properties:
> +- compatible : should be "pwm-leds".
> +- pwms : PWM property, please refer to: 
> +  Documentation/devicetree/bindings/pwm/pwm.txt
> +- pwm-names : (optional) Name to be used by the PWM subsystem for the PWM device
> +- label : (optional) The label for this LED.  If omitted, the label is
> +  taken from the node name (excluding the unit address).
> +- max-brightness : Maximum brightness possible for the LED
> +- linux,default-trigger :  (optional) This parameter, if present, is a
> +  string defining the trigger assigned to the LED.  Current triggers are:
> +    "backlight" - LED will act as a back-light, controlled by the framebuffer
> +		  system
> +    "default-on" - LED will turn on, but see "default-state" below
> +    "heartbeat" - LED "double" flashes at a load average based rate
> +    "ide-disk" - LED indicates disk activity
> +    "timer" - LED flashes at a fixed, configurable rate

The binding mostly looks good. However, it seems to be gratuitously
different from the gpio-leds binding and it duplicates property
definitions. Please match the gpio-leds behaviour with each led defined
as a sub node of the pwm-leds node.

Also, please reference the common properties in bindings/leds/common.txt
(This is a new file in linux-next. See how leds-gpio references it).

Otherwise the binding looks okay to me.


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

* Re: [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings
  2012-12-06 10:00   ` Grant Likely
@ 2012-12-06 12:36     ` Peter Ujfalusi
  2012-12-07 13:34       ` Grant Likely
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Ujfalusi @ 2012-12-06 12:36 UTC (permalink / raw)
  To: Grant Likely
  Cc: Bryan Wu, Richard Purdie, linux-leds, linux-kernel,
	devicetree-discuss, Thierry Reding, Linus Walleij

Hi Grant,

On 12/06/2012 11:00 AM, Grant Likely wrote:
> On Mon, 12 Nov 2012 15:41:10 +0100, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
>> Support for device tree booted kernel.
>> When the kernel is booted with DeviceTree blob we support one led per
>> leds-pwm device to have cleaner integration with the PWM subsystem.
>>
>> For usage see:
>> Documentation/devicetree/bindings/leds/leds-pwm.txt
>>
>> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
>> ---
>>  .../devicetree/bindings/leds/leds-pwm.txt          |  34 ++++++
>>  drivers/leds/leds-pwm.c                            | 125 +++++++++++++++------
>>  2 files changed, 127 insertions(+), 32 deletions(-)
>>  create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm.txt
>>
>> diff --git a/Documentation/devicetree/bindings/leds/leds-pwm.txt b/Documentation/devicetree/bindings/leds/leds-pwm.txt
>> new file mode 100644
>> index 0000000..9fe3040
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/leds/leds-pwm.txt
>> @@ -0,0 +1,34 @@
>> +LED connected to PWM
>> +
>> +Required properties:
>> +- compatible : should be "pwm-leds".
>> +- pwms : PWM property, please refer to: 
>> +  Documentation/devicetree/bindings/pwm/pwm.txt
>> +- pwm-names : (optional) Name to be used by the PWM subsystem for the PWM device
>> +- label : (optional) The label for this LED.  If omitted, the label is
>> +  taken from the node name (excluding the unit address).
>> +- max-brightness : Maximum brightness possible for the LED
>> +- linux,default-trigger :  (optional) This parameter, if present, is a
>> +  string defining the trigger assigned to the LED.  Current triggers are:
>> +    "backlight" - LED will act as a back-light, controlled by the framebuffer
>> +		  system
>> +    "default-on" - LED will turn on, but see "default-state" below
>> +    "heartbeat" - LED "double" flashes at a load average based rate
>> +    "ide-disk" - LED indicates disk activity
>> +    "timer" - LED flashes at a fixed, configurable rate
> 
> The binding mostly looks good. However, it seems to be gratuitously
> different from the gpio-leds binding and it duplicates property
> definitions. Please match the gpio-leds behaviour with each led defined
> as a sub node of the pwm-leds node.

The GPIO and PWM bindings are substantially different. For start in pwm we do
not have of_get_pwm* helpers. To get the PWM itself we need to use wpm_get()
which uses the pwms = <>; pwm-names = <>; properties on the device's main node.
This is what I could do at the moment:

twl_pwm: pwm {
	compatible = "ti,twl4030-pwm";
	#pwm-cells = <2>;
};

twl_led: pwmled {
	compatible = "ti,twl4030-pwmled";
	#pwm-cells = <2>;
};

pwmleds {
	compatible = "pwm-leds";
	pwms = <&twl_pwm 0 7812500
		&twl_pwmled 0 7812500>;
	pwm-names = "omap4::keypad",
		    "omap4:green:chrg";
	kpad {
		label = "omap4::keypad";
		max-brightness = <127>;
	};

	charging {
		label = "omap4:green:chrg";
		max-brightness = <255>;
	};


};

The string in pwm-names and under the led section's label must match in order
to be able to get the correct PWM for the led to drive it.
If this is good, I can make the change and resend the series soon.

> Also, please reference the common properties in bindings/leds/common.txt
> (This is a new file in linux-next. See how leds-gpio references it).

Will do that.

-- 
Péter

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

* Re: [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings
  2012-12-06 12:36     ` Peter Ujfalusi
@ 2012-12-07 13:34       ` Grant Likely
  2012-12-07 14:04         ` Peter Ujfalusi
  0 siblings, 1 reply; 16+ messages in thread
From: Grant Likely @ 2012-12-07 13:34 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: Bryan Wu, Richard Purdie, linux-leds, linux-kernel,
	devicetree-discuss, Thierry Reding, Linus Walleij

On Thu, 6 Dec 2012 13:36:11 +0100, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> Hi Grant,
> 
> On 12/06/2012 11:00 AM, Grant Likely wrote:
> > On Mon, 12 Nov 2012 15:41:10 +0100, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> >> Support for device tree booted kernel.
> >> When the kernel is booted with DeviceTree blob we support one led per
> >> leds-pwm device to have cleaner integration with the PWM subsystem.
> >>
> >> For usage see:
> >> Documentation/devicetree/bindings/leds/leds-pwm.txt
> >>
> >> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> >> ---
> >>  .../devicetree/bindings/leds/leds-pwm.txt          |  34 ++++++
> >>  drivers/leds/leds-pwm.c                            | 125 +++++++++++++++------
> >>  2 files changed, 127 insertions(+), 32 deletions(-)
> >>  create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm.txt
> >>
> >> diff --git a/Documentation/devicetree/bindings/leds/leds-pwm.txt b/Documentation/devicetree/bindings/leds/leds-pwm.txt
> >> new file mode 100644
> >> index 0000000..9fe3040
> >> --- /dev/null
> >> +++ b/Documentation/devicetree/bindings/leds/leds-pwm.txt
> >> @@ -0,0 +1,34 @@
> >> +LED connected to PWM
> >> +
> >> +Required properties:
> >> +- compatible : should be "pwm-leds".
> >> +- pwms : PWM property, please refer to: 
> >> +  Documentation/devicetree/bindings/pwm/pwm.txt
> >> +- pwm-names : (optional) Name to be used by the PWM subsystem for the PWM device
> >> +- label : (optional) The label for this LED.  If omitted, the label is
> >> +  taken from the node name (excluding the unit address).
> >> +- max-brightness : Maximum brightness possible for the LED
> >> +- linux,default-trigger :  (optional) This parameter, if present, is a
> >> +  string defining the trigger assigned to the LED.  Current triggers are:
> >> +    "backlight" - LED will act as a back-light, controlled by the framebuffer
> >> +		  system
> >> +    "default-on" - LED will turn on, but see "default-state" below
> >> +    "heartbeat" - LED "double" flashes at a load average based rate
> >> +    "ide-disk" - LED indicates disk activity
> >> +    "timer" - LED flashes at a fixed, configurable rate
> > 
> > The binding mostly looks good. However, it seems to be gratuitously
> > different from the gpio-leds binding and it duplicates property
> > definitions. Please match the gpio-leds behaviour with each led defined
> > as a sub node of the pwm-leds node.
> 
> The GPIO and PWM bindings are substantially different. For start in pwm we do
> not have of_get_pwm* helpers. To get the PWM itself we need to use wpm_get()

That's just the implementation. I'm talking about the binding. :-)

Implementation should follow binding design, not the other way around.
Both bindings use the same pattern. There isn't a of_get_pwm helper now,
but there is nothing preventing one from being created if you need it.

in the controller:
	#gpio-cells  vs. #pwm-cells
in the user:
	gpios = <[gpio specifier]> vs. pwms = <pwm specifier>

The PWM binding states that pwm-names is optional.

> which uses the pwms = <>; pwm-names = <>; properties on the device's main node.
> This is what I could do at the moment:
> 
> twl_pwm: pwm {
> 	compatible = "ti,twl4030-pwm";
> 	#pwm-cells = <2>;
> };
> 
> twl_led: pwmled {
> 	compatible = "ti,twl4030-pwmled";
> 	#pwm-cells = <2>;
> };
> 
> pwmleds {
> 	compatible = "pwm-leds";
> 	pwms = <&twl_pwm 0 7812500
> 		&twl_pwmled 0 7812500>;
> 	pwm-names = "omap4::keypad",
> 		    "omap4:green:chrg";
> 	kpad {
> 		label = "omap4::keypad";
> 		max-brightness = <127>;
> 	};
> 
> 	charging {
> 		label = "omap4:green:chrg";
> 		max-brightness = <255>;
> 	};

That's just a goofy extra layer of indirection and still doesn't follow
the lead of the gpio-leds pattern. That makes it worse that your
original binding, not better.

It really needs to look like this:

pwmleds {
	compatible = "pwm-leds";
	kpad {
		label = "omap4::keypad";
		max-brightness = <127>;
		pwms = <&twl_pwm 0 7812500>;
	};
	charging {
		label = "omap4:green:chrg";
		max-brightness = <255>;
		pwms = <&twl_pwmled 0 7812500>;
	};
};

g.

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

* Re: [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings
  2012-12-07 13:34       ` Grant Likely
@ 2012-12-07 14:04         ` Peter Ujfalusi
  2012-12-10 22:37           ` Grant Likely
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Ujfalusi @ 2012-12-07 14:04 UTC (permalink / raw)
  To: Grant Likely
  Cc: Bryan Wu, Richard Purdie, linux-leds, linux-kernel,
	devicetree-discuss, Thierry Reding, Linus Walleij

On 12/07/2012 02:34 PM, Grant Likely wrote:
> It really needs to look like this:
> 
> pwmleds {
> 	compatible = "pwm-leds";
> 	kpad {
> 		label = "omap4::keypad";
> 		max-brightness = <127>;
> 		pwms = <&twl_pwm 0 7812500>;
> 	};
> 	charging {
> 		label = "omap4:green:chrg";
> 		max-brightness = <255>;
> 		pwms = <&twl_pwmled 0 7812500>;
> 	};
> };

OK.
So What we need to do is export the of_pwm_request() from drivers/pwm/core.c
Client drivers us of_pwm_request(node, NULL); to get the pwm when booted with DT.
Works fine on my setup this way and the DTS section looks just as you have
described.
Now I need to clean them up and resubmit.

-- 
Péter

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

* Re: [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings
  2012-12-07 14:04         ` Peter Ujfalusi
@ 2012-12-10 22:37           ` Grant Likely
  0 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2012-12-10 22:37 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: Bryan Wu, Richard Purdie, linux-leds, linux-kernel,
	devicetree-discuss, Thierry Reding, Linus Walleij

On Fri, 7 Dec 2012 15:04:51 +0100, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> On 12/07/2012 02:34 PM, Grant Likely wrote:
> > It really needs to look like this:
> > 
> > pwmleds {
> > 	compatible = "pwm-leds";
> > 	kpad {
> > 		label = "omap4::keypad";
> > 		max-brightness = <127>;
> > 		pwms = <&twl_pwm 0 7812500>;
> > 	};
> > 	charging {
> > 		label = "omap4:green:chrg";
> > 		max-brightness = <255>;
> > 		pwms = <&twl_pwmled 0 7812500>;
> > 	};
> > };
> 
> OK.
> So What we need to do is export the of_pwm_request() from drivers/pwm/core.c
> Client drivers us of_pwm_request(node, NULL); to get the pwm when booted with DT.
> Works fine on my setup this way and the DTS section looks just as you have
> described.
> Now I need to clean them up and resubmit.

Cool, thanks.

g.


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

end of thread, other threads:[~2012-12-10 22:44 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-12 14:41 [PATCH v2 0/3] leds: leds-pwm: Device tree support Peter Ujfalusi
2012-11-12 14:41 ` [PATCH v2 1/3] leds: leds-pwm: Convert to use devm_get_pwm Peter Ujfalusi
2012-11-14  1:14   ` Bryan Wu
2012-11-14  7:13     ` Peter Ujfalusi
2012-12-03 14:13     ` Peter Ujfalusi
2012-12-03 18:32       ` Bryan Wu
2012-12-04  8:11         ` Peter Ujfalusi
2012-12-04 17:34           ` Bryan Wu
2012-12-05 15:36             ` Peter Ujfalusi
2012-11-12 14:41 ` [PATCH v2 2/3] leds: leds-pwm: Preparing the driver for device tree support Peter Ujfalusi
2012-11-12 14:41 ` [PATCH v2 3/3] leds: leds-pwm: Add device tree bindings Peter Ujfalusi
2012-12-06 10:00   ` Grant Likely
2012-12-06 12:36     ` Peter Ujfalusi
2012-12-07 13:34       ` Grant Likely
2012-12-07 14:04         ` Peter Ujfalusi
2012-12-10 22:37           ` Grant Likely

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