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