fix noaddr, connect and listen
[cor.git] / drivers / leds / leds-lm3532.c
blob0507c6575c0896853b47ba735c2fef332141b600
1 // SPDX-License-Identifier: GPL-2.0
2 // TI LM3532 LED driver
3 // Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
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>
15 #define LM3532_NAME "lm3532-led"
16 #define LM3532_BL_MODE_MANUAL 0x00
17 #define LM3532_BL_MODE_ALS 0x01
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
46 /* Control Enable */
47 #define LM3532_CTRL_A_ENABLE BIT(0)
48 #define LM3532_CTRL_B_ENABLE BIT(1)
49 #define LM3532_CTRL_C_ENABLE BIT(2)
51 /* PWM Zone Control */
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)
59 /* Brightness Configuration */
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)
70 #define LM3532_ENABLE_ALS BIT(3)
71 #define LM3532_ALS_SEL_SHIFT 6
73 /* Zone Boundary Register */
74 #define LM3532_ALS_WINDOW_mV 2000
75 #define LM3532_ALS_ZB_MAX 4
76 #define LM3532_ALS_OFFSET_mV 2
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
84 #define LM3532_OUTPUT_CFG_MASK 0x3
85 #define LM3532_BRT_VAL_ADJUST 8
86 #define LM3532_RAMP_DOWN_SHIFT 3
88 #define LM3532_NUM_RAMP_VALS 8
89 #define LM3532_NUM_AVG_VALS 8
90 #define LM3532_NUM_IMP_VALS 32
92 #define LM3532_FS_CURR_MIN 5000
93 #define LM3532_FS_CURR_MAX 29800
94 #define LM3532_FS_CURR_STEP 800
97 * struct lm3532_als_data
98 * @config - value of ALS configuration register
99 * @als1_imp_sel - value of ALS1 resistor select register
100 * @als2_imp_sel - value of ALS2 resistor select register
101 * @als_avrg_time - ALS averaging time
102 * @als_input_mode - ALS input mode for brightness control
103 * @als_vmin - Minimum ALS voltage
104 * @als_vmax - Maximum ALS voltage
105 * @zone_lo - values of ALS lo ZB(Zone Boundary) registers
106 * @zone_hi - values of ALS hi ZB(Zone Boundary) registers
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];
121 * struct lm3532_led
122 * @led_dev: led class device
123 * @priv - Pointer the device data structure
124 * @control_bank - Control bank the LED is associated to
125 * @mode - Mode of the LED string
126 * @ctrl_brt_pointer - Zone target register that controls the sink
127 * @num_leds - Number of LED strings are supported in this array
128 * @full_scale_current - The full-scale current setting for the current sink.
129 * @led_strings - The LED strings supported in this array
130 * @enabled - Enabled status
131 * @label - LED label
133 struct lm3532_led {
134 struct led_classdev led_dev;
135 struct lm3532_data *priv;
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];
148 * struct lm3532_data
149 * @enable_gpio - Hardware enable gpio
150 * @regulator: regulator
151 * @client: i2c client
152 * @regmap - Devices register map
153 * @dev - Pointer to the devices device struct
154 * @lock - Lock for reading/writing the device
155 * @als_data - Pointer to the als data struct
156 * @runtime_ramp_up - Runtime ramp up setting
157 * @runtime_ramp_down - Runtime ramp down setting
158 * @leds - Array of LED strings
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;
168 struct lm3532_als_data *als_data;
170 u32 runtime_ramp_up;
171 u32 runtime_ramp_down;
173 struct lm3532_led leds[];
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},
201 static const struct regmap_config lm3532_regmap_config = {
202 .reg_bits = 8,
203 .val_bits = 8,
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,
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)
221 int i;
223 if (als_imped > als_imp_table[1])
224 return 0;
226 if (als_imped < als_imp_table[LM3532_NUM_IMP_VALS - 1])
227 return LM3532_NUM_IMP_VALS - 1;
229 for (i = 1; i < LM3532_NUM_IMP_VALS; i++) {
230 if (als_imped == als_imp_table[i])
231 return i;
233 /* Find an approximate index by looking up the table */
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;
244 return -EINVAL;
247 static int lm3532_get_index(const int table[], int size, int value)
249 int i;
251 for (i = 1; i < size; i++) {
252 if (value == table[i])
253 return i;
255 /* Find an approximate index by looking up the table */
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;
265 return -EINVAL;
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)
273 if (avg_time <= als_avrg_table[0])
274 return 0;
276 if (avg_time > als_avrg_table[LM3532_NUM_AVG_VALS - 1])
277 return LM3532_NUM_AVG_VALS - 1;
279 return lm3532_get_index(&als_avrg_table[0], LM3532_NUM_AVG_VALS,
280 avg_time);
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)
287 if (ramp_time <= ramp_table[0])
288 return 0;
290 if (ramp_time > ramp_table[LM3532_NUM_RAMP_VALS - 1])
291 return LM3532_NUM_RAMP_VALS - 1;
293 return lm3532_get_index(&ramp_table[0], LM3532_NUM_RAMP_VALS,
294 ramp_time);
297 /* Caller must take care of locking */
298 static int lm3532_led_enable(struct lm3532_led *led_data)
300 int ctrl_en_val = BIT(led_data->control_bank);
301 int ret;
303 if (led_data->enabled)
304 return 0;
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;
313 ret = regulator_enable(led_data->priv->regulator);
314 if (ret < 0)
315 return ret;
317 led_data->enabled = 1;
319 return 0;
322 /* Caller must take care of locking */
323 static int lm3532_led_disable(struct lm3532_led *led_data)
325 int ctrl_en_val = BIT(led_data->control_bank);
326 int ret;
328 if (!led_data->enabled)
329 return 0;
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;
338 ret = regulator_disable(led_data->priv->regulator);
339 if (ret < 0)
340 return ret;
342 led_data->enabled = 0;
344 return 0;
347 static int lm3532_brightness_set(struct led_classdev *led_cdev,
348 enum led_brightness brt_val)
350 struct lm3532_led *led =
351 container_of(led_cdev, struct lm3532_led, led_dev);
352 u8 brightness_reg;
353 int ret;
355 mutex_lock(&led->priv->lock);
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);
363 goto unlock;
366 if (brt_val == LED_OFF) {
367 ret = lm3532_led_disable(led);
368 goto unlock;
371 ret = lm3532_led_enable(led);
372 if (ret)
373 goto unlock;
375 brightness_reg = LM3532_REG_ZONE_TRGT_A + led->control_bank * 5 +
376 (led->ctrl_brt_pointer >> 2);
378 ret = regmap_write(led->priv->regmap, brightness_reg, brt_val);
380 unlock:
381 mutex_unlock(&led->priv->lock);
382 return ret;
385 static int lm3532_init_registers(struct lm3532_led *led)
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;
398 if (drvdata->enable_gpio)
399 gpiod_direction_output(drvdata->enable_gpio, 1);
401 brightness_config_reg = LM3532_REG_ZONE_CFG_A + led->control_bank * 2;
403 * This could be hard coded to the default value but the control
404 * brightness register may have changed during boot.
406 ret = regmap_read(drvdata->regmap, brightness_config_reg,
407 &led->ctrl_brt_pointer);
408 if (ret)
409 return ret;
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;
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;
423 ret = regmap_write(drvdata->regmap, fs_current_reg,
424 fs_current_val);
425 if (ret)
426 return ret;
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;
435 ret = regmap_update_bits(drvdata->regmap, LM3532_REG_OUTPUT_CFG,
436 output_cfg_mask, output_cfg_val);
437 if (ret)
438 return ret;
440 runtime_ramp_val = drvdata->runtime_ramp_up |
441 (drvdata->runtime_ramp_down << LM3532_RAMP_DOWN_SHIFT);
443 return regmap_write(drvdata->regmap, LM3532_REG_RT_RAMP,
444 runtime_ramp_val);
447 static int lm3532_als_configure(struct lm3532_data *priv,
448 struct lm3532_led *led)
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;
456 als_vmin = als->als_vmin;
457 als_vmax = als->als_vmax;
459 als_vstep = (als_vmax - als_vmin) / ((LM3532_ALS_ZB_MAX + 1) * 2);
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;
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;
472 zone_reg += 1;
473 ret = regmap_write(priv->regmap, zone_reg, als->zones_hi[i]);
474 if (ret)
475 return ret;
478 als->config = (als->als_avrg_time | (LM3532_ENABLE_ALS) |
479 (als->als_input_mode << LM3532_ALS_SEL_SHIFT));
481 return regmap_write(priv->regmap, LM3532_ALS_CONFIG, als->config);
484 static int lm3532_parse_als(struct lm3532_data *priv)
486 struct lm3532_als_data *als;
487 int als_avg_time;
488 int als_impedance;
489 int ret;
491 als = devm_kzalloc(priv->dev, sizeof(*als), GFP_KERNEL);
492 if (als == NULL)
493 return -ENOMEM;
495 ret = device_property_read_u32(&priv->client->dev, "ti,als-vmin",
496 &als->als_vmin);
497 if (ret)
498 als->als_vmin = 0;
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;
505 if (als->als_vmax > LM3532_ALS_WINDOW_mV) {
506 ret = -EINVAL;
507 return ret;
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);
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);
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);
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;
536 if (als->als_input_mode > LM3532_BL_MODE_ALS) {
537 ret = -EINVAL;
538 return ret;
541 priv->als_data = als;
543 return ret;
546 static int lm3532_parse_node(struct lm3532_data *priv)
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;
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;
561 priv->regulator = devm_regulator_get(&priv->client->dev, "vin");
562 if (IS_ERR(priv->regulator))
563 priv->regulator = NULL;
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);
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);
579 device_for_each_child_node(priv->dev, child) {
580 led = &priv->leds[i];
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;
589 if (control_bank > LM3532_CONTROL_C) {
590 dev_err(&priv->client->dev, "Control bank invalid\n");
591 continue;
594 led->control_bank = control_bank;
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;
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);
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;
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;
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;
639 fwnode_property_read_string(child, "linux,default-trigger",
640 &led->led_dev.default_trigger);
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);
650 led->priv = priv;
651 led->led_dev.name = led->label;
652 led->led_dev.brightness_set_blocking = lm3532_brightness_set;
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;
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;
670 i++;
673 child_out:
674 return ret;
677 static int lm3532_probe(struct i2c_client *client,
678 const struct i2c_device_id *id)
680 struct lm3532_data *drvdata;
681 int ret = 0;
682 int count;
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;
690 drvdata = devm_kzalloc(&client->dev, struct_size(drvdata, leds, count),
691 GFP_KERNEL);
692 if (drvdata == NULL)
693 return -ENOMEM;
695 drvdata->client = client;
696 drvdata->dev = &client->dev;
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;
706 mutex_init(&drvdata->lock);
707 i2c_set_clientdata(client, drvdata);
709 ret = lm3532_parse_node(drvdata);
710 if (ret) {
711 dev_err(&client->dev, "Failed to parse node\n");
712 return ret;
715 return ret;
718 static int lm3532_remove(struct i2c_client *client)
720 struct lm3532_data *drvdata = i2c_get_clientdata(client);
722 mutex_destroy(&drvdata->lock);
724 if (drvdata->enable_gpio)
725 gpiod_direction_output(drvdata->enable_gpio, 0);
727 return 0;
730 static const struct of_device_id of_lm3532_leds_match[] = {
731 { .compatible = "ti,lm3532", },
734 MODULE_DEVICE_TABLE(of, of_lm3532_leds_match);
736 static const struct i2c_device_id lm3532_id[] = {
737 {LM3532_NAME, 0},
740 MODULE_DEVICE_TABLE(i2c, lm3532_id);
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,
751 module_i2c_driver(lm3532_i2c_driver);
753 MODULE_DESCRIPTION("Back Light driver for LM3532");
754 MODULE_LICENSE("GPL v2");
755 MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");