Commit 0f86815a authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Bryan Wu

leds: leds-pwm: Preparing the driver for device tree support

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: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
parent 9ea6cdac
...@@ -30,6 +30,11 @@ struct led_pwm_data { ...@@ -30,6 +30,11 @@ struct led_pwm_data {
unsigned int period; unsigned int period;
}; };
struct led_pwm_priv {
int num_leds;
struct led_pwm_data leds[0];
};
static void led_pwm_set(struct led_classdev *led_cdev, static void led_pwm_set(struct led_classdev *led_cdev,
enum led_brightness brightness) enum led_brightness brightness)
{ {
...@@ -47,25 +52,29 @@ static void led_pwm_set(struct led_classdev *led_cdev, ...@@ -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) static int led_pwm_probe(struct platform_device *pdev)
{ {
struct led_pwm_platform_data *pdata = pdev->dev.platform_data; struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
struct led_pwm *cur_led; struct led_pwm_priv *priv;
struct led_pwm_data *leds_data, *led_dat;
int i, ret = 0; int i, ret = 0;
if (!pdata) if (!pdata)
return -EBUSY; return -EBUSY;
leds_data = devm_kzalloc(&pdev->dev, priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(pdata->num_leds),
sizeof(struct led_pwm_data) * pdata->num_leds, GFP_KERNEL);
GFP_KERNEL); if (!priv)
if (!leds_data)
return -ENOMEM; return -ENOMEM;
for (i = 0; i < pdata->num_leds; i++) { for (i = 0; i < pdata->num_leds; i++) {
cur_led = &pdata->leds[i]; struct led_pwm *cur_led = &pdata->leds[i];
led_dat = &leds_data[i]; struct led_pwm_data *led_dat = &priv->leds[i];
led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name); led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
if (IS_ERR(led_dat->pwm)) { if (IS_ERR(led_dat->pwm)) {
...@@ -88,15 +97,16 @@ static int led_pwm_probe(struct platform_device *pdev) ...@@ -88,15 +97,16 @@ static int led_pwm_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err; goto err;
} }
priv->num_leds = pdata->num_leds;
platform_set_drvdata(pdev, leds_data); platform_set_drvdata(pdev, priv);
return 0; return 0;
err: err:
if (i > 0) { if (i > 0) {
for (i = i - 1; i >= 0; i--) for (i = i - 1; i >= 0; i--)
led_classdev_unregister(&leds_data[i].cdev); led_classdev_unregister(&priv->leds[i].cdev);
} }
return ret; return ret;
...@@ -104,14 +114,11 @@ static int led_pwm_probe(struct platform_device *pdev) ...@@ -104,14 +114,11 @@ static int led_pwm_probe(struct platform_device *pdev)
static int led_pwm_remove(struct platform_device *pdev) static int led_pwm_remove(struct platform_device *pdev)
{ {
struct led_pwm_priv *priv = platform_get_drvdata(pdev);
int i; 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++) for (i = 0; i < priv->num_leds; i++)
led_classdev_unregister(&leds_data[i].cdev); led_classdev_unregister(&priv->leds[i].cdev);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment