]> Git Repo - J-linux.git/blob - drivers/leds/leds-lm3532.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.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 - 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 <[email protected]>");
This page took 0.071032 seconds and 4 git commands to generate.