xref: /linux/drivers/leds/leds-lm3532.c (revision 7f71507851fc7764b36a3221839607d3a45c2025)
1 // SPDX-License-Identifier: GPL-2.0
2 // TI LM3532 LED driver
3 // Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com/
4 // https://www.ti.com/lit/ds/symlink/lm3532.pdf
5 
6 #include <linux/i2c.h>
7 #include <linux/leds.h>
8 #include <linux/slab.h>
9 #include <linux/regmap.h>
10 #include <linux/types.h>
11 #include <linux/regulator/consumer.h>
12 #include <linux/module.h>
13 #include <uapi/linux/uleds.h>
14 #include <linux/gpio/consumer.h>
15 
16 #define LM3532_NAME "lm3532-led"
17 #define LM3532_BL_MODE_MANUAL	0x00
18 #define LM3532_BL_MODE_ALS	0x01
19 
20 #define LM3532_REG_OUTPUT_CFG	0x10
21 #define LM3532_REG_STARTSHUT_RAMP	0x11
22 #define LM3532_REG_RT_RAMP	0x12
23 #define LM3532_REG_PWM_A_CFG	0x13
24 #define LM3532_REG_PWM_B_CFG	0x14
25 #define LM3532_REG_PWM_C_CFG	0x15
26 #define LM3532_REG_ZONE_CFG_A	0x16
27 #define LM3532_REG_CTRL_A_FS_CURR	0x17
28 #define LM3532_REG_ZONE_CFG_B	0x18
29 #define LM3532_REG_CTRL_B_FS_CURR	0x19
30 #define LM3532_REG_ZONE_CFG_C	0x1a
31 #define LM3532_REG_CTRL_C_FS_CURR	0x1b
32 #define LM3532_REG_ENABLE	0x1d
33 #define LM3532_ALS_CONFIG	0x23
34 #define LM3532_REG_ZN_0_HI	0x60
35 #define LM3532_REG_ZN_0_LO	0x61
36 #define LM3532_REG_ZN_1_HI	0x62
37 #define LM3532_REG_ZN_1_LO	0x63
38 #define LM3532_REG_ZN_2_HI	0x64
39 #define LM3532_REG_ZN_2_LO	0x65
40 #define LM3532_REG_ZN_3_HI	0x66
41 #define LM3532_REG_ZN_3_LO	0x67
42 #define LM3532_REG_ZONE_TRGT_A	0x70
43 #define LM3532_REG_ZONE_TRGT_B	0x75
44 #define LM3532_REG_ZONE_TRGT_C	0x7a
45 #define LM3532_REG_MAX		0x7e
46 
47 /* Control Enable */
48 #define LM3532_CTRL_A_ENABLE	BIT(0)
49 #define LM3532_CTRL_B_ENABLE	BIT(1)
50 #define LM3532_CTRL_C_ENABLE	BIT(2)
51 
52 /* PWM Zone Control */
53 #define LM3532_PWM_ZONE_MASK	0x7c
54 #define LM3532_PWM_ZONE_0_EN	BIT(2)
55 #define LM3532_PWM_ZONE_1_EN	BIT(3)
56 #define LM3532_PWM_ZONE_2_EN	BIT(4)
57 #define LM3532_PWM_ZONE_3_EN	BIT(5)
58 #define LM3532_PWM_ZONE_4_EN	BIT(6)
59 
60 /* Brightness Configuration */
61 #define LM3532_I2C_CTRL		BIT(0)
62 #define LM3532_ALS_CTRL		0
63 #define LM3532_LINEAR_MAP	BIT(1)
64 #define LM3532_ZONE_MASK	(BIT(2) | BIT(3) | BIT(4))
65 #define LM3532_ZONE_0		0
66 #define LM3532_ZONE_1		BIT(2)
67 #define LM3532_ZONE_2		BIT(3)
68 #define LM3532_ZONE_3		(BIT(2) | BIT(3))
69 #define LM3532_ZONE_4		BIT(4)
70 
71 #define LM3532_ENABLE_ALS	BIT(3)
72 #define LM3532_ALS_SEL_SHIFT	6
73 
74 /* Zone Boundary Register */
75 #define LM3532_ALS_WINDOW_mV	2000
76 #define LM3532_ALS_ZB_MAX	4
77 #define LM3532_ALS_OFFSET_mV	2
78 
79 #define LM3532_CONTROL_A	0
80 #define LM3532_CONTROL_B	1
81 #define LM3532_CONTROL_C	2
82 #define LM3532_MAX_CONTROL_BANKS 3
83 #define LM3532_MAX_LED_STRINGS	3
84 
85 #define LM3532_OUTPUT_CFG_MASK	0x3
86 #define LM3532_BRT_VAL_ADJUST	8
87 #define LM3532_RAMP_DOWN_SHIFT	3
88 
89 #define LM3532_NUM_RAMP_VALS	8
90 #define LM3532_NUM_AVG_VALS	8
91 #define LM3532_NUM_IMP_VALS	32
92 
93 #define LM3532_FS_CURR_MIN	5000
94 #define LM3532_FS_CURR_MAX	29800
95 #define LM3532_FS_CURR_STEP	800
96 
97 /*
98  * struct lm3532_als_data
99  * @config: value of ALS configuration register
100  * @als1_imp_sel: value of ALS1 resistor select register
101  * @als2_imp_sel: value of ALS2 resistor select register
102  * @als_avrg_time: ALS averaging time
103  * @als_input_mode: ALS input mode for brightness control
104  * @als_vmin: Minimum ALS voltage
105  * @als_vmax: Maximum ALS voltage
106  * @zone_lo: values of ALS lo ZB(Zone Boundary) registers
107  * @zone_hi: values of ALS hi ZB(Zone Boundary) registers
108  */
109 struct lm3532_als_data {
110 	u8 config;
111 	u8 als1_imp_sel;
112 	u8 als2_imp_sel;
113 	u8 als_avrg_time;
114 	u8 als_input_mode;
115 	u32 als_vmin;
116 	u32 als_vmax;
117 	u8 zones_lo[LM3532_ALS_ZB_MAX];
118 	u8 zones_hi[LM3532_ALS_ZB_MAX];
119 };
120 
121 /**
122  * struct lm3532_led
123  * @led_dev: led class device
124  * @priv: Pointer the device data structure
125  * @control_bank: Control bank the LED is associated to
126  * @mode: Mode of the LED string
127  * @ctrl_brt_pointer: Zone target register that controls the sink
128  * @num_leds: Number of LED strings are supported in this array
129  * @full_scale_current: The full-scale current setting for the current sink.
130  * @led_strings: The LED strings supported in this array
131  * @enabled: Enabled status
132  */
133 struct lm3532_led {
134 	struct led_classdev led_dev;
135 	struct lm3532_data *priv;
136 
137 	int control_bank;
138 	int mode;
139 	int ctrl_brt_pointer;
140 	int num_leds;
141 	int full_scale_current;
142 	unsigned int enabled:1;
143 	u32 led_strings[LM3532_MAX_CONTROL_BANKS];
144 };
145 
146 /**
147  * struct lm3532_data
148  * @enable_gpio: Hardware enable gpio
149  * @regulator: regulator
150  * @client: i2c client
151  * @regmap: Devices register map
152  * @dev: Pointer to the devices device struct
153  * @lock: Lock for reading/writing the device
154  * @als_data: Pointer to the als data struct
155  * @runtime_ramp_up: Runtime ramp up setting
156  * @runtime_ramp_down: Runtime ramp down setting
157  * @leds: Array of LED strings
158  */
159 struct lm3532_data {
160 	struct gpio_desc *enable_gpio;
161 	struct regulator *regulator;
162 	struct i2c_client *client;
163 	struct regmap *regmap;
164 	struct device *dev;
165 	struct mutex lock;
166 
167 	struct lm3532_als_data *als_data;
168 
169 	u32 runtime_ramp_up;
170 	u32 runtime_ramp_down;
171 
172 	struct lm3532_led leds[];
173 };
174 
175 static const struct reg_default lm3532_reg_defs[] = {
176 	{LM3532_REG_OUTPUT_CFG, 0xe4},
177 	{LM3532_REG_STARTSHUT_RAMP, 0xc0},
178 	{LM3532_REG_RT_RAMP, 0xc0},
179 	{LM3532_REG_PWM_A_CFG, 0x82},
180 	{LM3532_REG_PWM_B_CFG, 0x82},
181 	{LM3532_REG_PWM_C_CFG, 0x82},
182 	{LM3532_REG_ZONE_CFG_A, 0xf1},
183 	{LM3532_REG_CTRL_A_FS_CURR, 0xf3},
184 	{LM3532_REG_ZONE_CFG_B, 0xf1},
185 	{LM3532_REG_CTRL_B_FS_CURR, 0xf3},
186 	{LM3532_REG_ZONE_CFG_C, 0xf1},
187 	{LM3532_REG_CTRL_C_FS_CURR, 0xf3},
188 	{LM3532_REG_ENABLE, 0xf8},
189 	{LM3532_ALS_CONFIG, 0x44},
190 	{LM3532_REG_ZN_0_HI, 0x35},
191 	{LM3532_REG_ZN_0_LO, 0x33},
192 	{LM3532_REG_ZN_1_HI, 0x6a},
193 	{LM3532_REG_ZN_1_LO, 0x66},
194 	{LM3532_REG_ZN_2_HI, 0xa1},
195 	{LM3532_REG_ZN_2_LO, 0x99},
196 	{LM3532_REG_ZN_3_HI, 0xdc},
197 	{LM3532_REG_ZN_3_LO, 0xcc},
198 };
199 
200 static const struct regmap_config lm3532_regmap_config = {
201 	.reg_bits = 8,
202 	.val_bits = 8,
203 
204 	.max_register = LM3532_REG_MAX,
205 	.reg_defaults = lm3532_reg_defs,
206 	.num_reg_defaults = ARRAY_SIZE(lm3532_reg_defs),
207 	.cache_type = REGCACHE_FLAT,
208 };
209 
210 static const int als_imp_table[LM3532_NUM_IMP_VALS] = {37000, 18500, 12330,
211 						       92500, 7400, 6170, 5290,
212 						       4630, 4110, 3700, 3360,
213 						       3080, 2850, 2640, 2440,
214 						       2310, 2180, 2060, 1950,
215 						       1850, 1760, 1680, 1610,
216 						       1540, 1480, 1420, 1370,
217 						       1320, 1280, 1230, 1190};
218 static int lm3532_get_als_imp_index(int als_imped)
219 {
220 	int i;
221 
222 	if (als_imped > als_imp_table[1])
223 		return 0;
224 
225 	if (als_imped < als_imp_table[LM3532_NUM_IMP_VALS - 1])
226 		return LM3532_NUM_IMP_VALS - 1;
227 
228 	for (i = 1; i < LM3532_NUM_IMP_VALS; i++) {
229 		if (als_imped == als_imp_table[i])
230 			return i;
231 
232 		/* Find an approximate index by looking up the table */
233 		if (als_imped < als_imp_table[i - 1] &&
234 		    als_imped > als_imp_table[i]) {
235 			if (als_imped - als_imp_table[i - 1] <
236 			    als_imp_table[i] - als_imped)
237 				return i + 1;
238 			else
239 				return i;
240 		}
241 	}
242 
243 	return -EINVAL;
244 }
245 
246 static int lm3532_get_index(const int table[], int size, int value)
247 {
248 	int i;
249 
250 	for (i = 1; i < size; i++) {
251 		if (value == table[i])
252 			return i;
253 
254 		/* Find an approximate index by looking up the table */
255 		if (value > table[i - 1] &&
256 		    value < table[i]) {
257 			if (value - table[i - 1] < table[i] - value)
258 				return i - 1;
259 			else
260 				return i;
261 		}
262 	}
263 
264 	return -EINVAL;
265 }
266 
267 static const int als_avrg_table[LM3532_NUM_AVG_VALS] = {17920, 35840, 71680,
268 							1433360, 286720, 573440,
269 							1146880, 2293760};
270 static int lm3532_get_als_avg_index(int avg_time)
271 {
272 	if (avg_time <= als_avrg_table[0])
273 		return 0;
274 
275 	if (avg_time > als_avrg_table[LM3532_NUM_AVG_VALS - 1])
276 		return LM3532_NUM_AVG_VALS - 1;
277 
278 	return lm3532_get_index(&als_avrg_table[0], LM3532_NUM_AVG_VALS,
279 				avg_time);
280 }
281 
282 static const int ramp_table[LM3532_NUM_RAMP_VALS] = { 8, 1024, 2048, 4096, 8192,
283 						     16384, 32768, 65536};
284 static int lm3532_get_ramp_index(int ramp_time)
285 {
286 	if (ramp_time <= ramp_table[0])
287 		return 0;
288 
289 	if (ramp_time > ramp_table[LM3532_NUM_RAMP_VALS - 1])
290 		return LM3532_NUM_RAMP_VALS - 1;
291 
292 	return lm3532_get_index(&ramp_table[0], LM3532_NUM_RAMP_VALS,
293 				ramp_time);
294 }
295 
296 /* Caller must take care of locking */
297 static int lm3532_led_enable(struct lm3532_led *led_data)
298 {
299 	int ctrl_en_val = BIT(led_data->control_bank);
300 	int ret;
301 
302 	if (led_data->enabled)
303 		return 0;
304 
305 	ret = regmap_update_bits(led_data->priv->regmap, LM3532_REG_ENABLE,
306 					 ctrl_en_val, ctrl_en_val);
307 	if (ret) {
308 		dev_err(led_data->priv->dev, "Failed to set ctrl:%d\n", ret);
309 		return ret;
310 	}
311 
312 	ret = regulator_enable(led_data->priv->regulator);
313 	if (ret < 0)
314 		return ret;
315 
316 	led_data->enabled = 1;
317 
318 	return 0;
319 }
320 
321 /* Caller must take care of locking */
322 static int lm3532_led_disable(struct lm3532_led *led_data)
323 {
324 	int ctrl_en_val = BIT(led_data->control_bank);
325 	int ret;
326 
327 	if (!led_data->enabled)
328 		return 0;
329 
330 	ret = regmap_update_bits(led_data->priv->regmap, LM3532_REG_ENABLE,
331 					 ctrl_en_val, 0);
332 	if (ret) {
333 		dev_err(led_data->priv->dev, "Failed to set ctrl:%d\n", ret);
334 		return ret;
335 	}
336 
337 	ret = regulator_disable(led_data->priv->regulator);
338 	if (ret < 0)
339 		return ret;
340 
341 	led_data->enabled = 0;
342 
343 	return 0;
344 }
345 
346 static int lm3532_brightness_set(struct led_classdev *led_cdev,
347 				 enum led_brightness brt_val)
348 {
349 	struct lm3532_led *led =
350 			container_of(led_cdev, struct lm3532_led, led_dev);
351 	u8 brightness_reg;
352 	int ret;
353 
354 	mutex_lock(&led->priv->lock);
355 
356 	if (led->mode == LM3532_ALS_CTRL) {
357 		if (brt_val > LED_OFF)
358 			ret = lm3532_led_enable(led);
359 		else
360 			ret = lm3532_led_disable(led);
361 
362 		goto unlock;
363 	}
364 
365 	if (brt_val == LED_OFF) {
366 		ret = lm3532_led_disable(led);
367 		goto unlock;
368 	}
369 
370 	ret = lm3532_led_enable(led);
371 	if (ret)
372 		goto unlock;
373 
374 	brightness_reg = LM3532_REG_ZONE_TRGT_A + led->control_bank * 5 +
375 			 (led->ctrl_brt_pointer >> 2);
376 
377 	ret = regmap_write(led->priv->regmap, brightness_reg, brt_val);
378 
379 unlock:
380 	mutex_unlock(&led->priv->lock);
381 	return ret;
382 }
383 
384 static int lm3532_init_registers(struct lm3532_led *led)
385 {
386 	struct lm3532_data *drvdata = led->priv;
387 	unsigned int runtime_ramp_val;
388 	unsigned int output_cfg_val = 0;
389 	unsigned int output_cfg_shift = 0;
390 	unsigned int output_cfg_mask = 0;
391 	unsigned int brightness_config_reg;
392 	unsigned int brightness_config_val;
393 	int fs_current_reg;
394 	int fs_current_val;
395 	int ret, i;
396 
397 	if (drvdata->enable_gpio)
398 		gpiod_direction_output(drvdata->enable_gpio, 1);
399 
400 	brightness_config_reg = LM3532_REG_ZONE_CFG_A + led->control_bank * 2;
401 	/*
402 	 * This could be hard coded to the default value but the control
403 	 * brightness register may have changed during boot.
404 	 */
405 	ret = regmap_read(drvdata->regmap, brightness_config_reg,
406 			  &led->ctrl_brt_pointer);
407 	if (ret)
408 		return ret;
409 
410 	led->ctrl_brt_pointer &= LM3532_ZONE_MASK;
411 	brightness_config_val = led->ctrl_brt_pointer | led->mode;
412 	ret = regmap_write(drvdata->regmap, brightness_config_reg,
413 			   brightness_config_val);
414 	if (ret)
415 		return ret;
416 
417 	if (led->full_scale_current) {
418 		fs_current_reg = LM3532_REG_CTRL_A_FS_CURR + led->control_bank * 2;
419 		fs_current_val = (led->full_scale_current - LM3532_FS_CURR_MIN) /
420 				 LM3532_FS_CURR_STEP;
421 
422 		ret = regmap_write(drvdata->regmap, fs_current_reg,
423 				   fs_current_val);
424 		if (ret)
425 			return ret;
426 	}
427 
428 	for (i = 0; i < led->num_leds; i++) {
429 		output_cfg_shift = led->led_strings[i] * 2;
430 		output_cfg_val |= (led->control_bank << output_cfg_shift);
431 		output_cfg_mask |= LM3532_OUTPUT_CFG_MASK << output_cfg_shift;
432 	}
433 
434 	ret = regmap_update_bits(drvdata->regmap, LM3532_REG_OUTPUT_CFG,
435 				 output_cfg_mask, output_cfg_val);
436 	if (ret)
437 		return ret;
438 
439 	runtime_ramp_val = drvdata->runtime_ramp_up |
440 			 (drvdata->runtime_ramp_down << LM3532_RAMP_DOWN_SHIFT);
441 
442 	return regmap_write(drvdata->regmap, LM3532_REG_RT_RAMP,
443 			    runtime_ramp_val);
444 }
445 
446 static int lm3532_als_configure(struct lm3532_data *priv,
447 				struct lm3532_led *led)
448 {
449 	struct lm3532_als_data *als = priv->als_data;
450 	u32 als_vmin, als_vmax, als_vstep;
451 	int zone_reg = LM3532_REG_ZN_0_HI;
452 	int ret;
453 	int i;
454 
455 	als_vmin = als->als_vmin;
456 	als_vmax = als->als_vmax;
457 
458 	als_vstep = (als_vmax - als_vmin) / ((LM3532_ALS_ZB_MAX + 1) * 2);
459 
460 	for (i = 0; i < LM3532_ALS_ZB_MAX; i++) {
461 		als->zones_lo[i] = ((als_vmin + als_vstep + (i * als_vstep)) *
462 				LED_FULL) / 1000;
463 		als->zones_hi[i] = ((als_vmin + LM3532_ALS_OFFSET_mV +
464 				als_vstep + (i * als_vstep)) * LED_FULL) / 1000;
465 
466 		zone_reg = LM3532_REG_ZN_0_HI + i * 2;
467 		ret = regmap_write(priv->regmap, zone_reg, als->zones_lo[i]);
468 		if (ret)
469 			return ret;
470 
471 		zone_reg += 1;
472 		ret = regmap_write(priv->regmap, zone_reg, als->zones_hi[i]);
473 		if (ret)
474 			return ret;
475 	}
476 
477 	als->config = (als->als_avrg_time | (LM3532_ENABLE_ALS) |
478 		(als->als_input_mode << LM3532_ALS_SEL_SHIFT));
479 
480 	return regmap_write(priv->regmap, LM3532_ALS_CONFIG, als->config);
481 }
482 
483 static int lm3532_parse_als(struct lm3532_data *priv)
484 {
485 	struct lm3532_als_data *als;
486 	int als_avg_time;
487 	int als_impedance;
488 	int ret;
489 
490 	als = devm_kzalloc(priv->dev, sizeof(*als), GFP_KERNEL);
491 	if (als == NULL)
492 		return -ENOMEM;
493 
494 	ret = device_property_read_u32(&priv->client->dev, "ti,als-vmin",
495 				       &als->als_vmin);
496 	if (ret)
497 		als->als_vmin = 0;
498 
499 	ret = device_property_read_u32(&priv->client->dev, "ti,als-vmax",
500 				       &als->als_vmax);
501 	if (ret)
502 		als->als_vmax = LM3532_ALS_WINDOW_mV;
503 
504 	if (als->als_vmax > LM3532_ALS_WINDOW_mV) {
505 		ret = -EINVAL;
506 		return ret;
507 	}
508 
509 	ret = device_property_read_u32(&priv->client->dev, "ti,als1-imp-sel",
510 				      &als_impedance);
511 	if (ret)
512 		als->als1_imp_sel = 0;
513 	else
514 		als->als1_imp_sel = lm3532_get_als_imp_index(als_impedance);
515 
516 	ret = device_property_read_u32(&priv->client->dev, "ti,als2-imp-sel",
517 				      &als_impedance);
518 	if (ret)
519 		als->als2_imp_sel = 0;
520 	else
521 		als->als2_imp_sel = lm3532_get_als_imp_index(als_impedance);
522 
523 	ret = device_property_read_u32(&priv->client->dev, "ti,als-avrg-time-us",
524 				      &als_avg_time);
525 	if (ret)
526 		als->als_avrg_time = 0;
527 	else
528 		als->als_avrg_time = lm3532_get_als_avg_index(als_avg_time);
529 
530 	ret = device_property_read_u8(&priv->client->dev, "ti,als-input-mode",
531 				      &als->als_input_mode);
532 	if (ret)
533 		als->als_input_mode = 0;
534 
535 	if (als->als_input_mode > LM3532_BL_MODE_ALS) {
536 		ret = -EINVAL;
537 		return ret;
538 	}
539 
540 	priv->als_data = als;
541 
542 	return ret;
543 }
544 
545 static void gpio_set_low_action(void *data)
546 {
547 	struct lm3532_data *priv = data;
548 
549 	gpiod_direction_output(priv->enable_gpio, 0);
550 }
551 
552 static int lm3532_parse_node(struct lm3532_data *priv)
553 {
554 	struct lm3532_led *led;
555 	int control_bank;
556 	u32 ramp_time;
557 	size_t i = 0;
558 	int ret;
559 
560 	priv->enable_gpio = devm_gpiod_get_optional(&priv->client->dev,
561 						   "enable", GPIOD_OUT_LOW);
562 	if (IS_ERR(priv->enable_gpio))
563 		priv->enable_gpio = NULL;
564 
565 	if (priv->enable_gpio) {
566 		ret = devm_add_action(&priv->client->dev, gpio_set_low_action, priv);
567 		if (ret)
568 			return ret;
569 	}
570 
571 	priv->regulator = devm_regulator_get(&priv->client->dev, "vin");
572 	if (IS_ERR(priv->regulator))
573 		priv->regulator = NULL;
574 
575 	ret = device_property_read_u32(&priv->client->dev, "ramp-up-us",
576 				       &ramp_time);
577 	if (ret)
578 		dev_info(&priv->client->dev, "ramp-up-ms property missing\n");
579 	else
580 		priv->runtime_ramp_up = lm3532_get_ramp_index(ramp_time);
581 
582 	ret = device_property_read_u32(&priv->client->dev, "ramp-down-us",
583 				       &ramp_time);
584 	if (ret)
585 		dev_info(&priv->client->dev, "ramp-down-ms property missing\n");
586 	else
587 		priv->runtime_ramp_down = lm3532_get_ramp_index(ramp_time);
588 
589 	device_for_each_child_node_scoped(priv->dev, child) {
590 		struct led_init_data idata = {
591 			.fwnode = child,
592 			.default_label = ":",
593 			.devicename = priv->client->name,
594 		};
595 
596 		led = &priv->leds[i];
597 
598 		ret = fwnode_property_read_u32(child, "reg", &control_bank);
599 		if (ret) {
600 			dev_err(&priv->client->dev, "reg property missing\n");
601 			return ret;
602 		}
603 
604 		if (control_bank > LM3532_CONTROL_C) {
605 			dev_err(&priv->client->dev, "Control bank invalid\n");
606 			continue;
607 		}
608 
609 		led->control_bank = control_bank;
610 
611 		ret = fwnode_property_read_u32(child, "ti,led-mode",
612 					       &led->mode);
613 		if (ret) {
614 			dev_err(&priv->client->dev, "ti,led-mode property missing\n");
615 			return ret;
616 		}
617 
618 		if (fwnode_property_present(child, "led-max-microamp") &&
619 		    fwnode_property_read_u32(child, "led-max-microamp",
620 					     &led->full_scale_current))
621 			dev_err(&priv->client->dev,
622 				"Failed getting led-max-microamp\n");
623 		else
624 			led->full_scale_current = min(led->full_scale_current,
625 						      LM3532_FS_CURR_MAX);
626 
627 		if (led->mode == LM3532_BL_MODE_ALS) {
628 			led->mode = LM3532_ALS_CTRL;
629 			ret = lm3532_parse_als(priv);
630 			if (ret)
631 				dev_err(&priv->client->dev, "Failed to parse als\n");
632 			else
633 				lm3532_als_configure(priv, led);
634 		} else {
635 			led->mode = LM3532_I2C_CTRL;
636 		}
637 
638 		led->num_leds = fwnode_property_count_u32(child, "led-sources");
639 		if (led->num_leds > LM3532_MAX_LED_STRINGS) {
640 			dev_err(&priv->client->dev, "Too many LED string defined\n");
641 			continue;
642 		}
643 
644 		ret = fwnode_property_read_u32_array(child, "led-sources",
645 						    led->led_strings,
646 						    led->num_leds);
647 		if (ret) {
648 			dev_err(&priv->client->dev, "led-sources property missing\n");
649 			return ret;
650 		}
651 
652 		led->priv = priv;
653 		led->led_dev.brightness_set_blocking = lm3532_brightness_set;
654 
655 		ret = devm_led_classdev_register_ext(priv->dev, &led->led_dev, &idata);
656 		if (ret) {
657 			dev_err(&priv->client->dev, "led register err: %d\n",
658 				ret);
659 			return ret;
660 		}
661 
662 		ret = lm3532_init_registers(led);
663 		if (ret) {
664 			dev_err(&priv->client->dev, "register init err: %d\n",
665 				ret);
666 			return ret;
667 		}
668 
669 		i++;
670 	}
671 
672 	return 0;
673 }
674 
675 static int lm3532_probe(struct i2c_client *client)
676 {
677 	struct lm3532_data *drvdata;
678 	int ret = 0;
679 	int count;
680 
681 	count = device_get_child_node_count(&client->dev);
682 	if (!count) {
683 		dev_err(&client->dev, "LEDs are not defined in device tree!");
684 		return -ENODEV;
685 	}
686 
687 	drvdata = devm_kzalloc(&client->dev, struct_size(drvdata, leds, count),
688 			   GFP_KERNEL);
689 	if (drvdata == NULL)
690 		return -ENOMEM;
691 
692 	drvdata->client = client;
693 	drvdata->dev = &client->dev;
694 
695 	drvdata->regmap = devm_regmap_init_i2c(client, &lm3532_regmap_config);
696 	if (IS_ERR(drvdata->regmap)) {
697 		ret = PTR_ERR(drvdata->regmap);
698 		dev_err(&client->dev, "Failed to allocate register map: %d\n",
699 			ret);
700 		return ret;
701 	}
702 
703 	ret = devm_mutex_init(&client->dev, &drvdata->lock);
704 	if (ret)
705 		return ret;
706 
707 	i2c_set_clientdata(client, drvdata);
708 
709 	ret = lm3532_parse_node(drvdata);
710 	if (ret) {
711 		dev_err(&client->dev, "Failed to parse node\n");
712 		return ret;
713 	}
714 
715 	return ret;
716 }
717 
718 static const struct of_device_id of_lm3532_leds_match[] = {
719 	{ .compatible = "ti,lm3532", },
720 	{},
721 };
722 MODULE_DEVICE_TABLE(of, of_lm3532_leds_match);
723 
724 static const struct i2c_device_id lm3532_id[] = {
725 	{ LM3532_NAME },
726 	{}
727 };
728 MODULE_DEVICE_TABLE(i2c, lm3532_id);
729 
730 static struct i2c_driver lm3532_i2c_driver = {
731 	.probe = lm3532_probe,
732 	.id_table = lm3532_id,
733 	.driver = {
734 		.name = LM3532_NAME,
735 		.of_match_table = of_lm3532_leds_match,
736 	},
737 };
738 module_i2c_driver(lm3532_i2c_driver);
739 
740 MODULE_DESCRIPTION("Back Light driver for LM3532");
741 MODULE_LICENSE("GPL v2");
742 MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");
743