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 | } |