diff options
| -rw-r--r-- | drivers/leds/leds-pwm.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c index dd1787368fb1..7d0aaed1e23a 100644 --- a/drivers/leds/leds-pwm.c +++ b/drivers/leds/leds-pwm.c | |||
| @@ -83,6 +83,15 @@ static inline size_t sizeof_pwm_leds_priv(int num_leds) | |||
| 83 | (sizeof(struct led_pwm_data) * num_leds); | 83 | (sizeof(struct led_pwm_data) * num_leds); |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | static void led_pwm_cleanup(struct led_pwm_priv *priv) | ||
| 87 | { | ||
| 88 | while (priv->num_leds--) { | ||
| 89 | led_classdev_unregister(&priv->leds[priv->num_leds].cdev); | ||
| 90 | if (priv->leds[priv->num_leds].can_sleep) | ||
| 91 | cancel_work_sync(&priv->leds[priv->num_leds].work); | ||
| 92 | } | ||
| 93 | } | ||
| 94 | |||
| 86 | static int led_pwm_create_of(struct platform_device *pdev, | 95 | static int led_pwm_create_of(struct platform_device *pdev, |
| 87 | struct led_pwm_priv *priv) | 96 | struct led_pwm_priv *priv) |
| 88 | { | 97 | { |
| @@ -130,8 +139,7 @@ static int led_pwm_create_of(struct platform_device *pdev, | |||
| 130 | 139 | ||
| 131 | return 0; | 140 | return 0; |
| 132 | err: | 141 | err: |
| 133 | while (priv->num_leds--) | 142 | led_pwm_cleanup(priv); |
| 134 | led_classdev_unregister(&priv->leds[priv->num_leds].cdev); | ||
| 135 | 143 | ||
| 136 | return ret; | 144 | return ret; |
| 137 | } | 145 | } |
| @@ -199,8 +207,8 @@ static int led_pwm_probe(struct platform_device *pdev) | |||
| 199 | return 0; | 207 | return 0; |
| 200 | 208 | ||
| 201 | err: | 209 | err: |
| 202 | while (i--) | 210 | priv->num_leds = i; |
| 203 | led_classdev_unregister(&priv->leds[i].cdev); | 211 | led_pwm_cleanup(priv); |
| 204 | 212 | ||
| 205 | return ret; | 213 | return ret; |
| 206 | } | 214 | } |
| @@ -208,13 +216,8 @@ err: | |||
| 208 | static int led_pwm_remove(struct platform_device *pdev) | 216 | static int led_pwm_remove(struct platform_device *pdev) |
| 209 | { | 217 | { |
| 210 | struct led_pwm_priv *priv = platform_get_drvdata(pdev); | 218 | struct led_pwm_priv *priv = platform_get_drvdata(pdev); |
| 211 | int i; | ||
| 212 | 219 | ||
| 213 | for (i = 0; i < priv->num_leds; i++) { | 220 | led_pwm_cleanup(priv); |
| 214 | led_classdev_unregister(&priv->leds[i].cdev); | ||
| 215 | if (priv->leds[i].can_sleep) | ||
| 216 | cancel_work_sync(&priv->leds[i].work); | ||
| 217 | } | ||
| 218 | 221 | ||
| 219 | return 0; | 222 | return 0; |
| 220 | } | 223 | } |
