xref: /openbmc/linux/drivers/leds/leds-lm3533.c (revision 79e790ff)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * leds-lm3533.c -- LM3533 LED driver
4  *
5  * Copyright (C) 2011-2012 Texas Instruments
6  *
7  * Author: Johan Hovold <jhovold@gmail.com>
8  */
9 
10 #include <linux/module.h>
11 #include <linux/leds.h>
12 #include <linux/mfd/core.h>
13 #include <linux/mutex.h>
14 #include <linux/platform_device.h>
15 #include <linux/slab.h>
16 
17 #include <linux/mfd/lm3533.h>
18 
19 
20 #define LM3533_LVCTRLBANK_MIN		2
21 #define LM3533_LVCTRLBANK_MAX		5
22 #define LM3533_LVCTRLBANK_COUNT		4
23 #define LM3533_RISEFALLTIME_MAX		7
24 #define LM3533_ALS_CHANNEL_LV_MIN	1
25 #define LM3533_ALS_CHANNEL_LV_MAX	2
26 
27 #define LM3533_REG_CTRLBANK_BCONF_BASE		0x1b
28 #define LM3533_REG_PATTERN_ENABLE		0x28
29 #define LM3533_REG_PATTERN_LOW_TIME_BASE	0x71
30 #define LM3533_REG_PATTERN_HIGH_TIME_BASE	0x72
31 #define LM3533_REG_PATTERN_RISETIME_BASE	0x74
32 #define LM3533_REG_PATTERN_FALLTIME_BASE	0x75
33 
34 #define LM3533_REG_PATTERN_STEP			0x10
35 
36 #define LM3533_REG_CTRLBANK_BCONF_MAPPING_MASK		0x04
37 #define LM3533_REG_CTRLBANK_BCONF_ALS_EN_MASK		0x02
38 #define LM3533_REG_CTRLBANK_BCONF_ALS_CHANNEL_MASK	0x01
39 
40 #define LM3533_LED_FLAG_PATTERN_ENABLE		1
41 
42 
43 struct lm3533_led {
44 	struct lm3533 *lm3533;
45 	struct lm3533_ctrlbank cb;
46 	struct led_classdev cdev;
47 	int id;
48 
49 	struct mutex mutex;
50 	unsigned long flags;
51 };
52 
53 
54 static inline struct lm3533_led *to_lm3533_led(struct led_classdev *cdev)
55 {
56 	return container_of(cdev, struct lm3533_led, cdev);
57 }
58 
59 static inline int lm3533_led_get_ctrlbank_id(struct lm3533_led *led)
60 {
61 	return led->id + 2;
62 }
63 
64 static inline u8 lm3533_led_get_lv_reg(struct lm3533_led *led, u8 base)
65 {
66 	return base + led->id;
67 }
68 
69 static inline u8 lm3533_led_get_pattern(struct lm3533_led *led)
70 {
71 	return led->id;
72 }
73 
74 static inline u8 lm3533_led_get_pattern_reg(struct lm3533_led *led,
75 								u8 base)
76 {
77 	return base + lm3533_led_get_pattern(led) * LM3533_REG_PATTERN_STEP;
78 }
79 
80 static int lm3533_led_pattern_enable(struct lm3533_led *led, int enable)
81 {
82 	u8 mask;
83 	u8 val;
84 	int pattern;
85 	int state;
86 	int ret = 0;
87 
88 	dev_dbg(led->cdev.dev, "%s - %d\n", __func__, enable);
89 
90 	mutex_lock(&led->mutex);
91 
92 	state = test_bit(LM3533_LED_FLAG_PATTERN_ENABLE, &led->flags);
93 	if ((enable && state) || (!enable && !state))
94 		goto out;
95 
96 	pattern = lm3533_led_get_pattern(led);
97 	mask = 1 << (2 * pattern);
98 
99 	if (enable)
100 		val = mask;
101 	else
102 		val = 0;
103 
104 	ret = lm3533_update(led->lm3533, LM3533_REG_PATTERN_ENABLE, val, mask);
105 	if (ret) {
106 		dev_err(led->cdev.dev, "failed to enable pattern %d (%d)\n",
107 							pattern, enable);
108 		goto out;
109 	}
110 
111 	__change_bit(LM3533_LED_FLAG_PATTERN_ENABLE, &led->flags);
112 out:
113 	mutex_unlock(&led->mutex);
114 
115 	return ret;
116 }
117 
118 static int lm3533_led_set(struct led_classdev *cdev,
119 						enum led_brightness value)
120 {
121 	struct lm3533_led *led = to_lm3533_led(cdev);
122 
123 	dev_dbg(led->cdev.dev, "%s - %d\n", __func__, value);
124 
125 	if (value == 0)
126 		lm3533_led_pattern_enable(led, 0);	/* disable blink */
127 
128 	return lm3533_ctrlbank_set_brightness(&led->cb, value);
129 }
130 
131 static enum led_brightness lm3533_led_get(struct led_classdev *cdev)
132 {
133 	struct lm3533_led *led = to_lm3533_led(cdev);
134 	u8 val;
135 	int ret;
136 
137 	ret = lm3533_ctrlbank_get_brightness(&led->cb, &val);
138 	if (ret)
139 		return ret;
140 
141 	dev_dbg(led->cdev.dev, "%s - %u\n", __func__, val);
142 
143 	return val;
144 }
145 
146 /* Pattern generator defines (delays in us). */
147 #define LM3533_LED_DELAY1_VMIN	0x00
148 #define LM3533_LED_DELAY2_VMIN	0x3d
149 #define LM3533_LED_DELAY3_VMIN	0x80
150 
151 #define LM3533_LED_DELAY1_VMAX	(LM3533_LED_DELAY2_VMIN - 1)
152 #define LM3533_LED_DELAY2_VMAX	(LM3533_LED_DELAY3_VMIN - 1)
153 #define LM3533_LED_DELAY3_VMAX	0xff
154 
155 #define LM3533_LED_DELAY1_TMIN	16384U
156 #define LM3533_LED_DELAY2_TMIN	1130496U
157 #define LM3533_LED_DELAY3_TMIN	10305536U
158 
159 #define LM3533_LED_DELAY1_TMAX	999424U
160 #define LM3533_LED_DELAY2_TMAX	9781248U
161 #define LM3533_LED_DELAY3_TMAX	76890112U
162 
163 /* t_step = (t_max - t_min) / (v_max - v_min) */
164 #define LM3533_LED_DELAY1_TSTEP	16384
165 #define LM3533_LED_DELAY2_TSTEP	131072
166 #define LM3533_LED_DELAY3_TSTEP	524288
167 
168 /* Delay limits for hardware accelerated blinking (in ms). */
169 #define LM3533_LED_DELAY_ON_MAX \
170 	((LM3533_LED_DELAY2_TMAX + LM3533_LED_DELAY2_TSTEP / 2) / 1000)
171 #define LM3533_LED_DELAY_OFF_MAX \
172 	((LM3533_LED_DELAY3_TMAX + LM3533_LED_DELAY3_TSTEP / 2) / 1000)
173 
174 /*
175  * Returns linear map of *t from [t_min,t_max] to [v_min,v_max] with a step
176  * size of t_step, where
177  *
178  *	t_step = (t_max - t_min) / (v_max - v_min)
179  *
180  * and updates *t to reflect the mapped value.
181  */
182 static u8 time_to_val(unsigned *t, unsigned t_min, unsigned t_step,
183 							u8 v_min, u8 v_max)
184 {
185 	unsigned val;
186 
187 	val = (*t + t_step / 2 - t_min) / t_step + v_min;
188 
189 	*t = t_step * (val - v_min) + t_min;
190 
191 	return (u8)val;
192 }
193 
194 /*
195  * Returns time code corresponding to *delay (in ms) and updates *delay to
196  * reflect actual hardware delay.
197  *
198  * Hardware supports 256 discrete delay times, divided into three groups with
199  * the following ranges and step-sizes:
200  *
201  *	[   16,   999]	[0x00, 0x3e]	step  16 ms
202  *	[ 1130,  9781]	[0x3d, 0x7f]	step 131 ms
203  *	[10306, 76890]	[0x80, 0xff]	step 524 ms
204  *
205  * Note that delay group 3 is only available for delay_off.
206  */
207 static u8 lm3533_led_get_hw_delay(unsigned *delay)
208 {
209 	unsigned t;
210 	u8 val;
211 
212 	t = *delay * 1000;
213 
214 	if (t >= (LM3533_LED_DELAY2_TMAX + LM3533_LED_DELAY3_TMIN) / 2) {
215 		t = clamp(t, LM3533_LED_DELAY3_TMIN, LM3533_LED_DELAY3_TMAX);
216 		val = time_to_val(&t,	LM3533_LED_DELAY3_TMIN,
217 					LM3533_LED_DELAY3_TSTEP,
218 					LM3533_LED_DELAY3_VMIN,
219 					LM3533_LED_DELAY3_VMAX);
220 	} else if (t >= (LM3533_LED_DELAY1_TMAX + LM3533_LED_DELAY2_TMIN) / 2) {
221 		t = clamp(t, LM3533_LED_DELAY2_TMIN, LM3533_LED_DELAY2_TMAX);
222 		val = time_to_val(&t,	LM3533_LED_DELAY2_TMIN,
223 					LM3533_LED_DELAY2_TSTEP,
224 					LM3533_LED_DELAY2_VMIN,
225 					LM3533_LED_DELAY2_VMAX);
226 	} else {
227 		t = clamp(t, LM3533_LED_DELAY1_TMIN, LM3533_LED_DELAY1_TMAX);
228 		val = time_to_val(&t,	LM3533_LED_DELAY1_TMIN,
229 					LM3533_LED_DELAY1_TSTEP,
230 					LM3533_LED_DELAY1_VMIN,
231 					LM3533_LED_DELAY1_VMAX);
232 	}
233 
234 	*delay = (t + 500) / 1000;
235 
236 	return val;
237 }
238 
239 /*
240  * Set delay register base to *delay (in ms) and update *delay to reflect
241  * actual hardware delay used.
242  */
243 static u8 lm3533_led_delay_set(struct lm3533_led *led, u8 base,
244 							unsigned long *delay)
245 {
246 	unsigned t;
247 	u8 val;
248 	u8 reg;
249 	int ret;
250 
251 	t = (unsigned)*delay;
252 
253 	/* Delay group 3 is only available for low time (delay off). */
254 	if (base != LM3533_REG_PATTERN_LOW_TIME_BASE)
255 		t = min(t, LM3533_LED_DELAY2_TMAX / 1000);
256 
257 	val = lm3533_led_get_hw_delay(&t);
258 
259 	dev_dbg(led->cdev.dev, "%s - %lu: %u (0x%02x)\n", __func__,
260 							*delay, t, val);
261 	reg = lm3533_led_get_pattern_reg(led, base);
262 	ret = lm3533_write(led->lm3533, reg, val);
263 	if (ret)
264 		dev_err(led->cdev.dev, "failed to set delay (%02x)\n", reg);
265 
266 	*delay = t;
267 
268 	return ret;
269 }
270 
271 static int lm3533_led_delay_on_set(struct lm3533_led *led, unsigned long *t)
272 {
273 	return lm3533_led_delay_set(led, LM3533_REG_PATTERN_HIGH_TIME_BASE, t);
274 }
275 
276 static int lm3533_led_delay_off_set(struct lm3533_led *led, unsigned long *t)
277 {
278 	return lm3533_led_delay_set(led, LM3533_REG_PATTERN_LOW_TIME_BASE, t);
279 }
280 
281 static int lm3533_led_blink_set(struct led_classdev *cdev,
282 				unsigned long *delay_on,
283 				unsigned long *delay_off)
284 {
285 	struct lm3533_led *led = to_lm3533_led(cdev);
286 	int ret;
287 
288 	dev_dbg(led->cdev.dev, "%s - on = %lu, off = %lu\n", __func__,
289 							*delay_on, *delay_off);
290 
291 	if (*delay_on > LM3533_LED_DELAY_ON_MAX ||
292 					*delay_off > LM3533_LED_DELAY_OFF_MAX)
293 		return -EINVAL;
294 
295 	if (*delay_on == 0 && *delay_off == 0) {
296 		*delay_on = 500;
297 		*delay_off = 500;
298 	}
299 
300 	ret = lm3533_led_delay_on_set(led, delay_on);
301 	if (ret)
302 		return ret;
303 
304 	ret = lm3533_led_delay_off_set(led, delay_off);
305 	if (ret)
306 		return ret;
307 
308 	return lm3533_led_pattern_enable(led, 1);
309 }
310 
311 static ssize_t show_id(struct device *dev,
312 				struct device_attribute *attr, char *buf)
313 {
314 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
315 	struct lm3533_led *led = to_lm3533_led(led_cdev);
316 
317 	return scnprintf(buf, PAGE_SIZE, "%d\n", led->id);
318 }
319 
320 /*
321  * Pattern generator rise/fall times:
322  *
323  *   0 - 2048 us (default)
324  *   1 - 262 ms
325  *   2 - 524 ms
326  *   3 - 1.049 s
327  *   4 - 2.097 s
328  *   5 - 4.194 s
329  *   6 - 8.389 s
330  *   7 - 16.78 s
331  */
332 static ssize_t show_risefalltime(struct device *dev,
333 					struct device_attribute *attr,
334 					char *buf, u8 base)
335 {
336 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
337 	struct lm3533_led *led = to_lm3533_led(led_cdev);
338 	ssize_t ret;
339 	u8 reg;
340 	u8 val;
341 
342 	reg = lm3533_led_get_pattern_reg(led, base);
343 	ret = lm3533_read(led->lm3533, reg, &val);
344 	if (ret)
345 		return ret;
346 
347 	return scnprintf(buf, PAGE_SIZE, "%x\n", val);
348 }
349 
350 static ssize_t show_risetime(struct device *dev,
351 				struct device_attribute *attr, char *buf)
352 {
353 	return show_risefalltime(dev, attr, buf,
354 					LM3533_REG_PATTERN_RISETIME_BASE);
355 }
356 
357 static ssize_t show_falltime(struct device *dev,
358 				struct device_attribute *attr, char *buf)
359 {
360 	return show_risefalltime(dev, attr, buf,
361 					LM3533_REG_PATTERN_FALLTIME_BASE);
362 }
363 
364 static ssize_t store_risefalltime(struct device *dev,
365 					struct device_attribute *attr,
366 					const char *buf, size_t len, u8 base)
367 {
368 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
369 	struct lm3533_led *led = to_lm3533_led(led_cdev);
370 	u8 val;
371 	u8 reg;
372 	int ret;
373 
374 	if (kstrtou8(buf, 0, &val) || val > LM3533_RISEFALLTIME_MAX)
375 		return -EINVAL;
376 
377 	reg = lm3533_led_get_pattern_reg(led, base);
378 	ret = lm3533_write(led->lm3533, reg, val);
379 	if (ret)
380 		return ret;
381 
382 	return len;
383 }
384 
385 static ssize_t store_risetime(struct device *dev,
386 					struct device_attribute *attr,
387 					const char *buf, size_t len)
388 {
389 	return store_risefalltime(dev, attr, buf, len,
390 					LM3533_REG_PATTERN_RISETIME_BASE);
391 }
392 
393 static ssize_t store_falltime(struct device *dev,
394 					struct device_attribute *attr,
395 					const char *buf, size_t len)
396 {
397 	return store_risefalltime(dev, attr, buf, len,
398 					LM3533_REG_PATTERN_FALLTIME_BASE);
399 }
400 
401 static ssize_t show_als_channel(struct device *dev,
402 				struct device_attribute *attr, char *buf)
403 {
404 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
405 	struct lm3533_led *led = to_lm3533_led(led_cdev);
406 	unsigned channel;
407 	u8 reg;
408 	u8 val;
409 	int ret;
410 
411 	reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
412 	ret = lm3533_read(led->lm3533, reg, &val);
413 	if (ret)
414 		return ret;
415 
416 	channel = (val & LM3533_REG_CTRLBANK_BCONF_ALS_CHANNEL_MASK) + 1;
417 
418 	return scnprintf(buf, PAGE_SIZE, "%u\n", channel);
419 }
420 
421 static ssize_t store_als_channel(struct device *dev,
422 					struct device_attribute *attr,
423 					const char *buf, size_t len)
424 {
425 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
426 	struct lm3533_led *led = to_lm3533_led(led_cdev);
427 	unsigned channel;
428 	u8 reg;
429 	u8 val;
430 	u8 mask;
431 	int ret;
432 
433 	if (kstrtouint(buf, 0, &channel))
434 		return -EINVAL;
435 
436 	if (channel < LM3533_ALS_CHANNEL_LV_MIN ||
437 					channel > LM3533_ALS_CHANNEL_LV_MAX)
438 		return -EINVAL;
439 
440 	reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
441 	mask = LM3533_REG_CTRLBANK_BCONF_ALS_CHANNEL_MASK;
442 	val = channel - 1;
443 
444 	ret = lm3533_update(led->lm3533, reg, val, mask);
445 	if (ret)
446 		return ret;
447 
448 	return len;
449 }
450 
451 static ssize_t show_als_en(struct device *dev,
452 				struct device_attribute *attr, char *buf)
453 {
454 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
455 	struct lm3533_led *led = to_lm3533_led(led_cdev);
456 	bool enable;
457 	u8 reg;
458 	u8 val;
459 	int ret;
460 
461 	reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
462 	ret = lm3533_read(led->lm3533, reg, &val);
463 	if (ret)
464 		return ret;
465 
466 	enable = val & LM3533_REG_CTRLBANK_BCONF_ALS_EN_MASK;
467 
468 	return scnprintf(buf, PAGE_SIZE, "%d\n", enable);
469 }
470 
471 static ssize_t store_als_en(struct device *dev,
472 					struct device_attribute *attr,
473 					const char *buf, size_t len)
474 {
475 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
476 	struct lm3533_led *led = to_lm3533_led(led_cdev);
477 	unsigned enable;
478 	u8 reg;
479 	u8 mask;
480 	u8 val;
481 	int ret;
482 
483 	if (kstrtouint(buf, 0, &enable))
484 		return -EINVAL;
485 
486 	reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
487 	mask = LM3533_REG_CTRLBANK_BCONF_ALS_EN_MASK;
488 
489 	if (enable)
490 		val = mask;
491 	else
492 		val = 0;
493 
494 	ret = lm3533_update(led->lm3533, reg, val, mask);
495 	if (ret)
496 		return ret;
497 
498 	return len;
499 }
500 
501 static ssize_t show_linear(struct device *dev,
502 				struct device_attribute *attr, char *buf)
503 {
504 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
505 	struct lm3533_led *led = to_lm3533_led(led_cdev);
506 	u8 reg;
507 	u8 val;
508 	int linear;
509 	int ret;
510 
511 	reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
512 	ret = lm3533_read(led->lm3533, reg, &val);
513 	if (ret)
514 		return ret;
515 
516 	if (val & LM3533_REG_CTRLBANK_BCONF_MAPPING_MASK)
517 		linear = 1;
518 	else
519 		linear = 0;
520 
521 	return scnprintf(buf, PAGE_SIZE, "%x\n", linear);
522 }
523 
524 static ssize_t store_linear(struct device *dev,
525 					struct device_attribute *attr,
526 					const char *buf, size_t len)
527 {
528 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
529 	struct lm3533_led *led = to_lm3533_led(led_cdev);
530 	unsigned long linear;
531 	u8 reg;
532 	u8 mask;
533 	u8 val;
534 	int ret;
535 
536 	if (kstrtoul(buf, 0, &linear))
537 		return -EINVAL;
538 
539 	reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
540 	mask = LM3533_REG_CTRLBANK_BCONF_MAPPING_MASK;
541 
542 	if (linear)
543 		val = mask;
544 	else
545 		val = 0;
546 
547 	ret = lm3533_update(led->lm3533, reg, val, mask);
548 	if (ret)
549 		return ret;
550 
551 	return len;
552 }
553 
554 static ssize_t show_pwm(struct device *dev,
555 					struct device_attribute *attr,
556 					char *buf)
557 {
558 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
559 	struct lm3533_led *led = to_lm3533_led(led_cdev);
560 	u8 val;
561 	int ret;
562 
563 	ret = lm3533_ctrlbank_get_pwm(&led->cb, &val);
564 	if (ret)
565 		return ret;
566 
567 	return scnprintf(buf, PAGE_SIZE, "%u\n", val);
568 }
569 
570 static ssize_t store_pwm(struct device *dev,
571 					struct device_attribute *attr,
572 					const char *buf, size_t len)
573 {
574 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
575 	struct lm3533_led *led = to_lm3533_led(led_cdev);
576 	u8 val;
577 	int ret;
578 
579 	if (kstrtou8(buf, 0, &val))
580 		return -EINVAL;
581 
582 	ret = lm3533_ctrlbank_set_pwm(&led->cb, val);
583 	if (ret)
584 		return ret;
585 
586 	return len;
587 }
588 
589 static LM3533_ATTR_RW(als_channel);
590 static LM3533_ATTR_RW(als_en);
591 static LM3533_ATTR_RW(falltime);
592 static LM3533_ATTR_RO(id);
593 static LM3533_ATTR_RW(linear);
594 static LM3533_ATTR_RW(pwm);
595 static LM3533_ATTR_RW(risetime);
596 
597 static struct attribute *lm3533_led_attributes[] = {
598 	&dev_attr_als_channel.attr,
599 	&dev_attr_als_en.attr,
600 	&dev_attr_falltime.attr,
601 	&dev_attr_id.attr,
602 	&dev_attr_linear.attr,
603 	&dev_attr_pwm.attr,
604 	&dev_attr_risetime.attr,
605 	NULL,
606 };
607 
608 static umode_t lm3533_led_attr_is_visible(struct kobject *kobj,
609 					     struct attribute *attr, int n)
610 {
611 	struct device *dev = kobj_to_dev(kobj);
612 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
613 	struct lm3533_led *led = to_lm3533_led(led_cdev);
614 	umode_t mode = attr->mode;
615 
616 	if (attr == &dev_attr_als_channel.attr ||
617 					attr == &dev_attr_als_en.attr) {
618 		if (!led->lm3533->have_als)
619 			mode = 0;
620 	}
621 
622 	return mode;
623 };
624 
625 static const struct attribute_group lm3533_led_attribute_group = {
626 	.is_visible	= lm3533_led_attr_is_visible,
627 	.attrs		= lm3533_led_attributes
628 };
629 
630 static const struct attribute_group *lm3533_led_attribute_groups[] = {
631 	&lm3533_led_attribute_group,
632 	NULL
633 };
634 
635 static int lm3533_led_setup(struct lm3533_led *led,
636 					struct lm3533_led_platform_data *pdata)
637 {
638 	int ret;
639 
640 	ret = lm3533_ctrlbank_set_max_current(&led->cb, pdata->max_current);
641 	if (ret)
642 		return ret;
643 
644 	return lm3533_ctrlbank_set_pwm(&led->cb, pdata->pwm);
645 }
646 
647 static int lm3533_led_probe(struct platform_device *pdev)
648 {
649 	struct lm3533 *lm3533;
650 	struct lm3533_led_platform_data *pdata;
651 	struct lm3533_led *led;
652 	int ret;
653 
654 	dev_dbg(&pdev->dev, "%s\n", __func__);
655 
656 	lm3533 = dev_get_drvdata(pdev->dev.parent);
657 	if (!lm3533)
658 		return -EINVAL;
659 
660 	pdata = dev_get_platdata(&pdev->dev);
661 	if (!pdata) {
662 		dev_err(&pdev->dev, "no platform data\n");
663 		return -EINVAL;
664 	}
665 
666 	if (pdev->id < 0 || pdev->id >= LM3533_LVCTRLBANK_COUNT) {
667 		dev_err(&pdev->dev, "illegal LED id %d\n", pdev->id);
668 		return -EINVAL;
669 	}
670 
671 	led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL);
672 	if (!led)
673 		return -ENOMEM;
674 
675 	led->lm3533 = lm3533;
676 	led->cdev.name = pdata->name;
677 	led->cdev.default_trigger = pdata->default_trigger;
678 	led->cdev.brightness_set_blocking = lm3533_led_set;
679 	led->cdev.brightness_get = lm3533_led_get;
680 	led->cdev.blink_set = lm3533_led_blink_set;
681 	led->cdev.brightness = LED_OFF;
682 	led->cdev.groups = lm3533_led_attribute_groups;
683 	led->id = pdev->id;
684 
685 	mutex_init(&led->mutex);
686 
687 	/* The class framework makes a callback to get brightness during
688 	 * registration so use parent device (for error reporting) until
689 	 * registered.
690 	 */
691 	led->cb.lm3533 = lm3533;
692 	led->cb.id = lm3533_led_get_ctrlbank_id(led);
693 	led->cb.dev = lm3533->dev;
694 
695 	platform_set_drvdata(pdev, led);
696 
697 	ret = led_classdev_register(pdev->dev.parent, &led->cdev);
698 	if (ret) {
699 		dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id);
700 		return ret;
701 	}
702 
703 	led->cb.dev = led->cdev.dev;
704 
705 	ret = lm3533_led_setup(led, pdata);
706 	if (ret)
707 		goto err_deregister;
708 
709 	ret = lm3533_ctrlbank_enable(&led->cb);
710 	if (ret)
711 		goto err_deregister;
712 
713 	return 0;
714 
715 err_deregister:
716 	led_classdev_unregister(&led->cdev);
717 
718 	return ret;
719 }
720 
721 static int lm3533_led_remove(struct platform_device *pdev)
722 {
723 	struct lm3533_led *led = platform_get_drvdata(pdev);
724 
725 	dev_dbg(&pdev->dev, "%s\n", __func__);
726 
727 	lm3533_ctrlbank_disable(&led->cb);
728 	led_classdev_unregister(&led->cdev);
729 
730 	return 0;
731 }
732 
733 static void lm3533_led_shutdown(struct platform_device *pdev)
734 {
735 
736 	struct lm3533_led *led = platform_get_drvdata(pdev);
737 
738 	dev_dbg(&pdev->dev, "%s\n", __func__);
739 
740 	lm3533_ctrlbank_disable(&led->cb);
741 	lm3533_led_set(&led->cdev, LED_OFF);		/* disable blink */
742 }
743 
744 static struct platform_driver lm3533_led_driver = {
745 	.driver = {
746 		.name = "lm3533-leds",
747 	},
748 	.probe		= lm3533_led_probe,
749 	.remove		= lm3533_led_remove,
750 	.shutdown	= lm3533_led_shutdown,
751 };
752 module_platform_driver(lm3533_led_driver);
753 
754 MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");
755 MODULE_DESCRIPTION("LM3533 LED driver");
756 MODULE_LICENSE("GPL");
757 MODULE_ALIAS("platform:lm3533-leds");
758