|
@@ -83,6 +83,15 @@ static inline size_t sizeof_pwm_leds_priv(int num_leds)
|
|
|
(sizeof(struct led_pwm_data) * num_leds);
|
|
|
}
|
|
|
|
|
|
+static void led_pwm_cleanup(struct led_pwm_priv *priv)
|
|
|
+{
|
|
|
+ while (priv->num_leds--) {
|
|
|
+ led_classdev_unregister(&priv->leds[priv->num_leds].cdev);
|
|
|
+ if (priv->leds[priv->num_leds].can_sleep)
|
|
|
+ cancel_work_sync(&priv->leds[priv->num_leds].work);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int led_pwm_create_of(struct platform_device *pdev,
|
|
|
struct led_pwm_priv *priv)
|
|
|
{
|
|
@@ -130,8 +139,7 @@ static int led_pwm_create_of(struct platform_device *pdev,
|
|
|
|
|
|
return 0;
|
|
|
err:
|
|
|
- while (priv->num_leds--)
|
|
|
- led_classdev_unregister(&priv->leds[priv->num_leds].cdev);
|
|
|
+ led_pwm_cleanup(priv);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -199,8 +207,8 @@ static int led_pwm_probe(struct platform_device *pdev)
|
|
|
return 0;
|
|
|
|
|
|
err:
|
|
|
- while (i--)
|
|
|
- led_classdev_unregister(&priv->leds[i].cdev);
|
|
|
+ priv->num_leds = i;
|
|
|
+ led_pwm_cleanup(priv);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -208,13 +216,8 @@ err:
|
|
|
static int led_pwm_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
struct led_pwm_priv *priv = platform_get_drvdata(pdev);
|
|
|
- int i;
|
|
|
|
|
|
- for (i = 0; i < priv->num_leds; i++) {
|
|
|
- led_classdev_unregister(&priv->leds[i].cdev);
|
|
|
- if (priv->leds[i].can_sleep)
|
|
|
- cancel_work_sync(&priv->leds[i].work);
|
|
|
- }
|
|
|
+ led_pwm_cleanup(priv);
|
|
|
|
|
|
return 0;
|
|
|
}
|