diff options
Diffstat (limited to 'drivers/leds/leds-pwm.c')
-rw-r--r-- | drivers/leds/leds-pwm.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c index da3fa8dcdf5..ee9c7085664 100644 --- a/drivers/leds/leds-pwm.c +++ b/drivers/leds/leds-pwm.c @@ -26,8 +26,8 @@ struct led_pwm_data { struct led_classdev cdev; struct pwm_device *pwm; - unsigned int active_low; - unsigned int period; + struct led_pwm *led; + struct device *parent; }; static void led_pwm_set(struct led_classdev *led_cdev, @@ -35,8 +35,13 @@ static void led_pwm_set(struct led_classdev *led_cdev, { struct led_pwm_data *led_dat = container_of(led_cdev, struct led_pwm_data, cdev); + struct device *parent = led_dat->parent; + struct led_pwm_platform_data *pdata = parent->platform_data; unsigned int max = led_dat->cdev.max_brightness; - unsigned int period = led_dat->period; + unsigned int period = led_dat->led->pwm_period_ns; + + if (pdata->notify) + brightness = pdata->notify(parent, led_dat->led, brightness); if (brightness == 0) { pwm_config(led_dat->pwm, 0, period); @@ -76,18 +81,28 @@ static int led_pwm_probe(struct platform_device *pdev) 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; + led_dat->led = cur_led; + led_dat->parent = &pdev->dev; + ret = led_classdev_register(&pdev->dev, &led_dat->cdev); if (ret < 0) { pwm_free(led_dat->pwm); goto err; } + + if (pdata->init) { + ret = pdata->init(&pdev->dev, cur_led); + if (ret < 0) { + led_classdev_unregister(&led_dat->cdev); + pwm_free(led_dat->pwm); + goto err; + } + } } platform_set_drvdata(pdev, leds_data); @@ -97,6 +112,8 @@ static int led_pwm_probe(struct platform_device *pdev) err: if (i > 0) { for (i = i - 1; i >= 0; i--) { + if (pdata->exit) + pdata->exit(&pdev->dev, &pdata->leds[i]); led_classdev_unregister(&leds_data[i].cdev); pwm_free(leds_data[i].pwm); } @@ -116,6 +133,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++) { + if (pdata->exit) + pdata->exit(&pdev->dev, &pdata->leds[i]); led_classdev_unregister(&leds_data[i].cdev); pwm_free(leds_data[i].pwm); } |