[PATCH v4 2/7] leds: leds-pwm: Preparing the driver for device tree support

2012-12-12 Thread Peter Ujfalusi
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 
---
 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 351257c..c767837 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -30,6 +30,11 @@ struct led_pwm_data {
unsigned intperiod;
 };
 
+struct led_pwm_priv {
+   int num_leds;
+   struct led_pwm_data leds[0];
+};
+
 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 size_t 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(>dev,
-   sizeof(struct led_pwm_data) * pdata->num_leds,
-   GFP_KERNEL);
-   if (!leds_data)
+   priv = devm_kzalloc(>dev, sizeof_pwm_leds_priv(pdata->num_leds),
+   GFP_KERNEL);
+   if (!priv)
return -ENOMEM;
 
for (i = 0; i < pdata->num_leds; i++) {
-   cur_led = >leds[i];
-   led_dat = _data[i];
+   struct led_pwm *cur_led = >leds[i];
+   struct led_pwm_data *led_dat = >leds[i];
 
led_dat->pwm = devm_pwm_get(>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(_data[i].cdev);
+   led_classdev_unregister(>leds[i].cdev);
}
 
return ret;
@@ -104,14 +114,11 @@ err:
 
 static int 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(_data[i].cdev);
+   for (i = 0; i < priv->num_leds; i++)
+   led_classdev_unregister(>leds[i].cdev);
 
return 0;
 }
-- 
1.8.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v4 2/7] leds: leds-pwm: Preparing the driver for device tree support

2012-12-12 Thread Peter Ujfalusi
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.ujfal...@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 351257c..c767837 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -30,6 +30,11 @@ struct led_pwm_data {
unsigned intperiod;
 };
 
+struct led_pwm_priv {
+   int num_leds;
+   struct led_pwm_data leds[0];
+};
+
 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 size_t 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 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

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/