xref: /openbmc/linux/drivers/leds/rgb/leds-qcom-lpg.c (revision 26b32974)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2017-2022 Linaro Ltd
4  * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
5  * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
6  */
7 #include <linux/bits.h>
8 #include <linux/bitfield.h>
9 #include <linux/led-class-multicolor.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/of_device.h>
13 #include <linux/platform_device.h>
14 #include <linux/pwm.h>
15 #include <linux/regmap.h>
16 #include <linux/slab.h>
17 
18 #define LPG_SUBTYPE_REG		0x05
19 #define  LPG_SUBTYPE_LPG	0x2
20 #define  LPG_SUBTYPE_PWM	0xb
21 #define  LPG_SUBTYPE_HI_RES_PWM	0xc
22 #define  LPG_SUBTYPE_LPG_LITE	0x11
23 #define LPG_PATTERN_CONFIG_REG	0x40
24 #define LPG_SIZE_CLK_REG	0x41
25 #define  PWM_CLK_SELECT_MASK	GENMASK(1, 0)
26 #define  PWM_CLK_SELECT_HI_RES_MASK	GENMASK(2, 0)
27 #define  PWM_SIZE_HI_RES_MASK	GENMASK(6, 4)
28 #define LPG_PREDIV_CLK_REG	0x42
29 #define  PWM_FREQ_PRE_DIV_MASK	GENMASK(6, 5)
30 #define  PWM_FREQ_EXP_MASK	GENMASK(2, 0)
31 #define PWM_TYPE_CONFIG_REG	0x43
32 #define PWM_VALUE_REG		0x44
33 #define PWM_ENABLE_CONTROL_REG	0x46
34 #define PWM_SYNC_REG		0x47
35 #define LPG_RAMP_DURATION_REG	0x50
36 #define LPG_HI_PAUSE_REG	0x52
37 #define LPG_LO_PAUSE_REG	0x54
38 #define LPG_HI_IDX_REG		0x56
39 #define LPG_LO_IDX_REG		0x57
40 #define PWM_SEC_ACCESS_REG	0xd0
41 #define PWM_DTEST_REG(x)	(0xe2 + (x) - 1)
42 
43 #define TRI_LED_SRC_SEL		0x45
44 #define TRI_LED_EN_CTL		0x46
45 #define TRI_LED_ATC_CTL		0x47
46 
47 #define LPG_LUT_REG(x)		(0x40 + (x) * 2)
48 #define RAMP_CONTROL_REG	0xc8
49 
50 #define LPG_RESOLUTION_9BIT	BIT(9)
51 #define LPG_RESOLUTION_15BIT	BIT(15)
52 #define LPG_MAX_M		7
53 #define LPG_MAX_PREDIV		6
54 
55 struct lpg_channel;
56 struct lpg_data;
57 
58 /**
59  * struct lpg - LPG device context
60  * @dev:	pointer to LPG device
61  * @map:	regmap for register access
62  * @lock:	used to synchronize LED and pwm callback requests
63  * @pwm:	PWM-chip object, if operating in PWM mode
64  * @data:	reference to version specific data
65  * @lut_base:	base address of the LUT block (optional)
66  * @lut_size:	number of entries in the LUT block
67  * @lut_bitmap:	allocation bitmap for LUT entries
68  * @triled_base: base address of the TRILED block (optional)
69  * @triled_src:	power-source for the TRILED
70  * @triled_has_atc_ctl:	true if there is TRI_LED_ATC_CTL register
71  * @triled_has_src_sel:	true if there is TRI_LED_SRC_SEL register
72  * @channels:	list of PWM channels
73  * @num_channels: number of @channels
74  */
75 struct lpg {
76 	struct device *dev;
77 	struct regmap *map;
78 
79 	struct mutex lock;
80 
81 	struct pwm_chip pwm;
82 
83 	const struct lpg_data *data;
84 
85 	u32 lut_base;
86 	u32 lut_size;
87 	unsigned long *lut_bitmap;
88 
89 	u32 triled_base;
90 	u32 triled_src;
91 	bool triled_has_atc_ctl;
92 	bool triled_has_src_sel;
93 
94 	struct lpg_channel *channels;
95 	unsigned int num_channels;
96 };
97 
98 /**
99  * struct lpg_channel - per channel data
100  * @lpg:	reference to parent lpg
101  * @base:	base address of the PWM channel
102  * @triled_mask: mask in TRILED to enable this channel
103  * @lut_mask:	mask in LUT to start pattern generator for this channel
104  * @subtype:	PMIC hardware block subtype
105  * @in_use:	channel is exposed to LED framework
106  * @color:	color of the LED attached to this channel
107  * @dtest_line:	DTEST line for output, or 0 if disabled
108  * @dtest_value: DTEST line configuration
109  * @pwm_value:	duty (in microseconds) of the generated pulses, overridden by LUT
110  * @enabled:	output enabled?
111  * @period:	period (in nanoseconds) of the generated pulses
112  * @clk_sel:	reference clock frequency selector
113  * @pre_div_sel: divider selector of the reference clock
114  * @pre_div_exp: exponential divider of the reference clock
115  * @pwm_resolution_sel:	pwm resolution selector
116  * @ramp_enabled: duty cycle is driven by iterating over lookup table
117  * @ramp_ping_pong: reverse through pattern, rather than wrapping to start
118  * @ramp_oneshot: perform only a single pass over the pattern
119  * @ramp_reverse: iterate over pattern backwards
120  * @ramp_tick_ms: length (in milliseconds) of one step in the pattern
121  * @ramp_lo_pause_ms: pause (in milliseconds) before iterating over pattern
122  * @ramp_hi_pause_ms: pause (in milliseconds) after iterating over pattern
123  * @pattern_lo_idx: start index of associated pattern
124  * @pattern_hi_idx: last index of associated pattern
125  */
126 struct lpg_channel {
127 	struct lpg *lpg;
128 
129 	u32 base;
130 	unsigned int triled_mask;
131 	unsigned int lut_mask;
132 	unsigned int subtype;
133 
134 	bool in_use;
135 
136 	int color;
137 
138 	u32 dtest_line;
139 	u32 dtest_value;
140 
141 	u16 pwm_value;
142 	bool enabled;
143 
144 	u64 period;
145 	unsigned int clk_sel;
146 	unsigned int pre_div_sel;
147 	unsigned int pre_div_exp;
148 	unsigned int pwm_resolution_sel;
149 
150 	bool ramp_enabled;
151 	bool ramp_ping_pong;
152 	bool ramp_oneshot;
153 	bool ramp_reverse;
154 	unsigned short ramp_tick_ms;
155 	unsigned long ramp_lo_pause_ms;
156 	unsigned long ramp_hi_pause_ms;
157 
158 	unsigned int pattern_lo_idx;
159 	unsigned int pattern_hi_idx;
160 };
161 
162 /**
163  * struct lpg_led - logical LED object
164  * @lpg:		lpg context reference
165  * @cdev:		LED class device
166  * @mcdev:		Multicolor LED class device
167  * @num_channels:	number of @channels
168  * @channels:		list of channels associated with the LED
169  */
170 struct lpg_led {
171 	struct lpg *lpg;
172 
173 	struct led_classdev cdev;
174 	struct led_classdev_mc mcdev;
175 
176 	unsigned int num_channels;
177 	struct lpg_channel *channels[];
178 };
179 
180 /**
181  * struct lpg_channel_data - per channel initialization data
182  * @base:		base address for PWM channel registers
183  * @triled_mask:	bitmask for controlling this channel in TRILED
184  */
185 struct lpg_channel_data {
186 	unsigned int base;
187 	u8 triled_mask;
188 };
189 
190 /**
191  * struct lpg_data - initialization data
192  * @lut_base:		base address of LUT block
193  * @lut_size:		number of entries in LUT
194  * @triled_base:	base address of TRILED
195  * @triled_has_atc_ctl:	true if there is TRI_LED_ATC_CTL register
196  * @triled_has_src_sel:	true if there is TRI_LED_SRC_SEL register
197  * @num_channels:	number of channels in LPG
198  * @channels:		list of channel initialization data
199  */
200 struct lpg_data {
201 	unsigned int lut_base;
202 	unsigned int lut_size;
203 	unsigned int triled_base;
204 	bool triled_has_atc_ctl;
205 	bool triled_has_src_sel;
206 	int num_channels;
207 	const struct lpg_channel_data *channels;
208 };
209 
210 static int triled_set(struct lpg *lpg, unsigned int mask, unsigned int enable)
211 {
212 	/* Skip if we don't have a triled block */
213 	if (!lpg->triled_base)
214 		return 0;
215 
216 	return regmap_update_bits(lpg->map, lpg->triled_base + TRI_LED_EN_CTL,
217 				  mask, enable);
218 }
219 
220 static int lpg_lut_store(struct lpg *lpg, struct led_pattern *pattern,
221 			 size_t len, unsigned int *lo_idx, unsigned int *hi_idx)
222 {
223 	unsigned int idx;
224 	u16 val;
225 	int i;
226 
227 	idx = bitmap_find_next_zero_area(lpg->lut_bitmap, lpg->lut_size,
228 					 0, len, 0);
229 	if (idx >= lpg->lut_size)
230 		return -ENOMEM;
231 
232 	for (i = 0; i < len; i++) {
233 		val = pattern[i].brightness;
234 
235 		regmap_bulk_write(lpg->map, lpg->lut_base + LPG_LUT_REG(idx + i),
236 				  &val, sizeof(val));
237 	}
238 
239 	bitmap_set(lpg->lut_bitmap, idx, len);
240 
241 	*lo_idx = idx;
242 	*hi_idx = idx + len - 1;
243 
244 	return 0;
245 }
246 
247 static void lpg_lut_free(struct lpg *lpg, unsigned int lo_idx, unsigned int hi_idx)
248 {
249 	int len;
250 
251 	len = hi_idx - lo_idx + 1;
252 	if (len == 1)
253 		return;
254 
255 	bitmap_clear(lpg->lut_bitmap, lo_idx, len);
256 }
257 
258 static int lpg_lut_sync(struct lpg *lpg, unsigned int mask)
259 {
260 	return regmap_write(lpg->map, lpg->lut_base + RAMP_CONTROL_REG, mask);
261 }
262 
263 static const unsigned int lpg_clk_rates[] = {0, 1024, 32768, 19200000};
264 static const unsigned int lpg_clk_rates_hi_res[] = {0, 1024, 32768, 19200000, 76800000};
265 static const unsigned int lpg_pre_divs[] = {1, 3, 5, 6};
266 static const unsigned int lpg_pwm_resolution[] =  {9};
267 static const unsigned int lpg_pwm_resolution_hi_res[] =  {8, 9, 10, 11, 12, 13, 14, 15};
268 
269 static int lpg_calc_freq(struct lpg_channel *chan, uint64_t period)
270 {
271 	unsigned int i, pwm_resolution_count, best_pwm_resolution_sel = 0;
272 	const unsigned int *clk_rate_arr, *pwm_resolution_arr;
273 	unsigned int clk_sel, clk_len, best_clk = 0;
274 	unsigned int div, best_div = 0;
275 	unsigned int m, best_m = 0;
276 	unsigned int resolution;
277 	unsigned int error;
278 	unsigned int best_err = UINT_MAX;
279 	u64 max_period, min_period;
280 	u64 best_period = 0;
281 	u64 max_res;
282 
283 	/*
284 	 * The PWM period is determined by:
285 	 *
286 	 *          resolution * pre_div * 2^M
287 	 * period = --------------------------
288 	 *                   refclk
289 	 *
290 	 * Resolution = 2^9 bits for PWM or
291 	 *              2^{8, 9, 10, 11, 12, 13, 14, 15} bits for high resolution PWM
292 	 * pre_div = {1, 3, 5, 6} and
293 	 * M = [0..7].
294 	 *
295 	 * This allows for periods between 27uS and 384s for PWM channels and periods between
296 	 * 3uS and 24576s for high resolution PWMs.
297 	 * The PWM framework wants a period of equal or lower length than requested,
298 	 * reject anything below minimum period.
299 	 */
300 
301 	if (chan->subtype == LPG_SUBTYPE_HI_RES_PWM) {
302 		clk_rate_arr = lpg_clk_rates_hi_res;
303 		clk_len = ARRAY_SIZE(lpg_clk_rates_hi_res);
304 		pwm_resolution_arr = lpg_pwm_resolution_hi_res;
305 		pwm_resolution_count = ARRAY_SIZE(lpg_pwm_resolution_hi_res);
306 		max_res = LPG_RESOLUTION_15BIT;
307 	} else {
308 		clk_rate_arr = lpg_clk_rates;
309 		clk_len = ARRAY_SIZE(lpg_clk_rates);
310 		pwm_resolution_arr = lpg_pwm_resolution;
311 		pwm_resolution_count = ARRAY_SIZE(lpg_pwm_resolution);
312 		max_res = LPG_RESOLUTION_9BIT;
313 	}
314 
315 	min_period = div64_u64((u64)NSEC_PER_SEC * (1 << pwm_resolution_arr[0]),
316 			       clk_rate_arr[clk_len - 1]);
317 	if (period <= min_period)
318 		return -EINVAL;
319 
320 	/* Limit period to largest possible value, to avoid overflows */
321 	max_period = div64_u64((u64)NSEC_PER_SEC * max_res * LPG_MAX_PREDIV * (1 << LPG_MAX_M),
322 			       1024);
323 	if (period > max_period)
324 		period = max_period;
325 
326 	/*
327 	 * Search for the pre_div, refclk, resolution and M by solving the rewritten formula
328 	 * for each refclk, resolution and pre_div value:
329 	 *
330 	 *                     period * refclk
331 	 * M = log2 -------------------------------------
332 	 *           NSEC_PER_SEC * pre_div * resolution
333 	 */
334 
335 	for (i = 0; i < pwm_resolution_count; i++) {
336 		resolution = 1 << pwm_resolution_arr[i];
337 		for (clk_sel = 1; clk_sel < clk_len; clk_sel++) {
338 			u64 numerator = period * clk_rate_arr[clk_sel];
339 
340 			for (div = 0; div < ARRAY_SIZE(lpg_pre_divs); div++) {
341 				u64 denominator = (u64)NSEC_PER_SEC * lpg_pre_divs[div] *
342 						  resolution;
343 				u64 actual;
344 				u64 ratio;
345 
346 				if (numerator < denominator)
347 					continue;
348 
349 				ratio = div64_u64(numerator, denominator);
350 				m = ilog2(ratio);
351 				if (m > LPG_MAX_M)
352 					m = LPG_MAX_M;
353 
354 				actual = DIV_ROUND_UP_ULL(denominator * (1 << m),
355 							  clk_rate_arr[clk_sel]);
356 				error = period - actual;
357 				if (error < best_err) {
358 					best_err = error;
359 					best_div = div;
360 					best_m = m;
361 					best_clk = clk_sel;
362 					best_period = actual;
363 					best_pwm_resolution_sel = i;
364 				}
365 			}
366 		}
367 	}
368 	chan->clk_sel = best_clk;
369 	chan->pre_div_sel = best_div;
370 	chan->pre_div_exp = best_m;
371 	chan->period = best_period;
372 	chan->pwm_resolution_sel = best_pwm_resolution_sel;
373 	return 0;
374 }
375 
376 static void lpg_calc_duty(struct lpg_channel *chan, uint64_t duty)
377 {
378 	unsigned int max;
379 	unsigned int val;
380 	unsigned int clk_rate;
381 
382 	if (chan->subtype == LPG_SUBTYPE_HI_RES_PWM) {
383 		max = LPG_RESOLUTION_15BIT - 1;
384 		clk_rate = lpg_clk_rates_hi_res[chan->clk_sel];
385 	} else {
386 		max = LPG_RESOLUTION_9BIT - 1;
387 		clk_rate = lpg_clk_rates[chan->clk_sel];
388 	}
389 
390 	val = div64_u64(duty * clk_rate,
391 			(u64)NSEC_PER_SEC * lpg_pre_divs[chan->pre_div_sel] * (1 << chan->pre_div_exp));
392 
393 	chan->pwm_value = min(val, max);
394 }
395 
396 static void lpg_apply_freq(struct lpg_channel *chan)
397 {
398 	unsigned long val;
399 	struct lpg *lpg = chan->lpg;
400 
401 	if (!chan->enabled)
402 		return;
403 
404 	val = chan->clk_sel;
405 
406 	/* Specify resolution, based on the subtype of the channel */
407 	switch (chan->subtype) {
408 	case LPG_SUBTYPE_LPG:
409 		val |= GENMASK(5, 4);
410 		break;
411 	case LPG_SUBTYPE_PWM:
412 		val |= BIT(2);
413 		break;
414 	case LPG_SUBTYPE_HI_RES_PWM:
415 		val |= FIELD_PREP(PWM_SIZE_HI_RES_MASK, chan->pwm_resolution_sel);
416 		break;
417 	case LPG_SUBTYPE_LPG_LITE:
418 	default:
419 		val |= BIT(4);
420 		break;
421 	}
422 
423 	regmap_write(lpg->map, chan->base + LPG_SIZE_CLK_REG, val);
424 
425 	val = FIELD_PREP(PWM_FREQ_PRE_DIV_MASK, chan->pre_div_sel) |
426 	      FIELD_PREP(PWM_FREQ_EXP_MASK, chan->pre_div_exp);
427 	regmap_write(lpg->map, chan->base + LPG_PREDIV_CLK_REG, val);
428 }
429 
430 #define LPG_ENABLE_GLITCH_REMOVAL	BIT(5)
431 
432 static void lpg_enable_glitch(struct lpg_channel *chan)
433 {
434 	struct lpg *lpg = chan->lpg;
435 
436 	regmap_update_bits(lpg->map, chan->base + PWM_TYPE_CONFIG_REG,
437 			   LPG_ENABLE_GLITCH_REMOVAL, 0);
438 }
439 
440 static void lpg_disable_glitch(struct lpg_channel *chan)
441 {
442 	struct lpg *lpg = chan->lpg;
443 
444 	regmap_update_bits(lpg->map, chan->base + PWM_TYPE_CONFIG_REG,
445 			   LPG_ENABLE_GLITCH_REMOVAL,
446 			   LPG_ENABLE_GLITCH_REMOVAL);
447 }
448 
449 static void lpg_apply_pwm_value(struct lpg_channel *chan)
450 {
451 	struct lpg *lpg = chan->lpg;
452 	u16 val = chan->pwm_value;
453 
454 	if (!chan->enabled)
455 		return;
456 
457 	regmap_bulk_write(lpg->map, chan->base + PWM_VALUE_REG, &val, sizeof(val));
458 }
459 
460 #define LPG_PATTERN_CONFIG_LO_TO_HI	BIT(4)
461 #define LPG_PATTERN_CONFIG_REPEAT	BIT(3)
462 #define LPG_PATTERN_CONFIG_TOGGLE	BIT(2)
463 #define LPG_PATTERN_CONFIG_PAUSE_HI	BIT(1)
464 #define LPG_PATTERN_CONFIG_PAUSE_LO	BIT(0)
465 
466 static void lpg_apply_lut_control(struct lpg_channel *chan)
467 {
468 	struct lpg *lpg = chan->lpg;
469 	unsigned int hi_pause;
470 	unsigned int lo_pause;
471 	unsigned int conf = 0;
472 	unsigned int lo_idx = chan->pattern_lo_idx;
473 	unsigned int hi_idx = chan->pattern_hi_idx;
474 	u16 step = chan->ramp_tick_ms;
475 
476 	if (!chan->ramp_enabled || chan->pattern_lo_idx == chan->pattern_hi_idx)
477 		return;
478 
479 	hi_pause = DIV_ROUND_UP(chan->ramp_hi_pause_ms, step);
480 	lo_pause = DIV_ROUND_UP(chan->ramp_lo_pause_ms, step);
481 
482 	if (!chan->ramp_reverse)
483 		conf |= LPG_PATTERN_CONFIG_LO_TO_HI;
484 	if (!chan->ramp_oneshot)
485 		conf |= LPG_PATTERN_CONFIG_REPEAT;
486 	if (chan->ramp_ping_pong)
487 		conf |= LPG_PATTERN_CONFIG_TOGGLE;
488 	if (chan->ramp_hi_pause_ms)
489 		conf |= LPG_PATTERN_CONFIG_PAUSE_HI;
490 	if (chan->ramp_lo_pause_ms)
491 		conf |= LPG_PATTERN_CONFIG_PAUSE_LO;
492 
493 	regmap_write(lpg->map, chan->base + LPG_PATTERN_CONFIG_REG, conf);
494 	regmap_write(lpg->map, chan->base + LPG_HI_IDX_REG, hi_idx);
495 	regmap_write(lpg->map, chan->base + LPG_LO_IDX_REG, lo_idx);
496 
497 	regmap_bulk_write(lpg->map, chan->base + LPG_RAMP_DURATION_REG, &step, sizeof(step));
498 	regmap_write(lpg->map, chan->base + LPG_HI_PAUSE_REG, hi_pause);
499 	regmap_write(lpg->map, chan->base + LPG_LO_PAUSE_REG, lo_pause);
500 }
501 
502 #define LPG_ENABLE_CONTROL_OUTPUT		BIT(7)
503 #define LPG_ENABLE_CONTROL_BUFFER_TRISTATE	BIT(5)
504 #define LPG_ENABLE_CONTROL_SRC_PWM		BIT(2)
505 #define LPG_ENABLE_CONTROL_RAMP_GEN		BIT(1)
506 
507 static void lpg_apply_control(struct lpg_channel *chan)
508 {
509 	unsigned int ctrl;
510 	struct lpg *lpg = chan->lpg;
511 
512 	ctrl = LPG_ENABLE_CONTROL_BUFFER_TRISTATE;
513 
514 	if (chan->enabled)
515 		ctrl |= LPG_ENABLE_CONTROL_OUTPUT;
516 
517 	if (chan->pattern_lo_idx != chan->pattern_hi_idx)
518 		ctrl |= LPG_ENABLE_CONTROL_RAMP_GEN;
519 	else
520 		ctrl |= LPG_ENABLE_CONTROL_SRC_PWM;
521 
522 	regmap_write(lpg->map, chan->base + PWM_ENABLE_CONTROL_REG, ctrl);
523 
524 	/*
525 	 * Due to LPG hardware bug, in the PWM mode, having enabled PWM,
526 	 * We have to write PWM values one more time.
527 	 */
528 	if (chan->enabled)
529 		lpg_apply_pwm_value(chan);
530 }
531 
532 #define LPG_SYNC_PWM	BIT(0)
533 
534 static void lpg_apply_sync(struct lpg_channel *chan)
535 {
536 	struct lpg *lpg = chan->lpg;
537 
538 	regmap_write(lpg->map, chan->base + PWM_SYNC_REG, LPG_SYNC_PWM);
539 }
540 
541 static int lpg_parse_dtest(struct lpg *lpg)
542 {
543 	struct lpg_channel *chan;
544 	struct device_node *np = lpg->dev->of_node;
545 	int count;
546 	int ret;
547 	int i;
548 
549 	count = of_property_count_u32_elems(np, "qcom,dtest");
550 	if (count == -EINVAL) {
551 		return 0;
552 	} else if (count < 0) {
553 		ret = count;
554 		goto err_malformed;
555 	} else if (count != lpg->data->num_channels * 2) {
556 		dev_err(lpg->dev, "qcom,dtest needs to be %d items\n",
557 			lpg->data->num_channels * 2);
558 		return -EINVAL;
559 	}
560 
561 	for (i = 0; i < lpg->data->num_channels; i++) {
562 		chan = &lpg->channels[i];
563 
564 		ret = of_property_read_u32_index(np, "qcom,dtest", i * 2,
565 						 &chan->dtest_line);
566 		if (ret)
567 			goto err_malformed;
568 
569 		ret = of_property_read_u32_index(np, "qcom,dtest", i * 2 + 1,
570 						 &chan->dtest_value);
571 		if (ret)
572 			goto err_malformed;
573 	}
574 
575 	return 0;
576 
577 err_malformed:
578 	dev_err(lpg->dev, "malformed qcom,dtest\n");
579 	return ret;
580 }
581 
582 static void lpg_apply_dtest(struct lpg_channel *chan)
583 {
584 	struct lpg *lpg = chan->lpg;
585 
586 	if (!chan->dtest_line)
587 		return;
588 
589 	regmap_write(lpg->map, chan->base + PWM_SEC_ACCESS_REG, 0xa5);
590 	regmap_write(lpg->map, chan->base + PWM_DTEST_REG(chan->dtest_line),
591 		     chan->dtest_value);
592 }
593 
594 static void lpg_apply(struct lpg_channel *chan)
595 {
596 	lpg_disable_glitch(chan);
597 	lpg_apply_freq(chan);
598 	lpg_apply_pwm_value(chan);
599 	lpg_apply_control(chan);
600 	lpg_apply_sync(chan);
601 	lpg_apply_lut_control(chan);
602 	lpg_enable_glitch(chan);
603 }
604 
605 static void lpg_brightness_set(struct lpg_led *led, struct led_classdev *cdev,
606 			       struct mc_subled *subleds)
607 {
608 	enum led_brightness brightness;
609 	struct lpg_channel *chan;
610 	unsigned int triled_enabled = 0;
611 	unsigned int triled_mask = 0;
612 	unsigned int lut_mask = 0;
613 	unsigned int duty;
614 	struct lpg *lpg = led->lpg;
615 	int i;
616 
617 	for (i = 0; i < led->num_channels; i++) {
618 		chan = led->channels[i];
619 		brightness = subleds[i].brightness;
620 
621 		if (brightness == LED_OFF) {
622 			chan->enabled = false;
623 			chan->ramp_enabled = false;
624 		} else if (chan->pattern_lo_idx != chan->pattern_hi_idx) {
625 			lpg_calc_freq(chan, NSEC_PER_MSEC);
626 
627 			chan->enabled = true;
628 			chan->ramp_enabled = true;
629 
630 			lut_mask |= chan->lut_mask;
631 			triled_enabled |= chan->triled_mask;
632 		} else {
633 			lpg_calc_freq(chan, NSEC_PER_MSEC);
634 
635 			duty = div_u64(brightness * chan->period, cdev->max_brightness);
636 			lpg_calc_duty(chan, duty);
637 			chan->enabled = true;
638 			chan->ramp_enabled = false;
639 
640 			triled_enabled |= chan->triled_mask;
641 		}
642 
643 		triled_mask |= chan->triled_mask;
644 
645 		lpg_apply(chan);
646 	}
647 
648 	/* Toggle triled lines */
649 	if (triled_mask)
650 		triled_set(lpg, triled_mask, triled_enabled);
651 
652 	/* Trigger start of ramp generator(s) */
653 	if (lut_mask)
654 		lpg_lut_sync(lpg, lut_mask);
655 }
656 
657 static int lpg_brightness_single_set(struct led_classdev *cdev,
658 				     enum led_brightness value)
659 {
660 	struct lpg_led *led = container_of(cdev, struct lpg_led, cdev);
661 	struct mc_subled info;
662 
663 	mutex_lock(&led->lpg->lock);
664 
665 	info.brightness = value;
666 	lpg_brightness_set(led, cdev, &info);
667 
668 	mutex_unlock(&led->lpg->lock);
669 
670 	return 0;
671 }
672 
673 static int lpg_brightness_mc_set(struct led_classdev *cdev,
674 				 enum led_brightness value)
675 {
676 	struct led_classdev_mc *mc = lcdev_to_mccdev(cdev);
677 	struct lpg_led *led = container_of(mc, struct lpg_led, mcdev);
678 
679 	mutex_lock(&led->lpg->lock);
680 
681 	led_mc_calc_color_components(mc, value);
682 	lpg_brightness_set(led, cdev, mc->subled_info);
683 
684 	mutex_unlock(&led->lpg->lock);
685 
686 	return 0;
687 }
688 
689 static int lpg_blink_set(struct lpg_led *led,
690 			 unsigned long *delay_on, unsigned long *delay_off)
691 {
692 	struct lpg_channel *chan;
693 	unsigned int period;
694 	unsigned int triled_mask = 0;
695 	struct lpg *lpg = led->lpg;
696 	u64 duty;
697 	int i;
698 
699 	if (!*delay_on && !*delay_off) {
700 		*delay_on = 500;
701 		*delay_off = 500;
702 	}
703 
704 	duty = *delay_on * NSEC_PER_MSEC;
705 	period = (*delay_on + *delay_off) * NSEC_PER_MSEC;
706 
707 	for (i = 0; i < led->num_channels; i++) {
708 		chan = led->channels[i];
709 
710 		lpg_calc_freq(chan, period);
711 		lpg_calc_duty(chan, duty);
712 
713 		chan->enabled = true;
714 		chan->ramp_enabled = false;
715 
716 		triled_mask |= chan->triled_mask;
717 
718 		lpg_apply(chan);
719 	}
720 
721 	/* Enable triled lines */
722 	triled_set(lpg, triled_mask, triled_mask);
723 
724 	chan = led->channels[0];
725 	duty = div_u64(chan->pwm_value * chan->period, LPG_RESOLUTION_9BIT);
726 	*delay_on = div_u64(duty, NSEC_PER_MSEC);
727 	*delay_off = div_u64(chan->period - duty, NSEC_PER_MSEC);
728 
729 	return 0;
730 }
731 
732 static int lpg_blink_single_set(struct led_classdev *cdev,
733 				unsigned long *delay_on, unsigned long *delay_off)
734 {
735 	struct lpg_led *led = container_of(cdev, struct lpg_led, cdev);
736 	int ret;
737 
738 	mutex_lock(&led->lpg->lock);
739 
740 	ret = lpg_blink_set(led, delay_on, delay_off);
741 
742 	mutex_unlock(&led->lpg->lock);
743 
744 	return ret;
745 }
746 
747 static int lpg_blink_mc_set(struct led_classdev *cdev,
748 			    unsigned long *delay_on, unsigned long *delay_off)
749 {
750 	struct led_classdev_mc *mc = lcdev_to_mccdev(cdev);
751 	struct lpg_led *led = container_of(mc, struct lpg_led, mcdev);
752 	int ret;
753 
754 	mutex_lock(&led->lpg->lock);
755 
756 	ret = lpg_blink_set(led, delay_on, delay_off);
757 
758 	mutex_unlock(&led->lpg->lock);
759 
760 	return ret;
761 }
762 
763 static int lpg_pattern_set(struct lpg_led *led, struct led_pattern *led_pattern,
764 			   u32 len, int repeat)
765 {
766 	struct lpg_channel *chan;
767 	struct lpg *lpg = led->lpg;
768 	struct led_pattern *pattern;
769 	unsigned int brightness_a;
770 	unsigned int brightness_b;
771 	unsigned int actual_len;
772 	unsigned int hi_pause;
773 	unsigned int lo_pause;
774 	unsigned int delta_t;
775 	unsigned int lo_idx;
776 	unsigned int hi_idx;
777 	unsigned int i;
778 	bool ping_pong = true;
779 	int ret = -EINVAL;
780 
781 	/* Hardware only support oneshot or indefinite loops */
782 	if (repeat != -1 && repeat != 1)
783 		return -EINVAL;
784 
785 	/*
786 	 * The standardized leds-trigger-pattern format defines that the
787 	 * brightness of the LED follows a linear transition from one entry
788 	 * in the pattern to the next, over the given delta_t time. It
789 	 * describes that the way to perform instant transitions a zero-length
790 	 * entry should be added following a pattern entry.
791 	 *
792 	 * The LPG hardware is only able to perform the latter (no linear
793 	 * transitions), so require each entry in the pattern to be followed by
794 	 * a zero-length transition.
795 	 */
796 	if (len % 2)
797 		return -EINVAL;
798 
799 	pattern = kcalloc(len / 2, sizeof(*pattern), GFP_KERNEL);
800 	if (!pattern)
801 		return -ENOMEM;
802 
803 	for (i = 0; i < len; i += 2) {
804 		if (led_pattern[i].brightness != led_pattern[i + 1].brightness)
805 			goto out_free_pattern;
806 		if (led_pattern[i + 1].delta_t != 0)
807 			goto out_free_pattern;
808 
809 		pattern[i / 2].brightness = led_pattern[i].brightness;
810 		pattern[i / 2].delta_t = led_pattern[i].delta_t;
811 	}
812 
813 	len /= 2;
814 
815 	/*
816 	 * Specifying a pattern of length 1 causes the hardware to iterate
817 	 * through the entire LUT, so prohibit this.
818 	 */
819 	if (len < 2)
820 		goto out_free_pattern;
821 
822 	/*
823 	 * The LPG plays patterns with at a fixed pace, a "low pause" can be
824 	 * used to stretch the first delay of the pattern and a "high pause"
825 	 * the last one.
826 	 *
827 	 * In order to save space the pattern can be played in "ping pong"
828 	 * mode, in which the pattern is first played forward, then "high
829 	 * pause" is applied, then the pattern is played backwards and finally
830 	 * the "low pause" is applied.
831 	 *
832 	 * The middle elements of the pattern are used to determine delta_t and
833 	 * the "low pause" and "high pause" multipliers are derrived from this.
834 	 *
835 	 * The first element in the pattern is used to determine "low pause".
836 	 *
837 	 * If the specified pattern is a palindrome the ping pong mode is
838 	 * enabled. In this scenario the delta_t of the middle entry (i.e. the
839 	 * last in the programmed pattern) determines the "high pause".
840 	 */
841 
842 	/* Detect palindromes and use "ping pong" to reduce LUT usage */
843 	for (i = 0; i < len / 2; i++) {
844 		brightness_a = pattern[i].brightness;
845 		brightness_b = pattern[len - i - 1].brightness;
846 
847 		if (brightness_a != brightness_b) {
848 			ping_pong = false;
849 			break;
850 		}
851 	}
852 
853 	/* The pattern length to be written to the LUT */
854 	if (ping_pong)
855 		actual_len = (len + 1) / 2;
856 	else
857 		actual_len = len;
858 
859 	/*
860 	 * Validate that all delta_t in the pattern are the same, with the
861 	 * exception of the middle element in case of ping_pong.
862 	 */
863 	delta_t = pattern[1].delta_t;
864 	for (i = 2; i < len; i++) {
865 		if (pattern[i].delta_t != delta_t) {
866 			/*
867 			 * Allow last entry in the full or shortened pattern to
868 			 * specify hi pause. Reject other variations.
869 			 */
870 			if (i != actual_len - 1)
871 				goto out_free_pattern;
872 		}
873 	}
874 
875 	/* LPG_RAMP_DURATION_REG is a 9bit */
876 	if (delta_t >= BIT(9))
877 		goto out_free_pattern;
878 
879 	/* Find "low pause" and "high pause" in the pattern */
880 	lo_pause = pattern[0].delta_t;
881 	hi_pause = pattern[actual_len - 1].delta_t;
882 
883 	mutex_lock(&lpg->lock);
884 	ret = lpg_lut_store(lpg, pattern, actual_len, &lo_idx, &hi_idx);
885 	if (ret < 0)
886 		goto out_unlock;
887 
888 	for (i = 0; i < led->num_channels; i++) {
889 		chan = led->channels[i];
890 
891 		chan->ramp_tick_ms = delta_t;
892 		chan->ramp_ping_pong = ping_pong;
893 		chan->ramp_oneshot = repeat != -1;
894 
895 		chan->ramp_lo_pause_ms = lo_pause;
896 		chan->ramp_hi_pause_ms = hi_pause;
897 
898 		chan->pattern_lo_idx = lo_idx;
899 		chan->pattern_hi_idx = hi_idx;
900 	}
901 
902 out_unlock:
903 	mutex_unlock(&lpg->lock);
904 out_free_pattern:
905 	kfree(pattern);
906 
907 	return ret;
908 }
909 
910 static int lpg_pattern_single_set(struct led_classdev *cdev,
911 				  struct led_pattern *pattern, u32 len,
912 				  int repeat)
913 {
914 	struct lpg_led *led = container_of(cdev, struct lpg_led, cdev);
915 	int ret;
916 
917 	ret = lpg_pattern_set(led, pattern, len, repeat);
918 	if (ret < 0)
919 		return ret;
920 
921 	lpg_brightness_single_set(cdev, LED_FULL);
922 
923 	return 0;
924 }
925 
926 static int lpg_pattern_mc_set(struct led_classdev *cdev,
927 			      struct led_pattern *pattern, u32 len,
928 			      int repeat)
929 {
930 	struct led_classdev_mc *mc = lcdev_to_mccdev(cdev);
931 	struct lpg_led *led = container_of(mc, struct lpg_led, mcdev);
932 	int ret;
933 
934 	ret = lpg_pattern_set(led, pattern, len, repeat);
935 	if (ret < 0)
936 		return ret;
937 
938 	led_mc_calc_color_components(mc, LED_FULL);
939 	lpg_brightness_set(led, cdev, mc->subled_info);
940 
941 	return 0;
942 }
943 
944 static int lpg_pattern_clear(struct lpg_led *led)
945 {
946 	struct lpg_channel *chan;
947 	struct lpg *lpg = led->lpg;
948 	int i;
949 
950 	mutex_lock(&lpg->lock);
951 
952 	chan = led->channels[0];
953 	lpg_lut_free(lpg, chan->pattern_lo_idx, chan->pattern_hi_idx);
954 
955 	for (i = 0; i < led->num_channels; i++) {
956 		chan = led->channels[i];
957 		chan->pattern_lo_idx = 0;
958 		chan->pattern_hi_idx = 0;
959 	}
960 
961 	mutex_unlock(&lpg->lock);
962 
963 	return 0;
964 }
965 
966 static int lpg_pattern_single_clear(struct led_classdev *cdev)
967 {
968 	struct lpg_led *led = container_of(cdev, struct lpg_led, cdev);
969 
970 	return lpg_pattern_clear(led);
971 }
972 
973 static int lpg_pattern_mc_clear(struct led_classdev *cdev)
974 {
975 	struct led_classdev_mc *mc = lcdev_to_mccdev(cdev);
976 	struct lpg_led *led = container_of(mc, struct lpg_led, mcdev);
977 
978 	return lpg_pattern_clear(led);
979 }
980 
981 static int lpg_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
982 {
983 	struct lpg *lpg = container_of(chip, struct lpg, pwm);
984 	struct lpg_channel *chan = &lpg->channels[pwm->hwpwm];
985 
986 	return chan->in_use ? -EBUSY : 0;
987 }
988 
989 /*
990  * Limitations:
991  * - Updating both duty and period is not done atomically, so the output signal
992  *   will momentarily be a mix of the settings.
993  * - Changed parameters takes effect immediately.
994  * - A disabled channel outputs a logical 0.
995  */
996 static int lpg_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
997 			 const struct pwm_state *state)
998 {
999 	struct lpg *lpg = container_of(chip, struct lpg, pwm);
1000 	struct lpg_channel *chan = &lpg->channels[pwm->hwpwm];
1001 	int ret = 0;
1002 
1003 	if (state->polarity != PWM_POLARITY_NORMAL)
1004 		return -EINVAL;
1005 
1006 	mutex_lock(&lpg->lock);
1007 
1008 	if (state->enabled) {
1009 		ret = lpg_calc_freq(chan, state->period);
1010 		if (ret < 0)
1011 			goto out_unlock;
1012 
1013 		lpg_calc_duty(chan, state->duty_cycle);
1014 	}
1015 	chan->enabled = state->enabled;
1016 
1017 	lpg_apply(chan);
1018 
1019 	triled_set(lpg, chan->triled_mask, chan->enabled ? chan->triled_mask : 0);
1020 
1021 out_unlock:
1022 	mutex_unlock(&lpg->lock);
1023 
1024 	return ret;
1025 }
1026 
1027 static int lpg_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
1028 			     struct pwm_state *state)
1029 {
1030 	struct lpg *lpg = container_of(chip, struct lpg, pwm);
1031 	struct lpg_channel *chan = &lpg->channels[pwm->hwpwm];
1032 	unsigned int resolution;
1033 	unsigned int pre_div;
1034 	unsigned int refclk;
1035 	unsigned int val;
1036 	unsigned int m;
1037 	u16 pwm_value;
1038 	int ret;
1039 
1040 	ret = regmap_read(lpg->map, chan->base + LPG_SIZE_CLK_REG, &val);
1041 	if (ret)
1042 		return ret;
1043 
1044 	if (chan->subtype == LPG_SUBTYPE_HI_RES_PWM) {
1045 		refclk = lpg_clk_rates_hi_res[FIELD_GET(PWM_CLK_SELECT_HI_RES_MASK, val)];
1046 		resolution = lpg_pwm_resolution_hi_res[FIELD_GET(PWM_SIZE_HI_RES_MASK, val)];
1047 	} else {
1048 		refclk = lpg_clk_rates[FIELD_GET(PWM_CLK_SELECT_MASK, val)];
1049 		resolution = 9;
1050 	}
1051 
1052 	if (refclk) {
1053 		ret = regmap_read(lpg->map, chan->base + LPG_PREDIV_CLK_REG, &val);
1054 		if (ret)
1055 			return ret;
1056 
1057 		pre_div = lpg_pre_divs[FIELD_GET(PWM_FREQ_PRE_DIV_MASK, val)];
1058 		m = FIELD_GET(PWM_FREQ_EXP_MASK, val);
1059 
1060 		ret = regmap_bulk_read(lpg->map, chan->base + PWM_VALUE_REG, &pwm_value, sizeof(pwm_value));
1061 		if (ret)
1062 			return ret;
1063 
1064 		state->period = DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * (1 << resolution) *
1065 						 pre_div * (1 << m), refclk);
1066 		state->duty_cycle = DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * pwm_value * pre_div * (1 << m), refclk);
1067 	} else {
1068 		state->period = 0;
1069 		state->duty_cycle = 0;
1070 	}
1071 
1072 	ret = regmap_read(lpg->map, chan->base + PWM_ENABLE_CONTROL_REG, &val);
1073 	if (ret)
1074 		return ret;
1075 
1076 	state->enabled = FIELD_GET(LPG_ENABLE_CONTROL_OUTPUT, val);
1077 	state->polarity = PWM_POLARITY_NORMAL;
1078 
1079 	if (state->duty_cycle > state->period)
1080 		state->duty_cycle = state->period;
1081 
1082 	return 0;
1083 }
1084 
1085 static const struct pwm_ops lpg_pwm_ops = {
1086 	.request = lpg_pwm_request,
1087 	.apply = lpg_pwm_apply,
1088 	.get_state = lpg_pwm_get_state,
1089 	.owner = THIS_MODULE,
1090 };
1091 
1092 static int lpg_add_pwm(struct lpg *lpg)
1093 {
1094 	int ret;
1095 
1096 	lpg->pwm.base = -1;
1097 	lpg->pwm.dev = lpg->dev;
1098 	lpg->pwm.npwm = lpg->num_channels;
1099 	lpg->pwm.ops = &lpg_pwm_ops;
1100 
1101 	ret = pwmchip_add(&lpg->pwm);
1102 	if (ret)
1103 		dev_err(lpg->dev, "failed to add PWM chip: ret %d\n", ret);
1104 
1105 	return ret;
1106 }
1107 
1108 static int lpg_parse_channel(struct lpg *lpg, struct device_node *np,
1109 			     struct lpg_channel **channel)
1110 {
1111 	struct lpg_channel *chan;
1112 	u32 color = LED_COLOR_ID_GREEN;
1113 	u32 reg;
1114 	int ret;
1115 
1116 	ret = of_property_read_u32(np, "reg", &reg);
1117 	if (ret || !reg || reg > lpg->num_channels) {
1118 		dev_err(lpg->dev, "invalid \"reg\" of %pOFn\n", np);
1119 		return -EINVAL;
1120 	}
1121 
1122 	chan = &lpg->channels[reg - 1];
1123 	chan->in_use = true;
1124 
1125 	ret = of_property_read_u32(np, "color", &color);
1126 	if (ret < 0 && ret != -EINVAL) {
1127 		dev_err(lpg->dev, "failed to parse \"color\" of %pOF\n", np);
1128 		return ret;
1129 	}
1130 
1131 	chan->color = color;
1132 
1133 	*channel = chan;
1134 
1135 	return 0;
1136 }
1137 
1138 static int lpg_add_led(struct lpg *lpg, struct device_node *np)
1139 {
1140 	struct led_init_data init_data = {};
1141 	struct led_classdev *cdev;
1142 	struct device_node *child;
1143 	struct mc_subled *info;
1144 	struct lpg_led *led;
1145 	const char *state;
1146 	int num_channels;
1147 	u32 color = 0;
1148 	int ret;
1149 	int i;
1150 
1151 	ret = of_property_read_u32(np, "color", &color);
1152 	if (ret < 0 && ret != -EINVAL) {
1153 		dev_err(lpg->dev, "failed to parse \"color\" of %pOF\n", np);
1154 		return ret;
1155 	}
1156 
1157 	if (color == LED_COLOR_ID_RGB)
1158 		num_channels = of_get_available_child_count(np);
1159 	else
1160 		num_channels = 1;
1161 
1162 	led = devm_kzalloc(lpg->dev, struct_size(led, channels, num_channels), GFP_KERNEL);
1163 	if (!led)
1164 		return -ENOMEM;
1165 
1166 	led->lpg = lpg;
1167 	led->num_channels = num_channels;
1168 
1169 	if (color == LED_COLOR_ID_RGB) {
1170 		info = devm_kcalloc(lpg->dev, num_channels, sizeof(*info), GFP_KERNEL);
1171 		if (!info)
1172 			return -ENOMEM;
1173 		i = 0;
1174 		for_each_available_child_of_node(np, child) {
1175 			ret = lpg_parse_channel(lpg, child, &led->channels[i]);
1176 			if (ret < 0)
1177 				return ret;
1178 
1179 			info[i].color_index = led->channels[i]->color;
1180 			info[i].intensity = 0;
1181 			i++;
1182 		}
1183 
1184 		led->mcdev.subled_info = info;
1185 		led->mcdev.num_colors = num_channels;
1186 
1187 		cdev = &led->mcdev.led_cdev;
1188 		cdev->brightness_set_blocking = lpg_brightness_mc_set;
1189 		cdev->blink_set = lpg_blink_mc_set;
1190 
1191 		/* Register pattern accessors only if we have a LUT block */
1192 		if (lpg->lut_base) {
1193 			cdev->pattern_set = lpg_pattern_mc_set;
1194 			cdev->pattern_clear = lpg_pattern_mc_clear;
1195 		}
1196 	} else {
1197 		ret = lpg_parse_channel(lpg, np, &led->channels[0]);
1198 		if (ret < 0)
1199 			return ret;
1200 
1201 		cdev = &led->cdev;
1202 		cdev->brightness_set_blocking = lpg_brightness_single_set;
1203 		cdev->blink_set = lpg_blink_single_set;
1204 
1205 		/* Register pattern accessors only if we have a LUT block */
1206 		if (lpg->lut_base) {
1207 			cdev->pattern_set = lpg_pattern_single_set;
1208 			cdev->pattern_clear = lpg_pattern_single_clear;
1209 		}
1210 	}
1211 
1212 	cdev->default_trigger = of_get_property(np, "linux,default-trigger", NULL);
1213 	cdev->max_brightness = LPG_RESOLUTION_9BIT - 1;
1214 
1215 	if (!of_property_read_string(np, "default-state", &state) &&
1216 	    !strcmp(state, "on"))
1217 		cdev->brightness = cdev->max_brightness;
1218 	else
1219 		cdev->brightness = LED_OFF;
1220 
1221 	cdev->brightness_set_blocking(cdev, cdev->brightness);
1222 
1223 	init_data.fwnode = of_fwnode_handle(np);
1224 
1225 	if (color == LED_COLOR_ID_RGB)
1226 		ret = devm_led_classdev_multicolor_register_ext(lpg->dev, &led->mcdev, &init_data);
1227 	else
1228 		ret = devm_led_classdev_register_ext(lpg->dev, &led->cdev, &init_data);
1229 	if (ret)
1230 		dev_err(lpg->dev, "unable to register %s\n", cdev->name);
1231 
1232 	return ret;
1233 }
1234 
1235 static int lpg_init_channels(struct lpg *lpg)
1236 {
1237 	const struct lpg_data *data = lpg->data;
1238 	struct lpg_channel *chan;
1239 	int i;
1240 
1241 	lpg->num_channels = data->num_channels;
1242 	lpg->channels = devm_kcalloc(lpg->dev, data->num_channels,
1243 				     sizeof(struct lpg_channel), GFP_KERNEL);
1244 	if (!lpg->channels)
1245 		return -ENOMEM;
1246 
1247 	for (i = 0; i < data->num_channels; i++) {
1248 		chan = &lpg->channels[i];
1249 
1250 		chan->lpg = lpg;
1251 		chan->base = data->channels[i].base;
1252 		chan->triled_mask = data->channels[i].triled_mask;
1253 		chan->lut_mask = BIT(i);
1254 
1255 		regmap_read(lpg->map, chan->base + LPG_SUBTYPE_REG, &chan->subtype);
1256 	}
1257 
1258 	return 0;
1259 }
1260 
1261 static int lpg_init_triled(struct lpg *lpg)
1262 {
1263 	struct device_node *np = lpg->dev->of_node;
1264 	int ret;
1265 
1266 	/* Skip initialization if we don't have a triled block */
1267 	if (!lpg->data->triled_base)
1268 		return 0;
1269 
1270 	lpg->triled_base = lpg->data->triled_base;
1271 	lpg->triled_has_atc_ctl = lpg->data->triled_has_atc_ctl;
1272 	lpg->triled_has_src_sel = lpg->data->triled_has_src_sel;
1273 
1274 	if (lpg->triled_has_src_sel) {
1275 		ret = of_property_read_u32(np, "qcom,power-source", &lpg->triled_src);
1276 		if (ret || lpg->triled_src == 2 || lpg->triled_src > 3) {
1277 			dev_err(lpg->dev, "invalid power source\n");
1278 			return -EINVAL;
1279 		}
1280 	}
1281 
1282 	/* Disable automatic trickle charge LED */
1283 	if (lpg->triled_has_atc_ctl)
1284 		regmap_write(lpg->map, lpg->triled_base + TRI_LED_ATC_CTL, 0);
1285 
1286 	/* Configure power source */
1287 	if (lpg->triled_has_src_sel)
1288 		regmap_write(lpg->map, lpg->triled_base + TRI_LED_SRC_SEL, lpg->triled_src);
1289 
1290 	/* Default all outputs to off */
1291 	regmap_write(lpg->map, lpg->triled_base + TRI_LED_EN_CTL, 0);
1292 
1293 	return 0;
1294 }
1295 
1296 static int lpg_init_lut(struct lpg *lpg)
1297 {
1298 	const struct lpg_data *data = lpg->data;
1299 
1300 	if (!data->lut_base)
1301 		return 0;
1302 
1303 	lpg->lut_base = data->lut_base;
1304 	lpg->lut_size = data->lut_size;
1305 
1306 	lpg->lut_bitmap = devm_bitmap_zalloc(lpg->dev, lpg->lut_size, GFP_KERNEL);
1307 	if (!lpg->lut_bitmap)
1308 		return -ENOMEM;
1309 
1310 	return 0;
1311 }
1312 
1313 static int lpg_probe(struct platform_device *pdev)
1314 {
1315 	struct device_node *np;
1316 	struct lpg *lpg;
1317 	int ret;
1318 	int i;
1319 
1320 	lpg = devm_kzalloc(&pdev->dev, sizeof(*lpg), GFP_KERNEL);
1321 	if (!lpg)
1322 		return -ENOMEM;
1323 
1324 	lpg->data = of_device_get_match_data(&pdev->dev);
1325 	if (!lpg->data)
1326 		return -EINVAL;
1327 
1328 	platform_set_drvdata(pdev, lpg);
1329 
1330 	lpg->dev = &pdev->dev;
1331 	mutex_init(&lpg->lock);
1332 
1333 	lpg->map = dev_get_regmap(pdev->dev.parent, NULL);
1334 	if (!lpg->map)
1335 		return dev_err_probe(&pdev->dev, -ENXIO, "parent regmap unavailable\n");
1336 
1337 	ret = lpg_init_channels(lpg);
1338 	if (ret < 0)
1339 		return ret;
1340 
1341 	ret = lpg_parse_dtest(lpg);
1342 	if (ret < 0)
1343 		return ret;
1344 
1345 	ret = lpg_init_triled(lpg);
1346 	if (ret < 0)
1347 		return ret;
1348 
1349 	ret = lpg_init_lut(lpg);
1350 	if (ret < 0)
1351 		return ret;
1352 
1353 	for_each_available_child_of_node(pdev->dev.of_node, np) {
1354 		ret = lpg_add_led(lpg, np);
1355 		if (ret)
1356 			return ret;
1357 	}
1358 
1359 	for (i = 0; i < lpg->num_channels; i++)
1360 		lpg_apply_dtest(&lpg->channels[i]);
1361 
1362 	return lpg_add_pwm(lpg);
1363 }
1364 
1365 static int lpg_remove(struct platform_device *pdev)
1366 {
1367 	struct lpg *lpg = platform_get_drvdata(pdev);
1368 
1369 	pwmchip_remove(&lpg->pwm);
1370 
1371 	return 0;
1372 }
1373 
1374 static const struct lpg_data pm8916_pwm_data = {
1375 	.num_channels = 1,
1376 	.channels = (const struct lpg_channel_data[]) {
1377 		{ .base = 0xbc00 },
1378 	},
1379 };
1380 
1381 static const struct lpg_data pm8941_lpg_data = {
1382 	.lut_base = 0xb000,
1383 	.lut_size = 64,
1384 
1385 	.triled_base = 0xd000,
1386 	.triled_has_atc_ctl = true,
1387 	.triled_has_src_sel = true,
1388 
1389 	.num_channels = 8,
1390 	.channels = (const struct lpg_channel_data[]) {
1391 		{ .base = 0xb100 },
1392 		{ .base = 0xb200 },
1393 		{ .base = 0xb300 },
1394 		{ .base = 0xb400 },
1395 		{ .base = 0xb500, .triled_mask = BIT(5) },
1396 		{ .base = 0xb600, .triled_mask = BIT(6) },
1397 		{ .base = 0xb700, .triled_mask = BIT(7) },
1398 		{ .base = 0xb800 },
1399 	},
1400 };
1401 
1402 static const struct lpg_data pm8994_lpg_data = {
1403 	.lut_base = 0xb000,
1404 	.lut_size = 64,
1405 
1406 	.num_channels = 6,
1407 	.channels = (const struct lpg_channel_data[]) {
1408 		{ .base = 0xb100 },
1409 		{ .base = 0xb200 },
1410 		{ .base = 0xb300 },
1411 		{ .base = 0xb400 },
1412 		{ .base = 0xb500 },
1413 		{ .base = 0xb600 },
1414 	},
1415 };
1416 
1417 static const struct lpg_data pmi8994_lpg_data = {
1418 	.lut_base = 0xb000,
1419 	.lut_size = 24,
1420 
1421 	.triled_base = 0xd000,
1422 	.triled_has_atc_ctl = true,
1423 	.triled_has_src_sel = true,
1424 
1425 	.num_channels = 4,
1426 	.channels = (const struct lpg_channel_data[]) {
1427 		{ .base = 0xb100, .triled_mask = BIT(5) },
1428 		{ .base = 0xb200, .triled_mask = BIT(6) },
1429 		{ .base = 0xb300, .triled_mask = BIT(7) },
1430 		{ .base = 0xb400 },
1431 	},
1432 };
1433 
1434 static const struct lpg_data pmi8998_lpg_data = {
1435 	.lut_base = 0xb000,
1436 	.lut_size = 49,
1437 
1438 	.triled_base = 0xd000,
1439 
1440 	.num_channels = 6,
1441 	.channels = (const struct lpg_channel_data[]) {
1442 		{ .base = 0xb100 },
1443 		{ .base = 0xb200 },
1444 		{ .base = 0xb300, .triled_mask = BIT(5) },
1445 		{ .base = 0xb400, .triled_mask = BIT(6) },
1446 		{ .base = 0xb500, .triled_mask = BIT(7) },
1447 		{ .base = 0xb600 },
1448 	},
1449 };
1450 
1451 static const struct lpg_data pm8150b_lpg_data = {
1452 	.lut_base = 0xb000,
1453 	.lut_size = 24,
1454 
1455 	.triled_base = 0xd000,
1456 
1457 	.num_channels = 2,
1458 	.channels = (const struct lpg_channel_data[]) {
1459 		{ .base = 0xb100, .triled_mask = BIT(7) },
1460 		{ .base = 0xb200, .triled_mask = BIT(6) },
1461 	},
1462 };
1463 
1464 static const struct lpg_data pm8150l_lpg_data = {
1465 	.lut_base = 0xb000,
1466 	.lut_size = 48,
1467 
1468 	.triled_base = 0xd000,
1469 
1470 	.num_channels = 5,
1471 	.channels = (const struct lpg_channel_data[]) {
1472 		{ .base = 0xb100, .triled_mask = BIT(7) },
1473 		{ .base = 0xb200, .triled_mask = BIT(6) },
1474 		{ .base = 0xb300, .triled_mask = BIT(5) },
1475 		{ .base = 0xbc00 },
1476 		{ .base = 0xbd00 },
1477 
1478 	},
1479 };
1480 
1481 static const struct lpg_data pm8350c_pwm_data = {
1482 	.triled_base = 0xef00,
1483 
1484 	.num_channels = 4,
1485 	.channels = (const struct lpg_channel_data[]) {
1486 		{ .base = 0xe800, .triled_mask = BIT(7) },
1487 		{ .base = 0xe900, .triled_mask = BIT(6) },
1488 		{ .base = 0xea00, .triled_mask = BIT(5) },
1489 		{ .base = 0xeb00 },
1490 	},
1491 };
1492 
1493 static const struct lpg_data pmk8550_pwm_data = {
1494 	.num_channels = 2,
1495 	.channels = (const struct lpg_channel_data[]) {
1496 		{ .base = 0xe800 },
1497 		{ .base = 0xe900 },
1498 	},
1499 };
1500 
1501 static const struct of_device_id lpg_of_table[] = {
1502 	{ .compatible = "qcom,pm8150b-lpg", .data = &pm8150b_lpg_data },
1503 	{ .compatible = "qcom,pm8150l-lpg", .data = &pm8150l_lpg_data },
1504 	{ .compatible = "qcom,pm8350c-pwm", .data = &pm8350c_pwm_data },
1505 	{ .compatible = "qcom,pm8916-pwm", .data = &pm8916_pwm_data },
1506 	{ .compatible = "qcom,pm8941-lpg", .data = &pm8941_lpg_data },
1507 	{ .compatible = "qcom,pm8994-lpg", .data = &pm8994_lpg_data },
1508 	{ .compatible = "qcom,pmi8994-lpg", .data = &pmi8994_lpg_data },
1509 	{ .compatible = "qcom,pmi8998-lpg", .data = &pmi8998_lpg_data },
1510 	{ .compatible = "qcom,pmc8180c-lpg", .data = &pm8150l_lpg_data },
1511 	{ .compatible = "qcom,pmk8550-pwm", .data = &pmk8550_pwm_data },
1512 	{}
1513 };
1514 MODULE_DEVICE_TABLE(of, lpg_of_table);
1515 
1516 static struct platform_driver lpg_driver = {
1517 	.probe = lpg_probe,
1518 	.remove = lpg_remove,
1519 	.driver = {
1520 		.name = "qcom-spmi-lpg",
1521 		.of_match_table = lpg_of_table,
1522 	},
1523 };
1524 module_platform_driver(lpg_driver);
1525 
1526 MODULE_DESCRIPTION("Qualcomm LPG LED driver");
1527 MODULE_LICENSE("GPL v2");
1528