Skip to content

Commit

Permalink
leds: leds-pwm: Preparing the driver for device tree support
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
  • Loading branch information
Peter Ujfalusi authored and Bryan Wu committed Feb 2, 2013
1 parent 9ea6cda commit 0f86815
Showing 1 changed file with 23 additions and 16 deletions.
39 changes: 23 additions & 16 deletions drivers/leds/leds-pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ struct led_pwm_data {
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,
enum led_brightness brightness)
{
Expand All @@ -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)) {
Expand All @@ -88,30 +97,28 @@ 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;
}

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;
}
Expand Down

0 comments on commit 0f86815

Please sign in to comment.