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