1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
6 #include <linux/bitfield.h>
7 #include <linux/bits.h>
8 #include <linux/leds.h>
9 #include <linux/led-class-flash.h>
10 #include <linux/module.h>
11 #include <linux/platform_device.h>
12 #include <linux/property.h>
13 #include <linux/regmap.h>
14 #include <media/v4l2-flash-led-class.h>
16 /* registers definitions */
17 #define FLASH_REVISION_REG 0x00
18 #define FLASH_4CH_REVISION_V0P1 0x01
20 #define FLASH_TYPE_REG 0x04
21 #define FLASH_TYPE_VAL 0x18
23 #define FLASH_SUBTYPE_REG 0x05
24 #define FLASH_SUBTYPE_3CH_PM8150_VAL 0x04
25 #define FLASH_SUBTYPE_3CH_PMI8998_VAL 0x03
26 #define FLASH_SUBTYPE_4CH_VAL 0x07
28 #define FLASH_STS_3CH_OTST1 BIT(0)
29 #define FLASH_STS_3CH_OTST2 BIT(1)
30 #define FLASH_STS_3CH_OTST3 BIT(2)
31 #define FLASH_STS_3CH_BOB_THM_OVERLOAD BIT(3)
32 #define FLASH_STS_3CH_VPH_DROOP BIT(4)
33 #define FLASH_STS_3CH_BOB_ILIM_S1 BIT(5)
34 #define FLASH_STS_3CH_BOB_ILIM_S2 BIT(6)
35 #define FLASH_STS_3CH_BCL_IBAT BIT(7)
37 #define FLASH_STS_4CH_VPH_LOW BIT(0)
38 #define FLASH_STS_4CH_BCL_IBAT BIT(1)
39 #define FLASH_STS_4CH_BOB_ILIM_S1 BIT(2)
40 #define FLASH_STS_4CH_BOB_ILIM_S2 BIT(3)
41 #define FLASH_STS_4CH_OTST2 BIT(4)
42 #define FLASH_STS_4CH_OTST1 BIT(5)
43 #define FLASH_STS_4CHG_BOB_THM_OVERLOAD BIT(6)
45 #define FLASH_TIMER_EN_BIT BIT(7)
46 #define FLASH_TIMER_VAL_MASK GENMASK(6, 0)
47 #define FLASH_TIMER_STEP_MS 10
49 #define FLASH_STROBE_HW_SW_SEL_BIT BIT(2)
50 #define SW_STROBE_VAL 0
51 #define HW_STROBE_VAL 1
52 #define FLASH_HW_STROBE_TRIGGER_SEL_BIT BIT(1)
53 #define STROBE_LEVEL_TRIGGER_VAL 0
54 #define STROBE_EDGE_TRIGGER_VAL 1
55 #define FLASH_STROBE_POLARITY_BIT BIT(0)
56 #define STROBE_ACTIVE_HIGH_VAL 1
58 #define FLASH_IRES_MASK_4CH BIT(0)
59 #define FLASH_IRES_MASK_3CH GENMASK(1, 0)
60 #define FLASH_IRES_12P5MA_VAL 0
61 #define FLASH_IRES_5MA_VAL_4CH 1
62 #define FLASH_IRES_5MA_VAL_3CH 3
65 #define FLASH_CURRENT_MAX_UA 1500000
66 #define TORCH_CURRENT_MAX_UA 500000
67 #define FLASH_TOTAL_CURRENT_MAX_UA 2000000
68 #define FLASH_CURRENT_DEFAULT_UA 1000000
69 #define TORCH_CURRENT_DEFAULT_UA 200000
71 #define TORCH_IRES_UA 5000
72 #define FLASH_IRES_UA 12500
74 #define FLASH_TIMEOUT_MAX_US 1280000
75 #define FLASH_TIMEOUT_STEP_US 10000
77 #define UA_PER_MA 1000
79 /* thermal threshold constants */
80 #define OTST_3CH_MIN_VAL 3
81 #define OTST1_4CH_MIN_VAL 0
82 #define OTST1_4CH_V0P1_MIN_VAL 3
83 #define OTST2_4CH_MIN_VAL 0
85 #define OTST1_MAX_CURRENT_MA 1000
86 #define OTST2_MAX_CURRENT_MA 500
87 #define OTST3_MAX_CURRENT_MA 200
120 static struct reg_field mvflash_3ch_regs
[REG_MAX_COUNT
] = {
121 REG_FIELD(0x08, 0, 7), /* status1 */
122 REG_FIELD(0x09, 0, 7), /* status2 */
123 REG_FIELD(0x0a, 0, 7), /* status3 */
124 REG_FIELD_ID(0x40, 0, 7, 3, 1), /* chan_timer */
125 REG_FIELD_ID(0x43, 0, 6, 3, 1), /* itarget */
126 REG_FIELD(0x46, 7, 7), /* module_en */
127 REG_FIELD(0x47, 0, 5), /* iresolution */
128 REG_FIELD_ID(0x49, 0, 2, 3, 1), /* chan_strobe */
129 REG_FIELD(0x4c, 0, 2), /* chan_en */
130 REG_FIELD(0x56, 0, 2), /* therm_thrsh1 */
131 REG_FIELD(0x57, 0, 2), /* therm_thrsh2 */
132 REG_FIELD(0x58, 0, 2), /* therm_thrsh3 */
135 static struct reg_field mvflash_4ch_regs
[REG_MAX_COUNT
] = {
136 REG_FIELD(0x06, 0, 7), /* status1 */
137 REG_FIELD(0x07, 0, 6), /* status2 */
138 REG_FIELD(0x09, 0, 7), /* status3 */
139 REG_FIELD_ID(0x3e, 0, 7, 4, 1), /* chan_timer */
140 REG_FIELD_ID(0x42, 0, 6, 4, 1), /* itarget */
141 REG_FIELD(0x46, 7, 7), /* module_en */
142 REG_FIELD(0x49, 0, 3), /* iresolution */
143 REG_FIELD_ID(0x4a, 0, 6, 4, 1), /* chan_strobe */
144 REG_FIELD(0x4e, 0, 3), /* chan_en */
145 REG_FIELD(0x7a, 0, 2), /* therm_thrsh1 */
146 REG_FIELD(0x78, 0, 2), /* therm_thrsh2 */
149 struct qcom_flash_data
{
150 struct v4l2_flash
**v4l2_flash
;
151 struct regmap_field
*r_fields
[REG_MAX_COUNT
];
153 enum hw_type hw_type
;
161 struct qcom_flash_led
{
162 struct qcom_flash_data
*flash_data
;
163 struct led_classdev_flash flash
;
164 u32 max_flash_current_ma
;
165 u32 max_torch_current_ma
;
167 u32 flash_current_ma
;
168 u32 flash_timeout_ms
;
169 u32 current_in_use_ma
;
175 static int set_flash_module_en(struct qcom_flash_led
*led
, bool en
)
177 struct qcom_flash_data
*flash_data
= led
->flash_data
;
178 u8 led_mask
= 0, enable
;
181 for (i
= 0; i
< led
->chan_count
; i
++)
182 led_mask
|= BIT(led
->chan_id
[i
]);
184 mutex_lock(&flash_data
->lock
);
186 flash_data
->chan_en_bits
|= led_mask
;
188 flash_data
->chan_en_bits
&= ~led_mask
;
190 enable
= !!flash_data
->chan_en_bits
;
191 rc
= regmap_field_write(flash_data
->r_fields
[REG_MODULE_EN
], enable
);
193 dev_err(led
->flash
.led_cdev
.dev
, "write module_en failed, rc=%d\n", rc
);
194 mutex_unlock(&flash_data
->lock
);
199 static int update_allowed_flash_current(struct qcom_flash_led
*led
, u32
*current_ma
, bool strobe
)
201 struct qcom_flash_data
*flash_data
= led
->flash_data
;
202 u32 therm_ma
, avail_ma
, thrsh
[3], min_thrsh
, sts
;
205 mutex_lock(&flash_data
->lock
);
207 * Put previously allocated current into allowed budget in either of these two cases:
208 * 1) LED is disabled;
209 * 2) LED is enabled repeatedly
211 if (!strobe
|| led
->current_in_use_ma
!= 0) {
212 if (flash_data
->total_ma
>= led
->current_in_use_ma
)
213 flash_data
->total_ma
-= led
->current_in_use_ma
;
215 flash_data
->total_ma
= 0;
217 led
->current_in_use_ma
= 0;
223 * Cache the default thermal threshold settings, and set them to the lowest levels before
224 * reading over-temp real time status. If over-temp has been triggered at the lowest
225 * threshold, it's very likely that it would be triggered at a higher (default) threshold
226 * when more flash current is requested. Prevent device from triggering over-temp condition
227 * by limiting the flash current for the new request.
229 rc
= regmap_field_read(flash_data
->r_fields
[REG_THERM_THRSH1
], &thrsh
[0]);
233 rc
= regmap_field_read(flash_data
->r_fields
[REG_THERM_THRSH2
], &thrsh
[1]);
237 if (flash_data
->hw_type
== QCOM_MVFLASH_3CH
) {
238 rc
= regmap_field_read(flash_data
->r_fields
[REG_THERM_THRSH3
], &thrsh
[2]);
243 min_thrsh
= OTST_3CH_MIN_VAL
;
244 if (flash_data
->hw_type
== QCOM_MVFLASH_4CH
)
245 min_thrsh
= (flash_data
->revision
== FLASH_4CH_REVISION_V0P1
) ?
246 OTST1_4CH_V0P1_MIN_VAL
: OTST1_4CH_MIN_VAL
;
248 rc
= regmap_field_write(flash_data
->r_fields
[REG_THERM_THRSH1
], min_thrsh
);
252 if (flash_data
->hw_type
== QCOM_MVFLASH_4CH
)
253 min_thrsh
= OTST2_4CH_MIN_VAL
;
256 * The default thermal threshold settings have been updated hence
257 * restore them if any fault happens starting from here.
259 rc
= regmap_field_write(flash_data
->r_fields
[REG_THERM_THRSH2
], min_thrsh
);
263 if (flash_data
->hw_type
== QCOM_MVFLASH_3CH
) {
264 rc
= regmap_field_write(flash_data
->r_fields
[REG_THERM_THRSH3
], min_thrsh
);
269 /* Read thermal level status to get corresponding derating flash current */
270 rc
= regmap_field_read(flash_data
->r_fields
[REG_STATUS2
], &sts
);
274 therm_ma
= FLASH_TOTAL_CURRENT_MAX_UA
/ 1000;
275 if (flash_data
->hw_type
== QCOM_MVFLASH_3CH
) {
276 if (sts
& FLASH_STS_3CH_OTST3
)
277 therm_ma
= OTST3_MAX_CURRENT_MA
;
278 else if (sts
& FLASH_STS_3CH_OTST2
)
279 therm_ma
= OTST2_MAX_CURRENT_MA
;
280 else if (sts
& FLASH_STS_3CH_OTST1
)
281 therm_ma
= OTST1_MAX_CURRENT_MA
;
283 if (sts
& FLASH_STS_4CH_OTST2
)
284 therm_ma
= OTST2_MAX_CURRENT_MA
;
285 else if (sts
& FLASH_STS_4CH_OTST1
)
286 therm_ma
= OTST1_MAX_CURRENT_MA
;
289 /* Calculate the allowed flash current for the request */
290 if (therm_ma
<= flash_data
->total_ma
)
293 avail_ma
= therm_ma
- flash_data
->total_ma
;
295 *current_ma
= min_t(u32
, *current_ma
, avail_ma
);
296 led
->current_in_use_ma
= *current_ma
;
297 flash_data
->total_ma
+= led
->current_in_use_ma
;
299 dev_dbg(led
->flash
.led_cdev
.dev
, "allowed flash current: %dmA, total current: %dmA\n",
300 led
->current_in_use_ma
, flash_data
->total_ma
);
303 /* Restore to default thermal threshold settings */
304 rc
= regmap_field_write(flash_data
->r_fields
[REG_THERM_THRSH1
], thrsh
[0]);
308 rc
= regmap_field_write(flash_data
->r_fields
[REG_THERM_THRSH2
], thrsh
[1]);
312 if (flash_data
->hw_type
== QCOM_MVFLASH_3CH
)
313 rc
= regmap_field_write(flash_data
->r_fields
[REG_THERM_THRSH3
], thrsh
[2]);
316 mutex_unlock(&flash_data
->lock
);
320 static int set_flash_current(struct qcom_flash_led
*led
, u32 current_ma
, enum led_mode mode
)
322 struct qcom_flash_data
*flash_data
= led
->flash_data
;
323 u32 itarg_ua
, ires_ua
;
324 u8 shift
, ires_mask
= 0, ires_val
= 0, chan_id
;
328 * Split the current across the channels and set the
329 * IRESOLUTION and ITARGET registers accordingly.
331 itarg_ua
= (current_ma
* UA_PER_MA
) / led
->chan_count
+ 1;
332 ires_ua
= (mode
== FLASH_MODE
) ? FLASH_IRES_UA
: TORCH_IRES_UA
;
334 for (i
= 0; i
< led
->chan_count
; i
++) {
337 if (itarg_ua
> ires_ua
)
338 itarget
= itarg_ua
/ ires_ua
- 1;
340 chan_id
= led
->chan_id
[i
];
342 rc
= regmap_fields_write(flash_data
->r_fields
[REG_ITARGET
], chan_id
, itarget
);
346 if (flash_data
->hw_type
== QCOM_MVFLASH_3CH
) {
348 ires_mask
|= FLASH_IRES_MASK_3CH
<< shift
;
349 ires_val
|= ((mode
== FLASH_MODE
) ?
350 (FLASH_IRES_12P5MA_VAL
<< shift
) :
351 (FLASH_IRES_5MA_VAL_3CH
<< shift
));
352 } else if (flash_data
->hw_type
== QCOM_MVFLASH_4CH
) {
354 ires_mask
|= FLASH_IRES_MASK_4CH
<< shift
;
355 ires_val
|= ((mode
== FLASH_MODE
) ?
356 (FLASH_IRES_12P5MA_VAL
<< shift
) :
357 (FLASH_IRES_5MA_VAL_4CH
<< shift
));
359 dev_err(led
->flash
.led_cdev
.dev
,
360 "HW type %d is not supported\n", flash_data
->hw_type
);
365 return regmap_field_update_bits(flash_data
->r_fields
[REG_IRESOLUTION
], ires_mask
, ires_val
);
368 static int set_flash_timeout(struct qcom_flash_led
*led
, u32 timeout_ms
)
370 struct qcom_flash_data
*flash_data
= led
->flash_data
;
374 /* set SAFETY_TIMER for all the channels connected to the same LED */
375 timeout_ms
= min_t(u32
, timeout_ms
, led
->max_timeout_ms
);
377 for (i
= 0; i
< led
->chan_count
; i
++) {
378 chan_id
= led
->chan_id
[i
];
380 timer
= timeout_ms
/ FLASH_TIMER_STEP_MS
;
381 timer
= clamp_t(u8
, timer
, 0, FLASH_TIMER_VAL_MASK
);
384 timer
|= FLASH_TIMER_EN_BIT
;
386 rc
= regmap_fields_write(flash_data
->r_fields
[REG_CHAN_TIMER
], chan_id
, timer
);
394 static int set_flash_strobe(struct qcom_flash_led
*led
, enum led_strobe strobe
, bool state
)
396 struct qcom_flash_data
*flash_data
= led
->flash_data
;
397 u8 strobe_sel
, chan_en
, chan_id
, chan_mask
= 0;
400 /* Set SW strobe config for all channels connected to the LED */
401 for (i
= 0; i
< led
->chan_count
; i
++) {
402 chan_id
= led
->chan_id
[i
];
404 if (strobe
== SW_STROBE
)
405 strobe_sel
= FIELD_PREP(FLASH_STROBE_HW_SW_SEL_BIT
, SW_STROBE_VAL
);
407 strobe_sel
= FIELD_PREP(FLASH_STROBE_HW_SW_SEL_BIT
, HW_STROBE_VAL
);
410 FIELD_PREP(FLASH_HW_STROBE_TRIGGER_SEL_BIT
, STROBE_LEVEL_TRIGGER_VAL
) |
411 FIELD_PREP(FLASH_STROBE_POLARITY_BIT
, STROBE_ACTIVE_HIGH_VAL
);
413 rc
= regmap_fields_write(
414 flash_data
->r_fields
[REG_CHAN_STROBE
], chan_id
, strobe_sel
);
418 chan_mask
|= BIT(chan_id
);
421 /* Enable/disable flash channels */
422 chan_en
= state
? chan_mask
: 0;
423 rc
= regmap_field_update_bits(flash_data
->r_fields
[REG_CHAN_EN
], chan_mask
, chan_en
);
427 led
->enabled
= state
;
431 static inline struct qcom_flash_led
*flcdev_to_qcom_fled(struct led_classdev_flash
*flcdev
)
433 return container_of(flcdev
, struct qcom_flash_led
, flash
);
436 static int qcom_flash_brightness_set(struct led_classdev_flash
*fled_cdev
, u32 brightness
)
438 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
440 led
->flash_current_ma
= min_t(u32
, led
->max_flash_current_ma
, brightness
/ UA_PER_MA
);
444 static int qcom_flash_timeout_set(struct led_classdev_flash
*fled_cdev
, u32 timeout
)
446 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
448 led
->flash_timeout_ms
= timeout
/ USEC_PER_MSEC
;
452 static int qcom_flash_strobe_set(struct led_classdev_flash
*fled_cdev
, bool state
)
454 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
457 rc
= set_flash_strobe(led
, SW_STROBE
, false);
461 rc
= update_allowed_flash_current(led
, &led
->flash_current_ma
, state
);
465 rc
= set_flash_current(led
, led
->flash_current_ma
, FLASH_MODE
);
469 rc
= set_flash_timeout(led
, led
->flash_timeout_ms
);
473 rc
= set_flash_module_en(led
, state
);
477 return set_flash_strobe(led
, SW_STROBE
, state
);
480 static int qcom_flash_strobe_get(struct led_classdev_flash
*fled_cdev
, bool *state
)
482 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
484 *state
= led
->enabled
;
488 static int qcom_flash_fault_get(struct led_classdev_flash
*fled_cdev
, u32
*fault
)
490 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
491 struct qcom_flash_data
*flash_data
= led
->flash_data
;
492 u8 shift
, chan_id
, chan_mask
= 0;
493 u8 ot_mask
= 0, oc_mask
= 0, uv_mask
= 0;
494 u32 val
, fault_sts
= 0;
497 rc
= regmap_field_read(flash_data
->r_fields
[REG_STATUS1
], &val
);
501 for (i
= 0; i
< led
->chan_count
; i
++) {
502 chan_id
= led
->chan_id
[i
];
505 if (val
& BIT(shift
))
506 fault_sts
|= LED_FAULT_SHORT_CIRCUIT
;
508 chan_mask
|= BIT(chan_id
);
511 rc
= regmap_field_read(flash_data
->r_fields
[REG_STATUS2
], &val
);
515 if (flash_data
->hw_type
== QCOM_MVFLASH_3CH
) {
516 ot_mask
= FLASH_STS_3CH_OTST1
|
517 FLASH_STS_3CH_OTST2
|
518 FLASH_STS_3CH_OTST3
|
519 FLASH_STS_3CH_BOB_THM_OVERLOAD
;
520 oc_mask
= FLASH_STS_3CH_BOB_ILIM_S1
|
521 FLASH_STS_3CH_BOB_ILIM_S2
|
522 FLASH_STS_3CH_BCL_IBAT
;
523 uv_mask
= FLASH_STS_3CH_VPH_DROOP
;
524 } else if (flash_data
->hw_type
== QCOM_MVFLASH_4CH
) {
525 ot_mask
= FLASH_STS_4CH_OTST2
|
526 FLASH_STS_4CH_OTST1
|
527 FLASH_STS_4CHG_BOB_THM_OVERLOAD
;
528 oc_mask
= FLASH_STS_4CH_BCL_IBAT
|
529 FLASH_STS_4CH_BOB_ILIM_S1
|
530 FLASH_STS_4CH_BOB_ILIM_S2
;
531 uv_mask
= FLASH_STS_4CH_VPH_LOW
;
535 fault_sts
|= LED_FAULT_OVER_TEMPERATURE
;
538 fault_sts
|= LED_FAULT_OVER_CURRENT
;
541 fault_sts
|= LED_FAULT_INPUT_VOLTAGE
;
543 rc
= regmap_field_read(flash_data
->r_fields
[REG_STATUS3
], &val
);
547 if (flash_data
->hw_type
== QCOM_MVFLASH_3CH
) {
549 fault_sts
|= LED_FAULT_TIMEOUT
;
550 } else if (flash_data
->hw_type
== QCOM_MVFLASH_4CH
) {
551 for (i
= 0; i
< led
->chan_count
; i
++) {
552 chan_id
= led
->chan_id
[i
];
555 if (val
& BIT(shift
))
556 fault_sts
|= LED_FAULT_TIMEOUT
;
564 static int qcom_flash_led_brightness_set(struct led_classdev
*led_cdev
,
565 enum led_brightness brightness
)
567 struct led_classdev_flash
*fled_cdev
= lcdev_to_flcdev(led_cdev
);
568 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
569 u32 current_ma
= brightness
* led
->max_torch_current_ma
/ LED_FULL
;
570 bool enable
= !!brightness
;
573 rc
= set_flash_strobe(led
, SW_STROBE
, false);
577 rc
= set_flash_module_en(led
, false);
581 rc
= update_allowed_flash_current(led
, ¤t_ma
, enable
);
585 rc
= set_flash_current(led
, current_ma
, TORCH_MODE
);
589 /* Disable flash timeout for torch LED */
590 rc
= set_flash_timeout(led
, 0);
594 rc
= set_flash_module_en(led
, enable
);
598 return set_flash_strobe(led
, SW_STROBE
, enable
);
601 static const struct led_flash_ops qcom_flash_ops
= {
602 .flash_brightness_set
= qcom_flash_brightness_set
,
603 .strobe_set
= qcom_flash_strobe_set
,
604 .strobe_get
= qcom_flash_strobe_get
,
605 .timeout_set
= qcom_flash_timeout_set
,
606 .fault_get
= qcom_flash_fault_get
,
609 #if IS_ENABLED(CONFIG_V4L2_FLASH_LED_CLASS)
610 static int qcom_flash_external_strobe_set(struct v4l2_flash
*v4l2_flash
, bool enable
)
612 struct led_classdev_flash
*fled_cdev
= v4l2_flash
->fled_cdev
;
613 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
616 rc
= set_flash_module_en(led
, enable
);
621 return set_flash_strobe(led
, HW_STROBE
, true);
623 return set_flash_strobe(led
, SW_STROBE
, false);
626 static enum led_brightness
627 qcom_flash_intensity_to_led_brightness(struct v4l2_flash
*v4l2_flash
, s32 intensity
)
629 struct led_classdev_flash
*fled_cdev
= v4l2_flash
->fled_cdev
;
630 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
631 u32 current_ma
= intensity
/ UA_PER_MA
;
633 current_ma
= min_t(u32
, current_ma
, led
->max_torch_current_ma
);
637 return (current_ma
* LED_FULL
) / led
->max_torch_current_ma
;
640 static s32
qcom_flash_brightness_to_led_intensity(struct v4l2_flash
*v4l2_flash
,
641 enum led_brightness brightness
)
643 struct led_classdev_flash
*fled_cdev
= v4l2_flash
->fled_cdev
;
644 struct qcom_flash_led
*led
= flcdev_to_qcom_fled(fled_cdev
);
646 return (brightness
* led
->max_torch_current_ma
* UA_PER_MA
) / LED_FULL
;
649 static const struct v4l2_flash_ops qcom_v4l2_flash_ops
= {
650 .external_strobe_set
= qcom_flash_external_strobe_set
,
651 .intensity_to_led_brightness
= qcom_flash_intensity_to_led_brightness
,
652 .led_brightness_to_intensity
= qcom_flash_brightness_to_led_intensity
,
656 qcom_flash_v4l2_init(struct device
*dev
, struct qcom_flash_led
*led
, struct fwnode_handle
*fwnode
)
658 struct qcom_flash_data
*flash_data
= led
->flash_data
;
659 struct v4l2_flash_config v4l2_cfg
= { 0 };
660 struct led_flash_setting
*intensity
= &v4l2_cfg
.intensity
;
661 struct v4l2_flash
*v4l2_flash
;
663 if (!(led
->flash
.led_cdev
.flags
& LED_DEV_CAP_FLASH
))
666 intensity
->min
= intensity
->step
= TORCH_IRES_UA
* led
->chan_count
;
667 intensity
->max
= led
->max_torch_current_ma
* UA_PER_MA
;
668 intensity
->val
= min_t(u32
, intensity
->max
, TORCH_CURRENT_DEFAULT_UA
);
670 strscpy(v4l2_cfg
.dev_name
, led
->flash
.led_cdev
.dev
->kobj
.name
,
671 sizeof(v4l2_cfg
.dev_name
));
673 v4l2_cfg
.has_external_strobe
= true;
674 v4l2_cfg
.flash_faults
= LED_FAULT_INPUT_VOLTAGE
|
675 LED_FAULT_OVER_CURRENT
|
676 LED_FAULT_SHORT_CIRCUIT
|
677 LED_FAULT_OVER_TEMPERATURE
|
680 v4l2_flash
= v4l2_flash_init(dev
, fwnode
, &led
->flash
, &qcom_v4l2_flash_ops
, &v4l2_cfg
);
681 if (IS_ERR(v4l2_flash
))
682 return PTR_ERR(v4l2_flash
);
684 flash_data
->v4l2_flash
[flash_data
->leds_count
] = v4l2_flash
;
689 qcom_flash_v4l2_init(struct device
*dev
, struct qcom_flash_led
*led
, struct fwnode_handle
*fwnode
)
695 static int qcom_flash_register_led_device(struct device
*dev
,
696 struct fwnode_handle
*node
, struct qcom_flash_led
*led
)
698 struct qcom_flash_data
*flash_data
= led
->flash_data
;
699 struct led_init_data init_data
;
700 struct led_classdev_flash
*flash
= &led
->flash
;
701 struct led_flash_setting
*brightness
, *timeout
;
702 u32 current_ua
, timeout_us
;
706 count
= fwnode_property_count_u32(node
, "led-sources");
708 dev_err(dev
, "No led-sources specified\n");
712 if (count
> flash_data
->max_channels
) {
713 dev_err(dev
, "led-sources count %u exceeds maximum channel count %u\n",
714 count
, flash_data
->max_channels
);
718 rc
= fwnode_property_read_u32_array(node
, "led-sources", channels
, count
);
720 dev_err(dev
, "Failed to read led-sources property, rc=%d\n", rc
);
724 led
->chan_count
= count
;
725 led
->chan_id
= devm_kcalloc(dev
, count
, sizeof(u8
), GFP_KERNEL
);
729 for (i
= 0; i
< count
; i
++) {
730 if ((channels
[i
] == 0) || (channels
[i
] > flash_data
->max_channels
)) {
731 dev_err(dev
, "led-source out of HW support range [1-%u]\n",
732 flash_data
->max_channels
);
736 /* Make chan_id indexing from 0 */
737 led
->chan_id
[i
] = channels
[i
] - 1;
740 rc
= fwnode_property_read_u32(node
, "led-max-microamp", ¤t_ua
);
742 dev_err(dev
, "Failed to read led-max-microamp property, rc=%d\n", rc
);
746 if (current_ua
== 0) {
747 dev_err(dev
, "led-max-microamp shouldn't be 0\n");
751 current_ua
= min_t(u32
, current_ua
, TORCH_CURRENT_MAX_UA
* led
->chan_count
);
752 led
->max_torch_current_ma
= current_ua
/ UA_PER_MA
;
754 if (fwnode_property_present(node
, "flash-max-microamp")) {
755 flash
->led_cdev
.flags
|= LED_DEV_CAP_FLASH
;
757 rc
= fwnode_property_read_u32(node
, "flash-max-microamp", ¤t_ua
);
759 dev_err(dev
, "Failed to read flash-max-microamp property, rc=%d\n",
764 current_ua
= min_t(u32
, current_ua
, FLASH_CURRENT_MAX_UA
* led
->chan_count
);
765 current_ua
= min_t(u32
, current_ua
, FLASH_TOTAL_CURRENT_MAX_UA
);
767 /* Initialize flash class LED device brightness settings */
768 brightness
= &flash
->brightness
;
769 brightness
->min
= brightness
->step
= FLASH_IRES_UA
* led
->chan_count
;
770 brightness
->max
= current_ua
;
771 brightness
->val
= min_t(u32
, current_ua
, FLASH_CURRENT_DEFAULT_UA
);
773 led
->max_flash_current_ma
= current_ua
/ UA_PER_MA
;
774 led
->flash_current_ma
= brightness
->val
/ UA_PER_MA
;
776 rc
= fwnode_property_read_u32(node
, "flash-max-timeout-us", &timeout_us
);
778 dev_err(dev
, "Failed to read flash-max-timeout-us property, rc=%d\n",
783 timeout_us
= min_t(u32
, timeout_us
, FLASH_TIMEOUT_MAX_US
);
785 /* Initialize flash class LED device timeout settings */
786 timeout
= &flash
->timeout
;
787 timeout
->min
= timeout
->step
= FLASH_TIMEOUT_STEP_US
;
788 timeout
->val
= timeout
->max
= timeout_us
;
790 led
->max_timeout_ms
= led
->flash_timeout_ms
= timeout_us
/ USEC_PER_MSEC
;
792 flash
->ops
= &qcom_flash_ops
;
795 flash
->led_cdev
.brightness_set_blocking
= qcom_flash_led_brightness_set
;
797 init_data
.fwnode
= node
;
798 init_data
.devicename
= NULL
;
799 init_data
.default_label
= NULL
;
800 init_data
.devname_mandatory
= false;
802 rc
= devm_led_classdev_flash_register_ext(dev
, flash
, &init_data
);
804 dev_err(dev
, "Register flash LED classdev failed, rc=%d\n", rc
);
808 return qcom_flash_v4l2_init(dev
, led
, node
);
811 static int qcom_flash_led_probe(struct platform_device
*pdev
)
813 struct qcom_flash_data
*flash_data
;
814 struct qcom_flash_led
*led
;
815 struct device
*dev
= &pdev
->dev
;
816 struct regmap
*regmap
;
817 struct reg_field
*regs
;
821 flash_data
= devm_kzalloc(dev
, sizeof(*flash_data
), GFP_KERNEL
);
825 regmap
= dev_get_regmap(dev
->parent
, NULL
);
827 dev_err(dev
, "Failed to get parent regmap\n");
831 rc
= fwnode_property_read_u32(dev
->fwnode
, "reg", ®_base
);
833 dev_err(dev
, "Failed to get register base address, rc=%d\n", rc
);
837 rc
= regmap_read(regmap
, reg_base
+ FLASH_TYPE_REG
, &val
);
839 dev_err(dev
, "Read flash LED module type failed, rc=%d\n", rc
);
843 if (val
!= FLASH_TYPE_VAL
) {
844 dev_err(dev
, "type %#x is not a flash LED module\n", val
);
848 rc
= regmap_read(regmap
, reg_base
+ FLASH_SUBTYPE_REG
, &val
);
850 dev_err(dev
, "Read flash LED module subtype failed, rc=%d\n", rc
);
854 if (val
== FLASH_SUBTYPE_3CH_PM8150_VAL
|| val
== FLASH_SUBTYPE_3CH_PMI8998_VAL
) {
855 flash_data
->hw_type
= QCOM_MVFLASH_3CH
;
856 flash_data
->max_channels
= 3;
857 regs
= mvflash_3ch_regs
;
858 } else if (val
== FLASH_SUBTYPE_4CH_VAL
) {
859 flash_data
->hw_type
= QCOM_MVFLASH_4CH
;
860 flash_data
->max_channels
= 4;
861 regs
= mvflash_4ch_regs
;
863 rc
= regmap_read(regmap
, reg_base
+ FLASH_REVISION_REG
, &val
);
865 dev_err(dev
, "Failed to read flash LED module revision, rc=%d\n", rc
);
869 flash_data
->revision
= val
;
871 dev_err(dev
, "flash LED subtype %#x is not yet supported\n", val
);
875 for (i
= 0; i
< REG_MAX_COUNT
; i
++)
876 regs
[i
].reg
+= reg_base
;
878 rc
= devm_regmap_field_bulk_alloc(dev
, regmap
, flash_data
->r_fields
, regs
, REG_MAX_COUNT
);
880 dev_err(dev
, "Failed to allocate regmap field, rc=%d\n", rc
);
884 platform_set_drvdata(pdev
, flash_data
);
885 mutex_init(&flash_data
->lock
);
887 count
= device_get_child_node_count(dev
);
888 if (count
== 0 || count
> flash_data
->max_channels
) {
889 dev_err(dev
, "No child or child count exceeds %d\n", flash_data
->max_channels
);
893 flash_data
->v4l2_flash
= devm_kcalloc(dev
, count
,
894 sizeof(*flash_data
->v4l2_flash
), GFP_KERNEL
);
895 if (!flash_data
->v4l2_flash
)
898 device_for_each_child_node_scoped(dev
, child
) {
899 led
= devm_kzalloc(dev
, sizeof(*led
), GFP_KERNEL
);
905 led
->flash_data
= flash_data
;
906 rc
= qcom_flash_register_led_device(dev
, child
, led
);
910 flash_data
->leds_count
++;
916 while (flash_data
->v4l2_flash
[flash_data
->leds_count
] && flash_data
->leds_count
)
917 v4l2_flash_release(flash_data
->v4l2_flash
[flash_data
->leds_count
--]);
921 static void qcom_flash_led_remove(struct platform_device
*pdev
)
923 struct qcom_flash_data
*flash_data
= platform_get_drvdata(pdev
);
925 while (flash_data
->v4l2_flash
[flash_data
->leds_count
] && flash_data
->leds_count
)
926 v4l2_flash_release(flash_data
->v4l2_flash
[flash_data
->leds_count
--]);
928 mutex_destroy(&flash_data
->lock
);
931 static const struct of_device_id qcom_flash_led_match_table
[] = {
932 { .compatible
= "qcom,spmi-flash-led" },
936 MODULE_DEVICE_TABLE(of
, qcom_flash_led_match_table
);
937 static struct platform_driver qcom_flash_led_driver
= {
939 .name
= "leds-qcom-flash",
940 .of_match_table
= qcom_flash_led_match_table
,
942 .probe
= qcom_flash_led_probe
,
943 .remove
= qcom_flash_led_remove
,
946 module_platform_driver(qcom_flash_led_driver
);
948 MODULE_DESCRIPTION("QCOM Flash LED driver");
949 MODULE_LICENSE("GPL");