blob: b045e3bd3e63509489226ac58d97c922f7d4ec45 [file] [log] [blame]
David Collins8885f792017-01-26 14:36:34 -08001/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#define pr_fmt(fmt) "flashv2: %s: " fmt, __func__
14
15#include <linux/module.h>
16#include <linux/init.h>
17#include <linux/kernel.h>
18#include <linux/errno.h>
19#include <linux/delay.h>
20#include <linux/slab.h>
21#include <linux/of.h>
22#include <linux/of_irq.h>
23#include <linux/of_gpio.h>
24#include <linux/gpio.h>
25#include <linux/regmap.h>
26#include <linux/power_supply.h>
27#include <linux/platform_device.h>
28#include <linux/interrupt.h>
29#include <linux/regulator/consumer.h>
30#include <linux/leds-qpnp-flash.h>
31#include <linux/leds-qpnp-flash-v2.h>
32#include <linux/qpnp/qpnp-revid.h>
33#include <linux/log2.h>
34#include "leds.h"
35
36#define FLASH_LED_REG_LED_STATUS1(base) (base + 0x08)
37#define FLASH_LED_REG_LED_STATUS2(base) (base + 0x09)
38#define FLASH_LED_REG_INT_RT_STS(base) (base + 0x10)
39#define FLASH_LED_REG_SAFETY_TMR(base) (base + 0x40)
40#define FLASH_LED_REG_TGR_CURRENT(base) (base + 0x43)
41#define FLASH_LED_REG_MOD_CTRL(base) (base + 0x46)
42#define FLASH_LED_REG_IRES(base) (base + 0x47)
43#define FLASH_LED_REG_STROBE_CFG(base) (base + 0x48)
44#define FLASH_LED_REG_STROBE_CTRL(base) (base + 0x49)
45#define FLASH_LED_EN_LED_CTRL(base) (base + 0x4C)
46#define FLASH_LED_REG_HDRM_PRGM(base) (base + 0x4D)
47#define FLASH_LED_REG_HDRM_AUTO_MODE_CTRL(base) (base + 0x50)
48#define FLASH_LED_REG_WARMUP_DELAY(base) (base + 0x51)
49#define FLASH_LED_REG_ISC_DELAY(base) (base + 0x52)
50#define FLASH_LED_REG_THERMAL_RMP_DN_RATE(base) (base + 0x55)
51#define FLASH_LED_REG_THERMAL_THRSH1(base) (base + 0x56)
52#define FLASH_LED_REG_THERMAL_THRSH2(base) (base + 0x57)
53#define FLASH_LED_REG_THERMAL_THRSH3(base) (base + 0x58)
54#define FLASH_LED_REG_THERMAL_HYSTERESIS(base) (base + 0x59)
55#define FLASH_LED_REG_THERMAL_DEBOUNCE(base) (base + 0x5A)
56#define FLASH_LED_REG_VPH_DROOP_THRESHOLD(base) (base + 0x61)
57#define FLASH_LED_REG_VPH_DROOP_DEBOUNCE(base) (base + 0x62)
58#define FLASH_LED_REG_ILED_GRT_THRSH(base) (base + 0x67)
59#define FLASH_LED_REG_LED1N2_ICLAMP_LOW(base) (base + 0x68)
60#define FLASH_LED_REG_LED1N2_ICLAMP_MID(base) (base + 0x69)
61#define FLASH_LED_REG_LED3_ICLAMP_LOW(base) (base + 0x6A)
62#define FLASH_LED_REG_LED3_ICLAMP_MID(base) (base + 0x6B)
63#define FLASH_LED_REG_MITIGATION_SEL(base) (base + 0x6E)
64#define FLASH_LED_REG_MITIGATION_SW(base) (base + 0x6F)
65#define FLASH_LED_REG_LMH_LEVEL(base) (base + 0x70)
66#define FLASH_LED_REG_CURRENT_DERATE_EN(base) (base + 0x76)
67
68#define FLASH_LED_HDRM_VOL_MASK GENMASK(7, 4)
69#define FLASH_LED_CURRENT_MASK GENMASK(6, 0)
70#define FLASH_LED_ENABLE_MASK GENMASK(2, 0)
71#define FLASH_HW_STROBE_MASK GENMASK(2, 0)
72#define FLASH_LED_ISC_WARMUP_DELAY_MASK GENMASK(1, 0)
73#define FLASH_LED_CURRENT_DERATE_EN_MASK GENMASK(2, 0)
74#define FLASH_LED_VPH_DROOP_DEBOUNCE_MASK GENMASK(1, 0)
75#define FLASH_LED_CHGR_MITIGATION_SEL_MASK GENMASK(5, 4)
76#define FLASH_LED_LMH_MITIGATION_SEL_MASK GENMASK(1, 0)
77#define FLASH_LED_ILED_GRT_THRSH_MASK GENMASK(5, 0)
78#define FLASH_LED_LMH_LEVEL_MASK GENMASK(1, 0)
79#define FLASH_LED_VPH_DROOP_HYSTERESIS_MASK GENMASK(5, 4)
80#define FLASH_LED_VPH_DROOP_THRESHOLD_MASK GENMASK(2, 0)
81#define FLASH_LED_THERMAL_HYSTERESIS_MASK GENMASK(1, 0)
82#define FLASH_LED_THERMAL_DEBOUNCE_MASK GENMASK(1, 0)
83#define FLASH_LED_THERMAL_THRSH_MASK GENMASK(2, 0)
84#define FLASH_LED_MOD_CTRL_MASK BIT(7)
85#define FLASH_LED_HW_SW_STROBE_SEL_BIT BIT(2)
86#define FLASH_LED_VPH_DROOP_FAULT_MASK BIT(4)
87#define FLASH_LED_LMH_MITIGATION_EN_MASK BIT(0)
88#define FLASH_LED_CHGR_MITIGATION_EN_MASK BIT(4)
89#define THERMAL_OTST1_RAMP_CTRL_MASK BIT(7)
90#define THERMAL_OTST1_RAMP_CTRL_SHIFT 7
91#define THERMAL_DERATE_SLOW_SHIFT 4
92#define THERMAL_DERATE_SLOW_MASK GENMASK(6, 4)
93#define THERMAL_DERATE_FAST_MASK GENMASK(2, 0)
94
95#define VPH_DROOP_DEBOUNCE_US_TO_VAL(val_us) (val_us / 8)
96#define VPH_DROOP_HYST_MV_TO_VAL(val_mv) (val_mv / 25)
97#define VPH_DROOP_THRESH_MV_TO_VAL(val_mv) ((val_mv / 100) - 25)
98#define VPH_DROOP_THRESH_VAL_TO_UV(val) ((val + 25) * 100000)
99#define MITIGATION_THRSH_MA_TO_VAL(val_ma) (val_ma / 100)
100#define CURRENT_MA_TO_REG_VAL(curr_ma, ires_ua) ((curr_ma * 1000) / ires_ua - 1)
101#define SAFETY_TMR_TO_REG_VAL(duration_ms) ((duration_ms / 10) - 1)
102#define THERMAL_HYST_TEMP_TO_VAL(val, divisor) (val / divisor)
103
104#define FLASH_LED_ISC_WARMUP_DELAY_SHIFT 6
105#define FLASH_LED_WARMUP_DELAY_DEFAULT 2
106#define FLASH_LED_ISC_DELAY_DEFAULT 3
107#define FLASH_LED_VPH_DROOP_DEBOUNCE_DEFAULT 2
108#define FLASH_LED_VPH_DROOP_HYST_SHIFT 4
109#define FLASH_LED_VPH_DROOP_HYST_DEFAULT 2
110#define FLASH_LED_VPH_DROOP_THRESH_DEFAULT 5
111#define FLASH_LED_DEBOUNCE_MAX 3
112#define FLASH_LED_HYSTERESIS_MAX 3
113#define FLASH_LED_VPH_DROOP_THRESH_MAX 7
114#define THERMAL_DERATE_SLOW_MAX 314592
115#define THERMAL_DERATE_FAST_MAX 512
116#define THERMAL_DEBOUNCE_TIME_MAX 64
117#define THERMAL_DERATE_HYSTERESIS_MAX 3
118#define FLASH_LED_THERMAL_THRSH_MIN 3
119#define FLASH_LED_THERMAL_THRSH_MAX 7
120#define FLASH_LED_THERMAL_OTST_LEVELS 3
121#define FLASH_LED_VLED_MAX_DEFAULT_UV 3500000
122#define FLASH_LED_IBATT_OCP_THRESH_DEFAULT_UA 4500000
123#define FLASH_LED_RPARA_DEFAULT_UOHM 0
124#define FLASH_LED_SAFETY_TMR_ENABLE BIT(7)
125#define FLASH_LED_LMH_LEVEL_DEFAULT 0
126#define FLASH_LED_LMH_MITIGATION_ENABLE 1
127#define FLASH_LED_LMH_MITIGATION_DISABLE 0
128#define FLASH_LED_CHGR_MITIGATION_ENABLE BIT(4)
129#define FLASH_LED_CHGR_MITIGATION_DISABLE 0
130#define FLASH_LED_MITIGATION_SEL_DEFAULT 2
131#define FLASH_LED_MITIGATION_SEL_MAX 2
132#define FLASH_LED_CHGR_MITIGATION_SEL_SHIFT 4
133#define FLASH_LED_MITIGATION_THRSH_DEFAULT 0xA
134#define FLASH_LED_MITIGATION_THRSH_MAX 0x1F
135#define FLASH_LED_LMH_OCV_THRESH_DEFAULT_UV 3700000
136#define FLASH_LED_LMH_RBATT_THRESH_DEFAULT_UOHM 400000
137#define FLASH_LED_IRES_BASE 3
138#define FLASH_LED_IRES_DIVISOR 2500
139#define FLASH_LED_IRES_MIN_UA 5000
140#define FLASH_LED_IRES_DEFAULT_UA 12500
141#define FLASH_LED_IRES_DEFAULT_VAL 0x00
142#define FLASH_LED_HDRM_VOL_SHIFT 4
143#define FLASH_LED_HDRM_VOL_DEFAULT_MV 0x80
144#define FLASH_LED_HDRM_VOL_HI_LO_WIN_DEFAULT_MV 0x04
145#define FLASH_LED_HDRM_VOL_BASE_MV 125
146#define FLASH_LED_HDRM_VOL_STEP_MV 25
147#define FLASH_LED_STROBE_CFG_DEFAULT 0x00
148#define FLASH_LED_HW_STROBE_OPTION_1 0x00
149#define FLASH_LED_HW_STROBE_OPTION_2 0x01
150#define FLASH_LED_HW_STROBE_OPTION_3 0x02
151#define FLASH_LED_ENABLE BIT(0)
152#define FLASH_LED_MOD_ENABLE BIT(7)
153#define FLASH_LED_DISABLE 0x00
154#define FLASH_LED_SAFETY_TMR_DISABLED 0x13
155#define FLASH_LED_MIN_CURRENT_MA 25
156#define FLASH_LED_MAX_TOTAL_CURRENT_MA 3750
157
158/* notifier call chain for flash-led irqs */
159static ATOMIC_NOTIFIER_HEAD(irq_notifier_list);
160
161enum flash_led_type {
162 FLASH_LED_TYPE_FLASH,
163 FLASH_LED_TYPE_TORCH,
164};
165
166enum {
167 LED1 = 0,
168 LED2,
169 LED3,
170};
171
172/*
173 * Configurations for each individual LED
174 */
175struct flash_node_data {
176 struct platform_device *pdev;
177 struct led_classdev cdev;
178 struct pinctrl *pinctrl;
179 struct pinctrl_state *gpio_state_active;
180 struct pinctrl_state *gpio_state_suspend;
181 struct pinctrl_state *hw_strobe_state_active;
182 struct pinctrl_state *hw_strobe_state_suspend;
183 int hw_strobe_gpio;
184 int ires_ua;
185 int max_current;
186 int current_ma;
187 u8 duration;
188 u8 id;
189 u8 type;
190 u8 ires;
191 u8 hdrm_val;
192 u8 current_reg_val;
193 u8 trigger;
194 bool led_on;
195};
196
197
198struct flash_switch_data {
199 struct platform_device *pdev;
200 struct regulator *vreg;
201 struct led_classdev cdev;
202 int led_mask;
203 bool regulator_on;
204 bool enabled;
205};
206
207/*
208 * Flash LED configuration read from device tree
209 */
210struct flash_led_platform_data {
211 struct pmic_revid_data *pmic_rev_id;
212 int *thermal_derate_current;
213 int all_ramp_up_done_irq;
214 int all_ramp_down_done_irq;
215 int led_fault_irq;
216 int ibatt_ocp_threshold_ua;
217 int vled_max_uv;
218 int rpara_uohm;
219 int lmh_rbatt_threshold_uohm;
220 int lmh_ocv_threshold_uv;
221 int thermal_derate_slow;
222 int thermal_derate_fast;
223 int thermal_hysteresis;
224 int thermal_debounce;
225 int thermal_thrsh1;
226 int thermal_thrsh2;
227 int thermal_thrsh3;
228 u32 led1n2_iclamp_low_ma;
229 u32 led1n2_iclamp_mid_ma;
230 u32 led3_iclamp_low_ma;
231 u32 led3_iclamp_mid_ma;
232 u8 isc_delay;
233 u8 warmup_delay;
234 u8 current_derate_en_cfg;
235 u8 vph_droop_threshold;
236 u8 vph_droop_hysteresis;
237 u8 vph_droop_debounce;
238 u8 lmh_mitigation_sel;
239 u8 chgr_mitigation_sel;
240 u8 lmh_level;
241 u8 iled_thrsh_val;
242 u8 hw_strobe_option;
243 bool hdrm_auto_mode_en;
244 bool thermal_derate_en;
245 bool otst_ramp_bkup_en;
246};
247
248/*
249 * Flash LED data structure containing flash LED attributes
250 */
251struct qpnp_flash_led {
252 struct flash_led_platform_data *pdata;
253 struct platform_device *pdev;
254 struct regmap *regmap;
255 struct flash_node_data *fnode;
256 struct flash_switch_data *snode;
257 struct power_supply *bms_psy;
258 struct notifier_block nb;
259 spinlock_t lock;
260 int num_fnodes;
261 int num_snodes;
262 int enable;
263 u16 base;
264 bool trigger_lmh;
265 bool trigger_chgr;
266};
267
268static int thermal_derate_slow_table[] = {
269 128, 256, 512, 1024, 2048, 4096, 8192, 314592,
270};
271
272static int thermal_derate_fast_table[] = {
273 32, 64, 96, 128, 256, 384, 512,
274};
275
276static int otst1_threshold_table[] = {
277 85, 79, 73, 67, 109, 103, 97, 91,
278};
279
280static int otst2_threshold_table[] = {
281 110, 104, 98, 92, 134, 128, 122, 116,
282};
283
284static int otst3_threshold_table[] = {
285 125, 119, 113, 107, 149, 143, 137, 131,
286};
287
288static int qpnp_flash_led_read(struct qpnp_flash_led *led, u16 addr, u8 *data)
289{
290 int rc;
291 uint val;
292
293 rc = regmap_read(led->regmap, addr, &val);
294 if (rc < 0) {
295 pr_err("Unable to read from 0x%04X rc = %d\n", addr, rc);
296 return rc;
297 }
298
299 pr_debug("Read 0x%02X from addr 0x%04X\n", val, addr);
300 *data = (u8)val;
301 return 0;
302}
303
304static int qpnp_flash_led_write(struct qpnp_flash_led *led, u16 addr, u8 data)
305{
306 int rc;
307
308 rc = regmap_write(led->regmap, addr, data);
309 if (rc < 0) {
310 pr_err("Unable to write to 0x%04X rc = %d\n", addr, rc);
311 return rc;
312 }
313
314 pr_debug("Wrote 0x%02X to addr 0x%04X\n", data, addr);
315 return 0;
316}
317
318static int
319qpnp_flash_led_masked_read(struct qpnp_flash_led *led, u16 addr, u8 mask,
320 u8 *val)
321{
322 int rc;
323
324 rc = qpnp_flash_led_read(led, addr, val);
325 if (rc < 0)
326 return rc;
327
328 *val &= mask;
329 return rc;
330}
331
332static int
333qpnp_flash_led_masked_write(struct qpnp_flash_led *led, u16 addr, u8 mask,
334 u8 val)
335{
336 int rc;
337
338 rc = regmap_update_bits(led->regmap, addr, mask, val);
339 if (rc < 0)
340 pr_err("Unable to update bits from 0x%04X, rc = %d\n", addr,
341 rc);
342 else
343 pr_debug("Wrote 0x%02X to addr 0x%04X\n", val, addr);
344
345 return rc;
346}
347
348static enum
349led_brightness qpnp_flash_led_brightness_get(struct led_classdev *led_cdev)
350{
351 return led_cdev->brightness;
352}
353
354static int qpnp_flash_led_init_settings(struct qpnp_flash_led *led)
355{
356 int rc, i, addr_offset;
357 u8 val = 0, mask;
358
359 for (i = 0; i < led->num_fnodes; i++) {
360 addr_offset = led->fnode[i].id;
361 rc = qpnp_flash_led_write(led,
362 FLASH_LED_REG_HDRM_PRGM(led->base + addr_offset),
363 led->fnode[i].hdrm_val);
364 if (rc < 0)
365 return rc;
366
367 val |= 0x1 << led->fnode[i].id;
368 }
369
370 rc = qpnp_flash_led_write(led,
371 FLASH_LED_REG_HDRM_AUTO_MODE_CTRL(led->base),
372 val);
373 if (rc < 0)
374 return rc;
375
376 rc = qpnp_flash_led_masked_write(led,
377 FLASH_LED_REG_ISC_DELAY(led->base),
378 FLASH_LED_ISC_WARMUP_DELAY_MASK,
379 led->pdata->isc_delay);
380 if (rc < 0)
381 return rc;
382
383 rc = qpnp_flash_led_masked_write(led,
384 FLASH_LED_REG_WARMUP_DELAY(led->base),
385 FLASH_LED_ISC_WARMUP_DELAY_MASK,
386 led->pdata->warmup_delay);
387 if (rc < 0)
388 return rc;
389
390 rc = qpnp_flash_led_masked_write(led,
391 FLASH_LED_REG_CURRENT_DERATE_EN(led->base),
392 FLASH_LED_CURRENT_DERATE_EN_MASK,
393 led->pdata->current_derate_en_cfg);
394 if (rc < 0)
395 return rc;
396
397 val = (led->pdata->otst_ramp_bkup_en << THERMAL_OTST1_RAMP_CTRL_SHIFT);
398 mask = THERMAL_OTST1_RAMP_CTRL_MASK;
399 if (led->pdata->thermal_derate_slow >= 0) {
400 val |= (led->pdata->thermal_derate_slow <<
401 THERMAL_DERATE_SLOW_SHIFT);
402 mask |= THERMAL_DERATE_SLOW_MASK;
403 }
404
405 if (led->pdata->thermal_derate_fast >= 0) {
406 val |= led->pdata->thermal_derate_fast;
407 mask |= THERMAL_DERATE_FAST_MASK;
408 }
409
410 rc = qpnp_flash_led_masked_write(led,
411 FLASH_LED_REG_THERMAL_RMP_DN_RATE(led->base),
412 mask, val);
413 if (rc < 0)
414 return rc;
415
416 if (led->pdata->thermal_debounce >= 0) {
417 rc = qpnp_flash_led_masked_write(led,
418 FLASH_LED_REG_THERMAL_DEBOUNCE(led->base),
419 FLASH_LED_THERMAL_DEBOUNCE_MASK,
420 led->pdata->thermal_debounce);
421 if (rc < 0)
422 return rc;
423 }
424
425 if (led->pdata->thermal_hysteresis >= 0) {
426 rc = qpnp_flash_led_masked_write(led,
427 FLASH_LED_REG_THERMAL_HYSTERESIS(led->base),
428 FLASH_LED_THERMAL_HYSTERESIS_MASK,
429 led->pdata->thermal_hysteresis);
430 if (rc < 0)
431 return rc;
432 }
433
434 if (led->pdata->thermal_thrsh1 >= 0) {
435 rc = qpnp_flash_led_masked_write(led,
436 FLASH_LED_REG_THERMAL_THRSH1(led->base),
437 FLASH_LED_THERMAL_THRSH_MASK,
438 led->pdata->thermal_thrsh1);
439 if (rc < 0)
440 return rc;
441 }
442
443 if (led->pdata->thermal_thrsh2 >= 0) {
444 rc = qpnp_flash_led_masked_write(led,
445 FLASH_LED_REG_THERMAL_THRSH2(led->base),
446 FLASH_LED_THERMAL_THRSH_MASK,
447 led->pdata->thermal_thrsh2);
448 if (rc < 0)
449 return rc;
450 }
451
452 if (led->pdata->thermal_thrsh3 >= 0) {
453 rc = qpnp_flash_led_masked_write(led,
454 FLASH_LED_REG_THERMAL_THRSH3(led->base),
455 FLASH_LED_THERMAL_THRSH_MASK,
456 led->pdata->thermal_thrsh3);
457 if (rc < 0)
458 return rc;
459 }
460
461 rc = qpnp_flash_led_masked_write(led,
462 FLASH_LED_REG_VPH_DROOP_DEBOUNCE(led->base),
463 FLASH_LED_VPH_DROOP_DEBOUNCE_MASK,
464 led->pdata->vph_droop_debounce);
465 if (rc < 0)
466 return rc;
467
468 rc = qpnp_flash_led_masked_write(led,
469 FLASH_LED_REG_VPH_DROOP_THRESHOLD(led->base),
470 FLASH_LED_VPH_DROOP_THRESHOLD_MASK,
471 led->pdata->vph_droop_threshold);
472 if (rc < 0)
473 return rc;
474
475 rc = qpnp_flash_led_masked_write(led,
476 FLASH_LED_REG_VPH_DROOP_THRESHOLD(led->base),
477 FLASH_LED_VPH_DROOP_HYSTERESIS_MASK,
478 led->pdata->vph_droop_hysteresis);
479 if (rc < 0)
480 return rc;
481
482 rc = qpnp_flash_led_masked_write(led,
483 FLASH_LED_REG_MITIGATION_SEL(led->base),
484 FLASH_LED_LMH_MITIGATION_SEL_MASK,
485 led->pdata->lmh_mitigation_sel);
486 if (rc < 0)
487 return rc;
488
489 rc = qpnp_flash_led_masked_write(led,
490 FLASH_LED_REG_MITIGATION_SEL(led->base),
491 FLASH_LED_CHGR_MITIGATION_SEL_MASK,
492 led->pdata->chgr_mitigation_sel);
493 if (rc < 0)
494 return rc;
495
496 rc = qpnp_flash_led_masked_write(led,
497 FLASH_LED_REG_LMH_LEVEL(led->base),
498 FLASH_LED_LMH_LEVEL_MASK,
499 led->pdata->lmh_level);
500 if (rc < 0)
501 return rc;
502
503 rc = qpnp_flash_led_masked_write(led,
504 FLASH_LED_REG_ILED_GRT_THRSH(led->base),
505 FLASH_LED_ILED_GRT_THRSH_MASK,
506 led->pdata->iled_thrsh_val);
507 if (rc < 0)
508 return rc;
509
510 if (led->pdata->led1n2_iclamp_low_ma) {
511 val = CURRENT_MA_TO_REG_VAL(led->pdata->led1n2_iclamp_low_ma,
512 led->fnode[0].ires_ua);
513 rc = qpnp_flash_led_masked_write(led,
514 FLASH_LED_REG_LED1N2_ICLAMP_LOW(led->base),
515 FLASH_LED_CURRENT_MASK, val);
516 if (rc < 0)
517 return rc;
518 }
519
520 if (led->pdata->led1n2_iclamp_mid_ma) {
521 val = CURRENT_MA_TO_REG_VAL(led->pdata->led1n2_iclamp_mid_ma,
522 led->fnode[0].ires_ua);
523 rc = qpnp_flash_led_masked_write(led,
524 FLASH_LED_REG_LED1N2_ICLAMP_MID(led->base),
525 FLASH_LED_CURRENT_MASK, val);
526 if (rc < 0)
527 return rc;
528 }
529
530 if (led->pdata->led3_iclamp_low_ma) {
531 val = CURRENT_MA_TO_REG_VAL(led->pdata->led3_iclamp_low_ma,
532 led->fnode[3].ires_ua);
533 rc = qpnp_flash_led_masked_write(led,
534 FLASH_LED_REG_LED3_ICLAMP_LOW(led->base),
535 FLASH_LED_CURRENT_MASK, val);
536 if (rc < 0)
537 return rc;
538 }
539
540 if (led->pdata->led3_iclamp_mid_ma) {
541 val = CURRENT_MA_TO_REG_VAL(led->pdata->led3_iclamp_mid_ma,
542 led->fnode[3].ires_ua);
543 rc = qpnp_flash_led_masked_write(led,
544 FLASH_LED_REG_LED3_ICLAMP_MID(led->base),
545 FLASH_LED_CURRENT_MASK, val);
546 if (rc < 0)
547 return rc;
548 }
549
550 return 0;
551}
552
553static int qpnp_flash_led_hw_strobe_enable(struct flash_node_data *fnode,
554 int hw_strobe_option, bool on)
555{
556 int rc = 0;
557
558 /*
559 * If the LED controlled by this fnode is not GPIO controlled
560 * for the given strobe_option, return.
561 */
562 if (hw_strobe_option == FLASH_LED_HW_STROBE_OPTION_1)
563 return 0;
564 else if (hw_strobe_option == FLASH_LED_HW_STROBE_OPTION_2
565 && fnode->id != LED3)
566 return 0;
567 else if (hw_strobe_option == FLASH_LED_HW_STROBE_OPTION_3
568 && fnode->id == LED1)
569 return 0;
570
571 if (gpio_is_valid(fnode->hw_strobe_gpio)) {
572 gpio_set_value(fnode->hw_strobe_gpio, on ? 1 : 0);
573 } else if (fnode->hw_strobe_state_active &&
574 fnode->hw_strobe_state_suspend) {
575 rc = pinctrl_select_state(fnode->pinctrl,
576 on ? fnode->hw_strobe_state_active :
577 fnode->hw_strobe_state_suspend);
578 if (rc < 0) {
579 pr_err("failed to change hw strobe pin state\n");
580 return rc;
581 }
582 }
583
584 return rc;
585}
586
587static int qpnp_flash_led_regulator_enable(struct qpnp_flash_led *led,
588 struct flash_switch_data *snode, bool on)
589{
590 int rc = 0;
591
592 if (!snode || !snode->vreg)
593 return 0;
594
595 if (snode->regulator_on == on)
596 return 0;
597
598 if (on)
599 rc = regulator_enable(snode->vreg);
600 else
601 rc = regulator_disable(snode->vreg);
602
603 if (rc < 0) {
604 pr_err("regulator_%s failed, rc=%d\n",
605 on ? "enable" : "disable", rc);
606 return rc;
607 }
608
609 snode->regulator_on = on ? true : false;
610 return 0;
611}
612
613static int get_property_from_fg(struct qpnp_flash_led *led,
614 enum power_supply_property prop, int *val)
615{
616 int rc;
617 union power_supply_propval pval = {0, };
618
619 if (!led->bms_psy) {
620 pr_err("no bms psy found\n");
621 return -EINVAL;
622 }
623
624 rc = power_supply_get_property(led->bms_psy, prop, &pval);
625 if (rc) {
626 pr_err("bms psy doesn't support reading prop %d rc = %d\n",
627 prop, rc);
628 return rc;
629 }
630
631 *val = pval.intval;
632 return rc;
633}
634
635#define VOLTAGE_HDRM_DEFAULT_MV 350
636static int qpnp_flash_led_get_voltage_headroom(struct qpnp_flash_led *led)
637{
638 int i, voltage_hdrm_mv = 0, voltage_hdrm_max = 0;
639
640 for (i = 0; i < led->num_fnodes; i++) {
641 if (led->fnode[i].led_on) {
642 if (led->fnode[i].id < 2) {
643 if (led->fnode[i].current_ma < 750)
644 voltage_hdrm_mv = 125;
645 else if (led->fnode[i].current_ma < 1000)
646 voltage_hdrm_mv = 175;
647 else if (led->fnode[i].current_ma < 1250)
648 voltage_hdrm_mv = 250;
649 else
650 voltage_hdrm_mv = 350;
651 } else {
652 if (led->fnode[i].current_ma < 375)
653 voltage_hdrm_mv = 125;
654 else if (led->fnode[i].current_ma < 500)
655 voltage_hdrm_mv = 175;
656 else if (led->fnode[i].current_ma < 625)
657 voltage_hdrm_mv = 250;
658 else
659 voltage_hdrm_mv = 350;
660 }
661
662 voltage_hdrm_max = max(voltage_hdrm_max,
663 voltage_hdrm_mv);
664 }
665 }
666
667 if (!voltage_hdrm_max)
668 return VOLTAGE_HDRM_DEFAULT_MV;
669
670 return voltage_hdrm_max;
671}
672
673#define UCONV 1000000LL
674#define MCONV 1000LL
675#define FLASH_VDIP_MARGIN 50000
676#define BOB_EFFICIENCY 900LL
677#define VIN_FLASH_MIN_UV 3300000LL
678static int qpnp_flash_led_calc_max_current(struct qpnp_flash_led *led)
679{
Kyle Yan74fdd732017-03-22 13:37:08 -0700680 int ocv_uv, ibat_now, voltage_hdrm_mv, rc;
681 int rbatt_uohm = 0;
David Collins8885f792017-01-26 14:36:34 -0800682 int64_t ibat_flash_ua, avail_flash_ua, avail_flash_power_fw;
683 int64_t ibat_safe_ua, vin_flash_uv, vph_flash_uv, vph_flash_vdip;
684
685 /* RESISTANCE = esr_uohm + rslow_uohm */
686 rc = get_property_from_fg(led, POWER_SUPPLY_PROP_RESISTANCE,
687 &rbatt_uohm);
688 if (rc < 0) {
689 pr_err("bms psy does not support resistance, rc=%d\n", rc);
690 return rc;
691 }
692
693 /* If no battery is connected, return max possible flash current */
694 if (!rbatt_uohm)
695 return FLASH_LED_MAX_TOTAL_CURRENT_MA;
696
697 rc = get_property_from_fg(led, POWER_SUPPLY_PROP_VOLTAGE_OCV, &ocv_uv);
698 if (rc < 0) {
699 pr_err("bms psy does not support OCV, rc=%d\n", rc);
700 return rc;
701 }
702
703 rc = get_property_from_fg(led, POWER_SUPPLY_PROP_CURRENT_NOW,
704 &ibat_now);
705 if (rc < 0) {
706 pr_err("bms psy does not support current, rc=%d\n", rc);
707 return rc;
708 }
709
710 rbatt_uohm += led->pdata->rpara_uohm;
711 voltage_hdrm_mv = qpnp_flash_led_get_voltage_headroom(led);
712 vph_flash_vdip =
713 VPH_DROOP_THRESH_VAL_TO_UV(led->pdata->vph_droop_threshold)
714 + FLASH_VDIP_MARGIN;
715
716 /* Check if LMH_MITIGATION needs to be triggered */
717 if (!led->trigger_lmh && (ocv_uv < led->pdata->lmh_ocv_threshold_uv ||
718 rbatt_uohm > led->pdata->lmh_rbatt_threshold_uohm)) {
719 led->trigger_lmh = true;
720 rc = qpnp_flash_led_masked_write(led,
721 FLASH_LED_REG_MITIGATION_SW(led->base),
722 FLASH_LED_LMH_MITIGATION_EN_MASK,
723 FLASH_LED_LMH_MITIGATION_ENABLE);
724 if (rc < 0) {
725 pr_err("trigger lmh mitigation failed, rc=%d\n", rc);
726 return rc;
727 }
728
729 /* Wait for LMH mitigation to take effect */
730 udelay(100);
731
732 return qpnp_flash_led_calc_max_current(led);
733 }
734
735 /*
736 * Calculate the maximum current that can pulled out of the battery
737 * before the battery voltage dips below a safe threshold.
738 */
739 ibat_safe_ua = div_s64((ocv_uv - vph_flash_vdip) * UCONV,
740 rbatt_uohm);
741
742 if (ibat_safe_ua <= led->pdata->ibatt_ocp_threshold_ua) {
743 /*
744 * If the calculated current is below the OCP threshold, then
745 * use it as the possible flash current.
746 */
747 ibat_flash_ua = ibat_safe_ua - ibat_now;
748 vph_flash_uv = vph_flash_vdip;
749 } else {
750 /*
751 * If the calculated current is above the OCP threshold, then
752 * use the ocp threshold instead.
753 *
754 * Any higher current will be tripping the battery OCP.
755 */
756 ibat_flash_ua = led->pdata->ibatt_ocp_threshold_ua - ibat_now;
757 vph_flash_uv = ocv_uv - div64_s64((int64_t)rbatt_uohm
758 * led->pdata->ibatt_ocp_threshold_ua, UCONV);
759 }
760 /* Calculate the input voltage of the flash module. */
761 vin_flash_uv = max((led->pdata->vled_max_uv +
762 (voltage_hdrm_mv * MCONV)), VIN_FLASH_MIN_UV);
763 /* Calculate the available power for the flash module. */
764 avail_flash_power_fw = BOB_EFFICIENCY * vph_flash_uv * ibat_flash_ua;
765 /*
766 * Calculate the available amount of current the flash module can draw
767 * before collapsing the battery. (available power/ flash input voltage)
768 */
769 avail_flash_ua = div64_s64(avail_flash_power_fw, vin_flash_uv * MCONV);
770 pr_debug("avail_iflash=%lld, ocv=%d, ibat=%d, rbatt=%d, trigger_lmh=%d\n",
771 avail_flash_ua, ocv_uv, ibat_now, rbatt_uohm, led->trigger_lmh);
772 return min(FLASH_LED_MAX_TOTAL_CURRENT_MA,
773 (int)(div64_s64(avail_flash_ua, MCONV)));
774}
775
776static int qpnp_flash_led_calc_thermal_current_lim(struct qpnp_flash_led *led)
777{
778 int thermal_current_lim = 0;
779 int rc;
780 u8 thermal_thrsh1, thermal_thrsh2, thermal_thrsh3, otst_status;
781
782 /* Store THERMAL_THRSHx register values */
783 rc = qpnp_flash_led_masked_read(led,
784 FLASH_LED_REG_THERMAL_THRSH1(led->base),
785 FLASH_LED_THERMAL_THRSH_MASK,
786 &thermal_thrsh1);
787 if (rc < 0)
788 return rc;
789
790 rc = qpnp_flash_led_masked_read(led,
791 FLASH_LED_REG_THERMAL_THRSH2(led->base),
792 FLASH_LED_THERMAL_THRSH_MASK,
793 &thermal_thrsh2);
794 if (rc < 0)
795 return rc;
796
797 rc = qpnp_flash_led_masked_read(led,
798 FLASH_LED_REG_THERMAL_THRSH3(led->base),
799 FLASH_LED_THERMAL_THRSH_MASK,
800 &thermal_thrsh3);
801 if (rc < 0)
802 return rc;
803
804 /* Lower THERMAL_THRSHx thresholds to minimum */
805 rc = qpnp_flash_led_masked_write(led,
806 FLASH_LED_REG_THERMAL_THRSH1(led->base),
807 FLASH_LED_THERMAL_THRSH_MASK,
808 FLASH_LED_THERMAL_THRSH_MIN);
809 if (rc < 0)
810 return rc;
811
812 rc = qpnp_flash_led_masked_write(led,
813 FLASH_LED_REG_THERMAL_THRSH2(led->base),
814 FLASH_LED_THERMAL_THRSH_MASK,
815 FLASH_LED_THERMAL_THRSH_MIN);
816 if (rc < 0)
817 return rc;
818
819 rc = qpnp_flash_led_masked_write(led,
820 FLASH_LED_REG_THERMAL_THRSH3(led->base),
821 FLASH_LED_THERMAL_THRSH_MASK,
822 FLASH_LED_THERMAL_THRSH_MIN);
823 if (rc < 0)
824 return rc;
825
826 /* Check THERMAL_OTST status */
827 rc = qpnp_flash_led_read(led,
828 FLASH_LED_REG_LED_STATUS2(led->base),
829 &otst_status);
830 if (rc < 0)
831 return rc;
832
833 /* Look up current limit based on THERMAL_OTST status */
834 if (otst_status)
835 thermal_current_lim =
836 led->pdata->thermal_derate_current[otst_status >> 1];
837
838 /* Restore THERMAL_THRESHx registers to original values */
839 rc = qpnp_flash_led_masked_write(led,
840 FLASH_LED_REG_THERMAL_THRSH1(led->base),
841 FLASH_LED_THERMAL_THRSH_MASK,
842 thermal_thrsh1);
843 if (rc < 0)
844 return rc;
845
846 rc = qpnp_flash_led_masked_write(led,
847 FLASH_LED_REG_THERMAL_THRSH2(led->base),
848 FLASH_LED_THERMAL_THRSH_MASK,
849 thermal_thrsh2);
850 if (rc < 0)
851 return rc;
852
853 rc = qpnp_flash_led_masked_write(led,
854 FLASH_LED_REG_THERMAL_THRSH3(led->base),
855 FLASH_LED_THERMAL_THRSH_MASK,
856 thermal_thrsh3);
857 if (rc < 0)
858 return rc;
859
860 return thermal_current_lim;
861}
862
863static int qpnp_flash_led_get_max_avail_current(struct qpnp_flash_led *led)
864{
865 int max_avail_current, thermal_current_lim = 0;
866
867 led->trigger_lmh = false;
868 max_avail_current = qpnp_flash_led_calc_max_current(led);
869 if (led->pdata->thermal_derate_en)
870 thermal_current_lim =
871 qpnp_flash_led_calc_thermal_current_lim(led);
872
873 if (thermal_current_lim)
874 max_avail_current = min(max_avail_current, thermal_current_lim);
875
876 return max_avail_current;
877}
878
879static void qpnp_flash_led_node_set(struct flash_node_data *fnode, int value)
880{
881 int prgm_current_ma = value;
882
883 if (value <= 0)
884 prgm_current_ma = 0;
885 else if (value < FLASH_LED_MIN_CURRENT_MA)
886 prgm_current_ma = FLASH_LED_MIN_CURRENT_MA;
887
888 prgm_current_ma = min(prgm_current_ma, fnode->max_current);
889 fnode->current_ma = prgm_current_ma;
890 fnode->cdev.brightness = prgm_current_ma;
891 fnode->current_reg_val = CURRENT_MA_TO_REG_VAL(prgm_current_ma,
892 fnode->ires_ua);
893 fnode->led_on = prgm_current_ma != 0;
894}
895
896static int qpnp_flash_led_switch_disable(struct flash_switch_data *snode)
897{
898 struct qpnp_flash_led *led = dev_get_drvdata(&snode->pdev->dev);
899 int i, rc, addr_offset;
900
901 rc = qpnp_flash_led_masked_write(led,
902 FLASH_LED_EN_LED_CTRL(led->base),
903 snode->led_mask, FLASH_LED_DISABLE);
904 if (rc < 0)
905 return rc;
906
907 if (led->trigger_lmh) {
908 rc = qpnp_flash_led_masked_write(led,
909 FLASH_LED_REG_MITIGATION_SW(led->base),
910 FLASH_LED_LMH_MITIGATION_EN_MASK,
911 FLASH_LED_LMH_MITIGATION_DISABLE);
912 if (rc < 0) {
913 pr_err("disable lmh mitigation failed, rc=%d\n", rc);
914 return rc;
915 }
916 }
917
918 if (!led->trigger_chgr) {
919 rc = qpnp_flash_led_masked_write(led,
920 FLASH_LED_REG_MITIGATION_SW(led->base),
921 FLASH_LED_CHGR_MITIGATION_EN_MASK,
922 FLASH_LED_CHGR_MITIGATION_DISABLE);
923 if (rc < 0) {
924 pr_err("disable chgr mitigation failed, rc=%d\n", rc);
925 return rc;
926 }
927 }
928
929 led->enable--;
930 if (led->enable == 0) {
931 rc = qpnp_flash_led_masked_write(led,
932 FLASH_LED_REG_MOD_CTRL(led->base),
933 FLASH_LED_MOD_CTRL_MASK, FLASH_LED_DISABLE);
934 if (rc < 0)
935 return rc;
936 }
937
938 for (i = 0; i < led->num_fnodes; i++) {
939 if (!led->fnode[i].led_on ||
940 !(snode->led_mask & BIT(led->fnode[i].id)))
941 continue;
942
943 addr_offset = led->fnode[i].id;
944 rc = qpnp_flash_led_masked_write(led,
945 FLASH_LED_REG_TGR_CURRENT(led->base + addr_offset),
946 FLASH_LED_CURRENT_MASK, 0);
947 if (rc < 0)
948 return rc;
949
950 led->fnode[i].led_on = false;
951
952 if (led->fnode[i].pinctrl) {
953 rc = pinctrl_select_state(led->fnode[i].pinctrl,
954 led->fnode[i].gpio_state_suspend);
955 if (rc < 0) {
956 pr_err("failed to disable GPIO, rc=%d\n", rc);
957 return rc;
958 }
959 }
960
961 if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
962 rc = qpnp_flash_led_hw_strobe_enable(&led->fnode[i],
963 led->pdata->hw_strobe_option, false);
964 if (rc < 0) {
965 pr_err("Unable to disable hw strobe, rc=%d\n",
966 rc);
967 return rc;
968 }
969 }
970 }
971
972 snode->enabled = false;
973 return 0;
974}
975
976static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)
977{
978 struct qpnp_flash_led *led = dev_get_drvdata(&snode->pdev->dev);
979 int rc, i, addr_offset;
980 u8 val, mask;
981
982 if (snode->enabled == on) {
983 pr_debug("Switch node is already %s!\n",
984 on ? "enabled" : "disabled");
985 return 0;
986 }
987
988 if (!on) {
989 rc = qpnp_flash_led_switch_disable(snode);
990 return rc;
991 }
992
993 /* Iterate over all leds for this switch node */
994 val = 0;
995 for (i = 0; i < led->num_fnodes; i++)
996 if (snode->led_mask & BIT(led->fnode[i].id))
997 val |= led->fnode[i].ires << (led->fnode[i].id * 2);
998
999 rc = qpnp_flash_led_masked_write(led, FLASH_LED_REG_IRES(led->base),
1000 FLASH_LED_CURRENT_MASK, val);
1001 if (rc < 0)
1002 return rc;
1003
1004 rc = qpnp_flash_led_masked_write(led,
1005 FLASH_LED_REG_STROBE_CFG(led->base),
1006 FLASH_LED_ENABLE_MASK,
1007 led->pdata->hw_strobe_option);
1008 if (rc < 0)
1009 return rc;
1010
1011 val = 0;
1012 for (i = 0; i < led->num_fnodes; i++) {
1013 if (!led->fnode[i].led_on ||
1014 !(snode->led_mask & BIT(led->fnode[i].id)))
1015 continue;
1016
1017 addr_offset = led->fnode[i].id;
1018 if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT)
1019 mask = FLASH_HW_STROBE_MASK;
1020 else
1021 mask = FLASH_LED_HW_SW_STROBE_SEL_BIT;
1022 rc = qpnp_flash_led_masked_write(led,
1023 FLASH_LED_REG_STROBE_CTRL(led->base + addr_offset),
1024 mask, led->fnode[i].trigger);
1025 if (rc < 0)
1026 return rc;
1027
1028 rc = qpnp_flash_led_masked_write(led,
1029 FLASH_LED_REG_TGR_CURRENT(led->base + addr_offset),
1030 FLASH_LED_CURRENT_MASK, led->fnode[i].current_reg_val);
1031 if (rc < 0)
1032 return rc;
1033
1034 rc = qpnp_flash_led_write(led,
1035 FLASH_LED_REG_SAFETY_TMR(led->base + addr_offset),
1036 led->fnode[i].duration);
1037 if (rc < 0)
1038 return rc;
1039
1040 val |= FLASH_LED_ENABLE << led->fnode[i].id;
1041
1042 if (led->fnode[i].pinctrl) {
1043 rc = pinctrl_select_state(led->fnode[i].pinctrl,
1044 led->fnode[i].gpio_state_active);
1045 if (rc < 0) {
1046 pr_err("failed to enable GPIO rc=%d\n", rc);
1047 return rc;
1048 }
1049 }
1050
1051 if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
1052 rc = qpnp_flash_led_hw_strobe_enable(&led->fnode[i],
1053 led->pdata->hw_strobe_option, true);
1054 if (rc < 0) {
1055 pr_err("Unable to enable hw strobe rc=%d\n",
1056 rc);
1057 return rc;
1058 }
1059 }
1060 }
1061
1062 if (led->enable == 0) {
1063 rc = qpnp_flash_led_masked_write(led,
1064 FLASH_LED_REG_MOD_CTRL(led->base),
1065 FLASH_LED_MOD_CTRL_MASK, FLASH_LED_MOD_ENABLE);
1066 if (rc < 0)
1067 return rc;
1068 }
1069 led->enable++;
1070
1071 if (led->trigger_lmh) {
1072 rc = qpnp_flash_led_masked_write(led,
1073 FLASH_LED_REG_MITIGATION_SW(led->base),
1074 FLASH_LED_LMH_MITIGATION_EN_MASK,
1075 FLASH_LED_LMH_MITIGATION_ENABLE);
1076 if (rc < 0) {
1077 pr_err("trigger lmh mitigation failed, rc=%d\n", rc);
1078 return rc;
1079 }
Subbaraman Narayanamurthyd02fbc92017-02-02 16:39:41 -08001080 /* Wait for LMH mitigation to take effect */
1081 udelay(500);
David Collins8885f792017-01-26 14:36:34 -08001082 }
1083
1084 if (led->trigger_chgr) {
1085 rc = qpnp_flash_led_masked_write(led,
1086 FLASH_LED_REG_MITIGATION_SW(led->base),
1087 FLASH_LED_CHGR_MITIGATION_EN_MASK,
1088 FLASH_LED_CHGR_MITIGATION_ENABLE);
1089 if (rc < 0) {
1090 pr_err("trigger chgr mitigation failed, rc=%d\n", rc);
1091 return rc;
1092 }
1093 }
1094
1095 rc = qpnp_flash_led_masked_write(led,
1096 FLASH_LED_EN_LED_CTRL(led->base),
1097 snode->led_mask, val);
1098 if (rc < 0)
1099 return rc;
1100
1101 snode->enabled = true;
1102 return 0;
1103}
1104
1105int qpnp_flash_led_prepare(struct led_trigger *trig, int options,
1106 int *max_current)
1107{
1108 struct led_classdev *led_cdev;
1109 struct flash_switch_data *snode;
1110 struct qpnp_flash_led *led;
1111 int rc;
1112
1113 if (!trig) {
1114 pr_err("Invalid led_trigger provided\n");
1115 return -EINVAL;
1116 }
1117
1118 led_cdev = trigger_to_lcdev(trig);
1119 if (!led_cdev) {
1120 pr_err("Invalid led_cdev in trigger %s\n", trig->name);
1121 return -EINVAL;
1122 }
1123
1124 snode = container_of(led_cdev, struct flash_switch_data, cdev);
1125 led = dev_get_drvdata(&snode->pdev->dev);
1126
1127 if (!(options & FLASH_LED_PREPARE_OPTIONS_MASK)) {
1128 pr_err("Invalid options %d\n", options);
1129 return -EINVAL;
1130 }
1131
1132 if (options & ENABLE_REGULATOR) {
1133 rc = qpnp_flash_led_regulator_enable(led, snode, true);
1134 if (rc < 0) {
1135 pr_err("enable regulator failed, rc=%d\n", rc);
1136 return rc;
1137 }
1138 }
1139
1140 if (options & DISABLE_REGULATOR) {
1141 rc = qpnp_flash_led_regulator_enable(led, snode, false);
1142 if (rc < 0) {
1143 pr_err("disable regulator failed, rc=%d\n", rc);
1144 return rc;
1145 }
1146 }
1147
1148 if (options & QUERY_MAX_CURRENT) {
1149 rc = qpnp_flash_led_get_max_avail_current(led);
1150 if (rc < 0) {
1151 pr_err("query max current failed, rc=%d\n", rc);
1152 return rc;
1153 }
1154 *max_current = rc;
1155 }
1156
1157 led->trigger_chgr = false;
1158 if (options & PRE_FLASH)
1159 led->trigger_chgr = true;
1160
1161 return 0;
1162}
1163
1164static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,
1165 enum led_brightness value)
1166{
1167 struct flash_node_data *fnode = NULL;
1168 struct flash_switch_data *snode = NULL;
1169 struct qpnp_flash_led *led = NULL;
1170 int rc;
1171
1172 /*
1173 * strncmp() must be used here since a prefix comparison is required
1174 * in order to support names like led:switch_0 and led:flash_1.
1175 */
1176 if (!strncmp(led_cdev->name, "led:switch", strlen("led:switch"))) {
1177 snode = container_of(led_cdev, struct flash_switch_data, cdev);
1178 led = dev_get_drvdata(&snode->pdev->dev);
1179 } else if (!strncmp(led_cdev->name, "led:flash", strlen("led:flash")) ||
1180 !strncmp(led_cdev->name, "led:torch",
1181 strlen("led:torch"))) {
1182 fnode = container_of(led_cdev, struct flash_node_data, cdev);
1183 led = dev_get_drvdata(&fnode->pdev->dev);
1184 }
1185
1186 if (!led) {
1187 pr_err("Failed to get flash driver data\n");
1188 return;
1189 }
1190
1191 spin_lock(&led->lock);
1192 if (snode) {
1193 rc = qpnp_flash_led_switch_set(snode, value > 0);
1194 if (rc < 0)
1195 pr_err("Failed to set flash LED switch rc=%d\n", rc);
1196 } else if (fnode) {
1197 qpnp_flash_led_node_set(fnode, value);
1198 }
1199
1200 spin_unlock(&led->lock);
1201}
1202
1203/* sysfs show function for flash_max_current */
1204static ssize_t qpnp_flash_led_max_current_show(struct device *dev,
1205 struct device_attribute *attr, char *buf)
1206{
1207 int rc;
1208 struct flash_switch_data *snode;
1209 struct qpnp_flash_led *led;
1210 struct led_classdev *led_cdev = dev_get_drvdata(dev);
1211
1212 snode = container_of(led_cdev, struct flash_switch_data, cdev);
1213 led = dev_get_drvdata(&snode->pdev->dev);
1214
1215 rc = qpnp_flash_led_get_max_avail_current(led);
1216 if (rc < 0)
1217 pr_err("query max current failed, rc=%d\n", rc);
1218
1219 return snprintf(buf, PAGE_SIZE, "%d\n", rc);
1220}
1221
1222/* sysfs attributes exported by flash_led */
1223static struct device_attribute qpnp_flash_led_attrs[] = {
1224 __ATTR(max_current, 0664, qpnp_flash_led_max_current_show, NULL),
1225};
1226
1227static int flash_led_psy_notifier_call(struct notifier_block *nb,
1228 unsigned long ev, void *v)
1229{
1230 struct power_supply *psy = v;
1231 struct qpnp_flash_led *led =
1232 container_of(nb, struct qpnp_flash_led, nb);
1233
1234 if (ev != PSY_EVENT_PROP_CHANGED)
1235 return NOTIFY_OK;
1236
1237 if (!strcmp(psy->desc->name, "bms")) {
1238 led->bms_psy = power_supply_get_by_name("bms");
1239 if (!led->bms_psy)
1240 pr_err("Failed to get bms power_supply\n");
1241 else
1242 power_supply_unreg_notifier(&led->nb);
1243 }
1244
1245 return NOTIFY_OK;
1246}
1247
1248static int flash_led_psy_register_notifier(struct qpnp_flash_led *led)
1249{
1250 int rc;
1251
1252 led->nb.notifier_call = flash_led_psy_notifier_call;
1253 rc = power_supply_reg_notifier(&led->nb);
1254 if (rc < 0) {
1255 pr_err("Couldn't register psy notifier, rc = %d\n", rc);
1256 return rc;
1257 }
1258
1259 return 0;
1260}
1261
1262/* irq handler */
1263static irqreturn_t qpnp_flash_led_irq_handler(int irq, void *_led)
1264{
1265 struct qpnp_flash_led *led = _led;
1266 enum flash_led_irq_type irq_type = INVALID_IRQ;
1267 int rc;
1268 u8 irq_status, led_status1, led_status2;
1269
1270 pr_debug("irq received, irq=%d\n", irq);
1271
1272 rc = qpnp_flash_led_read(led,
1273 FLASH_LED_REG_INT_RT_STS(led->base), &irq_status);
1274 if (rc < 0) {
1275 pr_err("Failed to read interrupt status reg, rc=%d\n", rc);
1276 goto exit;
1277 }
1278
1279 if (irq == led->pdata->all_ramp_up_done_irq)
1280 irq_type = ALL_RAMP_UP_DONE_IRQ;
1281 else if (irq == led->pdata->all_ramp_down_done_irq)
1282 irq_type = ALL_RAMP_DOWN_DONE_IRQ;
1283 else if (irq == led->pdata->led_fault_irq)
1284 irq_type = LED_FAULT_IRQ;
1285
1286 if (irq_type == ALL_RAMP_UP_DONE_IRQ)
1287 atomic_notifier_call_chain(&irq_notifier_list,
1288 irq_type, NULL);
1289
1290 if (irq_type == LED_FAULT_IRQ) {
1291 rc = qpnp_flash_led_read(led,
1292 FLASH_LED_REG_LED_STATUS1(led->base), &led_status1);
1293 if (rc < 0) {
1294 pr_err("Failed to read led_status1 reg, rc=%d\n", rc);
1295 goto exit;
1296 }
1297
1298 rc = qpnp_flash_led_read(led,
1299 FLASH_LED_REG_LED_STATUS2(led->base), &led_status2);
1300 if (rc < 0) {
1301 pr_err("Failed to read led_status2 reg, rc=%d\n", rc);
1302 goto exit;
1303 }
1304
1305 if (led_status1)
1306 pr_emerg("led short/open fault detected! led_status1=%x\n",
1307 led_status1);
1308
1309 if (led_status2 & FLASH_LED_VPH_DROOP_FAULT_MASK)
1310 pr_emerg("led vph_droop fault detected!\n");
1311 }
1312
1313 pr_debug("irq handled, irq_type=%x, irq_status=%x\n", irq_type,
1314 irq_status);
1315
1316exit:
1317 return IRQ_HANDLED;
1318}
1319
1320int qpnp_flash_led_register_irq_notifier(struct notifier_block *nb)
1321{
1322 return atomic_notifier_chain_register(&irq_notifier_list, nb);
1323}
1324
1325int qpnp_flash_led_unregister_irq_notifier(struct notifier_block *nb)
1326{
1327 return atomic_notifier_chain_unregister(&irq_notifier_list, nb);
1328}
1329
1330static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
1331 struct flash_node_data *fnode, struct device_node *node)
1332{
1333 const char *temp_string;
1334 int rc;
1335 u32 val;
1336 bool strobe_sel = 0, edge_trigger = 0, active_high = 0;
1337
1338 fnode->pdev = led->pdev;
1339 fnode->cdev.brightness_set = qpnp_flash_led_brightness_set;
1340 fnode->cdev.brightness_get = qpnp_flash_led_brightness_get;
1341
1342 rc = of_property_read_string(node, "qcom,led-name", &fnode->cdev.name);
1343 if (rc < 0) {
1344 pr_err("Unable to read flash LED names\n");
1345 return rc;
1346 }
1347
1348 rc = of_property_read_string(node, "label", &temp_string);
1349 if (!rc) {
1350 if (!strcmp(temp_string, "flash")) {
1351 fnode->type = FLASH_LED_TYPE_FLASH;
1352 } else if (!strcmp(temp_string, "torch")) {
1353 fnode->type = FLASH_LED_TYPE_TORCH;
1354 } else {
1355 pr_err("Wrong flash LED type\n");
1356 return rc;
1357 }
1358 } else {
1359 pr_err("Unable to read flash LED label\n");
1360 return rc;
1361 }
1362
1363 rc = of_property_read_u32(node, "qcom,id", &val);
1364 if (!rc) {
1365 fnode->id = (u8)val;
1366 } else {
1367 pr_err("Unable to read flash LED ID\n");
1368 return rc;
1369 }
1370
1371 rc = of_property_read_string(node, "qcom,default-led-trigger",
1372 &fnode->cdev.default_trigger);
1373 if (rc < 0) {
1374 pr_err("Unable to read trigger name\n");
1375 return rc;
1376 }
1377
1378 fnode->ires_ua = FLASH_LED_IRES_DEFAULT_UA;
1379 fnode->ires = FLASH_LED_IRES_DEFAULT_VAL;
1380 rc = of_property_read_u32(node, "qcom,ires-ua", &val);
1381 if (!rc) {
1382 fnode->ires_ua = val;
1383 fnode->ires = FLASH_LED_IRES_BASE -
1384 (val - FLASH_LED_IRES_MIN_UA) / FLASH_LED_IRES_DIVISOR;
1385 } else if (rc != -EINVAL) {
1386 pr_err("Unable to read current resolution rc=%d\n", rc);
1387 return rc;
1388 }
1389
1390 rc = of_property_read_u32(node, "qcom,max-current", &val);
1391 if (!rc) {
1392 if (val < FLASH_LED_MIN_CURRENT_MA)
1393 val = FLASH_LED_MIN_CURRENT_MA;
1394 fnode->max_current = val;
1395 fnode->cdev.max_brightness = val;
1396 } else {
1397 pr_err("Unable to read max current, rc=%d\n", rc);
1398 return rc;
1399 }
1400
1401 rc = of_property_read_u32(node, "qcom,current-ma", &val);
1402 if (!rc) {
1403 if (val < FLASH_LED_MIN_CURRENT_MA ||
1404 val > fnode->max_current)
1405 pr_warn("Invalid operational current specified, capping it\n");
1406 if (val < FLASH_LED_MIN_CURRENT_MA)
1407 val = FLASH_LED_MIN_CURRENT_MA;
1408 if (val > fnode->max_current)
1409 val = fnode->max_current;
1410 fnode->current_ma = val;
1411 fnode->cdev.brightness = val;
1412 } else if (rc != -EINVAL) {
1413 pr_err("Unable to read operational current, rc=%d\n", rc);
1414 return rc;
1415 }
1416
1417 fnode->duration = FLASH_LED_SAFETY_TMR_DISABLED;
1418 rc = of_property_read_u32(node, "qcom,duration-ms", &val);
1419 if (!rc) {
1420 fnode->duration = (u8)(SAFETY_TMR_TO_REG_VAL(val) |
1421 FLASH_LED_SAFETY_TMR_ENABLE);
1422 } else if (rc == -EINVAL) {
1423 if (fnode->type == FLASH_LED_TYPE_FLASH) {
1424 pr_err("Timer duration is required for flash LED\n");
1425 return rc;
1426 }
1427 } else {
1428 pr_err("Unable to read timer duration\n");
1429 return rc;
1430 }
1431
1432 fnode->hdrm_val = FLASH_LED_HDRM_VOL_DEFAULT_MV;
1433 rc = of_property_read_u32(node, "qcom,hdrm-voltage-mv", &val);
1434 if (!rc) {
1435 val = (val - FLASH_LED_HDRM_VOL_BASE_MV) /
1436 FLASH_LED_HDRM_VOL_STEP_MV;
1437 fnode->hdrm_val = (val << FLASH_LED_HDRM_VOL_SHIFT) &
1438 FLASH_LED_HDRM_VOL_MASK;
1439 } else if (rc != -EINVAL) {
1440 pr_err("Unable to read headroom voltage\n");
1441 return rc;
1442 }
1443
1444 rc = of_property_read_u32(node, "qcom,hdrm-vol-hi-lo-win-mv", &val);
1445 if (!rc) {
1446 fnode->hdrm_val |= (val / FLASH_LED_HDRM_VOL_STEP_MV) &
1447 ~FLASH_LED_HDRM_VOL_MASK;
1448 } else if (rc == -EINVAL) {
1449 fnode->hdrm_val |= FLASH_LED_HDRM_VOL_HI_LO_WIN_DEFAULT_MV;
1450 } else {
1451 pr_err("Unable to read hdrm hi-lo window voltage\n");
1452 return rc;
1453 }
1454
1455 strobe_sel = of_property_read_bool(node, "qcom,hw-strobe-sel");
1456 if (strobe_sel) {
1457 edge_trigger = of_property_read_bool(node,
1458 "qcom,hw-strobe-edge-trigger");
1459 active_high = !of_property_read_bool(node,
1460 "qcom,hw-strobe-active-low");
1461 }
1462 fnode->trigger = (strobe_sel << 2) | (edge_trigger << 1) | active_high;
1463
1464 if (fnode->trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
1465 if (of_find_property(node, "qcom,hw-strobe-gpio", NULL)) {
1466 fnode->hw_strobe_gpio = of_get_named_gpio(node,
1467 "qcom,hw-strobe-gpio", 0);
1468 if (fnode->hw_strobe_gpio < 0) {
1469 pr_err("Invalid gpio specified\n");
1470 return fnode->hw_strobe_gpio;
1471 }
1472 gpio_direction_output(fnode->hw_strobe_gpio, 0);
1473 } else {
1474 fnode->hw_strobe_gpio = -1;
1475 fnode->hw_strobe_state_active =
1476 pinctrl_lookup_state(fnode->pinctrl,
1477 "strobe_enable");
1478 if (IS_ERR_OR_NULL(fnode->hw_strobe_state_active)) {
1479 pr_err("No active pin for hardware strobe, rc=%ld\n",
1480 PTR_ERR(fnode->hw_strobe_state_active));
1481 fnode->hw_strobe_state_active = NULL;
1482 }
1483
1484 fnode->hw_strobe_state_suspend =
1485 pinctrl_lookup_state(fnode->pinctrl,
1486 "strobe_disable");
1487 if (IS_ERR_OR_NULL(fnode->hw_strobe_state_suspend)) {
1488 pr_err("No suspend pin for hardware strobe, rc=%ld\n",
1489 PTR_ERR(fnode->hw_strobe_state_suspend)
1490 );
1491 fnode->hw_strobe_state_suspend = NULL;
1492 }
1493 }
1494 }
1495
1496 rc = led_classdev_register(&led->pdev->dev, &fnode->cdev);
1497 if (rc < 0) {
1498 pr_err("Unable to register led node %d\n", fnode->id);
1499 return rc;
1500 }
1501
1502 fnode->cdev.dev->of_node = node;
1503
1504 fnode->pinctrl = devm_pinctrl_get(fnode->cdev.dev);
1505 if (IS_ERR_OR_NULL(fnode->pinctrl)) {
1506 pr_debug("No pinctrl defined\n");
1507 fnode->pinctrl = NULL;
1508 } else {
1509 fnode->gpio_state_active =
1510 pinctrl_lookup_state(fnode->pinctrl, "led_enable");
1511 if (IS_ERR_OR_NULL(fnode->gpio_state_active)) {
1512 pr_err("Cannot lookup LED active state\n");
1513 devm_pinctrl_put(fnode->pinctrl);
1514 fnode->pinctrl = NULL;
1515 return PTR_ERR(fnode->gpio_state_active);
1516 }
1517
1518 fnode->gpio_state_suspend =
1519 pinctrl_lookup_state(fnode->pinctrl, "led_disable");
1520 if (IS_ERR_OR_NULL(fnode->gpio_state_suspend)) {
1521 pr_err("Cannot lookup LED disable state\n");
1522 devm_pinctrl_put(fnode->pinctrl);
1523 fnode->pinctrl = NULL;
1524 return PTR_ERR(fnode->gpio_state_suspend);
1525 }
1526 }
1527
1528 return 0;
1529}
1530
1531static int qpnp_flash_led_parse_and_register_switch(struct qpnp_flash_led *led,
1532 struct flash_switch_data *snode,
1533 struct device_node *node)
1534{
1535 int rc = 0, num;
1536 char reg_name[16], reg_sup_name[16];
1537
1538 rc = of_property_read_string(node, "qcom,led-name", &snode->cdev.name);
1539 if (rc < 0) {
1540 pr_err("Failed to read switch node name, rc=%d\n", rc);
1541 return rc;
1542 }
1543
1544 rc = sscanf(snode->cdev.name, "led:switch_%d", &num);
1545 if (!rc) {
1546 pr_err("No number for switch device?\n");
1547 return -EINVAL;
1548 }
1549
1550 rc = of_property_read_string(node, "qcom,default-led-trigger",
1551 &snode->cdev.default_trigger);
1552 if (rc < 0) {
1553 pr_err("Unable to read trigger name, rc=%d\n", rc);
1554 return rc;
1555 }
1556
1557 rc = of_property_read_u32(node, "qcom,led-mask", &snode->led_mask);
1558 if (rc < 0) {
1559 pr_err("Unable to read led mask rc=%d\n", rc);
1560 return rc;
1561 }
1562
1563 if (snode->led_mask < 1 || snode->led_mask > 7) {
1564 pr_err("Invalid value for led-mask\n");
1565 return -EINVAL;
1566 }
1567
1568 scnprintf(reg_name, sizeof(reg_name), "switch%d-supply", num);
1569 if (of_find_property(led->pdev->dev.of_node, reg_name, NULL)) {
1570 scnprintf(reg_sup_name, sizeof(reg_sup_name), "switch%d", num);
1571 snode->vreg = devm_regulator_get(&led->pdev->dev, reg_sup_name);
1572 if (IS_ERR_OR_NULL(snode->vreg)) {
1573 rc = PTR_ERR(snode->vreg);
1574 if (rc != -EPROBE_DEFER)
1575 pr_err("Failed to get regulator, rc=%d\n", rc);
1576 snode->vreg = NULL;
1577 return rc;
1578 }
1579 }
1580
1581 snode->pdev = led->pdev;
1582 snode->cdev.brightness_set = qpnp_flash_led_brightness_set;
1583 snode->cdev.brightness_get = qpnp_flash_led_brightness_get;
1584 snode->cdev.flags |= LED_KEEP_TRIGGER;
1585 rc = led_classdev_register(&led->pdev->dev, &snode->cdev);
1586 if (rc < 0) {
1587 pr_err("Unable to register led switch node\n");
1588 return rc;
1589 }
1590
1591 snode->cdev.dev->of_node = node;
1592 return 0;
1593}
1594
1595static int get_code_from_table(int *table, int len, int value)
1596{
1597 int i;
1598
1599 for (i = 0; i < len; i++) {
1600 if (value == table[i])
1601 break;
1602 }
1603
1604 if (i == len) {
1605 pr_err("Couldn't find %d from table\n", value);
1606 return -ENODATA;
1607 }
1608
1609 return i;
1610}
1611
1612static int qpnp_flash_led_parse_common_dt(struct qpnp_flash_led *led,
1613 struct device_node *node)
1614{
1615 struct device_node *revid_node;
1616 int rc;
1617 u32 val;
1618 bool short_circuit_det, open_circuit_det, vph_droop_det;
1619
1620 revid_node = of_parse_phandle(node, "qcom,pmic-revid", 0);
1621 if (!revid_node) {
1622 pr_err("Missing qcom,pmic-revid property - driver failed\n");
1623 return -EINVAL;
1624 }
1625
1626 led->pdata->pmic_rev_id = get_revid_data(revid_node);
1627 if (IS_ERR_OR_NULL(led->pdata->pmic_rev_id)) {
1628 pr_err("Unable to get pmic_revid rc=%ld\n",
1629 PTR_ERR(led->pdata->pmic_rev_id));
1630 /*
1631 * the revid peripheral must be registered, any failure
1632 * here only indicates that the rev-id module has not
1633 * probed yet.
1634 */
1635 return -EPROBE_DEFER;
1636 }
1637
1638 pr_debug("PMIC subtype %d Digital major %d\n",
1639 led->pdata->pmic_rev_id->pmic_subtype,
1640 led->pdata->pmic_rev_id->rev4);
1641
1642 led->pdata->hdrm_auto_mode_en = of_property_read_bool(node,
1643 "qcom,hdrm-auto-mode");
1644
1645 led->pdata->isc_delay = FLASH_LED_ISC_DELAY_DEFAULT;
1646 rc = of_property_read_u32(node, "qcom,isc-delay-us", &val);
1647 if (!rc) {
1648 led->pdata->isc_delay =
1649 val >> FLASH_LED_ISC_WARMUP_DELAY_SHIFT;
1650 } else if (rc != -EINVAL) {
1651 pr_err("Unable to read ISC delay, rc=%d\n", rc);
1652 return rc;
1653 }
1654
1655 led->pdata->warmup_delay = FLASH_LED_WARMUP_DELAY_DEFAULT;
1656 rc = of_property_read_u32(node, "qcom,warmup-delay-us", &val);
1657 if (!rc) {
1658 led->pdata->warmup_delay =
1659 val >> FLASH_LED_ISC_WARMUP_DELAY_SHIFT;
1660 } else if (rc != -EINVAL) {
1661 pr_err("Unable to read WARMUP delay, rc=%d\n", rc);
1662 return rc;
1663 }
1664
1665 short_circuit_det =
1666 of_property_read_bool(node, "qcom,short-circuit-det");
1667 open_circuit_det = of_property_read_bool(node, "qcom,open-circuit-det");
1668 vph_droop_det = of_property_read_bool(node, "qcom,vph-droop-det");
1669 led->pdata->current_derate_en_cfg = (vph_droop_det << 2) |
1670 (open_circuit_det << 1) | short_circuit_det;
1671
1672 led->pdata->thermal_derate_en =
1673 of_property_read_bool(node, "qcom,thermal-derate-en");
1674
1675 if (led->pdata->thermal_derate_en) {
1676 led->pdata->thermal_derate_current =
1677 devm_kcalloc(&led->pdev->dev,
1678 FLASH_LED_THERMAL_OTST_LEVELS,
1679 sizeof(int), GFP_KERNEL);
1680 if (!led->pdata->thermal_derate_current)
1681 return -ENOMEM;
1682
1683 rc = of_property_read_u32_array(node,
1684 "qcom,thermal-derate-current",
1685 led->pdata->thermal_derate_current,
1686 FLASH_LED_THERMAL_OTST_LEVELS);
1687 if (rc < 0) {
1688 pr_err("Unable to read thermal current limits, rc=%d\n",
1689 rc);
1690 return rc;
1691 }
1692 }
1693
1694 led->pdata->otst_ramp_bkup_en =
1695 !of_property_read_bool(node, "qcom,otst-ramp-back-up-dis");
1696
1697 led->pdata->thermal_derate_slow = -EINVAL;
1698 rc = of_property_read_u32(node, "qcom,thermal-derate-slow", &val);
1699 if (!rc) {
1700 if (val < 0 || val > THERMAL_DERATE_SLOW_MAX) {
1701 pr_err("Invalid thermal_derate_slow %d\n", val);
1702 return -EINVAL;
1703 }
1704
1705 led->pdata->thermal_derate_slow =
1706 get_code_from_table(thermal_derate_slow_table,
1707 ARRAY_SIZE(thermal_derate_slow_table), val);
1708 } else if (rc != -EINVAL) {
1709 pr_err("Unable to read thermal derate slow, rc=%d\n", rc);
1710 return rc;
1711 }
1712
1713 led->pdata->thermal_derate_fast = -EINVAL;
1714 rc = of_property_read_u32(node, "qcom,thermal-derate-fast", &val);
1715 if (!rc) {
1716 if (val < 0 || val > THERMAL_DERATE_FAST_MAX) {
1717 pr_err("Invalid thermal_derate_fast %d\n", val);
1718 return -EINVAL;
1719 }
1720
1721 led->pdata->thermal_derate_fast =
1722 get_code_from_table(thermal_derate_fast_table,
1723 ARRAY_SIZE(thermal_derate_fast_table), val);
1724 } else if (rc != -EINVAL) {
1725 pr_err("Unable to read thermal derate fast, rc=%d\n", rc);
1726 return rc;
1727 }
1728
1729 led->pdata->thermal_debounce = -EINVAL;
1730 rc = of_property_read_u32(node, "qcom,thermal-debounce", &val);
1731 if (!rc) {
1732 if (val < 0 || val > THERMAL_DEBOUNCE_TIME_MAX) {
1733 pr_err("Invalid thermal_debounce %d\n", val);
1734 return -EINVAL;
1735 }
1736
1737 if (val >= 0 && val < 16)
1738 led->pdata->thermal_debounce = 0;
1739 else
1740 led->pdata->thermal_debounce = ilog2(val) - 3;
1741 } else if (rc != -EINVAL) {
1742 pr_err("Unable to read thermal debounce, rc=%d\n", rc);
1743 return rc;
1744 }
1745
1746 led->pdata->thermal_hysteresis = -EINVAL;
1747 rc = of_property_read_u32(node, "qcom,thermal-hysteresis", &val);
1748 if (!rc) {
1749 if (led->pdata->pmic_rev_id->pmic_subtype == PM660L_SUBTYPE)
1750 val = THERMAL_HYST_TEMP_TO_VAL(val, 20);
1751 else
1752 val = THERMAL_HYST_TEMP_TO_VAL(val, 15);
1753
1754 if (val < 0 || val > THERMAL_DERATE_HYSTERESIS_MAX) {
1755 pr_err("Invalid thermal_derate_hysteresis %d\n", val);
1756 return -EINVAL;
1757 }
1758
1759 led->pdata->thermal_hysteresis = val;
1760 } else if (rc != -EINVAL) {
1761 pr_err("Unable to read thermal hysteresis, rc=%d\n", rc);
1762 return rc;
1763 }
1764
1765 led->pdata->thermal_thrsh1 = -EINVAL;
1766 rc = of_property_read_u32(node, "qcom,thermal-thrsh1", &val);
1767 if (!rc) {
1768 led->pdata->thermal_thrsh1 =
1769 get_code_from_table(otst1_threshold_table,
1770 ARRAY_SIZE(otst1_threshold_table), val);
1771 } else if (rc != -EINVAL) {
1772 pr_err("Unable to read thermal thrsh1, rc=%d\n", rc);
1773 return rc;
1774 }
1775
1776 led->pdata->thermal_thrsh2 = -EINVAL;
1777 rc = of_property_read_u32(node, "qcom,thermal-thrsh2", &val);
1778 if (!rc) {
1779 led->pdata->thermal_thrsh2 =
1780 get_code_from_table(otst2_threshold_table,
1781 ARRAY_SIZE(otst2_threshold_table), val);
1782 } else if (rc != -EINVAL) {
1783 pr_err("Unable to read thermal thrsh2, rc=%d\n", rc);
1784 return rc;
1785 }
1786
1787 led->pdata->thermal_thrsh3 = -EINVAL;
1788 rc = of_property_read_u32(node, "qcom,thermal-thrsh3", &val);
1789 if (!rc) {
1790 led->pdata->thermal_thrsh3 =
1791 get_code_from_table(otst3_threshold_table,
1792 ARRAY_SIZE(otst3_threshold_table), val);
1793 } else if (rc != -EINVAL) {
1794 pr_err("Unable to read thermal thrsh3, rc=%d\n", rc);
1795 return rc;
1796 }
1797
1798 led->pdata->vph_droop_debounce = FLASH_LED_VPH_DROOP_DEBOUNCE_DEFAULT;
1799 rc = of_property_read_u32(node, "qcom,vph-droop-debounce-us", &val);
1800 if (!rc) {
1801 led->pdata->vph_droop_debounce =
1802 VPH_DROOP_DEBOUNCE_US_TO_VAL(val);
1803 } else if (rc != -EINVAL) {
1804 pr_err("Unable to read VPH droop debounce, rc=%d\n", rc);
1805 return rc;
1806 }
1807
1808 if (led->pdata->vph_droop_debounce > FLASH_LED_DEBOUNCE_MAX) {
1809 pr_err("Invalid VPH droop debounce specified\n");
1810 return -EINVAL;
1811 }
1812
1813 led->pdata->vph_droop_threshold = FLASH_LED_VPH_DROOP_THRESH_DEFAULT;
1814 rc = of_property_read_u32(node, "qcom,vph-droop-threshold-mv", &val);
1815 if (!rc) {
1816 led->pdata->vph_droop_threshold =
1817 VPH_DROOP_THRESH_MV_TO_VAL(val);
1818 } else if (rc != -EINVAL) {
1819 pr_err("Unable to read VPH droop threshold, rc=%d\n", rc);
1820 return rc;
1821 }
1822
1823 if (led->pdata->vph_droop_threshold > FLASH_LED_VPH_DROOP_THRESH_MAX) {
1824 pr_err("Invalid VPH droop threshold specified\n");
1825 return -EINVAL;
1826 }
1827
1828 led->pdata->vph_droop_hysteresis =
1829 FLASH_LED_VPH_DROOP_HYST_DEFAULT;
1830 rc = of_property_read_u32(node, "qcom,vph-droop-hysteresis-mv", &val);
1831 if (!rc) {
1832 led->pdata->vph_droop_hysteresis =
1833 VPH_DROOP_HYST_MV_TO_VAL(val);
1834 } else if (rc != -EINVAL) {
1835 pr_err("Unable to read VPH droop hysteresis, rc=%d\n", rc);
1836 return rc;
1837 }
1838
1839 if (led->pdata->vph_droop_hysteresis > FLASH_LED_HYSTERESIS_MAX) {
1840 pr_err("Invalid VPH droop hysteresis specified\n");
1841 return -EINVAL;
1842 }
1843
1844 led->pdata->vph_droop_hysteresis <<= FLASH_LED_VPH_DROOP_HYST_SHIFT;
1845
1846 rc = of_property_read_u32(node, "qcom,hw-strobe-option", &val);
1847 if (!rc) {
1848 led->pdata->hw_strobe_option = (u8)val;
1849 } else if (rc != -EINVAL) {
1850 pr_err("Unable to parse hw strobe option, rc=%d\n", rc);
1851 return rc;
1852 }
1853
1854 rc = of_property_read_u32(node, "qcom,led1n2-iclamp-low-ma", &val);
1855 if (!rc) {
1856 led->pdata->led1n2_iclamp_low_ma = val;
1857 } else if (rc != -EINVAL) {
1858 pr_err("Unable to read led1n2_iclamp_low current, rc=%d\n", rc);
1859 return rc;
1860 }
1861
1862 rc = of_property_read_u32(node, "qcom,led1n2-iclamp-mid-ma", &val);
1863 if (!rc) {
1864 led->pdata->led1n2_iclamp_mid_ma = val;
1865 } else if (rc != -EINVAL) {
1866 pr_err("Unable to read led1n2_iclamp_mid current, rc=%d\n", rc);
1867 return rc;
1868 }
1869
1870 rc = of_property_read_u32(node, "qcom,led3-iclamp-low-ma", &val);
1871 if (!rc) {
1872 led->pdata->led3_iclamp_low_ma = val;
1873 } else if (rc != -EINVAL) {
1874 pr_err("Unable to read led3_iclamp_low current, rc=%d\n", rc);
1875 return rc;
1876 }
1877
1878 rc = of_property_read_u32(node, "qcom,led3-iclamp-mid-ma", &val);
1879 if (!rc) {
1880 led->pdata->led3_iclamp_mid_ma = val;
1881 } else if (rc != -EINVAL) {
1882 pr_err("Unable to read led3_iclamp_mid current, rc=%d\n", rc);
1883 return rc;
1884 }
1885
1886 led->pdata->vled_max_uv = FLASH_LED_VLED_MAX_DEFAULT_UV;
1887 rc = of_property_read_u32(node, "qcom,vled-max-uv", &val);
1888 if (!rc) {
1889 led->pdata->vled_max_uv = val;
1890 } else if (rc != -EINVAL) {
1891 pr_err("Unable to parse vled_max voltage, rc=%d\n", rc);
1892 return rc;
1893 }
1894
1895 led->pdata->ibatt_ocp_threshold_ua =
1896 FLASH_LED_IBATT_OCP_THRESH_DEFAULT_UA;
1897 rc = of_property_read_u32(node, "qcom,ibatt-ocp-threshold-ua", &val);
1898 if (!rc) {
1899 led->pdata->ibatt_ocp_threshold_ua = val;
1900 } else if (rc != -EINVAL) {
1901 pr_err("Unable to parse ibatt_ocp threshold, rc=%d\n", rc);
1902 return rc;
1903 }
1904
1905 led->pdata->rpara_uohm = FLASH_LED_RPARA_DEFAULT_UOHM;
1906 rc = of_property_read_u32(node, "qcom,rparasitic-uohm", &val);
1907 if (!rc) {
1908 led->pdata->rpara_uohm = val;
1909 } else if (rc != -EINVAL) {
1910 pr_err("Unable to parse rparasitic, rc=%d\n", rc);
1911 return rc;
1912 }
1913
1914 led->pdata->lmh_ocv_threshold_uv =
1915 FLASH_LED_LMH_OCV_THRESH_DEFAULT_UV;
1916 rc = of_property_read_u32(node, "qcom,lmh-ocv-threshold-uv", &val);
1917 if (!rc) {
1918 led->pdata->lmh_ocv_threshold_uv = val;
1919 } else if (rc != -EINVAL) {
1920 pr_err("Unable to parse lmh ocv threshold, rc=%d\n", rc);
1921 return rc;
1922 }
1923
1924 led->pdata->lmh_rbatt_threshold_uohm =
1925 FLASH_LED_LMH_RBATT_THRESH_DEFAULT_UOHM;
1926 rc = of_property_read_u32(node, "qcom,lmh-rbatt-threshold-uohm", &val);
1927 if (!rc) {
1928 led->pdata->lmh_rbatt_threshold_uohm = val;
1929 } else if (rc != -EINVAL) {
1930 pr_err("Unable to parse lmh rbatt threshold, rc=%d\n", rc);
1931 return rc;
1932 }
1933
1934 led->pdata->lmh_level = FLASH_LED_LMH_LEVEL_DEFAULT;
1935 rc = of_property_read_u32(node, "qcom,lmh-level", &val);
1936 if (!rc) {
1937 led->pdata->lmh_level = val;
1938 } else if (rc != -EINVAL) {
1939 pr_err("Unable to parse lmh_level, rc=%d\n", rc);
1940 return rc;
1941 }
1942
1943 led->pdata->lmh_mitigation_sel = FLASH_LED_MITIGATION_SEL_DEFAULT;
1944 rc = of_property_read_u32(node, "qcom,lmh-mitigation-sel", &val);
1945 if (!rc) {
1946 led->pdata->lmh_mitigation_sel = val;
1947 } else if (rc != -EINVAL) {
1948 pr_err("Unable to parse lmh_mitigation_sel, rc=%d\n", rc);
1949 return rc;
1950 }
1951
1952 if (led->pdata->lmh_mitigation_sel > FLASH_LED_MITIGATION_SEL_MAX) {
1953 pr_err("Invalid lmh_mitigation_sel specified\n");
1954 return -EINVAL;
1955 }
1956
1957 led->pdata->chgr_mitigation_sel = FLASH_LED_MITIGATION_SEL_DEFAULT;
1958 rc = of_property_read_u32(node, "qcom,chgr-mitigation-sel", &val);
1959 if (!rc) {
1960 led->pdata->chgr_mitigation_sel = val;
1961 } else if (rc != -EINVAL) {
1962 pr_err("Unable to parse chgr_mitigation_sel, rc=%d\n", rc);
1963 return rc;
1964 }
1965
1966 if (led->pdata->chgr_mitigation_sel > FLASH_LED_MITIGATION_SEL_MAX) {
1967 pr_err("Invalid chgr_mitigation_sel specified\n");
1968 return -EINVAL;
1969 }
1970
1971 led->pdata->chgr_mitigation_sel <<= FLASH_LED_CHGR_MITIGATION_SEL_SHIFT;
1972
1973 led->pdata->iled_thrsh_val = FLASH_LED_MITIGATION_THRSH_DEFAULT;
1974 rc = of_property_read_u32(node, "qcom,iled-thrsh-ma", &val);
1975 if (!rc) {
1976 led->pdata->iled_thrsh_val = MITIGATION_THRSH_MA_TO_VAL(val);
1977 } else if (rc != -EINVAL) {
1978 pr_err("Unable to parse iled_thrsh_val, rc=%d\n", rc);
1979 return rc;
1980 }
1981
1982 if (led->pdata->iled_thrsh_val > FLASH_LED_MITIGATION_THRSH_MAX) {
1983 pr_err("Invalid iled_thrsh_val specified\n");
1984 return -EINVAL;
1985 }
1986
1987 led->pdata->all_ramp_up_done_irq =
1988 of_irq_get_byname(node, "all-ramp-up-done-irq");
1989 if (led->pdata->all_ramp_up_done_irq < 0)
1990 pr_debug("all-ramp-up-done-irq not used\n");
1991
1992 led->pdata->all_ramp_down_done_irq =
1993 of_irq_get_byname(node, "all-ramp-down-done-irq");
1994 if (led->pdata->all_ramp_down_done_irq < 0)
1995 pr_debug("all-ramp-down-done-irq not used\n");
1996
1997 led->pdata->led_fault_irq =
1998 of_irq_get_byname(node, "led-fault-irq");
1999 if (led->pdata->led_fault_irq < 0)
2000 pr_debug("led-fault-irq not used\n");
2001
2002 return 0;
2003}
2004
2005static int qpnp_flash_led_probe(struct platform_device *pdev)
2006{
2007 struct qpnp_flash_led *led;
2008 struct device_node *node, *temp;
2009 const char *temp_string;
2010 unsigned int base;
2011 int rc, i = 0, j = 0;
2012
2013 node = pdev->dev.of_node;
2014 if (!node) {
2015 pr_err("No flash LED nodes defined\n");
2016 return -ENODEV;
2017 }
2018
2019 rc = of_property_read_u32(node, "reg", &base);
2020 if (rc < 0) {
2021 pr_err("Couldn't find reg in node %s, rc = %d\n",
2022 node->full_name, rc);
2023 return rc;
2024 }
2025
2026 led = devm_kzalloc(&pdev->dev, sizeof(struct qpnp_flash_led),
2027 GFP_KERNEL);
2028 if (!led)
2029 return -ENOMEM;
2030
2031 led->regmap = dev_get_regmap(pdev->dev.parent, NULL);
2032 if (!led->regmap) {
2033 pr_err("Couldn't get parent's regmap\n");
2034 return -EINVAL;
2035 }
2036
2037 led->base = base;
2038 led->pdev = pdev;
2039 led->pdata = devm_kzalloc(&pdev->dev,
2040 sizeof(struct flash_led_platform_data), GFP_KERNEL);
2041 if (!led->pdata)
2042 return -ENOMEM;
2043
2044 rc = qpnp_flash_led_parse_common_dt(led, node);
2045 if (rc < 0) {
2046 pr_err("Failed to parse common flash LED device tree\n");
2047 return rc;
2048 }
2049
2050 for_each_available_child_of_node(node, temp) {
2051 rc = of_property_read_string(temp, "label", &temp_string);
2052 if (rc < 0) {
2053 pr_err("Failed to parse label, rc=%d\n", rc);
2054 return rc;
2055 }
2056
2057 if (!strcmp("switch", temp_string)) {
2058 led->num_snodes++;
2059 } else if (!strcmp("flash", temp_string) ||
2060 !strcmp("torch", temp_string)) {
2061 led->num_fnodes++;
2062 } else {
2063 pr_err("Invalid label for led node\n");
2064 return -EINVAL;
2065 }
2066 }
2067
2068 if (!led->num_fnodes) {
2069 pr_err("No LED nodes defined\n");
2070 return -ECHILD;
2071 }
2072
2073 led->fnode = devm_kcalloc(&pdev->dev, led->num_fnodes,
2074 sizeof(*led->fnode),
2075 GFP_KERNEL);
2076 if (!led->fnode)
2077 return -ENOMEM;
2078
2079 led->snode = devm_kcalloc(&pdev->dev, led->num_snodes,
2080 sizeof(*led->snode),
2081 GFP_KERNEL);
2082 if (!led->snode)
2083 return -ENOMEM;
2084
2085 temp = NULL;
2086 i = 0;
2087 j = 0;
2088 for_each_available_child_of_node(node, temp) {
2089 rc = of_property_read_string(temp, "label", &temp_string);
2090 if (rc < 0) {
2091 pr_err("Failed to parse label, rc=%d\n", rc);
2092 return rc;
2093 }
2094
2095 if (!strcmp("flash", temp_string) ||
2096 !strcmp("torch", temp_string)) {
2097 rc = qpnp_flash_led_parse_each_led_dt(led,
2098 &led->fnode[i++], temp);
2099 if (rc < 0) {
2100 pr_err("Unable to parse flash node %d rc=%d\n",
2101 i, rc);
2102 goto error_led_register;
2103 }
2104 }
2105
2106 if (!strcmp("switch", temp_string)) {
2107 rc = qpnp_flash_led_parse_and_register_switch(led,
2108 &led->snode[j++], temp);
2109 if (rc < 0) {
2110 pr_err("Unable to parse and register switch node, rc=%d\n",
2111 rc);
2112 goto error_switch_register;
2113 }
2114 }
2115 }
2116
2117 /* setup irqs */
2118 if (led->pdata->all_ramp_up_done_irq >= 0) {
2119 rc = devm_request_threaded_irq(&led->pdev->dev,
2120 led->pdata->all_ramp_up_done_irq,
2121 NULL, qpnp_flash_led_irq_handler,
2122 IRQF_ONESHOT,
2123 "qpnp_flash_led_all_ramp_up_done_irq", led);
2124 if (rc < 0) {
2125 pr_err("Unable to request all_ramp_up_done(%d) IRQ(err:%d)\n",
2126 led->pdata->all_ramp_up_done_irq, rc);
2127 goto error_switch_register;
2128 }
2129 }
2130
2131 if (led->pdata->all_ramp_down_done_irq >= 0) {
2132 rc = devm_request_threaded_irq(&led->pdev->dev,
2133 led->pdata->all_ramp_down_done_irq,
2134 NULL, qpnp_flash_led_irq_handler,
2135 IRQF_ONESHOT,
2136 "qpnp_flash_led_all_ramp_down_done_irq", led);
2137 if (rc < 0) {
2138 pr_err("Unable to request all_ramp_down_done(%d) IRQ(err:%d)\n",
2139 led->pdata->all_ramp_down_done_irq, rc);
2140 goto error_switch_register;
2141 }
2142 }
2143
2144 if (led->pdata->led_fault_irq >= 0) {
2145 rc = devm_request_threaded_irq(&led->pdev->dev,
2146 led->pdata->led_fault_irq,
2147 NULL, qpnp_flash_led_irq_handler,
2148 IRQF_ONESHOT,
2149 "qpnp_flash_led_fault_irq", led);
2150 if (rc < 0) {
2151 pr_err("Unable to request led_fault(%d) IRQ(err:%d)\n",
2152 led->pdata->led_fault_irq, rc);
2153 goto error_switch_register;
2154 }
2155 }
2156
2157 led->bms_psy = power_supply_get_by_name("bms");
2158 if (!led->bms_psy) {
2159 rc = flash_led_psy_register_notifier(led);
2160 if (rc < 0) {
2161 pr_err("Couldn't register psy notifier, rc = %d\n", rc);
2162 goto error_switch_register;
2163 }
2164 }
2165
2166 rc = qpnp_flash_led_init_settings(led);
2167 if (rc < 0) {
2168 pr_err("Failed to initialize flash LED, rc=%d\n", rc);
2169 goto unreg_notifier;
2170 }
2171
2172 for (i = 0; i < led->num_snodes; i++) {
2173 for (j = 0; j < ARRAY_SIZE(qpnp_flash_led_attrs); j++) {
2174 rc = sysfs_create_file(&led->snode[i].cdev.dev->kobj,
2175 &qpnp_flash_led_attrs[j].attr);
2176 if (rc < 0) {
2177 pr_err("sysfs creation failed, rc=%d\n", rc);
2178 goto sysfs_fail;
2179 }
2180 }
2181 }
2182
2183 spin_lock_init(&led->lock);
2184
2185 dev_set_drvdata(&pdev->dev, led);
2186
2187 return 0;
2188
2189sysfs_fail:
2190 for (--j; j >= 0; j--)
2191 sysfs_remove_file(&led->snode[i].cdev.dev->kobj,
2192 &qpnp_flash_led_attrs[j].attr);
2193
2194 for (--i; i >= 0; i--) {
2195 for (j = 0; j < ARRAY_SIZE(qpnp_flash_led_attrs); j++)
2196 sysfs_remove_file(&led->snode[i].cdev.dev->kobj,
2197 &qpnp_flash_led_attrs[j].attr);
2198 }
2199
2200 i = led->num_snodes;
2201unreg_notifier:
2202 power_supply_unreg_notifier(&led->nb);
2203error_switch_register:
2204 while (i > 0)
2205 led_classdev_unregister(&led->snode[--i].cdev);
2206 i = led->num_fnodes;
2207error_led_register:
2208 while (i > 0)
2209 led_classdev_unregister(&led->fnode[--i].cdev);
2210
2211 return rc;
2212}
2213
2214static int qpnp_flash_led_remove(struct platform_device *pdev)
2215{
2216 struct qpnp_flash_led *led = dev_get_drvdata(&pdev->dev);
2217 int i, j;
2218
2219 for (i = 0; i < led->num_snodes; i++) {
2220 for (j = 0; j < ARRAY_SIZE(qpnp_flash_led_attrs); j++)
2221 sysfs_remove_file(&led->snode[i].cdev.dev->kobj,
2222 &qpnp_flash_led_attrs[j].attr);
2223
2224 if (led->snode[i].regulator_on)
2225 qpnp_flash_led_regulator_enable(led,
2226 &led->snode[i], false);
2227 }
2228
2229 while (i > 0)
2230 led_classdev_unregister(&led->snode[--i].cdev);
2231
2232 i = led->num_fnodes;
2233 while (i > 0)
2234 led_classdev_unregister(&led->fnode[--i].cdev);
2235
2236 power_supply_unreg_notifier(&led->nb);
2237 return 0;
2238}
2239
2240const struct of_device_id qpnp_flash_led_match_table[] = {
2241 { .compatible = "qcom,qpnp-flash-led-v2",},
2242 { },
2243};
2244
2245static struct platform_driver qpnp_flash_led_driver = {
2246 .driver = {
2247 .name = "qcom,qpnp-flash-led-v2",
2248 .of_match_table = qpnp_flash_led_match_table,
2249 },
2250 .probe = qpnp_flash_led_probe,
2251 .remove = qpnp_flash_led_remove,
2252};
2253
2254static int __init qpnp_flash_led_init(void)
2255{
2256 return platform_driver_register(&qpnp_flash_led_driver);
2257}
2258late_initcall(qpnp_flash_led_init);
2259
2260static void __exit qpnp_flash_led_exit(void)
2261{
2262 platform_driver_unregister(&qpnp_flash_led_driver);
2263}
2264module_exit(qpnp_flash_led_exit);
2265
2266MODULE_DESCRIPTION("QPNP Flash LED driver v2");
2267MODULE_LICENSE("GPL v2");
2268MODULE_ALIAS("leds:leds-qpnp-flash-v2");