blob: 817dfa3b2f531e1a281ba143a20ac2bc7adeda30 [file] [log] [blame]
David Collins8885f792017-01-26 14:36:34 -08001/* Copyright (c) 2012-2015, 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#include <linux/kernel.h>
14#include <linux/regmap.h>
15#include <linux/module.h>
16#include <linux/init.h>
17#include <linux/slab.h>
18#include <linux/leds.h>
19#include <linux/err.h>
20#include <linux/spinlock.h>
21#include <linux/of_platform.h>
22#include <linux/of_device.h>
23#include <linux/spmi.h>
24#include <linux/platform_device.h>
25#include <linux/qpnp/pwm.h>
26#include <linux/workqueue.h>
27#include <linux/delay.h>
28#include <linux/regulator/consumer.h>
29#include <linux/delay.h>
30
31#define WLED_MOD_EN_REG(base, n) (base + 0x60 + n*0x10)
32#define WLED_IDAC_DLY_REG(base, n) (WLED_MOD_EN_REG(base, n) + 0x01)
33#define WLED_FULL_SCALE_REG(base, n) (WLED_IDAC_DLY_REG(base, n) + 0x01)
34#define WLED_MOD_SRC_SEL_REG(base, n) (WLED_FULL_SCALE_REG(base, n) + 0x01)
35
36/* wled control registers */
37#define WLED_OVP_INT_STATUS(base) (base + 0x10)
38#define WLED_BRIGHTNESS_CNTL_LSB(base, n) (base + 0x40 + 2*n)
39#define WLED_BRIGHTNESS_CNTL_MSB(base, n) (base + 0x41 + 2*n)
40#define WLED_MOD_CTRL_REG(base) (base + 0x46)
41#define WLED_SYNC_REG(base) (base + 0x47)
42#define WLED_FDBCK_CTRL_REG(base) (base + 0x48)
43#define WLED_SWITCHING_FREQ_REG(base) (base + 0x4C)
44#define WLED_OVP_CFG_REG(base) (base + 0x4D)
45#define WLED_BOOST_LIMIT_REG(base) (base + 0x4E)
46#define WLED_CURR_SINK_REG(base) (base + 0x4F)
47#define WLED_HIGH_POLE_CAP_REG(base) (base + 0x58)
48#define WLED_CURR_SINK_MASK 0xE0
49#define WLED_CURR_SINK_SHFT 0x05
50#define WLED_DISABLE_ALL_SINKS 0x00
51#define WLED_DISABLE_1_2_SINKS 0x80
52#define WLED_SWITCH_FREQ_MASK 0x0F
53#define WLED_OVP_VAL_MASK 0x03
54#define WLED_OVP_INT_MASK 0x02
55#define WLED_OVP_VAL_BIT_SHFT 0x00
56#define WLED_BOOST_LIMIT_MASK 0x07
57#define WLED_BOOST_LIMIT_BIT_SHFT 0x00
58#define WLED_BOOST_ON 0x80
59#define WLED_BOOST_OFF 0x00
60#define WLED_EN_MASK 0x80
61#define WLED_NO_MASK 0x00
62#define WLED_CP_SELECT_MAX 0x03
63#define WLED_CP_SELECT_MASK 0x02
64#define WLED_USE_EXT_GEN_MOD_SRC 0x01
65#define WLED_CTL_DLY_STEP 200
66#define WLED_CTL_DLY_MAX 1400
67#define WLED_MAX_CURR 25
68#define WLED_NO_CURRENT 0x00
69#define WLED_OVP_DELAY 1000
70#define WLED_OVP_DELAY_INT 200
71#define WLED_OVP_DELAY_LOOP 100
72#define WLED_MSB_MASK 0x0F
73#define WLED_MAX_CURR_MASK 0x1F
74#define WLED_OP_FDBCK_MASK 0x07
75#define WLED_OP_FDBCK_BIT_SHFT 0x00
76#define WLED_OP_FDBCK_DEFAULT 0x00
77
78#define WLED_SET_ILIM_CODE 0x01
79
80#define WLED_MAX_LEVEL 4095
81#define WLED_8_BIT_MASK 0xFF
82#define WLED_4_BIT_MASK 0x0F
83#define WLED_8_BIT_SHFT 0x08
84#define WLED_MAX_DUTY_CYCLE 0xFFF
85
86#define WLED_SYNC_VAL 0x07
87#define WLED_SYNC_RESET_VAL 0x00
88
89#define PMIC_VER_8026 0x04
90#define PMIC_VER_8941 0x01
91#define PMIC_VERSION_REG 0x0105
92
93#define WLED_DEFAULT_STRINGS 0x01
94#define WLED_THREE_STRINGS 0x03
95#define WLED_MAX_TRIES 5
96#define WLED_DEFAULT_OVP_VAL 0x02
97#define WLED_BOOST_LIM_DEFAULT 0x03
98#define WLED_CP_SEL_DEFAULT 0x00
99#define WLED_CTRL_DLY_DEFAULT 0x00
100#define WLED_SWITCH_FREQ_DEFAULT 0x0B
101
102#define FLASH_SAFETY_TIMER(base) (base + 0x40)
103#define FLASH_MAX_CURR(base) (base + 0x41)
104#define FLASH_LED_0_CURR(base) (base + 0x42)
105#define FLASH_LED_1_CURR(base) (base + 0x43)
106#define FLASH_CLAMP_CURR(base) (base + 0x44)
107#define FLASH_LED_TMR_CTRL(base) (base + 0x48)
108#define FLASH_HEADROOM(base) (base + 0x4A)
109#define FLASH_STARTUP_DELAY(base) (base + 0x4B)
110#define FLASH_MASK_ENABLE(base) (base + 0x4C)
111#define FLASH_VREG_OK_FORCE(base) (base + 0x4F)
112#define FLASH_ENABLE_CONTROL(base) (base + 0x46)
113#define FLASH_LED_STROBE_CTRL(base) (base + 0x47)
114#define FLASH_WATCHDOG_TMR(base) (base + 0x49)
115#define FLASH_FAULT_DETECT(base) (base + 0x51)
116#define FLASH_PERIPHERAL_SUBTYPE(base) (base + 0x05)
117#define FLASH_CURRENT_RAMP(base) (base + 0x54)
118
119#define FLASH_MAX_LEVEL 0x4F
120#define TORCH_MAX_LEVEL 0x0F
121#define FLASH_NO_MASK 0x00
122
123#define FLASH_MASK_1 0x20
124#define FLASH_MASK_REG_MASK 0xE0
125#define FLASH_HEADROOM_MASK 0x03
126#define FLASH_SAFETY_TIMER_MASK 0x7F
127#define FLASH_CURRENT_MASK 0xFF
128#define FLASH_MAX_CURRENT_MASK 0x7F
129#define FLASH_TMR_MASK 0x03
130#define FLASH_TMR_WATCHDOG 0x03
131#define FLASH_TMR_SAFETY 0x00
132#define FLASH_FAULT_DETECT_MASK 0X80
133#define FLASH_HW_VREG_OK 0x40
134#define FLASH_SW_VREG_OK 0x80
135#define FLASH_VREG_MASK 0xC0
136#define FLASH_STARTUP_DLY_MASK 0x02
137#define FLASH_CURRENT_RAMP_MASK 0xBF
138
139#define FLASH_ENABLE_ALL 0xE0
140#define FLASH_ENABLE_MODULE 0x80
141#define FLASH_ENABLE_MODULE_MASK 0x80
142#define FLASH_DISABLE_ALL 0x00
143#define FLASH_ENABLE_MASK 0xE0
144#define FLASH_ENABLE_LED_0 0xC0
145#define FLASH_ENABLE_LED_1 0xA0
146#define FLASH_INIT_MASK 0xE0
147#define FLASH_SELFCHECK_ENABLE 0x80
148#define FLASH_WATCHDOG_MASK 0x1F
149#define FLASH_RAMP_STEP_27US 0xBF
150
151#define FLASH_HW_SW_STROBE_SEL_MASK 0x04
152#define FLASH_STROBE_MASK 0xC7
153#define FLASH_LED_0_OUTPUT 0x80
154#define FLASH_LED_1_OUTPUT 0x40
155#define FLASH_TORCH_OUTPUT 0xC0
156
157#define FLASH_CURRENT_PRGM_MIN 1
158#define FLASH_CURRENT_PRGM_SHIFT 1
159#define FLASH_CURRENT_MAX 0x4F
160#define FLASH_CURRENT_TORCH 0x07
161
162#define FLASH_DURATION_200ms 0x13
163#define TORCH_DURATION_12s 0x0A
164#define FLASH_CLAMP_200mA 0x0F
165
166#define FLASH_SUBTYPE_DUAL 0x01
167#define FLASH_SUBTYPE_SINGLE 0x02
168
169#define FLASH_RAMP_UP_DELAY_US 1000
170#define FLASH_RAMP_DN_DELAY_US 2160
171
172#define LED_TRIGGER_DEFAULT "none"
173
174#define RGB_LED_SRC_SEL(base) (base + 0x45)
175#define RGB_LED_EN_CTL(base) (base + 0x46)
176#define RGB_LED_ATC_CTL(base) (base + 0x47)
177
178#define RGB_MAX_LEVEL LED_FULL
179#define RGB_LED_ENABLE_RED 0x80
180#define RGB_LED_ENABLE_GREEN 0x40
181#define RGB_LED_ENABLE_BLUE 0x20
182#define RGB_LED_SOURCE_VPH_PWR 0x01
183#define RGB_LED_ENABLE_MASK 0xE0
184#define RGB_LED_SRC_MASK 0x03
185#define QPNP_LED_PWM_FLAGS (PM_PWM_LUT_LOOP | PM_PWM_LUT_RAMP_UP)
186#define QPNP_LUT_RAMP_STEP_DEFAULT 255
187#define PWM_LUT_MAX_SIZE 63
188#define PWM_GPLED_LUT_MAX_SIZE 31
189#define RGB_LED_DISABLE 0x00
190
191#define MPP_MAX_LEVEL LED_FULL
192#define LED_MPP_MODE_CTRL(base) (base + 0x40)
193#define LED_MPP_VIN_CTRL(base) (base + 0x41)
194#define LED_MPP_EN_CTRL(base) (base + 0x46)
195#define LED_MPP_SINK_CTRL(base) (base + 0x4C)
196
197#define LED_MPP_CURRENT_MIN 5
198#define LED_MPP_CURRENT_MAX 40
199#define LED_MPP_VIN_CTRL_DEFAULT 0
200#define LED_MPP_CURRENT_PER_SETTING 5
201#define LED_MPP_SOURCE_SEL_DEFAULT LED_MPP_MODE_ENABLE
202
203#define LED_MPP_SINK_MASK 0x07
204#define LED_MPP_MODE_MASK 0x7F
205#define LED_MPP_VIN_MASK 0x03
206#define LED_MPP_EN_MASK 0x80
207#define LED_MPP_SRC_MASK 0x0F
208#define LED_MPP_MODE_CTRL_MASK 0x70
209
210#define LED_MPP_MODE_SINK (0x06 << 4)
211#define LED_MPP_MODE_ENABLE 0x01
212#define LED_MPP_MODE_OUTPUT 0x10
213#define LED_MPP_MODE_DISABLE 0x00
214#define LED_MPP_EN_ENABLE 0x80
215#define LED_MPP_EN_DISABLE 0x00
216
217#define MPP_SOURCE_DTEST1 0x08
218
219#define GPIO_MAX_LEVEL LED_FULL
220#define LED_GPIO_MODE_CTRL(base) (base + 0x40)
221#define LED_GPIO_VIN_CTRL(base) (base + 0x41)
222#define LED_GPIO_EN_CTRL(base) (base + 0x46)
223
224#define LED_GPIO_VIN_CTRL_DEFAULT 0
225#define LED_GPIO_SOURCE_SEL_DEFAULT LED_GPIO_MODE_ENABLE
226
227#define LED_GPIO_MODE_MASK 0x3F
228#define LED_GPIO_VIN_MASK 0x0F
229#define LED_GPIO_EN_MASK 0x80
230#define LED_GPIO_SRC_MASK 0x0F
231#define LED_GPIO_MODE_CTRL_MASK 0x30
232
233#define LED_GPIO_MODE_ENABLE 0x01
234#define LED_GPIO_MODE_DISABLE 0x00
235#define LED_GPIO_MODE_OUTPUT 0x10
236#define LED_GPIO_EN_ENABLE 0x80
237#define LED_GPIO_EN_DISABLE 0x00
238
239#define KPDBL_MAX_LEVEL LED_FULL
240#define KPDBL_ROW_SRC_SEL(base) (base + 0x40)
241#define KPDBL_ENABLE(base) (base + 0x46)
242#define KPDBL_ROW_SRC(base) (base + 0xE5)
243
244#define KPDBL_ROW_SRC_SEL_VAL_MASK 0x0F
245#define KPDBL_ROW_SCAN_EN_MASK 0x80
246#define KPDBL_ROW_SCAN_VAL_MASK 0x0F
247#define KPDBL_ROW_SCAN_EN_SHIFT 7
248#define KPDBL_MODULE_EN 0x80
249#define KPDBL_MODULE_DIS 0x00
250#define KPDBL_MODULE_EN_MASK 0x80
251#define NUM_KPDBL_LEDS 4
252#define KPDBL_MASTER_BIT_INDEX 0
253
254/**
255 * enum qpnp_leds - QPNP supported led ids
256 * @QPNP_ID_WLED - White led backlight
257 */
258enum qpnp_leds {
259 QPNP_ID_WLED = 0,
260 QPNP_ID_FLASH1_LED0,
261 QPNP_ID_FLASH1_LED1,
262 QPNP_ID_RGB_RED,
263 QPNP_ID_RGB_GREEN,
264 QPNP_ID_RGB_BLUE,
265 QPNP_ID_LED_MPP,
266 QPNP_ID_KPDBL,
267 QPNP_ID_LED_GPIO,
268 QPNP_ID_MAX,
269};
270
271/* current boost limit */
272enum wled_current_boost_limit {
273 WLED_CURR_LIMIT_105mA,
274 WLED_CURR_LIMIT_385mA,
275 WLED_CURR_LIMIT_525mA,
276 WLED_CURR_LIMIT_805mA,
277 WLED_CURR_LIMIT_980mA,
278 WLED_CURR_LIMIT_1260mA,
279 WLED_CURR_LIMIT_1400mA,
280 WLED_CURR_LIMIT_1680mA,
281};
282
283/* over voltage protection threshold */
284enum wled_ovp_threshold {
285 WLED_OVP_35V,
286 WLED_OVP_32V,
287 WLED_OVP_29V,
288 WLED_OVP_27V,
289};
290
291enum flash_headroom {
292 HEADROOM_250mV = 0,
293 HEADROOM_300mV,
294 HEADROOM_400mV,
295 HEADROOM_500mV,
296};
297
298enum flash_startup_dly {
299 DELAY_10us = 0,
300 DELAY_32us,
301 DELAY_64us,
302 DELAY_128us,
303};
304
305enum led_mode {
306 PWM_MODE = 0,
307 LPG_MODE,
308 MANUAL_MODE,
309};
310
311static u8 wled_debug_regs[] = {
312 /* brightness registers */
313 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
314 /* common registers */
315 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
316 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
317 /* LED1 */
318 0x60, 0x61, 0x62, 0x63, 0x66,
319 /* LED2 */
320 0x70, 0x71, 0x72, 0x73, 0x76,
321 /* LED3 */
322 0x80, 0x81, 0x82, 0x83, 0x86,
323};
324
325static u8 flash_debug_regs[] = {
326 0x40, 0x41, 0x42, 0x43, 0x44, 0x48, 0x49, 0x4b, 0x4c,
327 0x4f, 0x46, 0x47,
328};
329
330static u8 rgb_pwm_debug_regs[] = {
331 0x45, 0x46, 0x47,
332};
333
334static u8 mpp_debug_regs[] = {
335 0x40, 0x41, 0x42, 0x45, 0x46, 0x4c,
336};
337
338static u8 kpdbl_debug_regs[] = {
339 0x40, 0x46, 0xb1, 0xb3, 0xb4, 0xe5,
340};
341
342static u8 gpio_debug_regs[] = {
343 0x40, 0x41, 0x42, 0x45, 0x46,
344};
345
346/**
347 * pwm_config_data - pwm configuration data
348 * @lut_params - lut parameters to be used by pwm driver
349 * @pwm_device - pwm device
350 * @pwm_period_us - period for pwm, in us
351 * @mode - mode the led operates in
352 * @old_duty_pcts - storage for duty pcts that may need to be reused
353 * @default_mode - default mode of LED as set in device tree
354 * @use_blink - use blink sysfs entry
355 * @blinking - device is currently blinking w/LPG mode
356 */
357struct pwm_config_data {
358 struct lut_params lut_params;
359 struct pwm_device *pwm_dev;
360 u32 pwm_period_us;
361 struct pwm_duty_cycles *duty_cycles;
362 int *old_duty_pcts;
363 u8 mode;
364 u8 default_mode;
365 bool pwm_enabled;
366 bool use_blink;
367 bool blinking;
368};
369
370/**
371 * wled_config_data - wled configuration data
372 * @num_strings - number of wled strings to be configured
373 * @num_physical_strings - physical number of strings supported
374 * @ovp_val - over voltage protection threshold
375 * @boost_curr_lim - boot current limit
376 * @cp_select - high pole capacitance
377 * @ctrl_delay_us - delay in activation of led
378 * @dig_mod_gen_en - digital module generator
379 * @cs_out_en - current sink output enable
380 * @op_fdbck - selection of output as feedback for the boost
381 */
382struct wled_config_data {
383 u8 num_strings;
384 u8 num_physical_strings;
385 u8 ovp_val;
386 u8 boost_curr_lim;
387 u8 cp_select;
388 u8 ctrl_delay_us;
389 u8 switch_freq;
390 u8 op_fdbck;
391 u8 pmic_version;
392 bool dig_mod_gen_en;
393 bool cs_out_en;
394};
395
396/**
397 * mpp_config_data - mpp configuration data
398 * @pwm_cfg - device pwm configuration
399 * @current_setting - current setting, 5ma-40ma in 5ma increments
400 * @source_sel - source selection
401 * @mode_ctrl - mode control
402 * @vin_ctrl - input control
403 * @min_brightness - minimum brightness supported
404 * @pwm_mode - pwm mode in use
405 * @max_uV - maximum regulator voltage
406 * @min_uV - minimum regulator voltage
407 * @mpp_reg - regulator to power mpp based LED
408 * @enable - flag indicating LED on or off
409 */
410struct mpp_config_data {
411 struct pwm_config_data *pwm_cfg;
412 u8 current_setting;
413 u8 source_sel;
414 u8 mode_ctrl;
415 u8 vin_ctrl;
416 u8 min_brightness;
417 u8 pwm_mode;
418 u32 max_uV;
419 u32 min_uV;
420 struct regulator *mpp_reg;
421 bool enable;
422};
423
424/**
425 * flash_config_data - flash configuration data
426 * @current_prgm - current to be programmed, scaled by max level
427 * @clamp_curr - clamp current to use
428 * @headroom - headroom value to use
429 * @duration - duration of the flash
430 * @enable_module - enable address for particular flash
431 * @trigger_flash - trigger flash
432 * @startup_dly - startup delay for flash
433 * @strobe_type - select between sw and hw strobe
434 * @peripheral_subtype - module peripheral subtype
435 * @current_addr - address to write for current
436 * @second_addr - address of secondary flash to be written
437 * @safety_timer - enable safety timer or watchdog timer
438 * @torch_enable - enable flash LED torch mode
439 * @flash_reg_get - flash regulator attached or not
440 * @flash_wa_reg_get - workaround regulator attached or not
441 * @flash_on - flash status, on or off
442 * @torch_on - torch status, on or off
443 * @vreg_ok - specifies strobe type, sw or hw
444 * @no_smbb_support - specifies if smbb boost is not required and there is a
445 single regulator for both flash and torch
446 * @flash_boost_reg - boost regulator for flash
447 * @torch_boost_reg - boost regulator for torch
448 * @flash_wa_reg - flash regulator for wa
449 */
450struct flash_config_data {
451 u8 current_prgm;
452 u8 clamp_curr;
453 u8 headroom;
454 u8 duration;
455 u8 enable_module;
456 u8 trigger_flash;
457 u8 startup_dly;
458 u8 strobe_type;
459 u8 peripheral_subtype;
460 u16 current_addr;
461 u16 second_addr;
462 bool safety_timer;
463 bool torch_enable;
464 bool flash_reg_get;
465 bool flash_wa_reg_get;
466 bool flash_on;
467 bool torch_on;
468 bool vreg_ok;
469 bool no_smbb_support;
470 struct regulator *flash_boost_reg;
471 struct regulator *torch_boost_reg;
472 struct regulator *flash_wa_reg;
473};
474
475/**
476 * kpdbl_config_data - kpdbl configuration data
477 * @pwm_cfg - device pwm configuration
478 * @mode - running mode: pwm or lut
479 * @row_id - row id of the led
480 * @row_src_vbst - 0 for vph_pwr and 1 for vbst
481 * @row_src_en - enable row source
482 * @always_on - always on row
483 * @lut_params - lut parameters to be used by pwm driver
484 * @duty_cycles - duty cycles for lut
485 * @pwm_mode - pwm mode in use
486 */
487struct kpdbl_config_data {
488 struct pwm_config_data *pwm_cfg;
489 u32 row_id;
490 bool row_src_vbst;
491 bool row_src_en;
492 bool always_on;
493 struct pwm_duty_cycles *duty_cycles;
494 struct lut_params lut_params;
495 u8 pwm_mode;
496};
497
498/**
499 * rgb_config_data - rgb configuration data
500 * @pwm_cfg - device pwm configuration
501 * @enable - bits to enable led
502 */
503struct rgb_config_data {
504 struct pwm_config_data *pwm_cfg;
505 u8 enable;
506};
507
508/**
509 * gpio_config_data - gpio configuration data
510 * @source_sel - source selection
511 * @mode_ctrl - mode control
512 * @vin_ctrl - input control
513 * @enable - flag indicating LED on or off
514 */
515struct gpio_config_data {
516 u8 source_sel;
517 u8 mode_ctrl;
518 u8 vin_ctrl;
519 bool enable;
520};
521
522/**
523 * struct qpnp_led_data - internal led data structure
524 * @led_classdev - led class device
525 * @delayed_work - delayed work for turning off the LED
526 * @workqueue - dedicated workqueue to handle concurrency
527 * @work - workqueue for led
528 * @id - led index
529 * @base_reg - base register given in device tree
530 * @lock - to protect the transactions
531 * @reg - cached value of led register
532 * @num_leds - number of leds in the module
533 * @max_current - maximum current supported by LED
534 * @default_on - true: default state max, false, default state 0
535 * @turn_off_delay_ms - number of msec before turning off the LED
536 */
537struct qpnp_led_data {
538 struct led_classdev cdev;
539 struct platform_device *pdev;
540 struct regmap *regmap;
541 struct delayed_work dwork;
542 struct workqueue_struct *workqueue;
543 struct work_struct work;
544 int id;
545 u16 base;
546 u8 reg;
547 u8 num_leds;
548 struct mutex lock;
549 struct wled_config_data *wled_cfg;
550 struct flash_config_data *flash_cfg;
551 struct kpdbl_config_data *kpdbl_cfg;
552 struct rgb_config_data *rgb_cfg;
553 struct mpp_config_data *mpp_cfg;
554 struct gpio_config_data *gpio_cfg;
555 int max_current;
556 bool default_on;
557 bool in_order_command_processing;
558 int turn_off_delay_ms;
559};
560
561static DEFINE_MUTEX(flash_lock);
562static struct pwm_device *kpdbl_master;
563static u32 kpdbl_master_period_us;
564DECLARE_BITMAP(kpdbl_leds_in_use, NUM_KPDBL_LEDS);
565static bool is_kpdbl_master_turn_on;
566
567static int
568qpnp_led_masked_write(struct qpnp_led_data *led, u16 addr, u8 mask, u8 val)
569{
570 int rc;
571
572 rc = regmap_update_bits(led->regmap, addr, mask, val);
573 if (rc)
574 dev_err(&led->pdev->dev,
575 "Unable to regmap_update_bits to addr=%x, rc(%d)\n",
576 addr, rc);
577 return rc;
578}
579
580static void qpnp_dump_regs(struct qpnp_led_data *led, u8 regs[], u8 array_size)
581{
582 int i;
583 u8 val;
584
585 pr_debug("===== %s LED register dump start =====\n", led->cdev.name);
586 for (i = 0; i < array_size; i++) {
587 regmap_bulk_read(led->regmap, led->base + regs[i], &val,
588 sizeof(val));
589 pr_debug("%s: 0x%x = 0x%x\n", led->cdev.name,
590 led->base + regs[i], val);
591 }
592 pr_debug("===== %s LED register dump end =====\n", led->cdev.name);
593}
594
595static int qpnp_wled_sync(struct qpnp_led_data *led)
596{
597 int rc;
598 u8 val;
599
600 /* sync */
601 val = WLED_SYNC_VAL;
602 rc = regmap_write(led->regmap, WLED_SYNC_REG(led->base), val);
603 if (rc) {
604 dev_err(&led->pdev->dev,
605 "WLED set sync reg failed(%d)\n", rc);
606 return rc;
607 }
608
609 val = WLED_SYNC_RESET_VAL;
610 rc = regmap_write(led->regmap, WLED_SYNC_REG(led->base), val);
611 if (rc) {
612 dev_err(&led->pdev->dev,
613 "WLED reset sync reg failed(%d)\n", rc);
614 return rc;
615 }
616 return 0;
617}
618
619static int qpnp_wled_set(struct qpnp_led_data *led)
620{
621 int rc, duty, level, tries = 0;
622 u8 val, i, num_wled_strings;
623 uint sink_val, ilim_val, ovp_val;
624
625 num_wled_strings = led->wled_cfg->num_strings;
626
627 level = led->cdev.brightness;
628
629 if (level > WLED_MAX_LEVEL)
630 level = WLED_MAX_LEVEL;
631 if (level == 0) {
632 for (i = 0; i < num_wled_strings; i++) {
633 rc = qpnp_led_masked_write(led,
634 WLED_FULL_SCALE_REG(led->base, i),
635 WLED_MAX_CURR_MASK, WLED_NO_CURRENT);
636 if (rc) {
637 dev_err(&led->pdev->dev,
638 "Write max current failure (%d)\n",
639 rc);
640 return rc;
641 }
642 }
643
644 rc = qpnp_wled_sync(led);
645 if (rc) {
646 dev_err(&led->pdev->dev,
647 "WLED sync failed(%d)\n", rc);
648 return rc;
649 }
650
651 rc = regmap_read(led->regmap, WLED_CURR_SINK_REG(led->base),
652 &sink_val);
653 if (rc) {
654 dev_err(&led->pdev->dev,
655 "WLED read sink reg failed(%d)\n", rc);
656 return rc;
657 }
658
659 if (led->wled_cfg->pmic_version == PMIC_VER_8026) {
660 val = WLED_DISABLE_ALL_SINKS;
661 rc = regmap_write(led->regmap,
662 WLED_CURR_SINK_REG(led->base), val);
663 if (rc) {
664 dev_err(&led->pdev->dev,
665 "WLED write sink reg failed(%d)\n", rc);
666 return rc;
667 }
668
669 usleep_range(WLED_OVP_DELAY, WLED_OVP_DELAY + 10);
670 } else if (led->wled_cfg->pmic_version == PMIC_VER_8941) {
671 if (led->wled_cfg->num_physical_strings <=
672 WLED_THREE_STRINGS) {
673 val = WLED_DISABLE_1_2_SINKS;
674 rc = regmap_write(led->regmap,
675 WLED_CURR_SINK_REG(led->base),
676 val);
677 if (rc) {
678 dev_err(&led->pdev->dev,
679 "WLED write sink reg failed");
680 return rc;
681 }
682
683 rc = regmap_read(led->regmap,
684 WLED_BOOST_LIMIT_REG(led->base),
685 &ilim_val);
686 if (rc) {
687 dev_err(&led->pdev->dev,
688 "Unable to read boost reg");
689 }
690 val = WLED_SET_ILIM_CODE;
691 rc = regmap_write(led->regmap,
692 WLED_BOOST_LIMIT_REG(led->base),
693 val);
694 if (rc) {
695 dev_err(&led->pdev->dev,
696 "WLED write sink reg failed");
697 return rc;
698 }
699 usleep_range(WLED_OVP_DELAY,
700 WLED_OVP_DELAY + 10);
701 } else {
702 val = WLED_DISABLE_ALL_SINKS;
703 rc = regmap_write(led->regmap,
704 WLED_CURR_SINK_REG(led->base),
705 val);
706 if (rc) {
707 dev_err(&led->pdev->dev,
708 "WLED write sink reg failed");
709 return rc;
710 }
711
712 msleep(WLED_OVP_DELAY_INT);
713 while (tries < WLED_MAX_TRIES) {
714 rc = regmap_read(led->regmap,
715 WLED_OVP_INT_STATUS(led->base),
716 &ovp_val);
717 if (rc) {
718 dev_err(&led->pdev->dev,
719 "Unable to read boost reg");
720 }
721
722 if (ovp_val & WLED_OVP_INT_MASK)
723 break;
724
725 msleep(WLED_OVP_DELAY_LOOP);
726 tries++;
727 }
728 usleep_range(WLED_OVP_DELAY,
729 WLED_OVP_DELAY + 10);
730 }
731 }
732
733 val = WLED_BOOST_OFF;
734 rc = regmap_write(led->regmap, WLED_MOD_CTRL_REG(led->base),
735 val);
736 if (rc) {
737 dev_err(&led->pdev->dev,
738 "WLED write ctrl reg failed(%d)\n", rc);
739 return rc;
740 }
741
742 for (i = 0; i < num_wled_strings; i++) {
743 rc = qpnp_led_masked_write(led,
744 WLED_FULL_SCALE_REG(led->base, i),
745 WLED_MAX_CURR_MASK, (u8)led->max_current);
746 if (rc) {
747 dev_err(&led->pdev->dev,
748 "Write max current failure (%d)\n",
749 rc);
750 return rc;
751 }
752 }
753
754 rc = qpnp_wled_sync(led);
755 if (rc) {
756 dev_err(&led->pdev->dev,
757 "WLED sync failed(%d)\n", rc);
758 return rc;
759 }
760
761 if (led->wled_cfg->pmic_version == PMIC_VER_8941) {
762 if (led->wled_cfg->num_physical_strings <=
763 WLED_THREE_STRINGS) {
764 rc = regmap_write(led->regmap,
765 WLED_BOOST_LIMIT_REG(led->base),
766 ilim_val);
767 if (rc) {
768 dev_err(&led->pdev->dev,
769 "WLED write sink reg failed");
770 return rc;
771 }
772 } else {
773 /* restore OVP to original value */
774 rc = regmap_write(led->regmap,
775 WLED_OVP_CFG_REG(led->base),
776 *&led->wled_cfg->ovp_val);
777 if (rc) {
778 dev_err(&led->pdev->dev,
779 "WLED write sink reg failed");
780 return rc;
781 }
782 }
783 }
784
785 /* re-enable all sinks */
786 rc = regmap_write(led->regmap, WLED_CURR_SINK_REG(led->base),
787 sink_val);
788 if (rc) {
789 dev_err(&led->pdev->dev,
790 "WLED write sink reg failed(%d)\n", rc);
791 return rc;
792 }
793
794 } else {
795 val = WLED_BOOST_ON;
796 rc = regmap_write(led->regmap, WLED_MOD_CTRL_REG(led->base),
797 val);
798 if (rc) {
799 dev_err(&led->pdev->dev,
800 "WLED write ctrl reg failed(%d)\n", rc);
801 return rc;
802 }
803 }
804
805 duty = (WLED_MAX_DUTY_CYCLE * level) / WLED_MAX_LEVEL;
806
807 /* program brightness control registers */
808 for (i = 0; i < num_wled_strings; i++) {
809 rc = qpnp_led_masked_write(led,
810 WLED_BRIGHTNESS_CNTL_MSB(led->base, i), WLED_MSB_MASK,
811 (duty >> WLED_8_BIT_SHFT) & WLED_4_BIT_MASK);
812 if (rc) {
813 dev_err(&led->pdev->dev,
814 "WLED set brightness MSB failed(%d)\n", rc);
815 return rc;
816 }
817 val = duty & WLED_8_BIT_MASK;
818 rc = regmap_write(led->regmap,
819 WLED_BRIGHTNESS_CNTL_LSB(led->base, i), val);
820 if (rc) {
821 dev_err(&led->pdev->dev,
822 "WLED set brightness LSB failed(%d)\n", rc);
823 return rc;
824 }
825 }
826
827 rc = qpnp_wled_sync(led);
828 if (rc) {
829 dev_err(&led->pdev->dev, "WLED sync failed(%d)\n", rc);
830 return rc;
831 }
832 return 0;
833}
834
835static int qpnp_mpp_set(struct qpnp_led_data *led)
836{
837 int rc;
838 u8 val;
839 int duty_us, duty_ns, period_us;
840
841 if (led->cdev.brightness) {
842 if (led->mpp_cfg->mpp_reg && !led->mpp_cfg->enable) {
843 rc = regulator_set_voltage(led->mpp_cfg->mpp_reg,
844 led->mpp_cfg->min_uV,
845 led->mpp_cfg->max_uV);
846 if (rc) {
847 dev_err(&led->pdev->dev,
848 "Regulator voltage set failed rc=%d\n",
849 rc);
850 return rc;
851 }
852
853 rc = regulator_enable(led->mpp_cfg->mpp_reg);
854 if (rc) {
855 dev_err(&led->pdev->dev,
856 "Regulator enable failed(%d)\n", rc);
857 goto err_reg_enable;
858 }
859 }
860
861 led->mpp_cfg->enable = true;
862
863 if (led->cdev.brightness < led->mpp_cfg->min_brightness) {
864 dev_warn(&led->pdev->dev, "brightness is less than supported, set to minimum supported\n");
865 led->cdev.brightness = led->mpp_cfg->min_brightness;
866 }
867
868 if (led->mpp_cfg->pwm_mode != MANUAL_MODE) {
869 if (!led->mpp_cfg->pwm_cfg->blinking) {
870 led->mpp_cfg->pwm_cfg->mode =
871 led->mpp_cfg->pwm_cfg->default_mode;
872 led->mpp_cfg->pwm_mode =
873 led->mpp_cfg->pwm_cfg->default_mode;
874 }
875 }
876 if (led->mpp_cfg->pwm_mode == PWM_MODE) {
877 /*config pwm for brightness scaling*/
878 period_us = led->mpp_cfg->pwm_cfg->pwm_period_us;
879 if (period_us > INT_MAX / NSEC_PER_USEC) {
880 duty_us = (period_us * led->cdev.brightness) /
881 LED_FULL;
882 rc = pwm_config_us(
883 led->mpp_cfg->pwm_cfg->pwm_dev,
884 duty_us,
885 period_us);
886 } else {
887 duty_ns = ((period_us * NSEC_PER_USEC) /
888 LED_FULL) * led->cdev.brightness;
889 rc = pwm_config(
890 led->mpp_cfg->pwm_cfg->pwm_dev,
891 duty_ns,
892 period_us * NSEC_PER_USEC);
893 }
894 if (rc < 0) {
895 dev_err(&led->pdev->dev, "Failed to configure pwm for new values\n");
896 goto err_mpp_reg_write;
897 }
898 }
899
Fenglin Wu325e6de2017-03-16 13:40:26 +0800900 if (led->mpp_cfg->pwm_mode != MANUAL_MODE) {
David Collins8885f792017-01-26 14:36:34 -0800901 pwm_enable(led->mpp_cfg->pwm_cfg->pwm_dev);
Fenglin Wu325e6de2017-03-16 13:40:26 +0800902 led->mpp_cfg->pwm_cfg->pwm_enabled = 1;
903 } else {
David Collins8885f792017-01-26 14:36:34 -0800904 if (led->cdev.brightness < LED_MPP_CURRENT_MIN)
905 led->cdev.brightness = LED_MPP_CURRENT_MIN;
906 else {
907 /*
908 * PMIC supports LED intensity from 5mA - 40mA
909 * in steps of 5mA. Brightness is rounded to
910 * 5mA or nearest lower supported values
911 */
912 led->cdev.brightness /= LED_MPP_CURRENT_MIN;
913 led->cdev.brightness *= LED_MPP_CURRENT_MIN;
914 }
915
916 val = (led->cdev.brightness / LED_MPP_CURRENT_MIN) - 1;
917
918 rc = qpnp_led_masked_write(led,
919 LED_MPP_SINK_CTRL(led->base),
920 LED_MPP_SINK_MASK, val);
921 if (rc) {
922 dev_err(&led->pdev->dev,
923 "Failed to write sink control reg\n");
924 goto err_mpp_reg_write;
925 }
926 }
927
928 val = (led->mpp_cfg->source_sel & LED_MPP_SRC_MASK) |
929 (led->mpp_cfg->mode_ctrl & LED_MPP_MODE_CTRL_MASK);
930
931 rc = qpnp_led_masked_write(led,
932 LED_MPP_MODE_CTRL(led->base), LED_MPP_MODE_MASK,
933 val);
934 if (rc) {
935 dev_err(&led->pdev->dev,
936 "Failed to write led mode reg\n");
937 goto err_mpp_reg_write;
938 }
939
940 rc = qpnp_led_masked_write(led,
941 LED_MPP_EN_CTRL(led->base), LED_MPP_EN_MASK,
942 LED_MPP_EN_ENABLE);
943 if (rc) {
944 dev_err(&led->pdev->dev, "Failed to write led enable reg\n");
945 goto err_mpp_reg_write;
946 }
947 } else {
948 if (led->mpp_cfg->pwm_mode != MANUAL_MODE) {
949 led->mpp_cfg->pwm_cfg->mode =
950 led->mpp_cfg->pwm_cfg->default_mode;
951 led->mpp_cfg->pwm_mode =
952 led->mpp_cfg->pwm_cfg->default_mode;
953 pwm_disable(led->mpp_cfg->pwm_cfg->pwm_dev);
Fenglin Wu325e6de2017-03-16 13:40:26 +0800954 led->mpp_cfg->pwm_cfg->pwm_enabled = 0;
David Collins8885f792017-01-26 14:36:34 -0800955 }
956 rc = qpnp_led_masked_write(led,
957 LED_MPP_MODE_CTRL(led->base),
958 LED_MPP_MODE_MASK,
959 LED_MPP_MODE_DISABLE);
960 if (rc) {
961 dev_err(&led->pdev->dev,
962 "Failed to write led mode reg\n");
963 goto err_mpp_reg_write;
964 }
965
966 rc = qpnp_led_masked_write(led,
967 LED_MPP_EN_CTRL(led->base),
968 LED_MPP_EN_MASK,
969 LED_MPP_EN_DISABLE);
970 if (rc) {
971 dev_err(&led->pdev->dev,
972 "Failed to write led enable reg\n");
973 goto err_mpp_reg_write;
974 }
975
976 if (led->mpp_cfg->mpp_reg && led->mpp_cfg->enable) {
977 rc = regulator_disable(led->mpp_cfg->mpp_reg);
978 if (rc) {
979 dev_err(&led->pdev->dev,
980 "MPP regulator disable failed(%d)\n",
981 rc);
982 return rc;
983 }
984
985 rc = regulator_set_voltage(led->mpp_cfg->mpp_reg,
986 0, led->mpp_cfg->max_uV);
987 if (rc) {
988 dev_err(&led->pdev->dev,
989 "MPP regulator voltage set failed(%d)\n",
990 rc);
991 return rc;
992 }
993 }
994
995 led->mpp_cfg->enable = false;
996 }
997
998 if (led->mpp_cfg->pwm_mode != MANUAL_MODE)
999 led->mpp_cfg->pwm_cfg->blinking = false;
1000 qpnp_dump_regs(led, mpp_debug_regs, ARRAY_SIZE(mpp_debug_regs));
1001
1002 return 0;
1003
1004err_mpp_reg_write:
1005 if (led->mpp_cfg->mpp_reg)
1006 regulator_disable(led->mpp_cfg->mpp_reg);
1007err_reg_enable:
1008 if (led->mpp_cfg->mpp_reg)
1009 regulator_set_voltage(led->mpp_cfg->mpp_reg, 0,
1010 led->mpp_cfg->max_uV);
1011 led->mpp_cfg->enable = false;
1012
1013 return rc;
1014}
1015
1016static int qpnp_gpio_set(struct qpnp_led_data *led)
1017{
1018 int rc, val;
1019
1020 if (led->cdev.brightness) {
1021 val = (led->gpio_cfg->source_sel & LED_GPIO_SRC_MASK) |
1022 (led->gpio_cfg->mode_ctrl & LED_GPIO_MODE_CTRL_MASK);
1023
1024 rc = qpnp_led_masked_write(led,
1025 LED_GPIO_MODE_CTRL(led->base),
1026 LED_GPIO_MODE_MASK,
1027 val);
1028 if (rc) {
1029 dev_err(&led->pdev->dev,
1030 "Failed to write led mode reg\n");
1031 goto err_gpio_reg_write;
1032 }
1033
1034 rc = qpnp_led_masked_write(led,
1035 LED_GPIO_EN_CTRL(led->base),
1036 LED_GPIO_EN_MASK,
1037 LED_GPIO_EN_ENABLE);
1038 if (rc) {
1039 dev_err(&led->pdev->dev,
1040 "Failed to write led enable reg\n");
1041 goto err_gpio_reg_write;
1042 }
1043
1044 led->gpio_cfg->enable = true;
1045 } else {
1046 rc = qpnp_led_masked_write(led,
1047 LED_GPIO_MODE_CTRL(led->base),
1048 LED_GPIO_MODE_MASK,
1049 LED_GPIO_MODE_DISABLE);
1050 if (rc) {
1051 dev_err(&led->pdev->dev,
1052 "Failed to write led mode reg\n");
1053 goto err_gpio_reg_write;
1054 }
1055
1056 rc = qpnp_led_masked_write(led,
1057 LED_GPIO_EN_CTRL(led->base),
1058 LED_GPIO_EN_MASK,
1059 LED_GPIO_EN_DISABLE);
1060 if (rc) {
1061 dev_err(&led->pdev->dev,
1062 "Failed to write led enable reg\n");
1063 goto err_gpio_reg_write;
1064 }
1065
1066 led->gpio_cfg->enable = false;
1067 }
1068
1069 qpnp_dump_regs(led, gpio_debug_regs, ARRAY_SIZE(gpio_debug_regs));
1070
1071 return 0;
1072
1073err_gpio_reg_write:
1074 led->gpio_cfg->enable = false;
1075
1076 return rc;
1077}
1078
1079static int qpnp_flash_regulator_operate(struct qpnp_led_data *led, bool on)
1080{
1081 int rc, i;
1082 struct qpnp_led_data *led_array;
1083 bool regulator_on = false;
1084
1085 led_array = dev_get_drvdata(&led->pdev->dev);
1086 if (!led_array) {
1087 dev_err(&led->pdev->dev, "Unable to get LED array\n");
1088 return -EINVAL;
1089 }
1090
1091 for (i = 0; i < led->num_leds; i++)
1092 regulator_on |= led_array[i].flash_cfg->flash_on;
1093
1094 if (!on)
1095 goto regulator_turn_off;
1096
1097 if (!regulator_on && !led->flash_cfg->flash_on) {
1098 for (i = 0; i < led->num_leds; i++) {
1099 if (led_array[i].flash_cfg->flash_reg_get) {
1100 if (led_array[i].flash_cfg->flash_wa_reg_get) {
1101 rc = regulator_enable(
1102 led_array[i].flash_cfg->
1103 flash_wa_reg);
1104 if (rc) {
1105 dev_err(&led->pdev->dev, "Flash wa regulator enable failed(%d)\n",
1106 rc);
1107 return rc;
1108 }
1109 }
1110
1111 rc = regulator_enable(
1112 led_array[i].flash_cfg->flash_boost_reg);
1113 if (rc) {
1114 if (led_array[i].flash_cfg->
1115 flash_wa_reg_get)
1116 /*
1117 * Disable flash wa regulator
1118 * when flash boost regulator
1119 * enable fails
1120 */
1121 regulator_disable(
1122 led_array[i].flash_cfg->
1123 flash_wa_reg);
1124 dev_err(&led->pdev->dev, "Flash boost regulator enable failed(%d)\n",
1125 rc);
1126 return rc;
1127 }
1128 led->flash_cfg->flash_on = true;
1129 }
1130 break;
1131 }
1132 }
1133
1134 return 0;
1135
1136regulator_turn_off:
1137 if (regulator_on && led->flash_cfg->flash_on) {
1138 for (i = 0; i < led->num_leds; i++) {
1139 if (led_array[i].flash_cfg->flash_reg_get) {
1140 rc = qpnp_led_masked_write(led,
1141 FLASH_ENABLE_CONTROL(led->base),
1142 FLASH_ENABLE_MASK,
1143 FLASH_DISABLE_ALL);
1144 if (rc) {
1145 dev_err(&led->pdev->dev,
1146 "Enable reg write failed(%d)\n",
1147 rc);
1148 }
1149
1150 rc = regulator_disable(
1151 led_array[i].flash_cfg->flash_boost_reg);
1152 if (rc) {
1153 dev_err(&led->pdev->dev, "Flash boost regulator disable failed(%d)\n",
1154 rc);
1155 return rc;
1156 }
1157 if (led_array[i].flash_cfg->flash_wa_reg_get) {
1158 rc = regulator_disable(
1159 led_array[i].flash_cfg->
1160 flash_wa_reg);
1161 if (rc) {
1162 dev_err(&led->pdev->dev, "Flash_wa regulator disable failed(%d)\n",
1163 rc);
1164 return rc;
1165 }
1166 }
1167 led->flash_cfg->flash_on = false;
1168 }
1169 break;
1170 }
1171 }
1172
1173 return 0;
1174}
1175
1176static int qpnp_torch_regulator_operate(struct qpnp_led_data *led, bool on)
1177{
1178 int rc;
1179
1180 if (!on)
1181 goto regulator_turn_off;
1182
1183 if (!led->flash_cfg->torch_on) {
1184 rc = regulator_enable(led->flash_cfg->torch_boost_reg);
1185 if (rc) {
1186 dev_err(&led->pdev->dev,
1187 "Regulator enable failed(%d)\n", rc);
1188 return rc;
1189 }
1190 led->flash_cfg->torch_on = true;
1191 }
1192 return 0;
1193
1194regulator_turn_off:
1195 if (led->flash_cfg->torch_on) {
1196 rc = qpnp_led_masked_write(led, FLASH_ENABLE_CONTROL(led->base),
1197 FLASH_ENABLE_MODULE_MASK, FLASH_DISABLE_ALL);
1198 if (rc) {
1199 dev_err(&led->pdev->dev,
1200 "Enable reg write failed(%d)\n", rc);
1201 }
1202
1203 rc = regulator_disable(led->flash_cfg->torch_boost_reg);
1204 if (rc) {
1205 dev_err(&led->pdev->dev,
1206 "Regulator disable failed(%d)\n", rc);
1207 return rc;
1208 }
1209 led->flash_cfg->torch_on = false;
1210 }
1211 return 0;
1212}
1213
1214static int qpnp_flash_set(struct qpnp_led_data *led)
1215{
1216 int rc, error;
1217 int val = led->cdev.brightness;
1218
1219 if (led->flash_cfg->torch_enable)
1220 led->flash_cfg->current_prgm =
1221 (val * TORCH_MAX_LEVEL / led->max_current);
1222 else
1223 led->flash_cfg->current_prgm =
1224 (val * FLASH_MAX_LEVEL / led->max_current);
1225
1226 /* Set led current */
1227 if (val > 0) {
1228 if (led->flash_cfg->torch_enable) {
1229 if (led->flash_cfg->peripheral_subtype ==
1230 FLASH_SUBTYPE_DUAL) {
1231 if (!led->flash_cfg->no_smbb_support)
1232 rc = qpnp_torch_regulator_operate(led,
1233 true);
1234 else
1235 rc = qpnp_flash_regulator_operate(led,
1236 true);
1237 if (rc) {
1238 dev_err(&led->pdev->dev,
1239 "Torch regulator operate failed(%d)\n",
1240 rc);
1241 return rc;
1242 }
1243 } else if (led->flash_cfg->peripheral_subtype ==
1244 FLASH_SUBTYPE_SINGLE) {
1245 rc = qpnp_flash_regulator_operate(led, true);
1246 if (rc) {
1247 dev_err(&led->pdev->dev,
1248 "Flash regulator operate failed(%d)\n",
1249 rc);
1250 goto error_flash_set;
1251 }
1252 }
1253
1254 qpnp_led_masked_write(led, FLASH_MAX_CURR(led->base),
1255 FLASH_CURRENT_MASK,
1256 TORCH_MAX_LEVEL);
1257 if (rc) {
1258 dev_err(&led->pdev->dev,
1259 "Max current reg write failed(%d)\n",
1260 rc);
1261 goto error_reg_write;
1262 }
1263
1264 qpnp_led_masked_write(led,
1265 FLASH_LED_TMR_CTRL(led->base),
1266 FLASH_TMR_MASK,
1267 FLASH_TMR_WATCHDOG);
1268 if (rc) {
1269 dev_err(&led->pdev->dev,
1270 "Timer control reg write failed(%d)\n",
1271 rc);
1272 goto error_reg_write;
1273 }
1274
1275 rc = qpnp_led_masked_write(led,
1276 led->flash_cfg->current_addr,
1277 FLASH_CURRENT_MASK,
1278 led->flash_cfg->current_prgm);
1279 if (rc) {
1280 dev_err(&led->pdev->dev,
1281 "Current reg write failed(%d)\n", rc);
1282 goto error_reg_write;
1283 }
1284
1285 rc = qpnp_led_masked_write(led,
1286 led->flash_cfg->second_addr,
1287 FLASH_CURRENT_MASK,
1288 led->flash_cfg->current_prgm);
1289 if (rc) {
1290 dev_err(&led->pdev->dev,
1291 "2nd Current reg write failed(%d)\n",
1292 rc);
1293 goto error_reg_write;
1294 }
1295
1296 qpnp_led_masked_write(led,
1297 FLASH_WATCHDOG_TMR(led->base),
1298 FLASH_WATCHDOG_MASK,
1299 led->flash_cfg->duration);
1300 if (rc) {
1301 dev_err(&led->pdev->dev,
1302 "Max current reg write failed(%d)\n",
1303 rc);
1304 goto error_reg_write;
1305 }
1306
1307 rc = qpnp_led_masked_write(led,
1308 FLASH_ENABLE_CONTROL(led->base),
1309 FLASH_ENABLE_MASK,
1310 led->flash_cfg->enable_module);
1311 if (rc) {
1312 dev_err(&led->pdev->dev,
1313 "Enable reg write failed(%d)\n",
1314 rc);
1315 goto error_reg_write;
1316 }
1317
1318 if (!led->flash_cfg->strobe_type)
1319 led->flash_cfg->trigger_flash &=
1320 ~FLASH_HW_SW_STROBE_SEL_MASK;
1321 else
1322 led->flash_cfg->trigger_flash |=
1323 FLASH_HW_SW_STROBE_SEL_MASK;
1324
1325 rc = qpnp_led_masked_write(led,
1326 FLASH_LED_STROBE_CTRL(led->base),
1327 led->flash_cfg->trigger_flash,
1328 led->flash_cfg->trigger_flash);
1329 if (rc) {
1330 dev_err(&led->pdev->dev,
1331 "LED %d strobe reg write failed(%d)\n",
1332 led->id, rc);
1333 goto error_reg_write;
1334 }
1335 } else {
1336 rc = qpnp_flash_regulator_operate(led, true);
1337 if (rc) {
1338 dev_err(&led->pdev->dev,
1339 "Flash regulator operate failed(%d)\n",
1340 rc);
1341 goto error_flash_set;
1342 }
1343
1344 qpnp_led_masked_write(led,
1345 FLASH_LED_TMR_CTRL(led->base),
1346 FLASH_TMR_MASK,
1347 FLASH_TMR_SAFETY);
1348 if (rc) {
1349 dev_err(&led->pdev->dev,
1350 "Timer control reg write failed(%d)\n",
1351 rc);
1352 goto error_reg_write;
1353 }
1354
1355 /* Set flash safety timer */
1356 rc = qpnp_led_masked_write(led,
1357 FLASH_SAFETY_TIMER(led->base),
1358 FLASH_SAFETY_TIMER_MASK,
1359 led->flash_cfg->duration);
1360 if (rc) {
1361 dev_err(&led->pdev->dev,
1362 "Safety timer reg write failed(%d)\n",
1363 rc);
1364 goto error_flash_set;
1365 }
1366
1367 /* Set max current */
1368 rc = qpnp_led_masked_write(led,
1369 FLASH_MAX_CURR(led->base), FLASH_CURRENT_MASK,
1370 FLASH_MAX_LEVEL);
1371 if (rc) {
1372 dev_err(&led->pdev->dev,
1373 "Max current reg write failed(%d)\n",
1374 rc);
1375 goto error_flash_set;
1376 }
1377
1378 /* Set clamp current */
1379 rc = qpnp_led_masked_write(led,
1380 FLASH_CLAMP_CURR(led->base),
1381 FLASH_CURRENT_MASK,
1382 led->flash_cfg->clamp_curr);
1383 if (rc) {
1384 dev_err(&led->pdev->dev,
1385 "Clamp current reg write failed(%d)\n",
1386 rc);
1387 goto error_flash_set;
1388 }
1389
1390 rc = qpnp_led_masked_write(led,
1391 led->flash_cfg->current_addr,
1392 FLASH_CURRENT_MASK,
1393 led->flash_cfg->current_prgm);
1394 if (rc) {
1395 dev_err(&led->pdev->dev,
1396 "Current reg write failed(%d)\n", rc);
1397 goto error_flash_set;
1398 }
1399
1400 rc = qpnp_led_masked_write(led,
1401 FLASH_ENABLE_CONTROL(led->base),
1402 led->flash_cfg->enable_module,
1403 led->flash_cfg->enable_module);
1404 if (rc) {
1405 dev_err(&led->pdev->dev,
1406 "Enable reg write failed(%d)\n", rc);
1407 goto error_flash_set;
1408 }
1409
1410 /*
1411 * Add 1ms delay for bharger enter stable state
1412 */
1413 usleep_range(FLASH_RAMP_UP_DELAY_US,
1414 FLASH_RAMP_UP_DELAY_US + 10);
1415
1416 if (!led->flash_cfg->strobe_type)
1417 led->flash_cfg->trigger_flash &=
1418 ~FLASH_HW_SW_STROBE_SEL_MASK;
1419 else
1420 led->flash_cfg->trigger_flash |=
1421 FLASH_HW_SW_STROBE_SEL_MASK;
1422
1423 rc = qpnp_led_masked_write(led,
1424 FLASH_LED_STROBE_CTRL(led->base),
1425 led->flash_cfg->trigger_flash,
1426 led->flash_cfg->trigger_flash);
1427 if (rc) {
1428 dev_err(&led->pdev->dev,
1429 "LED %d strobe reg write failed(%d)\n",
1430 led->id, rc);
1431 goto error_flash_set;
1432 }
1433 }
1434 } else {
1435 rc = qpnp_led_masked_write(led,
1436 FLASH_LED_STROBE_CTRL(led->base),
1437 led->flash_cfg->trigger_flash,
1438 FLASH_DISABLE_ALL);
1439 if (rc) {
1440 dev_err(&led->pdev->dev,
1441 "LED %d flash write failed(%d)\n", led->id, rc);
1442 if (led->flash_cfg->torch_enable)
1443 goto error_torch_set;
1444 else
1445 goto error_flash_set;
1446 }
1447
1448 if (led->flash_cfg->torch_enable) {
1449 if (led->flash_cfg->peripheral_subtype ==
1450 FLASH_SUBTYPE_DUAL) {
1451 if (!led->flash_cfg->no_smbb_support)
1452 rc = qpnp_torch_regulator_operate(led,
1453 false);
1454 else
1455 rc = qpnp_flash_regulator_operate(led,
1456 false);
1457 if (rc) {
1458 dev_err(&led->pdev->dev,
1459 "Torch regulator operate failed(%d)\n",
1460 rc);
1461 return rc;
1462 }
1463 } else if (led->flash_cfg->peripheral_subtype ==
1464 FLASH_SUBTYPE_SINGLE) {
1465 rc = qpnp_flash_regulator_operate(led, false);
1466 if (rc) {
1467 dev_err(&led->pdev->dev,
1468 "Flash regulator operate failed(%d)\n",
1469 rc);
1470 return rc;
1471 }
1472 }
1473 } else {
1474 /*
1475 * Disable module after ramp down complete for stable
1476 * behavior
1477 */
1478 usleep_range(FLASH_RAMP_UP_DELAY_US,
1479 FLASH_RAMP_UP_DELAY_US + 10);
1480
1481 rc = qpnp_led_masked_write(led,
1482 FLASH_ENABLE_CONTROL(led->base),
1483 led->flash_cfg->enable_module &
1484 ~FLASH_ENABLE_MODULE_MASK,
1485 FLASH_DISABLE_ALL);
1486 if (rc) {
1487 dev_err(&led->pdev->dev,
1488 "Enable reg write failed(%d)\n", rc);
1489 if (led->flash_cfg->torch_enable)
1490 goto error_torch_set;
1491 else
1492 goto error_flash_set;
1493 }
1494
1495 rc = qpnp_flash_regulator_operate(led, false);
1496 if (rc) {
1497 dev_err(&led->pdev->dev,
1498 "Flash regulator operate failed(%d)\n",
1499 rc);
1500 return rc;
1501 }
1502 }
1503 }
1504
1505 qpnp_dump_regs(led, flash_debug_regs, ARRAY_SIZE(flash_debug_regs));
1506
1507 return 0;
1508
1509error_reg_write:
1510 if (led->flash_cfg->peripheral_subtype == FLASH_SUBTYPE_SINGLE)
1511 goto error_flash_set;
1512
1513error_torch_set:
1514 if (!led->flash_cfg->no_smbb_support)
1515 error = qpnp_torch_regulator_operate(led, false);
1516 else
1517 error = qpnp_flash_regulator_operate(led, false);
1518 if (error) {
1519 dev_err(&led->pdev->dev,
1520 "Torch regulator operate failed(%d)\n", rc);
1521 return error;
1522 }
1523 return rc;
1524
1525error_flash_set:
1526 error = qpnp_flash_regulator_operate(led, false);
1527 if (error) {
1528 dev_err(&led->pdev->dev,
1529 "Flash regulator operate failed(%d)\n", rc);
1530 return error;
1531 }
1532 return rc;
1533}
1534
1535static int qpnp_kpdbl_set(struct qpnp_led_data *led)
1536{
1537 int rc;
1538 int duty_us, duty_ns, period_us;
1539
1540 if (led->cdev.brightness) {
1541 if (!led->kpdbl_cfg->pwm_cfg->blinking)
1542 led->kpdbl_cfg->pwm_cfg->mode =
1543 led->kpdbl_cfg->pwm_cfg->default_mode;
1544
1545 if (bitmap_empty(kpdbl_leds_in_use, NUM_KPDBL_LEDS)) {
1546 rc = qpnp_led_masked_write(led, KPDBL_ENABLE(led->base),
1547 KPDBL_MODULE_EN_MASK, KPDBL_MODULE_EN);
1548 if (rc) {
1549 dev_err(&led->pdev->dev,
1550 "Enable reg write failed(%d)\n", rc);
1551 return rc;
1552 }
1553 }
1554
1555 /* On some platforms, GPLED1 channel should always be enabled
1556 * for the other GPLEDs 2/3/4 to glow. Before enabling GPLED
1557 * 2/3/4, first check if GPLED1 is already enabled. If GPLED1
1558 * channel is not enabled, then enable the GPLED1 channel but
1559 * with a 0 brightness
1560 */
1561 if (!led->kpdbl_cfg->always_on &&
1562 !test_bit(KPDBL_MASTER_BIT_INDEX, kpdbl_leds_in_use) &&
1563 kpdbl_master) {
1564 rc = pwm_config_us(kpdbl_master, 0,
1565 kpdbl_master_period_us);
1566 if (rc < 0) {
1567 dev_err(&led->pdev->dev,
1568 "pwm config failed\n");
1569 return rc;
1570 }
1571
1572 rc = pwm_enable(kpdbl_master);
1573 if (rc < 0) {
1574 dev_err(&led->pdev->dev,
1575 "pwm enable failed\n");
1576 return rc;
1577 }
1578 set_bit(KPDBL_MASTER_BIT_INDEX,
1579 kpdbl_leds_in_use);
1580 }
1581
1582 if (led->kpdbl_cfg->pwm_cfg->mode == PWM_MODE) {
1583 period_us = led->kpdbl_cfg->pwm_cfg->pwm_period_us;
1584 if (period_us > INT_MAX / NSEC_PER_USEC) {
1585 duty_us = (period_us * led->cdev.brightness) /
1586 KPDBL_MAX_LEVEL;
1587 rc = pwm_config_us(
1588 led->kpdbl_cfg->pwm_cfg->pwm_dev,
1589 duty_us,
1590 period_us);
1591 } else {
1592 duty_ns = ((period_us * NSEC_PER_USEC) /
1593 KPDBL_MAX_LEVEL) * led->cdev.brightness;
1594 rc = pwm_config(
1595 led->kpdbl_cfg->pwm_cfg->pwm_dev,
1596 duty_ns,
1597 period_us * NSEC_PER_USEC);
1598 }
1599 if (rc < 0) {
1600 dev_err(&led->pdev->dev,
1601 "pwm config failed\n");
1602 return rc;
1603 }
1604 }
1605
1606 rc = pwm_enable(led->kpdbl_cfg->pwm_cfg->pwm_dev);
1607 if (rc < 0) {
1608 dev_err(&led->pdev->dev, "pwm enable failed\n");
1609 return rc;
1610 }
Fenglin Wu325e6de2017-03-16 13:40:26 +08001611 led->kpdbl_cfg->pwm_cfg->pwm_enabled = 1;
David Collins8885f792017-01-26 14:36:34 -08001612 set_bit(led->kpdbl_cfg->row_id, kpdbl_leds_in_use);
1613
1614 /* is_kpdbl_master_turn_on will be set to true when GPLED1
1615 * channel is enabled and has a valid brightness value
1616 */
1617 if (led->kpdbl_cfg->always_on)
1618 is_kpdbl_master_turn_on = true;
1619
1620 } else {
1621 led->kpdbl_cfg->pwm_cfg->mode =
1622 led->kpdbl_cfg->pwm_cfg->default_mode;
1623
1624 /* Before disabling GPLED1, check if any other GPLED 2/3/4 is
1625 * on. If any of the other GPLED 2/3/4 is on, then have the
1626 * GPLED1 channel enabled with 0 brightness.
1627 */
1628 if (led->kpdbl_cfg->always_on) {
1629 if (bitmap_weight(kpdbl_leds_in_use,
1630 NUM_KPDBL_LEDS) > 1) {
1631 rc = pwm_config_us(
1632 led->kpdbl_cfg->pwm_cfg->pwm_dev, 0,
1633 led->kpdbl_cfg->pwm_cfg->pwm_period_us);
1634 if (rc < 0) {
1635 dev_err(&led->pdev->dev,
1636 "pwm config failed\n");
1637 return rc;
1638 }
1639
1640 rc = pwm_enable(led->kpdbl_cfg->pwm_cfg->
1641 pwm_dev);
1642 if (rc < 0) {
1643 dev_err(&led->pdev->dev,
1644 "pwm enable failed\n");
1645 return rc;
1646 }
Fenglin Wu325e6de2017-03-16 13:40:26 +08001647 led->kpdbl_cfg->pwm_cfg->pwm_enabled = 1;
David Collins8885f792017-01-26 14:36:34 -08001648 } else {
1649 if (kpdbl_master) {
1650 pwm_disable(kpdbl_master);
1651 clear_bit(KPDBL_MASTER_BIT_INDEX,
1652 kpdbl_leds_in_use);
1653 rc = qpnp_led_masked_write(
1654 led, KPDBL_ENABLE(led->base),
1655 KPDBL_MODULE_EN_MASK,
1656 KPDBL_MODULE_DIS);
1657 if (rc) {
1658 dev_err(&led->pdev->dev, "Failed to write led enable reg\n");
1659 return rc;
1660 }
1661 }
1662 }
1663 is_kpdbl_master_turn_on = false;
1664 } else {
1665 pwm_disable(led->kpdbl_cfg->pwm_cfg->pwm_dev);
Fenglin Wu325e6de2017-03-16 13:40:26 +08001666 led->kpdbl_cfg->pwm_cfg->pwm_enabled = 0;
David Collins8885f792017-01-26 14:36:34 -08001667 clear_bit(led->kpdbl_cfg->row_id, kpdbl_leds_in_use);
1668 if (bitmap_weight(kpdbl_leds_in_use,
1669 NUM_KPDBL_LEDS) == 1 && kpdbl_master &&
1670 !is_kpdbl_master_turn_on) {
1671 pwm_disable(kpdbl_master);
1672 clear_bit(KPDBL_MASTER_BIT_INDEX,
1673 kpdbl_leds_in_use);
1674 rc = qpnp_led_masked_write(
1675 led, KPDBL_ENABLE(led->base),
1676 KPDBL_MODULE_EN_MASK, KPDBL_MODULE_DIS);
1677 if (rc) {
1678 dev_err(&led->pdev->dev,
1679 "Failed to write led enable reg\n");
1680 return rc;
1681 }
1682 is_kpdbl_master_turn_on = false;
1683 }
1684 }
1685 }
1686
1687 led->kpdbl_cfg->pwm_cfg->blinking = false;
1688
1689 qpnp_dump_regs(led, kpdbl_debug_regs, ARRAY_SIZE(kpdbl_debug_regs));
1690
1691 return 0;
1692}
1693
1694static int qpnp_rgb_set(struct qpnp_led_data *led)
1695{
1696 int rc;
1697 int duty_us, duty_ns, period_us;
1698
1699 if (led->cdev.brightness) {
1700 if (!led->rgb_cfg->pwm_cfg->blinking)
1701 led->rgb_cfg->pwm_cfg->mode =
1702 led->rgb_cfg->pwm_cfg->default_mode;
1703 if (led->rgb_cfg->pwm_cfg->mode == PWM_MODE) {
1704 period_us = led->rgb_cfg->pwm_cfg->pwm_period_us;
1705 if (period_us > INT_MAX / NSEC_PER_USEC) {
1706 duty_us = (period_us * led->cdev.brightness) /
1707 LED_FULL;
1708 rc = pwm_config_us(
1709 led->rgb_cfg->pwm_cfg->pwm_dev,
1710 duty_us,
1711 period_us);
1712 } else {
1713 duty_ns = ((period_us * NSEC_PER_USEC) /
1714 LED_FULL) * led->cdev.brightness;
1715 rc = pwm_config(
1716 led->rgb_cfg->pwm_cfg->pwm_dev,
1717 duty_ns,
1718 period_us * NSEC_PER_USEC);
1719 }
1720 if (rc < 0) {
1721 dev_err(&led->pdev->dev,
1722 "pwm config failed\n");
1723 return rc;
1724 }
1725 }
1726 rc = qpnp_led_masked_write(led,
1727 RGB_LED_EN_CTL(led->base),
1728 led->rgb_cfg->enable, led->rgb_cfg->enable);
1729 if (rc) {
1730 dev_err(&led->pdev->dev,
1731 "Failed to write led enable reg\n");
1732 return rc;
1733 }
Fenglin Wu325e6de2017-03-16 13:40:26 +08001734 if (!led->rgb_cfg->pwm_cfg->pwm_enabled) {
1735 pwm_enable(led->rgb_cfg->pwm_cfg->pwm_dev);
1736 led->rgb_cfg->pwm_cfg->pwm_enabled = 1;
1737 }
1738 } else {
1739 led->rgb_cfg->pwm_cfg->mode =
1740 led->rgb_cfg->pwm_cfg->default_mode;
David Collins8885f792017-01-26 14:36:34 -08001741 if (led->rgb_cfg->pwm_cfg->pwm_enabled) {
1742 pwm_disable(led->rgb_cfg->pwm_cfg->pwm_dev);
1743 led->rgb_cfg->pwm_cfg->pwm_enabled = 0;
1744 }
David Collins8885f792017-01-26 14:36:34 -08001745 rc = qpnp_led_masked_write(led,
1746 RGB_LED_EN_CTL(led->base),
1747 led->rgb_cfg->enable, RGB_LED_DISABLE);
1748 if (rc) {
1749 dev_err(&led->pdev->dev,
1750 "Failed to write led enable reg\n");
1751 return rc;
1752 }
1753 }
1754
1755 led->rgb_cfg->pwm_cfg->blinking = false;
1756 qpnp_dump_regs(led, rgb_pwm_debug_regs, ARRAY_SIZE(rgb_pwm_debug_regs));
1757
1758 return 0;
1759}
1760
1761static void qpnp_led_set(struct led_classdev *led_cdev,
1762 enum led_brightness value)
1763{
1764 struct qpnp_led_data *led;
1765
1766 led = container_of(led_cdev, struct qpnp_led_data, cdev);
1767 if (value < LED_OFF) {
1768 dev_err(&led->pdev->dev, "Invalid brightness value\n");
1769 return;
1770 }
1771
1772 if (value > led->cdev.max_brightness)
1773 value = led->cdev.max_brightness;
1774
1775 led->cdev.brightness = value;
1776 if (led->in_order_command_processing)
1777 queue_work(led->workqueue, &led->work);
1778 else
1779 schedule_work(&led->work);
1780}
1781
1782static void __qpnp_led_work(struct qpnp_led_data *led,
1783 enum led_brightness value)
1784{
1785 int rc;
1786
1787 if (led->id == QPNP_ID_FLASH1_LED0 || led->id == QPNP_ID_FLASH1_LED1)
1788 mutex_lock(&flash_lock);
1789 else
1790 mutex_lock(&led->lock);
1791
1792 switch (led->id) {
1793 case QPNP_ID_WLED:
1794 rc = qpnp_wled_set(led);
1795 if (rc < 0)
1796 dev_err(&led->pdev->dev,
1797 "WLED set brightness failed (%d)\n", rc);
1798 break;
1799 case QPNP_ID_FLASH1_LED0:
1800 case QPNP_ID_FLASH1_LED1:
1801 rc = qpnp_flash_set(led);
1802 if (rc < 0)
1803 dev_err(&led->pdev->dev,
1804 "FLASH set brightness failed (%d)\n", rc);
1805 break;
1806 case QPNP_ID_RGB_RED:
1807 case QPNP_ID_RGB_GREEN:
1808 case QPNP_ID_RGB_BLUE:
1809 rc = qpnp_rgb_set(led);
1810 if (rc < 0)
1811 dev_err(&led->pdev->dev,
1812 "RGB set brightness failed (%d)\n", rc);
1813 break;
1814 case QPNP_ID_LED_MPP:
1815 rc = qpnp_mpp_set(led);
1816 if (rc < 0)
1817 dev_err(&led->pdev->dev,
1818 "MPP set brightness failed (%d)\n", rc);
1819 break;
1820 case QPNP_ID_LED_GPIO:
1821 rc = qpnp_gpio_set(led);
1822 if (rc < 0)
1823 dev_err(&led->pdev->dev,
1824 "GPIO set brightness failed (%d)\n",
1825 rc);
1826 break;
1827 case QPNP_ID_KPDBL:
1828 rc = qpnp_kpdbl_set(led);
1829 if (rc < 0)
1830 dev_err(&led->pdev->dev,
1831 "KPDBL set brightness failed (%d)\n", rc);
1832 break;
1833 default:
1834 dev_err(&led->pdev->dev, "Invalid LED(%d)\n", led->id);
1835 break;
1836 }
1837 if (led->id == QPNP_ID_FLASH1_LED0 || led->id == QPNP_ID_FLASH1_LED1)
1838 mutex_unlock(&flash_lock);
1839 else
1840 mutex_unlock(&led->lock);
1841
1842}
1843
1844static void qpnp_led_work(struct work_struct *work)
1845{
1846 struct qpnp_led_data *led = container_of(work,
1847 struct qpnp_led_data, work);
1848
1849 __qpnp_led_work(led, led->cdev.brightness);
1850}
1851
1852static int qpnp_led_set_max_brightness(struct qpnp_led_data *led)
1853{
1854 switch (led->id) {
1855 case QPNP_ID_WLED:
1856 led->cdev.max_brightness = WLED_MAX_LEVEL;
1857 break;
1858 case QPNP_ID_FLASH1_LED0:
1859 case QPNP_ID_FLASH1_LED1:
1860 led->cdev.max_brightness = led->max_current;
1861 break;
1862 case QPNP_ID_RGB_RED:
1863 case QPNP_ID_RGB_GREEN:
1864 case QPNP_ID_RGB_BLUE:
1865 led->cdev.max_brightness = RGB_MAX_LEVEL;
1866 break;
1867 case QPNP_ID_LED_MPP:
1868 if (led->mpp_cfg->pwm_mode == MANUAL_MODE)
1869 led->cdev.max_brightness = led->max_current;
1870 else
1871 led->cdev.max_brightness = MPP_MAX_LEVEL;
1872 break;
1873 case QPNP_ID_LED_GPIO:
1874 led->cdev.max_brightness = led->max_current;
1875 break;
1876 case QPNP_ID_KPDBL:
1877 led->cdev.max_brightness = KPDBL_MAX_LEVEL;
1878 break;
1879 default:
1880 dev_err(&led->pdev->dev, "Invalid LED(%d)\n", led->id);
1881 return -EINVAL;
1882 }
1883
1884 return 0;
1885}
1886
1887static enum led_brightness qpnp_led_get(struct led_classdev *led_cdev)
1888{
1889 struct qpnp_led_data *led;
1890
1891 led = container_of(led_cdev, struct qpnp_led_data, cdev);
1892
1893 return led->cdev.brightness;
1894}
1895
1896static void qpnp_led_turn_off_delayed(struct work_struct *work)
1897{
1898 struct delayed_work *dwork = to_delayed_work(work);
1899 struct qpnp_led_data *led
1900 = container_of(dwork, struct qpnp_led_data, dwork);
1901
1902 led->cdev.brightness = LED_OFF;
1903 qpnp_led_set(&led->cdev, led->cdev.brightness);
1904}
1905
1906static void qpnp_led_turn_off(struct qpnp_led_data *led)
1907{
1908 INIT_DELAYED_WORK(&led->dwork, qpnp_led_turn_off_delayed);
1909 schedule_delayed_work(&led->dwork,
1910 msecs_to_jiffies(led->turn_off_delay_ms));
1911}
1912
1913static int qpnp_wled_init(struct qpnp_led_data *led)
1914{
1915 int rc, i;
1916 u8 num_wled_strings, val = 0;
1917
1918 num_wled_strings = led->wled_cfg->num_strings;
1919
1920 /* verify ranges */
1921 if (led->wled_cfg->ovp_val > WLED_OVP_27V) {
1922 dev_err(&led->pdev->dev, "Invalid ovp value\n");
1923 return -EINVAL;
1924 }
1925
1926 if (led->wled_cfg->boost_curr_lim > WLED_CURR_LIMIT_1680mA) {
1927 dev_err(&led->pdev->dev, "Invalid boost current limit\n");
1928 return -EINVAL;
1929 }
1930
1931 if (led->wled_cfg->cp_select > WLED_CP_SELECT_MAX) {
1932 dev_err(&led->pdev->dev, "Invalid pole capacitance\n");
1933 return -EINVAL;
1934 }
1935
1936 if (led->max_current > WLED_MAX_CURR) {
1937 dev_err(&led->pdev->dev, "Invalid max current\n");
1938 return -EINVAL;
1939 }
1940
1941 if ((led->wled_cfg->ctrl_delay_us % WLED_CTL_DLY_STEP) ||
1942 (led->wled_cfg->ctrl_delay_us > WLED_CTL_DLY_MAX)) {
1943 dev_err(&led->pdev->dev, "Invalid control delay\n");
1944 return -EINVAL;
1945 }
1946
1947 /* program over voltage protection threshold */
1948 rc = qpnp_led_masked_write(led, WLED_OVP_CFG_REG(led->base),
1949 WLED_OVP_VAL_MASK,
1950 (led->wled_cfg->ovp_val << WLED_OVP_VAL_BIT_SHFT));
1951 if (rc) {
1952 dev_err(&led->pdev->dev,
1953 "WLED OVP reg write failed(%d)\n", rc);
1954 return rc;
1955 }
1956
1957 /* program current boost limit */
1958 rc = qpnp_led_masked_write(led, WLED_BOOST_LIMIT_REG(led->base),
1959 WLED_BOOST_LIMIT_MASK, led->wled_cfg->boost_curr_lim);
1960 if (rc) {
1961 dev_err(&led->pdev->dev,
1962 "WLED boost limit reg write failed(%d)\n", rc);
1963 return rc;
1964 }
1965
1966 /* program output feedback */
1967 rc = qpnp_led_masked_write(led, WLED_FDBCK_CTRL_REG(led->base),
1968 WLED_OP_FDBCK_MASK,
1969 (led->wled_cfg->op_fdbck << WLED_OP_FDBCK_BIT_SHFT));
1970 if (rc) {
1971 dev_err(&led->pdev->dev,
1972 "WLED fdbck ctrl reg write failed(%d)\n", rc);
1973 return rc;
1974 }
1975
1976 /* program switch frequency */
1977 rc = qpnp_led_masked_write(led,
1978 WLED_SWITCHING_FREQ_REG(led->base),
1979 WLED_SWITCH_FREQ_MASK, led->wled_cfg->switch_freq);
1980 if (rc) {
1981 dev_err(&led->pdev->dev,
1982 "WLED switch freq reg write failed(%d)\n", rc);
1983 return rc;
1984 }
1985
1986 /* program current sink */
1987 if (led->wled_cfg->cs_out_en) {
1988 for (i = 0; i < led->wled_cfg->num_strings; i++)
1989 val |= 1 << i;
1990 rc = qpnp_led_masked_write(led, WLED_CURR_SINK_REG(led->base),
1991 WLED_CURR_SINK_MASK, (val << WLED_CURR_SINK_SHFT));
1992 if (rc) {
1993 dev_err(&led->pdev->dev,
1994 "WLED curr sink reg write failed(%d)\n", rc);
1995 return rc;
1996 }
1997 }
1998
1999 /* program high pole capacitance */
2000 rc = qpnp_led_masked_write(led, WLED_HIGH_POLE_CAP_REG(led->base),
2001 WLED_CP_SELECT_MASK, led->wled_cfg->cp_select);
2002 if (rc) {
2003 dev_err(&led->pdev->dev,
2004 "WLED pole cap reg write failed(%d)\n", rc);
2005 return rc;
2006 }
2007
2008 /* program modulator, current mod src and cabc */
2009 for (i = 0; i < num_wled_strings; i++) {
2010 rc = qpnp_led_masked_write(led, WLED_MOD_EN_REG(led->base, i),
2011 WLED_NO_MASK, WLED_EN_MASK);
2012 if (rc) {
2013 dev_err(&led->pdev->dev,
2014 "WLED mod enable reg write failed(%d)\n", rc);
2015 return rc;
2016 }
2017
2018 if (led->wled_cfg->dig_mod_gen_en) {
2019 rc = qpnp_led_masked_write(led,
2020 WLED_MOD_SRC_SEL_REG(led->base, i),
2021 WLED_NO_MASK, WLED_USE_EXT_GEN_MOD_SRC);
2022 if (rc) {
2023 dev_err(&led->pdev->dev,
2024 "WLED dig mod en reg write failed(%d)\n", rc);
2025 }
2026 }
2027
2028 rc = qpnp_led_masked_write(led,
2029 WLED_FULL_SCALE_REG(led->base, i), WLED_MAX_CURR_MASK,
2030 (u8)led->max_current);
2031 if (rc) {
2032 dev_err(&led->pdev->dev,
2033 "WLED max current reg write failed(%d)\n", rc);
2034 return rc;
2035 }
2036
2037 }
2038
2039 /* Reset WLED enable register */
2040 rc = qpnp_led_masked_write(led, WLED_MOD_CTRL_REG(led->base),
2041 WLED_8_BIT_MASK, WLED_BOOST_OFF);
2042 if (rc) {
2043 dev_err(&led->pdev->dev,
2044 "WLED write ctrl reg failed(%d)\n", rc);
2045 return rc;
2046 }
2047
2048 /* dump wled registers */
2049 qpnp_dump_regs(led, wled_debug_regs, ARRAY_SIZE(wled_debug_regs));
2050
2051 return 0;
2052}
2053
2054static ssize_t led_mode_store(struct device *dev,
2055 struct device_attribute *attr,
2056 const char *buf, size_t count)
2057{
2058 struct qpnp_led_data *led;
2059 unsigned long state;
2060 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2061 ssize_t ret = -EINVAL;
2062
2063 ret = kstrtoul(buf, 10, &state);
2064 if (ret)
2065 return ret;
2066
2067 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2068
2069 /* '1' to enable torch mode; '0' to switch to flash mode */
2070 if (state == 1)
2071 led->flash_cfg->torch_enable = true;
2072 else
2073 led->flash_cfg->torch_enable = false;
2074
2075 return count;
2076}
2077
2078static ssize_t led_strobe_type_store(struct device *dev,
2079 struct device_attribute *attr,
2080 const char *buf, size_t count)
2081{
2082 struct qpnp_led_data *led;
2083 unsigned long state;
2084 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2085 ssize_t ret = -EINVAL;
2086
2087 ret = kstrtoul(buf, 10, &state);
2088 if (ret)
2089 return ret;
2090
2091 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2092
2093 /* '0' for sw strobe; '1' for hw strobe */
2094 if (state == 1)
2095 led->flash_cfg->strobe_type = 1;
2096 else
2097 led->flash_cfg->strobe_type = 0;
2098
2099 return count;
2100}
2101
2102static int qpnp_pwm_init(struct pwm_config_data *pwm_cfg,
2103 struct platform_device *pdev,
2104 const char *name)
2105{
2106 int rc, start_idx, idx_len, lut_max_size;
2107
2108 if (pwm_cfg->pwm_dev) {
2109 if (pwm_cfg->mode == LPG_MODE) {
2110 start_idx =
2111 pwm_cfg->duty_cycles->start_idx;
2112 idx_len =
2113 pwm_cfg->duty_cycles->num_duty_pcts;
2114
2115 if (strnstr(name, "kpdbl", sizeof("kpdbl")))
2116 lut_max_size = PWM_GPLED_LUT_MAX_SIZE;
2117 else
2118 lut_max_size = PWM_LUT_MAX_SIZE;
2119
2120 if (idx_len >= lut_max_size && start_idx) {
2121 dev_err(&pdev->dev,
2122 "Wrong LUT size or index\n");
2123 return -EINVAL;
2124 }
2125
2126 if ((start_idx + idx_len) > lut_max_size) {
2127 dev_err(&pdev->dev, "Exceed LUT limit\n");
2128 return -EINVAL;
2129 }
2130 rc = pwm_lut_config(pwm_cfg->pwm_dev,
2131 pwm_cfg->pwm_period_us,
2132 pwm_cfg->duty_cycles->duty_pcts,
2133 pwm_cfg->lut_params);
2134 if (rc < 0) {
2135 dev_err(&pdev->dev, "Failed to configure pwm LUT\n");
2136 return rc;
2137 }
2138 }
2139 } else {
2140 dev_err(&pdev->dev, "Invalid PWM device\n");
2141 return -EINVAL;
2142 }
2143
2144 return 0;
2145}
2146
2147static ssize_t pwm_us_store(struct device *dev,
2148 struct device_attribute *attr,
2149 const char *buf, size_t count)
2150{
2151 struct qpnp_led_data *led;
2152 u32 pwm_us;
2153 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2154 ssize_t ret;
2155 u32 previous_pwm_us;
2156 struct pwm_config_data *pwm_cfg;
2157
2158 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2159
2160 ret = kstrtou32(buf, 10, &pwm_us);
2161 if (ret)
2162 return ret;
2163
2164 switch (led->id) {
2165 case QPNP_ID_LED_MPP:
2166 pwm_cfg = led->mpp_cfg->pwm_cfg;
2167 break;
2168 case QPNP_ID_RGB_RED:
2169 case QPNP_ID_RGB_GREEN:
2170 case QPNP_ID_RGB_BLUE:
2171 pwm_cfg = led->rgb_cfg->pwm_cfg;
2172 break;
2173 case QPNP_ID_KPDBL:
2174 pwm_cfg = led->kpdbl_cfg->pwm_cfg;
2175 break;
2176 default:
2177 dev_err(&led->pdev->dev, "Invalid LED id type for pwm_us\n");
2178 return -EINVAL;
2179 }
2180
2181 if (pwm_cfg->mode == LPG_MODE)
2182 pwm_cfg->blinking = true;
2183
2184 previous_pwm_us = pwm_cfg->pwm_period_us;
2185
2186 pwm_cfg->pwm_period_us = pwm_us;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002187 if (pwm_cfg->pwm_enabled) {
2188 pwm_disable(pwm_cfg->pwm_dev);
2189 pwm_cfg->pwm_enabled = 0;
2190 }
David Collins8885f792017-01-26 14:36:34 -08002191 ret = qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2192 if (ret) {
2193 pwm_cfg->pwm_period_us = previous_pwm_us;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002194 if (pwm_cfg->pwm_enabled) {
2195 pwm_disable(pwm_cfg->pwm_dev);
2196 pwm_cfg->pwm_enabled = 0;
2197 }
David Collins8885f792017-01-26 14:36:34 -08002198 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2199 qpnp_led_set(&led->cdev, led->cdev.brightness);
2200 dev_err(&led->pdev->dev,
2201 "Failed to initialize pwm with new pwm_us value\n");
2202 return ret;
2203 }
2204 qpnp_led_set(&led->cdev, led->cdev.brightness);
2205 return count;
2206}
2207
2208static ssize_t pause_lo_store(struct device *dev,
2209 struct device_attribute *attr,
2210 const char *buf, size_t count)
2211{
2212 struct qpnp_led_data *led;
2213 u32 pause_lo;
2214 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2215 ssize_t ret;
2216 u32 previous_pause_lo;
2217 struct pwm_config_data *pwm_cfg;
2218
2219 ret = kstrtou32(buf, 10, &pause_lo);
2220 if (ret)
2221 return ret;
2222 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2223
2224 switch (led->id) {
2225 case QPNP_ID_LED_MPP:
2226 pwm_cfg = led->mpp_cfg->pwm_cfg;
2227 break;
2228 case QPNP_ID_RGB_RED:
2229 case QPNP_ID_RGB_GREEN:
2230 case QPNP_ID_RGB_BLUE:
2231 pwm_cfg = led->rgb_cfg->pwm_cfg;
2232 break;
2233 case QPNP_ID_KPDBL:
2234 pwm_cfg = led->kpdbl_cfg->pwm_cfg;
2235 break;
2236 default:
2237 dev_err(&led->pdev->dev,
2238 "Invalid LED id type for pause lo\n");
2239 return -EINVAL;
2240 }
2241
2242 if (pwm_cfg->mode == LPG_MODE)
2243 pwm_cfg->blinking = true;
2244
2245 previous_pause_lo = pwm_cfg->lut_params.lut_pause_lo;
2246
Fenglin Wu325e6de2017-03-16 13:40:26 +08002247 if (pwm_cfg->pwm_enabled) {
2248 pwm_disable(pwm_cfg->pwm_dev);
2249 pwm_cfg->pwm_enabled = 0;
2250 }
David Collins8885f792017-01-26 14:36:34 -08002251 pwm_cfg->lut_params.lut_pause_lo = pause_lo;
2252 ret = qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2253 if (ret) {
2254 pwm_cfg->lut_params.lut_pause_lo = previous_pause_lo;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002255 if (pwm_cfg->pwm_enabled) {
2256 pwm_disable(pwm_cfg->pwm_dev);
2257 pwm_cfg->pwm_enabled = 0;
2258 }
David Collins8885f792017-01-26 14:36:34 -08002259 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2260 qpnp_led_set(&led->cdev, led->cdev.brightness);
2261 dev_err(&led->pdev->dev,
2262 "Failed to initialize pwm with new pause lo value\n");
2263 return ret;
2264 }
2265 qpnp_led_set(&led->cdev, led->cdev.brightness);
2266 return count;
2267}
2268
2269static ssize_t pause_hi_store(struct device *dev,
2270 struct device_attribute *attr,
2271 const char *buf, size_t count)
2272{
2273 struct qpnp_led_data *led;
2274 u32 pause_hi;
2275 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2276 ssize_t ret;
2277 u32 previous_pause_hi;
2278 struct pwm_config_data *pwm_cfg;
2279
2280 ret = kstrtou32(buf, 10, &pause_hi);
2281 if (ret)
2282 return ret;
2283 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2284
2285 switch (led->id) {
2286 case QPNP_ID_LED_MPP:
2287 pwm_cfg = led->mpp_cfg->pwm_cfg;
2288 break;
2289 case QPNP_ID_RGB_RED:
2290 case QPNP_ID_RGB_GREEN:
2291 case QPNP_ID_RGB_BLUE:
2292 pwm_cfg = led->rgb_cfg->pwm_cfg;
2293 break;
2294 case QPNP_ID_KPDBL:
2295 pwm_cfg = led->kpdbl_cfg->pwm_cfg;
2296 break;
2297 default:
2298 dev_err(&led->pdev->dev,
2299 "Invalid LED id type for pause hi\n");
2300 return -EINVAL;
2301 }
2302
2303 if (pwm_cfg->mode == LPG_MODE)
2304 pwm_cfg->blinking = true;
2305
2306 previous_pause_hi = pwm_cfg->lut_params.lut_pause_hi;
2307
Fenglin Wu325e6de2017-03-16 13:40:26 +08002308 if (pwm_cfg->pwm_enabled) {
2309 pwm_disable(pwm_cfg->pwm_dev);
2310 pwm_cfg->pwm_enabled = 0;
2311 }
David Collins8885f792017-01-26 14:36:34 -08002312 pwm_cfg->lut_params.lut_pause_hi = pause_hi;
2313 ret = qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2314 if (ret) {
2315 pwm_cfg->lut_params.lut_pause_hi = previous_pause_hi;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002316 if (pwm_cfg->pwm_enabled) {
2317 pwm_disable(pwm_cfg->pwm_dev);
2318 pwm_cfg->pwm_enabled = 0;
2319 }
David Collins8885f792017-01-26 14:36:34 -08002320 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2321 qpnp_led_set(&led->cdev, led->cdev.brightness);
2322 dev_err(&led->pdev->dev,
2323 "Failed to initialize pwm with new pause hi value\n");
2324 return ret;
2325 }
2326 qpnp_led_set(&led->cdev, led->cdev.brightness);
2327 return count;
2328}
2329
2330static ssize_t start_idx_store(struct device *dev,
2331 struct device_attribute *attr,
2332 const char *buf, size_t count)
2333{
2334 struct qpnp_led_data *led;
2335 u32 start_idx;
2336 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2337 ssize_t ret;
2338 u32 previous_start_idx;
2339 struct pwm_config_data *pwm_cfg;
2340
2341 ret = kstrtou32(buf, 10, &start_idx);
2342 if (ret)
2343 return ret;
2344 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2345
2346 switch (led->id) {
2347 case QPNP_ID_LED_MPP:
2348 pwm_cfg = led->mpp_cfg->pwm_cfg;
2349 break;
2350 case QPNP_ID_RGB_RED:
2351 case QPNP_ID_RGB_GREEN:
2352 case QPNP_ID_RGB_BLUE:
2353 pwm_cfg = led->rgb_cfg->pwm_cfg;
2354 break;
2355 case QPNP_ID_KPDBL:
2356 pwm_cfg = led->kpdbl_cfg->pwm_cfg;
2357 break;
2358 default:
2359 dev_err(&led->pdev->dev,
2360 "Invalid LED id type for start idx\n");
2361 return -EINVAL;
2362 }
2363
2364 if (pwm_cfg->mode == LPG_MODE)
2365 pwm_cfg->blinking = true;
2366
2367 previous_start_idx = pwm_cfg->duty_cycles->start_idx;
2368 pwm_cfg->duty_cycles->start_idx = start_idx;
2369 pwm_cfg->lut_params.start_idx = pwm_cfg->duty_cycles->start_idx;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002370 if (pwm_cfg->pwm_enabled) {
2371 pwm_disable(pwm_cfg->pwm_dev);
2372 pwm_cfg->pwm_enabled = 0;
2373 }
David Collins8885f792017-01-26 14:36:34 -08002374 ret = qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2375 if (ret) {
2376 pwm_cfg->duty_cycles->start_idx = previous_start_idx;
2377 pwm_cfg->lut_params.start_idx = pwm_cfg->duty_cycles->start_idx;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002378 if (pwm_cfg->pwm_enabled) {
2379 pwm_disable(pwm_cfg->pwm_dev);
2380 pwm_cfg->pwm_enabled = 0;
2381 }
David Collins8885f792017-01-26 14:36:34 -08002382 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2383 qpnp_led_set(&led->cdev, led->cdev.brightness);
2384 dev_err(&led->pdev->dev,
2385 "Failed to initialize pwm with new start idx value\n");
2386 return ret;
2387 }
2388 qpnp_led_set(&led->cdev, led->cdev.brightness);
2389 return count;
2390}
2391
2392static ssize_t ramp_step_ms_store(struct device *dev,
2393 struct device_attribute *attr,
2394 const char *buf, size_t count)
2395{
2396 struct qpnp_led_data *led;
2397 u32 ramp_step_ms;
2398 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2399 ssize_t ret;
2400 u32 previous_ramp_step_ms;
2401 struct pwm_config_data *pwm_cfg;
2402
2403 ret = kstrtou32(buf, 10, &ramp_step_ms);
2404 if (ret)
2405 return ret;
2406 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2407
2408 switch (led->id) {
2409 case QPNP_ID_LED_MPP:
2410 pwm_cfg = led->mpp_cfg->pwm_cfg;
2411 break;
2412 case QPNP_ID_RGB_RED:
2413 case QPNP_ID_RGB_GREEN:
2414 case QPNP_ID_RGB_BLUE:
2415 pwm_cfg = led->rgb_cfg->pwm_cfg;
2416 break;
2417 case QPNP_ID_KPDBL:
2418 pwm_cfg = led->kpdbl_cfg->pwm_cfg;
2419 break;
2420 default:
2421 dev_err(&led->pdev->dev,
2422 "Invalid LED id type for ramp step\n");
2423 return -EINVAL;
2424 }
2425
2426 if (pwm_cfg->mode == LPG_MODE)
2427 pwm_cfg->blinking = true;
2428
2429 previous_ramp_step_ms = pwm_cfg->lut_params.ramp_step_ms;
2430
Fenglin Wu325e6de2017-03-16 13:40:26 +08002431 if (pwm_cfg->pwm_enabled) {
2432 pwm_disable(pwm_cfg->pwm_dev);
2433 pwm_cfg->pwm_enabled = 0;
2434 }
David Collins8885f792017-01-26 14:36:34 -08002435 pwm_cfg->lut_params.ramp_step_ms = ramp_step_ms;
2436 ret = qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2437 if (ret) {
2438 pwm_cfg->lut_params.ramp_step_ms = previous_ramp_step_ms;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002439 if (pwm_cfg->pwm_enabled) {
2440 pwm_disable(pwm_cfg->pwm_dev);
2441 pwm_cfg->pwm_enabled = 0;
2442 }
David Collins8885f792017-01-26 14:36:34 -08002443 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2444 qpnp_led_set(&led->cdev, led->cdev.brightness);
2445 dev_err(&led->pdev->dev,
2446 "Failed to initialize pwm with new ramp step value\n");
2447 return ret;
2448 }
2449 qpnp_led_set(&led->cdev, led->cdev.brightness);
2450 return count;
2451}
2452
2453static ssize_t lut_flags_store(struct device *dev,
2454 struct device_attribute *attr,
2455 const char *buf, size_t count)
2456{
2457 struct qpnp_led_data *led;
2458 u32 lut_flags;
2459 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2460 ssize_t ret;
2461 u32 previous_lut_flags;
2462 struct pwm_config_data *pwm_cfg;
2463
2464 ret = kstrtou32(buf, 10, &lut_flags);
2465 if (ret)
2466 return ret;
2467 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2468
2469 switch (led->id) {
2470 case QPNP_ID_LED_MPP:
2471 pwm_cfg = led->mpp_cfg->pwm_cfg;
2472 break;
2473 case QPNP_ID_RGB_RED:
2474 case QPNP_ID_RGB_GREEN:
2475 case QPNP_ID_RGB_BLUE:
2476 pwm_cfg = led->rgb_cfg->pwm_cfg;
2477 break;
2478 case QPNP_ID_KPDBL:
2479 pwm_cfg = led->kpdbl_cfg->pwm_cfg;
2480 break;
2481 default:
2482 dev_err(&led->pdev->dev,
2483 "Invalid LED id type for lut flags\n");
2484 return -EINVAL;
2485 }
2486
2487 if (pwm_cfg->mode == LPG_MODE)
2488 pwm_cfg->blinking = true;
2489
2490 previous_lut_flags = pwm_cfg->lut_params.flags;
2491
Fenglin Wu325e6de2017-03-16 13:40:26 +08002492 if (pwm_cfg->pwm_enabled) {
2493 pwm_disable(pwm_cfg->pwm_dev);
2494 pwm_cfg->pwm_enabled = 0;
2495 }
David Collins8885f792017-01-26 14:36:34 -08002496 pwm_cfg->lut_params.flags = lut_flags;
2497 ret = qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2498 if (ret) {
2499 pwm_cfg->lut_params.flags = previous_lut_flags;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002500 if (pwm_cfg->pwm_enabled) {
2501 pwm_disable(pwm_cfg->pwm_dev);
2502 pwm_cfg->pwm_enabled = 0;
2503 }
David Collins8885f792017-01-26 14:36:34 -08002504 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2505 qpnp_led_set(&led->cdev, led->cdev.brightness);
2506 dev_err(&led->pdev->dev,
2507 "Failed to initialize pwm with new lut flags value\n");
2508 return ret;
2509 }
2510 qpnp_led_set(&led->cdev, led->cdev.brightness);
2511 return count;
2512}
2513
2514static ssize_t duty_pcts_store(struct device *dev,
2515 struct device_attribute *attr,
2516 const char *buf, size_t count)
2517{
2518 struct qpnp_led_data *led;
2519 int num_duty_pcts = 0;
2520 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2521 char *buffer;
2522 ssize_t ret;
2523 int i = 0;
2524 int max_duty_pcts;
2525 struct pwm_config_data *pwm_cfg;
2526 u32 previous_num_duty_pcts;
2527 int value;
2528 int *previous_duty_pcts;
2529
2530 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2531
2532 switch (led->id) {
2533 case QPNP_ID_LED_MPP:
2534 pwm_cfg = led->mpp_cfg->pwm_cfg;
2535 max_duty_pcts = PWM_LUT_MAX_SIZE;
2536 break;
2537 case QPNP_ID_RGB_RED:
2538 case QPNP_ID_RGB_GREEN:
2539 case QPNP_ID_RGB_BLUE:
2540 pwm_cfg = led->rgb_cfg->pwm_cfg;
2541 max_duty_pcts = PWM_LUT_MAX_SIZE;
2542 break;
2543 case QPNP_ID_KPDBL:
2544 pwm_cfg = led->kpdbl_cfg->pwm_cfg;
2545 max_duty_pcts = PWM_GPLED_LUT_MAX_SIZE;
2546 break;
2547 default:
2548 dev_err(&led->pdev->dev,
2549 "Invalid LED id type for duty pcts\n");
2550 return -EINVAL;
2551 }
2552
2553 if (pwm_cfg->mode == LPG_MODE)
2554 pwm_cfg->blinking = true;
2555
2556 buffer = (char *)buf;
2557
2558 for (i = 0; i < max_duty_pcts; i++) {
2559 if (buffer == NULL)
2560 break;
2561 ret = sscanf((const char *)buffer, "%u,%s", &value, buffer);
2562 pwm_cfg->old_duty_pcts[i] = value;
2563 num_duty_pcts++;
2564 if (ret <= 1)
2565 break;
2566 }
2567
2568 if (num_duty_pcts >= max_duty_pcts) {
2569 dev_err(&led->pdev->dev,
2570 "Number of duty pcts given exceeds max (%d)\n",
2571 max_duty_pcts);
2572 return -EINVAL;
2573 }
2574
2575 previous_num_duty_pcts = pwm_cfg->duty_cycles->num_duty_pcts;
2576 previous_duty_pcts = pwm_cfg->duty_cycles->duty_pcts;
2577
2578 pwm_cfg->duty_cycles->num_duty_pcts = num_duty_pcts;
2579 pwm_cfg->duty_cycles->duty_pcts = pwm_cfg->old_duty_pcts;
2580 pwm_cfg->old_duty_pcts = previous_duty_pcts;
2581 pwm_cfg->lut_params.idx_len = pwm_cfg->duty_cycles->num_duty_pcts;
2582
Fenglin Wu325e6de2017-03-16 13:40:26 +08002583 if (pwm_cfg->pwm_enabled) {
2584 pwm_disable(pwm_cfg->pwm_dev);
2585 pwm_cfg->pwm_enabled = 0;
2586 }
2587
David Collins8885f792017-01-26 14:36:34 -08002588 ret = qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2589 if (ret)
2590 goto restore;
2591
2592 qpnp_led_set(&led->cdev, led->cdev.brightness);
2593 return count;
2594
2595restore:
2596 dev_err(&led->pdev->dev,
2597 "Failed to initialize pwm with new duty pcts value\n");
2598 pwm_cfg->duty_cycles->num_duty_pcts = previous_num_duty_pcts;
2599 pwm_cfg->old_duty_pcts = pwm_cfg->duty_cycles->duty_pcts;
2600 pwm_cfg->duty_cycles->duty_pcts = previous_duty_pcts;
2601 pwm_cfg->lut_params.idx_len = pwm_cfg->duty_cycles->num_duty_pcts;
Fenglin Wu325e6de2017-03-16 13:40:26 +08002602 if (pwm_cfg->pwm_enabled) {
2603 pwm_disable(pwm_cfg->pwm_dev);
2604 pwm_cfg->pwm_enabled = 0;
2605 }
David Collins8885f792017-01-26 14:36:34 -08002606 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2607 qpnp_led_set(&led->cdev, led->cdev.brightness);
2608 return ret;
2609}
2610
2611static void led_blink(struct qpnp_led_data *led,
2612 struct pwm_config_data *pwm_cfg)
2613{
2614 int rc;
2615
2616 flush_work(&led->work);
2617 mutex_lock(&led->lock);
2618 if (pwm_cfg->use_blink) {
2619 if (led->cdev.brightness) {
2620 pwm_cfg->blinking = true;
2621 if (led->id == QPNP_ID_LED_MPP)
2622 led->mpp_cfg->pwm_mode = LPG_MODE;
2623 else if (led->id == QPNP_ID_KPDBL)
2624 led->kpdbl_cfg->pwm_mode = LPG_MODE;
2625 pwm_cfg->mode = LPG_MODE;
2626 } else {
2627 pwm_cfg->blinking = false;
2628 pwm_cfg->mode = pwm_cfg->default_mode;
2629 if (led->id == QPNP_ID_LED_MPP)
2630 led->mpp_cfg->pwm_mode = pwm_cfg->default_mode;
2631 else if (led->id == QPNP_ID_KPDBL)
2632 led->kpdbl_cfg->pwm_mode =
2633 pwm_cfg->default_mode;
2634 }
Fenglin Wu325e6de2017-03-16 13:40:26 +08002635 if (pwm_cfg->pwm_enabled) {
2636 pwm_disable(pwm_cfg->pwm_dev);
2637 pwm_cfg->pwm_enabled = 0;
2638 }
David Collins8885f792017-01-26 14:36:34 -08002639 qpnp_pwm_init(pwm_cfg, led->pdev, led->cdev.name);
2640 if (led->id == QPNP_ID_RGB_RED || led->id == QPNP_ID_RGB_GREEN
2641 || led->id == QPNP_ID_RGB_BLUE) {
2642 rc = qpnp_rgb_set(led);
2643 if (rc < 0)
2644 dev_err(&led->pdev->dev,
2645 "RGB set brightness failed (%d)\n", rc);
2646 } else if (led->id == QPNP_ID_LED_MPP) {
2647 rc = qpnp_mpp_set(led);
2648 if (rc < 0)
2649 dev_err(&led->pdev->dev,
2650 "MPP set brightness failed (%d)\n", rc);
2651 } else if (led->id == QPNP_ID_KPDBL) {
2652 rc = qpnp_kpdbl_set(led);
2653 if (rc < 0)
2654 dev_err(&led->pdev->dev,
2655 "KPDBL set brightness failed (%d)\n", rc);
2656 }
2657 }
2658 mutex_unlock(&led->lock);
2659}
2660
2661static ssize_t blink_store(struct device *dev,
2662 struct device_attribute *attr,
2663 const char *buf, size_t count)
2664{
2665 struct qpnp_led_data *led;
2666 unsigned long blinking;
2667 struct led_classdev *led_cdev = dev_get_drvdata(dev);
2668 ssize_t ret = -EINVAL;
2669
2670 ret = kstrtoul(buf, 10, &blinking);
2671 if (ret)
2672 return ret;
2673 led = container_of(led_cdev, struct qpnp_led_data, cdev);
2674 led->cdev.brightness = blinking ? led->cdev.max_brightness : 0;
2675
2676 switch (led->id) {
2677 case QPNP_ID_LED_MPP:
2678 led_blink(led, led->mpp_cfg->pwm_cfg);
2679 break;
2680 case QPNP_ID_RGB_RED:
2681 case QPNP_ID_RGB_GREEN:
2682 case QPNP_ID_RGB_BLUE:
2683 led_blink(led, led->rgb_cfg->pwm_cfg);
2684 break;
2685 case QPNP_ID_KPDBL:
2686 led_blink(led, led->kpdbl_cfg->pwm_cfg);
2687 break;
2688 default:
2689 dev_err(&led->pdev->dev, "Invalid LED id type for blink\n");
2690 return -EINVAL;
2691 }
2692 return count;
2693}
2694
2695static DEVICE_ATTR(led_mode, 0664, NULL, led_mode_store);
2696static DEVICE_ATTR(strobe, 0664, NULL, led_strobe_type_store);
2697static DEVICE_ATTR(pwm_us, 0664, NULL, pwm_us_store);
2698static DEVICE_ATTR(pause_lo, 0664, NULL, pause_lo_store);
2699static DEVICE_ATTR(pause_hi, 0664, NULL, pause_hi_store);
2700static DEVICE_ATTR(start_idx, 0664, NULL, start_idx_store);
2701static DEVICE_ATTR(ramp_step_ms, 0664, NULL, ramp_step_ms_store);
2702static DEVICE_ATTR(lut_flags, 0664, NULL, lut_flags_store);
2703static DEVICE_ATTR(duty_pcts, 0664, NULL, duty_pcts_store);
2704static DEVICE_ATTR(blink, 0664, NULL, blink_store);
2705
2706static struct attribute *led_attrs[] = {
2707 &dev_attr_led_mode.attr,
2708 &dev_attr_strobe.attr,
2709 NULL
2710};
2711
2712static const struct attribute_group led_attr_group = {
2713 .attrs = led_attrs,
2714};
2715
2716static struct attribute *pwm_attrs[] = {
2717 &dev_attr_pwm_us.attr,
2718 NULL
2719};
2720
2721static struct attribute *lpg_attrs[] = {
2722 &dev_attr_pause_lo.attr,
2723 &dev_attr_pause_hi.attr,
2724 &dev_attr_start_idx.attr,
2725 &dev_attr_ramp_step_ms.attr,
2726 &dev_attr_lut_flags.attr,
2727 &dev_attr_duty_pcts.attr,
2728 NULL
2729};
2730
2731static struct attribute *blink_attrs[] = {
2732 &dev_attr_blink.attr,
2733 NULL
2734};
2735
2736static const struct attribute_group pwm_attr_group = {
2737 .attrs = pwm_attrs,
2738};
2739
2740static const struct attribute_group lpg_attr_group = {
2741 .attrs = lpg_attrs,
2742};
2743
2744static const struct attribute_group blink_attr_group = {
2745 .attrs = blink_attrs,
2746};
2747
2748static int qpnp_flash_init(struct qpnp_led_data *led)
2749{
2750 int rc;
2751
2752 led->flash_cfg->flash_on = false;
2753
2754 rc = qpnp_led_masked_write(led,
2755 FLASH_LED_STROBE_CTRL(led->base),
2756 FLASH_STROBE_MASK, FLASH_DISABLE_ALL);
2757 if (rc) {
2758 dev_err(&led->pdev->dev,
2759 "LED %d flash write failed(%d)\n", led->id, rc);
2760 return rc;
2761 }
2762
2763 /* Disable flash LED module */
2764 rc = qpnp_led_masked_write(led, FLASH_ENABLE_CONTROL(led->base),
2765 FLASH_ENABLE_MASK, FLASH_DISABLE_ALL);
2766 if (rc) {
2767 dev_err(&led->pdev->dev, "Enable reg write failed(%d)\n", rc);
2768 return rc;
2769 }
2770
2771 if (led->flash_cfg->torch_enable)
2772 return 0;
2773
2774 /* Set headroom */
2775 rc = qpnp_led_masked_write(led, FLASH_HEADROOM(led->base),
2776 FLASH_HEADROOM_MASK, led->flash_cfg->headroom);
2777 if (rc) {
2778 dev_err(&led->pdev->dev,
2779 "Headroom reg write failed(%d)\n", rc);
2780 return rc;
2781 }
2782
2783 /* Set startup delay */
2784 rc = qpnp_led_masked_write(led,
2785 FLASH_STARTUP_DELAY(led->base), FLASH_STARTUP_DLY_MASK,
2786 led->flash_cfg->startup_dly);
2787 if (rc) {
2788 dev_err(&led->pdev->dev,
2789 "Startup delay reg write failed(%d)\n", rc);
2790 return rc;
2791 }
2792
2793 /* Set timer control - safety or watchdog */
2794 if (led->flash_cfg->safety_timer) {
2795 rc = qpnp_led_masked_write(led,
2796 FLASH_LED_TMR_CTRL(led->base),
2797 FLASH_TMR_MASK, FLASH_TMR_SAFETY);
2798 if (rc) {
2799 dev_err(&led->pdev->dev,
2800 "LED timer ctrl reg write failed(%d)\n",
2801 rc);
2802 return rc;
2803 }
2804 }
2805
2806 /* Set Vreg force */
2807 if (led->flash_cfg->vreg_ok)
2808 rc = qpnp_led_masked_write(led, FLASH_VREG_OK_FORCE(led->base),
2809 FLASH_VREG_MASK, FLASH_SW_VREG_OK);
2810 else
2811 rc = qpnp_led_masked_write(led, FLASH_VREG_OK_FORCE(led->base),
2812 FLASH_VREG_MASK, FLASH_HW_VREG_OK);
2813
2814 if (rc) {
2815 dev_err(&led->pdev->dev,
2816 "Vreg OK reg write failed(%d)\n", rc);
2817 return rc;
2818 }
2819
2820 /* Set self fault check */
2821 rc = qpnp_led_masked_write(led, FLASH_FAULT_DETECT(led->base),
2822 FLASH_FAULT_DETECT_MASK, FLASH_SELFCHECK_ENABLE);
2823 if (rc) {
2824 dev_err(&led->pdev->dev,
2825 "Fault detect reg write failed(%d)\n", rc);
2826 return rc;
2827 }
2828
2829 /* Set mask enable */
2830 rc = qpnp_led_masked_write(led, FLASH_MASK_ENABLE(led->base),
2831 FLASH_MASK_REG_MASK, FLASH_MASK_1);
2832 if (rc) {
2833 dev_err(&led->pdev->dev,
2834 "Mask enable reg write failed(%d)\n", rc);
2835 return rc;
2836 }
2837
2838 /* Set current ramp */
2839 rc = qpnp_led_masked_write(led, FLASH_CURRENT_RAMP(led->base),
2840 FLASH_CURRENT_RAMP_MASK, FLASH_RAMP_STEP_27US);
2841 if (rc) {
2842 dev_err(&led->pdev->dev,
2843 "Current ramp reg write failed(%d)\n", rc);
2844 return rc;
2845 }
2846
2847 led->flash_cfg->strobe_type = 0;
2848
2849 /* dump flash registers */
2850 qpnp_dump_regs(led, flash_debug_regs, ARRAY_SIZE(flash_debug_regs));
2851
2852 return 0;
2853}
2854
2855static int qpnp_kpdbl_init(struct qpnp_led_data *led)
2856{
2857 int rc;
2858 uint val;
2859
2860 /* select row source - vbst or vph */
2861 rc = regmap_read(led->regmap, KPDBL_ROW_SRC_SEL(led->base), &val);
2862 if (rc) {
2863 dev_err(&led->pdev->dev,
2864 "Unable to read from addr=%x, rc(%d)\n",
2865 KPDBL_ROW_SRC_SEL(led->base), rc);
2866 return rc;
2867 }
2868
2869 if (led->kpdbl_cfg->row_src_vbst)
2870 val |= 1 << led->kpdbl_cfg->row_id;
2871 else
2872 val &= ~(1 << led->kpdbl_cfg->row_id);
2873
2874 rc = regmap_write(led->regmap, KPDBL_ROW_SRC_SEL(led->base), val);
2875 if (rc) {
2876 dev_err(&led->pdev->dev,
2877 "Unable to read from addr=%x, rc(%d)\n",
2878 KPDBL_ROW_SRC_SEL(led->base), rc);
2879 return rc;
2880 }
2881
2882 /* row source enable */
2883 rc = regmap_read(led->regmap, KPDBL_ROW_SRC(led->base), &val);
2884 if (rc) {
2885 dev_err(&led->pdev->dev,
2886 "Unable to read from addr=%x, rc(%d)\n",
2887 KPDBL_ROW_SRC(led->base), rc);
2888 return rc;
2889 }
2890
2891 if (led->kpdbl_cfg->row_src_en)
2892 val |= KPDBL_ROW_SCAN_EN_MASK | (1 << led->kpdbl_cfg->row_id);
2893 else
2894 val &= ~(1 << led->kpdbl_cfg->row_id);
2895
2896 rc = regmap_write(led->regmap, KPDBL_ROW_SRC(led->base), val);
2897 if (rc) {
2898 dev_err(&led->pdev->dev,
2899 "Unable to write to addr=%x, rc(%d)\n",
2900 KPDBL_ROW_SRC(led->base), rc);
2901 return rc;
2902 }
2903
2904 /* enable module */
2905 rc = qpnp_led_masked_write(led, KPDBL_ENABLE(led->base),
2906 KPDBL_MODULE_EN_MASK, KPDBL_MODULE_EN);
2907 if (rc) {
2908 dev_err(&led->pdev->dev,
2909 "Enable module write failed(%d)\n", rc);
2910 return rc;
2911 }
2912
2913 rc = qpnp_pwm_init(led->kpdbl_cfg->pwm_cfg, led->pdev,
2914 led->cdev.name);
2915 if (rc) {
2916 dev_err(&led->pdev->dev, "Failed to initialize pwm\n");
2917 return rc;
2918 }
2919
2920 if (led->kpdbl_cfg->always_on) {
2921 kpdbl_master = led->kpdbl_cfg->pwm_cfg->pwm_dev;
2922 kpdbl_master_period_us = led->kpdbl_cfg->pwm_cfg->pwm_period_us;
2923 }
2924
2925 /* dump kpdbl registers */
2926 qpnp_dump_regs(led, kpdbl_debug_regs, ARRAY_SIZE(kpdbl_debug_regs));
2927
2928 return 0;
2929}
2930
2931static int qpnp_rgb_init(struct qpnp_led_data *led)
2932{
2933 int rc;
2934
2935 rc = qpnp_led_masked_write(led, RGB_LED_SRC_SEL(led->base),
2936 RGB_LED_SRC_MASK, RGB_LED_SOURCE_VPH_PWR);
2937 if (rc) {
2938 dev_err(&led->pdev->dev,
2939 "Failed to write led source select register\n");
2940 return rc;
2941 }
2942
2943 rc = qpnp_pwm_init(led->rgb_cfg->pwm_cfg, led->pdev, led->cdev.name);
2944 if (rc) {
2945 dev_err(&led->pdev->dev, "Failed to initialize pwm\n");
2946 return rc;
2947 }
2948 /* Initialize led for use in auto trickle charging mode */
2949 rc = qpnp_led_masked_write(led, RGB_LED_ATC_CTL(led->base),
2950 led->rgb_cfg->enable, led->rgb_cfg->enable);
2951
2952 return 0;
2953}
2954
2955static int qpnp_mpp_init(struct qpnp_led_data *led)
2956{
2957 int rc;
2958 u8 val;
2959
2960
2961 if (led->max_current < LED_MPP_CURRENT_MIN ||
2962 led->max_current > LED_MPP_CURRENT_MAX) {
2963 dev_err(&led->pdev->dev,
2964 "max current for mpp is not valid\n");
2965 return -EINVAL;
2966 }
2967
2968 val = (led->mpp_cfg->current_setting / LED_MPP_CURRENT_PER_SETTING) - 1;
2969
2970 if (val < 0)
2971 val = 0;
2972
2973 rc = qpnp_led_masked_write(led, LED_MPP_VIN_CTRL(led->base),
2974 LED_MPP_VIN_MASK, led->mpp_cfg->vin_ctrl);
2975 if (rc) {
2976 dev_err(&led->pdev->dev,
2977 "Failed to write led vin control reg\n");
2978 return rc;
2979 }
2980
2981 rc = qpnp_led_masked_write(led, LED_MPP_SINK_CTRL(led->base),
2982 LED_MPP_SINK_MASK, val);
2983 if (rc) {
2984 dev_err(&led->pdev->dev,
2985 "Failed to write sink control reg\n");
2986 return rc;
2987 }
2988
2989 if (led->mpp_cfg->pwm_mode != MANUAL_MODE) {
2990 rc = qpnp_pwm_init(led->mpp_cfg->pwm_cfg, led->pdev,
2991 led->cdev.name);
2992 if (rc) {
2993 dev_err(&led->pdev->dev,
2994 "Failed to initialize pwm\n");
2995 return rc;
2996 }
2997 }
2998
2999 return 0;
3000}
3001
3002static int qpnp_gpio_init(struct qpnp_led_data *led)
3003{
3004 int rc;
3005
3006 rc = qpnp_led_masked_write(led, LED_GPIO_VIN_CTRL(led->base),
3007 LED_GPIO_VIN_MASK, led->gpio_cfg->vin_ctrl);
3008 if (rc) {
3009 dev_err(&led->pdev->dev,
3010 "Failed to write led vin control reg\n");
3011 return rc;
3012 }
3013
3014 return 0;
3015}
3016
3017static int qpnp_led_initialize(struct qpnp_led_data *led)
3018{
3019 int rc = 0;
3020
3021 switch (led->id) {
3022 case QPNP_ID_WLED:
3023 rc = qpnp_wled_init(led);
3024 if (rc)
3025 dev_err(&led->pdev->dev,
3026 "WLED initialize failed(%d)\n", rc);
3027 break;
3028 case QPNP_ID_FLASH1_LED0:
3029 case QPNP_ID_FLASH1_LED1:
3030 rc = qpnp_flash_init(led);
3031 if (rc)
3032 dev_err(&led->pdev->dev,
3033 "FLASH initialize failed(%d)\n", rc);
3034 break;
3035 case QPNP_ID_RGB_RED:
3036 case QPNP_ID_RGB_GREEN:
3037 case QPNP_ID_RGB_BLUE:
3038 rc = qpnp_rgb_init(led);
3039 if (rc)
3040 dev_err(&led->pdev->dev,
3041 "RGB initialize failed(%d)\n", rc);
3042 break;
3043 case QPNP_ID_LED_MPP:
3044 rc = qpnp_mpp_init(led);
3045 if (rc)
3046 dev_err(&led->pdev->dev,
3047 "MPP initialize failed(%d)\n", rc);
3048 break;
3049 case QPNP_ID_LED_GPIO:
3050 rc = qpnp_gpio_init(led);
3051 if (rc)
3052 dev_err(&led->pdev->dev,
3053 "GPIO initialize failed(%d)\n", rc);
3054 break;
3055 case QPNP_ID_KPDBL:
3056 rc = qpnp_kpdbl_init(led);
3057 if (rc)
3058 dev_err(&led->pdev->dev,
3059 "KPDBL initialize failed(%d)\n", rc);
3060 break;
3061 default:
3062 dev_err(&led->pdev->dev, "Invalid LED(%d)\n", led->id);
3063 return -EINVAL;
3064 }
3065
3066 return rc;
3067}
3068
3069static int qpnp_get_common_configs(struct qpnp_led_data *led,
3070 struct device_node *node)
3071{
3072 int rc;
3073 u32 val;
3074 const char *temp_string;
3075
3076 led->cdev.default_trigger = LED_TRIGGER_DEFAULT;
3077 rc = of_property_read_string(node, "linux,default-trigger",
3078 &temp_string);
3079 if (!rc)
3080 led->cdev.default_trigger = temp_string;
3081 else if (rc != -EINVAL)
3082 return rc;
3083
3084 led->default_on = false;
3085 rc = of_property_read_string(node, "qcom,default-state",
3086 &temp_string);
3087 if (!rc) {
3088 if (strcmp(temp_string, "on") == 0)
3089 led->default_on = true;
3090 } else if (rc != -EINVAL)
3091 return rc;
3092
3093 led->turn_off_delay_ms = 0;
3094 rc = of_property_read_u32(node, "qcom,turn-off-delay-ms", &val);
3095 if (!rc)
3096 led->turn_off_delay_ms = val;
3097 else if (rc != -EINVAL)
3098 return rc;
3099
3100 return 0;
3101}
3102
3103/*
3104 * Handlers for alternative sources of platform_data
3105 */
3106static int qpnp_get_config_wled(struct qpnp_led_data *led,
3107 struct device_node *node)
3108{
3109 u32 val;
3110 uint tmp;
3111 int rc;
3112
3113 led->wled_cfg = devm_kzalloc(&led->pdev->dev,
3114 sizeof(struct wled_config_data), GFP_KERNEL);
3115 if (!led->wled_cfg)
3116 return -ENOMEM;
3117
3118 rc = regmap_read(led->regmap, PMIC_VERSION_REG, &tmp);
3119 if (rc) {
3120 dev_err(&led->pdev->dev,
3121 "Unable to read pmic ver, rc(%d)\n", rc);
3122 }
3123 led->wled_cfg->pmic_version = (u8)tmp;
3124
3125 led->wled_cfg->num_strings = WLED_DEFAULT_STRINGS;
3126 rc = of_property_read_u32(node, "qcom,num-strings", &val);
3127 if (!rc)
3128 led->wled_cfg->num_strings = (u8) val;
3129 else if (rc != -EINVAL)
3130 return rc;
3131
3132 led->wled_cfg->num_physical_strings = led->wled_cfg->num_strings;
3133 rc = of_property_read_u32(node, "qcom,num-physical-strings", &val);
3134 if (!rc)
3135 led->wled_cfg->num_physical_strings = (u8) val;
3136 else if (rc != -EINVAL)
3137 return rc;
3138
3139 led->wled_cfg->ovp_val = WLED_DEFAULT_OVP_VAL;
3140 rc = of_property_read_u32(node, "qcom,ovp-val", &val);
3141 if (!rc)
3142 led->wled_cfg->ovp_val = (u8) val;
3143 else if (rc != -EINVAL)
3144 return rc;
3145
3146 led->wled_cfg->boost_curr_lim = WLED_BOOST_LIM_DEFAULT;
3147 rc = of_property_read_u32(node, "qcom,boost-curr-lim", &val);
3148 if (!rc)
3149 led->wled_cfg->boost_curr_lim = (u8) val;
3150 else if (rc != -EINVAL)
3151 return rc;
3152
3153 led->wled_cfg->cp_select = WLED_CP_SEL_DEFAULT;
3154 rc = of_property_read_u32(node, "qcom,cp-sel", &val);
3155 if (!rc)
3156 led->wled_cfg->cp_select = (u8) val;
3157 else if (rc != -EINVAL)
3158 return rc;
3159
3160 led->wled_cfg->ctrl_delay_us = WLED_CTRL_DLY_DEFAULT;
3161 rc = of_property_read_u32(node, "qcom,ctrl-delay-us", &val);
3162 if (!rc)
3163 led->wled_cfg->ctrl_delay_us = (u8) val;
3164 else if (rc != -EINVAL)
3165 return rc;
3166
3167 led->wled_cfg->op_fdbck = WLED_OP_FDBCK_DEFAULT;
3168 rc = of_property_read_u32(node, "qcom,op-fdbck", &val);
3169 if (!rc)
3170 led->wled_cfg->op_fdbck = (u8) val;
3171 else if (rc != -EINVAL)
3172 return rc;
3173
3174 led->wled_cfg->switch_freq = WLED_SWITCH_FREQ_DEFAULT;
3175 rc = of_property_read_u32(node, "qcom,switch-freq", &val);
3176 if (!rc)
3177 led->wled_cfg->switch_freq = (u8) val;
3178 else if (rc != -EINVAL)
3179 return rc;
3180
3181 led->wled_cfg->dig_mod_gen_en =
3182 of_property_read_bool(node, "qcom,dig-mod-gen-en");
3183
3184 led->wled_cfg->cs_out_en =
3185 of_property_read_bool(node, "qcom,cs-out-en");
3186
3187 return 0;
3188}
3189
3190static int qpnp_get_config_flash(struct qpnp_led_data *led,
3191 struct device_node *node, bool *reg_set)
3192{
3193 int rc;
3194 u32 val;
3195 uint tmp;
3196
3197 led->flash_cfg = devm_kzalloc(&led->pdev->dev,
3198 sizeof(struct flash_config_data), GFP_KERNEL);
3199 if (!led->flash_cfg)
3200 return -ENOMEM;
3201
3202 rc = regmap_read(led->regmap, FLASH_PERIPHERAL_SUBTYPE(led->base),
3203 &tmp);
3204 if (rc) {
3205 dev_err(&led->pdev->dev,
3206 "Unable to read from addr=%x, rc(%d)\n",
3207 FLASH_PERIPHERAL_SUBTYPE(led->base), rc);
3208 }
3209 led->flash_cfg->peripheral_subtype = (u8)tmp;
3210
3211 led->flash_cfg->torch_enable =
3212 of_property_read_bool(node, "qcom,torch-enable");
3213
3214 led->flash_cfg->no_smbb_support =
3215 of_property_read_bool(node, "qcom,no-smbb-support");
3216
3217 if (of_find_property(of_get_parent(node), "flash-wa-supply",
3218 NULL) && (!*reg_set)) {
3219 led->flash_cfg->flash_wa_reg =
3220 devm_regulator_get(&led->pdev->dev, "flash-wa");
3221 if (IS_ERR_OR_NULL(led->flash_cfg->flash_wa_reg)) {
3222 rc = PTR_ERR(led->flash_cfg->flash_wa_reg);
3223 if (rc != EPROBE_DEFER) {
3224 dev_err(&led->pdev->dev,
3225 "Flash wa regulator get failed(%d)\n",
3226 rc);
3227 }
3228 } else {
3229 led->flash_cfg->flash_wa_reg_get = true;
3230 }
3231 }
3232
3233 if (led->id == QPNP_ID_FLASH1_LED0) {
3234 led->flash_cfg->enable_module = FLASH_ENABLE_LED_0;
3235 led->flash_cfg->current_addr = FLASH_LED_0_CURR(led->base);
3236 led->flash_cfg->trigger_flash = FLASH_LED_0_OUTPUT;
3237 if (!*reg_set) {
3238 led->flash_cfg->flash_boost_reg =
3239 regulator_get(&led->pdev->dev,
3240 "flash-boost");
3241 if (IS_ERR(led->flash_cfg->flash_boost_reg)) {
3242 rc = PTR_ERR(led->flash_cfg->flash_boost_reg);
3243 dev_err(&led->pdev->dev,
3244 "Regulator get failed(%d)\n", rc);
3245 goto error_get_flash_reg;
3246 }
3247 led->flash_cfg->flash_reg_get = true;
3248 *reg_set = true;
3249 } else
3250 led->flash_cfg->flash_reg_get = false;
3251
3252 if (led->flash_cfg->torch_enable) {
3253 led->flash_cfg->second_addr =
3254 FLASH_LED_1_CURR(led->base);
3255 }
3256 } else if (led->id == QPNP_ID_FLASH1_LED1) {
3257 led->flash_cfg->enable_module = FLASH_ENABLE_LED_1;
3258 led->flash_cfg->current_addr = FLASH_LED_1_CURR(led->base);
3259 led->flash_cfg->trigger_flash = FLASH_LED_1_OUTPUT;
3260 if (!*reg_set) {
3261 led->flash_cfg->flash_boost_reg =
3262 regulator_get(&led->pdev->dev,
3263 "flash-boost");
3264 if (IS_ERR(led->flash_cfg->flash_boost_reg)) {
3265 rc = PTR_ERR(led->flash_cfg->flash_boost_reg);
3266 dev_err(&led->pdev->dev,
3267 "Regulator get failed(%d)\n", rc);
3268 goto error_get_flash_reg;
3269 }
3270 led->flash_cfg->flash_reg_get = true;
3271 *reg_set = true;
3272 } else
3273 led->flash_cfg->flash_reg_get = false;
3274
3275 if (led->flash_cfg->torch_enable) {
3276 led->flash_cfg->second_addr =
3277 FLASH_LED_0_CURR(led->base);
3278 }
3279 } else {
3280 dev_err(&led->pdev->dev, "Unknown flash LED name given\n");
3281 return -EINVAL;
3282 }
3283
3284 if (led->flash_cfg->torch_enable) {
3285 if (of_find_property(of_get_parent(node), "torch-boost-supply",
3286 NULL)) {
3287 if (!led->flash_cfg->no_smbb_support) {
3288 led->flash_cfg->torch_boost_reg =
3289 regulator_get(&led->pdev->dev,
3290 "torch-boost");
3291 if (IS_ERR(led->flash_cfg->torch_boost_reg)) {
3292 rc = PTR_ERR(led->flash_cfg->
3293 torch_boost_reg);
3294 dev_err(&led->pdev->dev,
3295 "Torch regulator get failed(%d)\n", rc);
3296 goto error_get_torch_reg;
3297 }
3298 }
3299 led->flash_cfg->enable_module = FLASH_ENABLE_MODULE;
3300 } else
3301 led->flash_cfg->enable_module = FLASH_ENABLE_ALL;
3302 led->flash_cfg->trigger_flash = FLASH_TORCH_OUTPUT;
3303
3304 rc = of_property_read_u32(node, "qcom,duration", &val);
3305 if (!rc)
3306 led->flash_cfg->duration = ((u8) val) - 2;
3307 else if (rc == -EINVAL)
3308 led->flash_cfg->duration = TORCH_DURATION_12s;
3309 else {
3310 if (led->flash_cfg->peripheral_subtype ==
3311 FLASH_SUBTYPE_SINGLE)
3312 goto error_get_flash_reg;
3313 else if (led->flash_cfg->peripheral_subtype ==
3314 FLASH_SUBTYPE_DUAL)
3315 goto error_get_torch_reg;
3316 }
3317
3318 rc = of_property_read_u32(node, "qcom,current", &val);
3319 if (!rc)
3320 led->flash_cfg->current_prgm = (val *
3321 TORCH_MAX_LEVEL / led->max_current);
3322 else {
3323 if (led->flash_cfg->peripheral_subtype ==
3324 FLASH_SUBTYPE_SINGLE)
3325 goto error_get_flash_reg;
3326 else if (led->flash_cfg->peripheral_subtype ==
3327 FLASH_SUBTYPE_DUAL)
3328 goto error_get_torch_reg;
3329 goto error_get_torch_reg;
3330 }
3331
3332 return 0;
3333 }
3334
3335 rc = of_property_read_u32(node, "qcom,duration", &val);
3336 if (!rc)
3337 led->flash_cfg->duration = (u8)((val - 10) / 10);
3338 else if (rc == -EINVAL)
3339 led->flash_cfg->duration = FLASH_DURATION_200ms;
3340 else
3341 goto error_get_flash_reg;
3342
3343 rc = of_property_read_u32(node, "qcom,current", &val);
3344 if (!rc)
3345 led->flash_cfg->current_prgm = val * FLASH_MAX_LEVEL
3346 / led->max_current;
3347 else
3348 goto error_get_flash_reg;
3349
3350 rc = of_property_read_u32(node, "qcom,headroom", &val);
3351 if (!rc)
3352 led->flash_cfg->headroom = (u8) val;
3353 else if (rc == -EINVAL)
3354 led->flash_cfg->headroom = HEADROOM_500mV;
3355 else
3356 goto error_get_flash_reg;
3357
3358 rc = of_property_read_u32(node, "qcom,clamp-curr", &val);
3359 if (!rc)
3360 led->flash_cfg->clamp_curr = (val *
3361 FLASH_MAX_LEVEL / led->max_current);
3362 else if (rc == -EINVAL)
3363 led->flash_cfg->clamp_curr = FLASH_CLAMP_200mA;
3364 else
3365 goto error_get_flash_reg;
3366
3367 rc = of_property_read_u32(node, "qcom,startup-dly", &val);
3368 if (!rc)
3369 led->flash_cfg->startup_dly = (u8) val;
3370 else if (rc == -EINVAL)
3371 led->flash_cfg->startup_dly = DELAY_128us;
3372 else
3373 goto error_get_flash_reg;
3374
3375 led->flash_cfg->safety_timer =
3376 of_property_read_bool(node, "qcom,safety-timer");
3377
3378 led->flash_cfg->vreg_ok =
3379 of_property_read_bool(node, "qcom,sw_vreg_ok");
3380
3381 return 0;
3382
3383error_get_torch_reg:
3384 if (led->flash_cfg->no_smbb_support)
3385 regulator_put(led->flash_cfg->flash_boost_reg);
3386 else
3387 regulator_put(led->flash_cfg->torch_boost_reg);
3388
3389error_get_flash_reg:
3390 regulator_put(led->flash_cfg->flash_boost_reg);
3391 return rc;
3392
3393}
3394
3395static int qpnp_get_config_pwm(struct pwm_config_data *pwm_cfg,
3396 struct platform_device *pdev,
3397 struct device_node *node)
3398{
3399 struct property *prop;
3400 int rc, i, lut_max_size;
3401 u32 val;
3402 u8 *temp_cfg;
3403 const char *led_label;
3404
3405 pwm_cfg->pwm_dev = of_pwm_get(node, NULL);
3406
3407 if (IS_ERR(pwm_cfg->pwm_dev)) {
3408 rc = PTR_ERR(pwm_cfg->pwm_dev);
3409 dev_err(&pdev->dev, "Cannot get PWM device rc:(%d)\n", rc);
3410 pwm_cfg->pwm_dev = NULL;
3411 return rc;
3412 }
3413
3414 if (pwm_cfg->mode != MANUAL_MODE) {
3415 rc = of_property_read_u32(node, "qcom,pwm-us", &val);
3416 if (!rc)
3417 pwm_cfg->pwm_period_us = val;
3418 else
3419 return rc;
3420 }
3421
3422 pwm_cfg->use_blink =
3423 of_property_read_bool(node, "qcom,use-blink");
3424
3425 if (pwm_cfg->mode == LPG_MODE || pwm_cfg->use_blink) {
3426 pwm_cfg->duty_cycles =
3427 devm_kzalloc(&pdev->dev,
3428 sizeof(struct pwm_duty_cycles), GFP_KERNEL);
3429 if (!pwm_cfg->duty_cycles) {
3430 dev_err(&pdev->dev, "Unable to allocate memory\n");
3431 rc = -ENOMEM;
3432 goto bad_lpg_params;
3433 }
3434
3435 prop = of_find_property(node, "qcom,duty-pcts",
3436 &pwm_cfg->duty_cycles->num_duty_pcts);
3437 if (!prop) {
3438 dev_err(&pdev->dev, "Looking up property node qcom,duty-pcts failed\n");
3439 rc = -ENODEV;
3440 goto bad_lpg_params;
3441 } else if (!pwm_cfg->duty_cycles->num_duty_pcts) {
3442 dev_err(&pdev->dev, "Invalid length of duty pcts\n");
3443 rc = -EINVAL;
3444 goto bad_lpg_params;
3445 }
3446
3447 rc = of_property_read_string(node, "label", &led_label);
3448
3449 if (rc < 0) {
3450 dev_err(&pdev->dev,
3451 "Failure reading label, rc = %d\n", rc);
3452 return rc;
3453 }
3454
3455 if (strcmp(led_label, "kpdbl") == 0)
3456 lut_max_size = PWM_GPLED_LUT_MAX_SIZE;
3457 else
3458 lut_max_size = PWM_LUT_MAX_SIZE;
3459
3460 pwm_cfg->duty_cycles->duty_pcts =
3461 devm_kzalloc(&pdev->dev,
3462 sizeof(int) * lut_max_size,
3463 GFP_KERNEL);
3464 if (!pwm_cfg->duty_cycles->duty_pcts) {
3465 dev_err(&pdev->dev, "Unable to allocate memory\n");
3466 rc = -ENOMEM;
3467 goto bad_lpg_params;
3468 }
3469
3470 pwm_cfg->old_duty_pcts =
3471 devm_kzalloc(&pdev->dev,
3472 sizeof(int) * lut_max_size,
3473 GFP_KERNEL);
3474 if (!pwm_cfg->old_duty_pcts) {
3475 dev_err(&pdev->dev, "Unable to allocate memory\n");
3476 rc = -ENOMEM;
3477 goto bad_lpg_params;
3478 }
3479
3480 temp_cfg = devm_kzalloc(&pdev->dev,
3481 pwm_cfg->duty_cycles->num_duty_pcts *
3482 sizeof(u8), GFP_KERNEL);
3483 if (!temp_cfg) {
3484 dev_err(&pdev->dev, "Failed to allocate memory for duty pcts\n");
3485 rc = -ENOMEM;
3486 goto bad_lpg_params;
3487 }
3488
3489 memcpy(temp_cfg, prop->value,
3490 pwm_cfg->duty_cycles->num_duty_pcts);
3491
3492 for (i = 0; i < pwm_cfg->duty_cycles->num_duty_pcts; i++)
3493 pwm_cfg->duty_cycles->duty_pcts[i] =
3494 (int) temp_cfg[i];
3495
3496 rc = of_property_read_u32(node, "qcom,start-idx", &val);
3497 if (!rc) {
3498 pwm_cfg->lut_params.start_idx = val;
3499 pwm_cfg->duty_cycles->start_idx = val;
3500 } else
3501 goto bad_lpg_params;
3502
3503 pwm_cfg->lut_params.lut_pause_hi = 0;
3504 rc = of_property_read_u32(node, "qcom,pause-hi", &val);
3505 if (!rc)
3506 pwm_cfg->lut_params.lut_pause_hi = val;
3507 else if (rc != -EINVAL)
3508 goto bad_lpg_params;
3509
3510 pwm_cfg->lut_params.lut_pause_lo = 0;
3511 rc = of_property_read_u32(node, "qcom,pause-lo", &val);
3512 if (!rc)
3513 pwm_cfg->lut_params.lut_pause_lo = val;
3514 else if (rc != -EINVAL)
3515 goto bad_lpg_params;
3516
3517 pwm_cfg->lut_params.ramp_step_ms =
3518 QPNP_LUT_RAMP_STEP_DEFAULT;
3519 rc = of_property_read_u32(node, "qcom,ramp-step-ms", &val);
3520 if (!rc)
3521 pwm_cfg->lut_params.ramp_step_ms = val;
3522 else if (rc != -EINVAL)
3523 goto bad_lpg_params;
3524
3525 pwm_cfg->lut_params.flags = QPNP_LED_PWM_FLAGS;
3526 rc = of_property_read_u32(node, "qcom,lut-flags", &val);
3527 if (!rc)
3528 pwm_cfg->lut_params.flags = (u8) val;
3529 else if (rc != -EINVAL)
3530 goto bad_lpg_params;
3531
3532 pwm_cfg->lut_params.idx_len =
3533 pwm_cfg->duty_cycles->num_duty_pcts;
3534 }
3535 return 0;
3536
3537bad_lpg_params:
3538 pwm_cfg->use_blink = false;
3539 if (pwm_cfg->mode == PWM_MODE) {
3540 dev_err(&pdev->dev, "LPG parameters not set for blink mode, defaulting to PWM mode\n");
3541 return 0;
3542 }
3543 return rc;
3544};
3545
3546static int qpnp_led_get_mode(const char *mode)
3547{
3548 if (strcmp(mode, "manual") == 0)
3549 return MANUAL_MODE;
3550 else if (strcmp(mode, "pwm") == 0)
3551 return PWM_MODE;
3552 else if (strcmp(mode, "lpg") == 0)
3553 return LPG_MODE;
3554 else
3555 return -EINVAL;
3556};
3557
3558static int qpnp_get_config_kpdbl(struct qpnp_led_data *led,
3559 struct device_node *node)
3560{
3561 int rc;
3562 u32 val;
3563 u8 led_mode;
3564 const char *mode;
3565
3566 led->kpdbl_cfg = devm_kzalloc(&led->pdev->dev,
3567 sizeof(struct kpdbl_config_data), GFP_KERNEL);
3568 if (!led->kpdbl_cfg)
3569 return -ENOMEM;
3570
3571 rc = of_property_read_string(node, "qcom,mode", &mode);
3572 if (!rc) {
3573 led_mode = qpnp_led_get_mode(mode);
3574 if ((led_mode == MANUAL_MODE) || (led_mode == -EINVAL)) {
3575 dev_err(&led->pdev->dev, "Selected mode not supported for kpdbl.\n");
3576 return -EINVAL;
3577 }
3578 led->kpdbl_cfg->pwm_cfg = devm_kzalloc(&led->pdev->dev,
3579 sizeof(struct pwm_config_data),
3580 GFP_KERNEL);
3581 if (!led->kpdbl_cfg->pwm_cfg)
3582 return -ENOMEM;
3583
3584 led->kpdbl_cfg->pwm_cfg->mode = led_mode;
3585 led->kpdbl_cfg->pwm_cfg->default_mode = led_mode;
3586 } else {
3587 return rc;
3588 }
3589
3590 rc = qpnp_get_config_pwm(led->kpdbl_cfg->pwm_cfg, led->pdev, node);
Fenglin Wu325e6de2017-03-16 13:40:26 +08003591 if (rc < 0) {
3592 if (led->kpdbl_cfg->pwm_cfg->pwm_dev)
3593 pwm_put(led->kpdbl_cfg->pwm_cfg->pwm_dev);
David Collins8885f792017-01-26 14:36:34 -08003594 return rc;
Fenglin Wu325e6de2017-03-16 13:40:26 +08003595 }
David Collins8885f792017-01-26 14:36:34 -08003596
3597 rc = of_property_read_u32(node, "qcom,row-id", &val);
3598 if (!rc)
3599 led->kpdbl_cfg->row_id = val;
3600 else
3601 return rc;
3602
3603 led->kpdbl_cfg->row_src_vbst =
3604 of_property_read_bool(node, "qcom,row-src-vbst");
3605
3606 led->kpdbl_cfg->row_src_en =
3607 of_property_read_bool(node, "qcom,row-src-en");
3608
3609 led->kpdbl_cfg->always_on =
3610 of_property_read_bool(node, "qcom,always-on");
3611
3612 return 0;
3613}
3614
3615static int qpnp_get_config_rgb(struct qpnp_led_data *led,
3616 struct device_node *node)
3617{
3618 int rc;
3619 u8 led_mode;
3620 const char *mode;
3621
3622 led->rgb_cfg = devm_kzalloc(&led->pdev->dev,
3623 sizeof(struct rgb_config_data), GFP_KERNEL);
3624 if (!led->rgb_cfg)
3625 return -ENOMEM;
3626
3627 if (led->id == QPNP_ID_RGB_RED)
3628 led->rgb_cfg->enable = RGB_LED_ENABLE_RED;
3629 else if (led->id == QPNP_ID_RGB_GREEN)
3630 led->rgb_cfg->enable = RGB_LED_ENABLE_GREEN;
3631 else if (led->id == QPNP_ID_RGB_BLUE)
3632 led->rgb_cfg->enable = RGB_LED_ENABLE_BLUE;
3633 else
3634 return -EINVAL;
3635
3636 rc = of_property_read_string(node, "qcom,mode", &mode);
3637 if (!rc) {
3638 led_mode = qpnp_led_get_mode(mode);
3639 if ((led_mode == MANUAL_MODE) || (led_mode == -EINVAL)) {
3640 dev_err(&led->pdev->dev, "Selected mode not supported for rgb\n");
3641 return -EINVAL;
3642 }
3643 led->rgb_cfg->pwm_cfg = devm_kzalloc(&led->pdev->dev,
3644 sizeof(struct pwm_config_data),
3645 GFP_KERNEL);
3646 if (!led->rgb_cfg->pwm_cfg) {
3647 dev_err(&led->pdev->dev,
3648 "Unable to allocate memory\n");
3649 return -ENOMEM;
3650 }
3651 led->rgb_cfg->pwm_cfg->mode = led_mode;
3652 led->rgb_cfg->pwm_cfg->default_mode = led_mode;
3653 } else {
3654 return rc;
3655 }
3656
3657 rc = qpnp_get_config_pwm(led->rgb_cfg->pwm_cfg, led->pdev, node);
Fenglin Wu325e6de2017-03-16 13:40:26 +08003658 if (rc < 0) {
3659 if (led->rgb_cfg->pwm_cfg->pwm_dev)
3660 pwm_put(led->rgb_cfg->pwm_cfg->pwm_dev);
David Collins8885f792017-01-26 14:36:34 -08003661 return rc;
Fenglin Wu325e6de2017-03-16 13:40:26 +08003662 }
David Collins8885f792017-01-26 14:36:34 -08003663
3664 return 0;
3665}
3666
3667static int qpnp_get_config_mpp(struct qpnp_led_data *led,
3668 struct device_node *node)
3669{
3670 int rc;
3671 u32 val;
3672 u8 led_mode;
3673 const char *mode;
3674
3675 led->mpp_cfg = devm_kzalloc(&led->pdev->dev,
3676 sizeof(struct mpp_config_data), GFP_KERNEL);
3677 if (!led->mpp_cfg)
3678 return -ENOMEM;
3679
3680 if (of_find_property(of_get_parent(node), "mpp-power-supply", NULL)) {
3681 led->mpp_cfg->mpp_reg =
3682 regulator_get(&led->pdev->dev,
3683 "mpp-power");
3684 if (IS_ERR(led->mpp_cfg->mpp_reg)) {
3685 rc = PTR_ERR(led->mpp_cfg->mpp_reg);
3686 dev_err(&led->pdev->dev,
3687 "MPP regulator get failed(%d)\n", rc);
3688 return rc;
3689 }
3690 }
3691
3692 if (led->mpp_cfg->mpp_reg) {
3693 rc = of_property_read_u32(of_get_parent(node),
3694 "qcom,mpp-power-max-voltage", &val);
3695 if (!rc)
3696 led->mpp_cfg->max_uV = val;
3697 else
3698 goto err_config_mpp;
3699
3700 rc = of_property_read_u32(of_get_parent(node),
3701 "qcom,mpp-power-min-voltage", &val);
3702 if (!rc)
3703 led->mpp_cfg->min_uV = val;
3704 else
3705 goto err_config_mpp;
3706 } else {
3707 rc = of_property_read_u32(of_get_parent(node),
3708 "qcom,mpp-power-max-voltage", &val);
3709 if (!rc)
3710 dev_warn(&led->pdev->dev, "No regulator specified\n");
3711
3712 rc = of_property_read_u32(of_get_parent(node),
3713 "qcom,mpp-power-min-voltage", &val);
3714 if (!rc)
3715 dev_warn(&led->pdev->dev, "No regulator specified\n");
3716 }
3717
3718 led->mpp_cfg->current_setting = LED_MPP_CURRENT_MIN;
3719 rc = of_property_read_u32(node, "qcom,current-setting", &val);
3720 if (!rc) {
3721 if (led->mpp_cfg->current_setting < LED_MPP_CURRENT_MIN)
3722 led->mpp_cfg->current_setting = LED_MPP_CURRENT_MIN;
3723 else if (led->mpp_cfg->current_setting > LED_MPP_CURRENT_MAX)
3724 led->mpp_cfg->current_setting = LED_MPP_CURRENT_MAX;
3725 else
3726 led->mpp_cfg->current_setting = (u8) val;
3727 } else if (rc != -EINVAL)
3728 goto err_config_mpp;
3729
3730 led->mpp_cfg->source_sel = LED_MPP_SOURCE_SEL_DEFAULT;
3731 rc = of_property_read_u32(node, "qcom,source-sel", &val);
3732 if (!rc)
3733 led->mpp_cfg->source_sel = (u8) val;
3734 else if (rc != -EINVAL)
3735 goto err_config_mpp;
3736
3737 led->mpp_cfg->mode_ctrl = LED_MPP_MODE_SINK;
3738 rc = of_property_read_u32(node, "qcom,mode-ctrl", &val);
3739 if (!rc)
3740 led->mpp_cfg->mode_ctrl = (u8) val;
3741 else if (rc != -EINVAL)
3742 goto err_config_mpp;
3743
3744 led->mpp_cfg->vin_ctrl = LED_MPP_VIN_CTRL_DEFAULT;
3745 rc = of_property_read_u32(node, "qcom,vin-ctrl", &val);
3746 if (!rc)
3747 led->mpp_cfg->vin_ctrl = (u8) val;
3748 else if (rc != -EINVAL)
3749 goto err_config_mpp;
3750
3751 led->mpp_cfg->min_brightness = 0;
3752 rc = of_property_read_u32(node, "qcom,min-brightness", &val);
3753 if (!rc)
3754 led->mpp_cfg->min_brightness = (u8) val;
3755 else if (rc != -EINVAL)
3756 goto err_config_mpp;
3757
3758 rc = of_property_read_string(node, "qcom,mode", &mode);
3759 if (!rc) {
3760 led_mode = qpnp_led_get_mode(mode);
3761 led->mpp_cfg->pwm_mode = led_mode;
3762 if (led_mode == MANUAL_MODE)
3763 return MANUAL_MODE;
3764 else if (led_mode == -EINVAL) {
3765 dev_err(&led->pdev->dev, "Selected mode not supported for mpp\n");
3766 rc = -EINVAL;
3767 goto err_config_mpp;
3768 }
3769 led->mpp_cfg->pwm_cfg = devm_kzalloc(&led->pdev->dev,
3770 sizeof(struct pwm_config_data),
3771 GFP_KERNEL);
3772 if (!led->mpp_cfg->pwm_cfg) {
3773 dev_err(&led->pdev->dev,
3774 "Unable to allocate memory\n");
3775 rc = -ENOMEM;
3776 goto err_config_mpp;
3777 }
3778 led->mpp_cfg->pwm_cfg->mode = led_mode;
3779 led->mpp_cfg->pwm_cfg->default_mode = led_mode;
3780 } else {
3781 return rc;
3782 }
3783
3784 rc = qpnp_get_config_pwm(led->mpp_cfg->pwm_cfg, led->pdev, node);
Fenglin Wu325e6de2017-03-16 13:40:26 +08003785 if (rc < 0) {
3786 if (led->mpp_cfg->pwm_cfg && led->mpp_cfg->pwm_cfg->pwm_dev)
3787 pwm_put(led->mpp_cfg->pwm_cfg->pwm_dev);
David Collins8885f792017-01-26 14:36:34 -08003788 goto err_config_mpp;
Fenglin Wu325e6de2017-03-16 13:40:26 +08003789 }
David Collins8885f792017-01-26 14:36:34 -08003790
3791 return 0;
3792
3793err_config_mpp:
3794 if (led->mpp_cfg->mpp_reg)
3795 regulator_put(led->mpp_cfg->mpp_reg);
3796 return rc;
3797}
3798
3799static int qpnp_get_config_gpio(struct qpnp_led_data *led,
3800 struct device_node *node)
3801{
3802 int rc;
3803 u32 val;
3804
3805 led->gpio_cfg = devm_kzalloc(&led->pdev->dev,
3806 sizeof(struct gpio_config_data), GFP_KERNEL);
3807 if (!led->gpio_cfg)
3808 return -ENOMEM;
3809
3810 led->gpio_cfg->source_sel = LED_GPIO_SOURCE_SEL_DEFAULT;
3811 rc = of_property_read_u32(node, "qcom,source-sel", &val);
3812 if (!rc)
3813 led->gpio_cfg->source_sel = (u8) val;
3814 else if (rc != -EINVAL)
3815 goto err_config_gpio;
3816
3817 led->gpio_cfg->mode_ctrl = LED_GPIO_MODE_OUTPUT;
3818 rc = of_property_read_u32(node, "qcom,mode-ctrl", &val);
3819 if (!rc)
3820 led->gpio_cfg->mode_ctrl = (u8) val;
3821 else if (rc != -EINVAL)
3822 goto err_config_gpio;
3823
3824 led->gpio_cfg->vin_ctrl = LED_GPIO_VIN_CTRL_DEFAULT;
3825 rc = of_property_read_u32(node, "qcom,vin-ctrl", &val);
3826 if (!rc)
3827 led->gpio_cfg->vin_ctrl = (u8) val;
3828 else if (rc != -EINVAL)
3829 goto err_config_gpio;
3830
3831 return 0;
3832
3833err_config_gpio:
3834 return rc;
3835}
3836
3837static int qpnp_leds_probe(struct platform_device *pdev)
3838{
3839 struct qpnp_led_data *led, *led_array;
3840 unsigned int base;
3841 struct device_node *node, *temp;
3842 int rc, i, num_leds = 0, parsed_leds = 0;
3843 const char *led_label;
3844 bool regulator_probe = false;
3845
3846 node = pdev->dev.of_node;
3847 if (node == NULL)
3848 return -ENODEV;
3849
3850 temp = NULL;
3851 while ((temp = of_get_next_child(node, temp)))
3852 num_leds++;
3853
3854 if (!num_leds)
3855 return -ECHILD;
3856
3857 led_array = devm_kcalloc(&pdev->dev, num_leds, sizeof(*led_array),
3858 GFP_KERNEL);
3859 if (!led_array)
3860 return -ENOMEM;
3861
3862 for_each_child_of_node(node, temp) {
3863 led = &led_array[parsed_leds];
3864 led->num_leds = num_leds;
3865 led->regmap = dev_get_regmap(pdev->dev.parent, NULL);
3866 if (!led->regmap) {
3867 dev_err(&pdev->dev, "Couldn't get parent's regmap\n");
3868 return -EINVAL;
3869 }
3870 led->pdev = pdev;
3871
3872 rc = of_property_read_u32(pdev->dev.of_node, "reg", &base);
3873 if (rc < 0) {
3874 dev_err(&pdev->dev,
3875 "Couldn't find reg in node = %s rc = %d\n",
3876 pdev->dev.of_node->full_name, rc);
3877 goto fail_id_check;
3878 }
3879 led->base = base;
3880
3881 rc = of_property_read_string(temp, "label", &led_label);
3882 if (rc < 0) {
3883 dev_err(&led->pdev->dev,
3884 "Failure reading label, rc = %d\n", rc);
3885 goto fail_id_check;
3886 }
3887
3888 rc = of_property_read_string(temp, "linux,name",
3889 &led->cdev.name);
3890 if (rc < 0) {
3891 dev_err(&led->pdev->dev,
3892 "Failure reading led name, rc = %d\n", rc);
3893 goto fail_id_check;
3894 }
3895
3896 rc = of_property_read_u32(temp, "qcom,max-current",
3897 &led->max_current);
3898 if (rc < 0) {
3899 dev_err(&led->pdev->dev,
3900 "Failure reading max_current, rc = %d\n", rc);
3901 goto fail_id_check;
3902 }
3903
3904 rc = of_property_read_u32(temp, "qcom,id", &led->id);
3905 if (rc < 0) {
3906 dev_err(&led->pdev->dev,
3907 "Failure reading led id, rc = %d\n", rc);
3908 goto fail_id_check;
3909 }
3910
3911 rc = qpnp_get_common_configs(led, temp);
3912 if (rc) {
3913 dev_err(&led->pdev->dev, "Failure reading common led configuration, rc = %d\n",
3914 rc);
3915 goto fail_id_check;
3916 }
3917
3918 led->cdev.brightness_set = qpnp_led_set;
3919 led->cdev.brightness_get = qpnp_led_get;
3920
3921 if (strcmp(led_label, "wled") == 0) {
3922 rc = qpnp_get_config_wled(led, temp);
3923 if (rc < 0) {
3924 dev_err(&led->pdev->dev,
3925 "Unable to read wled config data\n");
3926 goto fail_id_check;
3927 }
3928 } else if (strcmp(led_label, "flash") == 0) {
3929 if (!of_find_property(node, "flash-boost-supply", NULL))
3930 regulator_probe = true;
3931 rc = qpnp_get_config_flash(led, temp, &regulator_probe);
3932 if (rc < 0) {
3933 dev_err(&led->pdev->dev,
3934 "Unable to read flash config data\n");
3935 goto fail_id_check;
3936 }
3937 } else if (strcmp(led_label, "rgb") == 0) {
3938 rc = qpnp_get_config_rgb(led, temp);
3939 if (rc < 0) {
3940 dev_err(&led->pdev->dev,
3941 "Unable to read rgb config data\n");
3942 goto fail_id_check;
3943 }
3944 } else if (strcmp(led_label, "mpp") == 0) {
3945 rc = qpnp_get_config_mpp(led, temp);
3946 if (rc < 0) {
3947 dev_err(&led->pdev->dev,
3948 "Unable to read mpp config data\n");
3949 goto fail_id_check;
3950 }
3951 } else if (strcmp(led_label, "gpio") == 0) {
3952 rc = qpnp_get_config_gpio(led, temp);
3953 if (rc < 0) {
3954 dev_err(&led->pdev->dev,
3955 "Unable to read gpio config data\n");
3956 goto fail_id_check;
3957 }
3958 } else if (strcmp(led_label, "kpdbl") == 0) {
3959 bitmap_zero(kpdbl_leds_in_use, NUM_KPDBL_LEDS);
3960 is_kpdbl_master_turn_on = false;
3961 rc = qpnp_get_config_kpdbl(led, temp);
3962 if (rc < 0) {
3963 dev_err(&led->pdev->dev,
3964 "Unable to read kpdbl config data\n");
3965 goto fail_id_check;
3966 }
3967 } else {
3968 dev_err(&led->pdev->dev, "No LED matching label\n");
3969 rc = -EINVAL;
3970 goto fail_id_check;
3971 }
3972
3973 if (led->id != QPNP_ID_FLASH1_LED0 &&
3974 led->id != QPNP_ID_FLASH1_LED1)
3975 mutex_init(&led->lock);
3976
3977 led->in_order_command_processing = of_property_read_bool
3978 (temp, "qcom,in-order-command-processing");
3979
3980 if (led->in_order_command_processing) {
3981 /*
3982 * the command order from user space needs to be
3983 * maintained use ordered workqueue to prevent
3984 * concurrency
3985 */
3986 led->workqueue = alloc_ordered_workqueue
3987 ("led_workqueue", 0);
3988 if (!led->workqueue) {
3989 rc = -ENOMEM;
3990 goto fail_id_check;
3991 }
3992 }
3993
3994 INIT_WORK(&led->work, qpnp_led_work);
3995
3996 rc = qpnp_led_initialize(led);
3997 if (rc < 0)
3998 goto fail_id_check;
3999
4000 rc = qpnp_led_set_max_brightness(led);
4001 if (rc < 0)
4002 goto fail_id_check;
4003
4004 rc = led_classdev_register(&pdev->dev, &led->cdev);
4005 if (rc) {
4006 dev_err(&pdev->dev,
4007 "unable to register led %d,rc=%d\n",
4008 led->id, rc);
4009 goto fail_id_check;
4010 }
4011
4012 if (led->id == QPNP_ID_FLASH1_LED0 ||
4013 led->id == QPNP_ID_FLASH1_LED1) {
4014 rc = sysfs_create_group(&led->cdev.dev->kobj,
4015 &led_attr_group);
4016 if (rc)
4017 goto fail_id_check;
4018
4019 }
4020
4021 if (led->id == QPNP_ID_LED_MPP) {
4022 if (!led->mpp_cfg->pwm_cfg)
4023 break;
4024 if (led->mpp_cfg->pwm_cfg->mode == PWM_MODE) {
4025 rc = sysfs_create_group(&led->cdev.dev->kobj,
4026 &pwm_attr_group);
4027 if (rc)
4028 goto fail_id_check;
4029 }
4030 if (led->mpp_cfg->pwm_cfg->use_blink) {
4031 rc = sysfs_create_group(&led->cdev.dev->kobj,
4032 &blink_attr_group);
4033 if (rc)
4034 goto fail_id_check;
4035
4036 rc = sysfs_create_group(&led->cdev.dev->kobj,
4037 &lpg_attr_group);
4038 if (rc)
4039 goto fail_id_check;
4040 } else if (led->mpp_cfg->pwm_cfg->mode == LPG_MODE) {
4041 rc = sysfs_create_group(&led->cdev.dev->kobj,
4042 &lpg_attr_group);
4043 if (rc)
4044 goto fail_id_check;
4045 }
4046 } else if ((led->id == QPNP_ID_RGB_RED) ||
4047 (led->id == QPNP_ID_RGB_GREEN) ||
4048 (led->id == QPNP_ID_RGB_BLUE)) {
4049 if (led->rgb_cfg->pwm_cfg->mode == PWM_MODE) {
4050 rc = sysfs_create_group(&led->cdev.dev->kobj,
4051 &pwm_attr_group);
4052 if (rc)
4053 goto fail_id_check;
4054 }
4055 if (led->rgb_cfg->pwm_cfg->use_blink) {
4056 rc = sysfs_create_group(&led->cdev.dev->kobj,
4057 &blink_attr_group);
4058 if (rc)
4059 goto fail_id_check;
4060
4061 rc = sysfs_create_group(&led->cdev.dev->kobj,
4062 &lpg_attr_group);
4063 if (rc)
4064 goto fail_id_check;
4065 } else if (led->rgb_cfg->pwm_cfg->mode == LPG_MODE) {
4066 rc = sysfs_create_group(&led->cdev.dev->kobj,
4067 &lpg_attr_group);
4068 if (rc)
4069 goto fail_id_check;
4070 }
4071 } else if (led->id == QPNP_ID_KPDBL) {
4072 if (led->kpdbl_cfg->pwm_cfg->mode == PWM_MODE) {
4073 rc = sysfs_create_group(&led->cdev.dev->kobj,
4074 &pwm_attr_group);
4075 if (rc)
4076 goto fail_id_check;
4077 }
4078 if (led->kpdbl_cfg->pwm_cfg->use_blink) {
4079 rc = sysfs_create_group(&led->cdev.dev->kobj,
4080 &blink_attr_group);
4081 if (rc)
4082 goto fail_id_check;
4083
4084 rc = sysfs_create_group(&led->cdev.dev->kobj,
4085 &lpg_attr_group);
4086 if (rc)
4087 goto fail_id_check;
4088 } else if (led->kpdbl_cfg->pwm_cfg->mode == LPG_MODE) {
4089 rc = sysfs_create_group(&led->cdev.dev->kobj,
4090 &lpg_attr_group);
4091 if (rc)
4092 goto fail_id_check;
4093 }
4094 }
4095
4096 /* configure default state */
4097 if (led->default_on) {
4098 led->cdev.brightness = led->cdev.max_brightness;
4099 __qpnp_led_work(led, led->cdev.brightness);
4100 if (led->turn_off_delay_ms > 0)
4101 qpnp_led_turn_off(led);
4102 } else
4103 led->cdev.brightness = LED_OFF;
4104
4105 parsed_leds++;
4106 }
4107 dev_set_drvdata(&pdev->dev, led_array);
4108 return 0;
4109
4110fail_id_check:
4111 for (i = 0; i < parsed_leds; i++) {
4112 if (led_array[i].id != QPNP_ID_FLASH1_LED0 &&
4113 led_array[i].id != QPNP_ID_FLASH1_LED1)
4114 mutex_destroy(&led_array[i].lock);
4115 if (led_array[i].in_order_command_processing)
4116 destroy_workqueue(led_array[i].workqueue);
4117 led_classdev_unregister(&led_array[i].cdev);
4118 }
4119
4120 return rc;
4121}
4122
4123static int qpnp_leds_remove(struct platform_device *pdev)
4124{
4125 struct qpnp_led_data *led_array = dev_get_drvdata(&pdev->dev);
4126 int i, parsed_leds = led_array->num_leds;
4127
4128 for (i = 0; i < parsed_leds; i++) {
4129 cancel_work_sync(&led_array[i].work);
4130 if (led_array[i].id != QPNP_ID_FLASH1_LED0 &&
4131 led_array[i].id != QPNP_ID_FLASH1_LED1)
4132 mutex_destroy(&led_array[i].lock);
4133
4134 if (led_array[i].in_order_command_processing)
4135 destroy_workqueue(led_array[i].workqueue);
4136 led_classdev_unregister(&led_array[i].cdev);
4137 switch (led_array[i].id) {
4138 case QPNP_ID_WLED:
4139 break;
4140 case QPNP_ID_FLASH1_LED0:
4141 case QPNP_ID_FLASH1_LED1:
4142 if (led_array[i].flash_cfg->flash_reg_get)
4143 regulator_put(
4144 led_array[i].flash_cfg->flash_boost_reg);
4145 if (led_array[i].flash_cfg->torch_enable)
4146 if (!led_array[i].flash_cfg->no_smbb_support)
4147 regulator_put(led_array[i].
4148 flash_cfg->torch_boost_reg);
4149 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4150 &led_attr_group);
4151 break;
4152 case QPNP_ID_RGB_RED:
4153 case QPNP_ID_RGB_GREEN:
4154 case QPNP_ID_RGB_BLUE:
4155 if (led_array[i].rgb_cfg->pwm_cfg->mode == PWM_MODE)
4156 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4157 &pwm_attr_group);
4158 if (led_array[i].rgb_cfg->pwm_cfg->use_blink) {
4159 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4160 &blink_attr_group);
4161 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4162 &lpg_attr_group);
4163 } else if (led_array[i].rgb_cfg->pwm_cfg->mode
4164 == LPG_MODE)
4165 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4166 &lpg_attr_group);
4167 break;
4168 case QPNP_ID_LED_MPP:
4169 if (!led_array[i].mpp_cfg->pwm_cfg)
4170 break;
4171 if (led_array[i].mpp_cfg->pwm_cfg->mode == PWM_MODE)
4172 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4173 &pwm_attr_group);
4174 if (led_array[i].mpp_cfg->pwm_cfg->use_blink) {
4175 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4176 &blink_attr_group);
4177 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4178 &lpg_attr_group);
4179 } else if (led_array[i].mpp_cfg->pwm_cfg->mode
4180 == LPG_MODE)
4181 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4182 &lpg_attr_group);
4183 if (led_array[i].mpp_cfg->mpp_reg)
4184 regulator_put(led_array[i].mpp_cfg->mpp_reg);
4185 break;
4186 case QPNP_ID_KPDBL:
4187 if (led_array[i].kpdbl_cfg->pwm_cfg->mode == PWM_MODE)
4188 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4189 &pwm_attr_group);
4190 if (led_array[i].kpdbl_cfg->pwm_cfg->use_blink) {
4191 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4192 &blink_attr_group);
4193 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4194 &lpg_attr_group);
4195 } else if (led_array[i].kpdbl_cfg->pwm_cfg->mode
4196 == LPG_MODE)
4197 sysfs_remove_group(&led_array[i].cdev.dev->kobj,
4198 &lpg_attr_group);
4199 break;
4200 default:
4201 dev_err(&led_array->pdev->dev,
4202 "Invalid LED(%d)\n",
4203 led_array[i].id);
4204 return -EINVAL;
4205 }
4206 }
4207
4208 return 0;
4209}
4210
4211#ifdef CONFIG_OF
4212static const struct of_device_id spmi_match_table[] = {
4213 { .compatible = "qcom,leds-qpnp",},
4214 { },
4215};
4216#else
4217#define spmi_match_table NULL
4218#endif
4219
4220static struct platform_driver qpnp_leds_driver = {
4221 .driver = {
4222 .name = "qcom,leds-qpnp",
4223 .of_match_table = spmi_match_table,
4224 },
4225 .probe = qpnp_leds_probe,
4226 .remove = qpnp_leds_remove,
4227};
4228
4229static int __init qpnp_led_init(void)
4230{
4231 return platform_driver_register(&qpnp_leds_driver);
4232}
4233module_init(qpnp_led_init);
4234
4235static void __exit qpnp_led_exit(void)
4236{
4237 platform_driver_unregister(&qpnp_leds_driver);
4238}
4239module_exit(qpnp_led_exit);
4240
4241MODULE_DESCRIPTION("QPNP LEDs driver");
4242MODULE_LICENSE("GPL v2");
4243MODULE_ALIAS("leds:leds-qpnp");
4244