summaryrefslogtreecommitdiffstats
path: root/drivers/leds/leds-wm8350.c
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2015-08-20 06:59:45 -0400
committerJacek Anaszewski <j.anaszewski@samsung.com>2016-01-04 03:57:35 -0500
commit0dd756f7677a519a1d52a94e74d179e0af39e2ec (patch)
tree6d4b5ea5915d011ddc5af0c8599339e3ee796689 /drivers/leds/leds-wm8350.c
parent77e85036389929356096f3a5c90bde782fe78f17 (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.c64
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
92static void wm8350_led_enable(struct wm8350_led *led) 92static 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
115static void wm8350_led_disable(struct wm8350_led *led) 117static 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
141static void led_work(struct work_struct *work) 145static 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
175out:
176 mutex_unlock(&led->mutex);
177}
178
179static 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
191static void wm8350_led_shutdown(struct platform_device *pdev) 182static 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
201static int wm8350_led_probe(struct platform_device *pdev) 190static 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}