diff options
author | Andrew Lunn <andrew@lunn.ch> | 2015-08-20 06:59:45 -0400 |
---|---|---|
committer | Jacek Anaszewski <j.anaszewski@samsung.com> | 2016-01-04 03:57:35 -0500 |
commit | 0dd756f7677a519a1d52a94e74d179e0af39e2ec (patch) | |
tree | 6d4b5ea5915d011ddc5af0c8599339e3ee796689 /drivers/leds/leds-wm8350.c | |
parent | 77e85036389929356096f3a5c90bde782fe78f17 (diff) |
leds: wm8350: Remove work queue
Now the core implements the work queue, remove it from the drivers,
and switch to using brightness_set_blocking op.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
Acked-by: Antonio Ospite <ao2@ao2.it>
Reviewed-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/leds/leds-wm8350.c')
-rw-r--r-- | drivers/leds/leds-wm8350.c | 64 |
1 files changed, 25 insertions, 39 deletions
diff --git a/drivers/leds/leds-wm8350.c b/drivers/leds/leds-wm8350.c index 0d121835673f..e1e4e9d0b8b1 100644 --- a/drivers/leds/leds-wm8350.c +++ b/drivers/leds/leds-wm8350.c | |||
@@ -89,40 +89,42 @@ static const int isink_cur[] = { | |||
89 | #define to_wm8350_led(led_cdev) \ | 89 | #define to_wm8350_led(led_cdev) \ |
90 | container_of(led_cdev, struct wm8350_led, cdev) | 90 | container_of(led_cdev, struct wm8350_led, cdev) |
91 | 91 | ||
92 | static void wm8350_led_enable(struct wm8350_led *led) | 92 | static int wm8350_led_enable(struct wm8350_led *led) |
93 | { | 93 | { |
94 | int ret; | 94 | int ret = 0; |
95 | 95 | ||
96 | if (led->enabled) | 96 | if (led->enabled) |
97 | return; | 97 | return ret; |
98 | 98 | ||
99 | ret = regulator_enable(led->isink); | 99 | ret = regulator_enable(led->isink); |
100 | if (ret != 0) { | 100 | if (ret != 0) { |
101 | dev_err(led->cdev.dev, "Failed to enable ISINK: %d\n", ret); | 101 | dev_err(led->cdev.dev, "Failed to enable ISINK: %d\n", ret); |
102 | return; | 102 | return ret; |
103 | } | 103 | } |
104 | 104 | ||
105 | ret = regulator_enable(led->dcdc); | 105 | ret = regulator_enable(led->dcdc); |
106 | if (ret != 0) { | 106 | if (ret != 0) { |
107 | dev_err(led->cdev.dev, "Failed to enable DCDC: %d\n", ret); | 107 | dev_err(led->cdev.dev, "Failed to enable DCDC: %d\n", ret); |
108 | regulator_disable(led->isink); | 108 | regulator_disable(led->isink); |
109 | return; | 109 | return ret; |
110 | } | 110 | } |
111 | 111 | ||
112 | led->enabled = 1; | 112 | led->enabled = 1; |
113 | |||
114 | return ret; | ||
113 | } | 115 | } |
114 | 116 | ||
115 | static void wm8350_led_disable(struct wm8350_led *led) | 117 | static int wm8350_led_disable(struct wm8350_led *led) |
116 | { | 118 | { |
117 | int ret; | 119 | int ret = 0; |
118 | 120 | ||
119 | if (!led->enabled) | 121 | if (!led->enabled) |
120 | return; | 122 | return ret; |
121 | 123 | ||
122 | ret = regulator_disable(led->dcdc); | 124 | ret = regulator_disable(led->dcdc); |
123 | if (ret != 0) { | 125 | if (ret != 0) { |
124 | dev_err(led->cdev.dev, "Failed to disable DCDC: %d\n", ret); | 126 | dev_err(led->cdev.dev, "Failed to disable DCDC: %d\n", ret); |
125 | return; | 127 | return ret; |
126 | } | 128 | } |
127 | 129 | ||
128 | ret = regulator_disable(led->isink); | 130 | ret = regulator_disable(led->isink); |
@@ -132,27 +134,29 @@ static void wm8350_led_disable(struct wm8350_led *led) | |||
132 | if (ret != 0) | 134 | if (ret != 0) |
133 | dev_err(led->cdev.dev, "Failed to reenable DCDC: %d\n", | 135 | dev_err(led->cdev.dev, "Failed to reenable DCDC: %d\n", |
134 | ret); | 136 | ret); |
135 | return; | 137 | return ret; |
136 | } | 138 | } |
137 | 139 | ||
138 | led->enabled = 0; | 140 | led->enabled = 0; |
141 | |||
142 | return ret; | ||
139 | } | 143 | } |
140 | 144 | ||
141 | static void led_work(struct work_struct *work) | 145 | static int wm8350_led_set(struct led_classdev *led_cdev, |
146 | enum led_brightness value) | ||
142 | { | 147 | { |
143 | struct wm8350_led *led = container_of(work, struct wm8350_led, work); | 148 | struct wm8350_led *led = to_wm8350_led(led_cdev); |
149 | unsigned long flags; | ||
144 | int ret; | 150 | int ret; |
145 | int uA; | 151 | int uA; |
146 | unsigned long flags; | ||
147 | 152 | ||
148 | mutex_lock(&led->mutex); | 153 | led->value = value; |
149 | 154 | ||
150 | spin_lock_irqsave(&led->value_lock, flags); | 155 | spin_lock_irqsave(&led->value_lock, flags); |
151 | 156 | ||
152 | if (led->value == LED_OFF) { | 157 | if (led->value == LED_OFF) { |
153 | spin_unlock_irqrestore(&led->value_lock, flags); | 158 | spin_unlock_irqrestore(&led->value_lock, flags); |
154 | wm8350_led_disable(led); | 159 | return wm8350_led_disable(led); |
155 | goto out; | ||
156 | } | 160 | } |
157 | 161 | ||
158 | /* This scales linearly into the index of valid current | 162 | /* This scales linearly into the index of valid current |
@@ -166,36 +170,21 @@ static void led_work(struct work_struct *work) | |||
166 | 170 | ||
167 | ret = regulator_set_current_limit(led->isink, isink_cur[uA], | 171 | ret = regulator_set_current_limit(led->isink, isink_cur[uA], |
168 | isink_cur[uA]); | 172 | isink_cur[uA]); |
169 | if (ret != 0) | 173 | if (ret != 0) { |
170 | dev_err(led->cdev.dev, "Failed to set %duA: %d\n", | 174 | dev_err(led->cdev.dev, "Failed to set %duA: %d\n", |
171 | isink_cur[uA], ret); | 175 | isink_cur[uA], ret); |
176 | return ret; | ||
177 | } | ||
172 | 178 | ||
173 | wm8350_led_enable(led); | 179 | return wm8350_led_enable(led); |
174 | |||
175 | out: | ||
176 | mutex_unlock(&led->mutex); | ||
177 | } | ||
178 | |||
179 | static void wm8350_led_set(struct led_classdev *led_cdev, | ||
180 | enum led_brightness value) | ||
181 | { | ||
182 | struct wm8350_led *led = to_wm8350_led(led_cdev); | ||
183 | unsigned long flags; | ||
184 | |||
185 | spin_lock_irqsave(&led->value_lock, flags); | ||
186 | led->value = value; | ||
187 | schedule_work(&led->work); | ||
188 | spin_unlock_irqrestore(&led->value_lock, flags); | ||
189 | } | 180 | } |
190 | 181 | ||
191 | static void wm8350_led_shutdown(struct platform_device *pdev) | 182 | static void wm8350_led_shutdown(struct platform_device *pdev) |
192 | { | 183 | { |
193 | struct wm8350_led *led = platform_get_drvdata(pdev); | 184 | struct wm8350_led *led = platform_get_drvdata(pdev); |
194 | 185 | ||
195 | mutex_lock(&led->mutex); | ||
196 | led->value = LED_OFF; | 186 | led->value = LED_OFF; |
197 | wm8350_led_disable(led); | 187 | wm8350_led_disable(led); |
198 | mutex_unlock(&led->mutex); | ||
199 | } | 188 | } |
200 | 189 | ||
201 | static int wm8350_led_probe(struct platform_device *pdev) | 190 | static int wm8350_led_probe(struct platform_device *pdev) |
@@ -232,7 +221,7 @@ static int wm8350_led_probe(struct platform_device *pdev) | |||
232 | if (led == NULL) | 221 | if (led == NULL) |
233 | return -ENOMEM; | 222 | return -ENOMEM; |
234 | 223 | ||
235 | led->cdev.brightness_set = wm8350_led_set; | 224 | led->cdev.brightness_set_blocking = wm8350_led_set; |
236 | led->cdev.default_trigger = pdata->default_trigger; | 225 | led->cdev.default_trigger = pdata->default_trigger; |
237 | led->cdev.name = pdata->name; | 226 | led->cdev.name = pdata->name; |
238 | led->cdev.flags |= LED_CORE_SUSPENDRESUME; | 227 | led->cdev.flags |= LED_CORE_SUSPENDRESUME; |
@@ -251,8 +240,6 @@ static int wm8350_led_probe(struct platform_device *pdev) | |||
251 | pdata->max_uA); | 240 | pdata->max_uA); |
252 | 241 | ||
253 | spin_lock_init(&led->value_lock); | 242 | spin_lock_init(&led->value_lock); |
254 | mutex_init(&led->mutex); | ||
255 | INIT_WORK(&led->work, led_work); | ||
256 | led->value = LED_OFF; | 243 | led->value = LED_OFF; |
257 | platform_set_drvdata(pdev, led); | 244 | platform_set_drvdata(pdev, led); |
258 | 245 | ||
@@ -264,7 +251,6 @@ static int wm8350_led_remove(struct platform_device *pdev) | |||
264 | struct wm8350_led *led = platform_get_drvdata(pdev); | 251 | struct wm8350_led *led = platform_get_drvdata(pdev); |
265 | 252 | ||
266 | led_classdev_unregister(&led->cdev); | 253 | led_classdev_unregister(&led->cdev); |
267 | flush_work(&led->work); | ||
268 | wm8350_led_disable(led); | 254 | wm8350_led_disable(led); |
269 | return 0; | 255 | return 0; |
270 | } | 256 | } |