blob: a342197f99914540dec6dc6552c5c88c0da010aa [file] [log] [blame]
Aparna Mallavarapu083766b2014-07-21 21:04:48 +05301 /* Copyright (c) 2014, The Linux Foundation. All rights reserved.
2
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation, Inc. nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <stdio.h>
30#include <err.h>
31#include <qpnp_wled.h>
32
33static int fls(uint16_t n)
34{
35 int i = 0;
36 for (; n; n >>= 1, i++);
37 return i;
38}
39
40static struct qpnp_wled *gwled;
41
42static int qpnp_wled_sec_access(struct qpnp_wled *wled, uint16_t base_addr)
43{
44 int rc;
45 uint8_t reg = QPNP_WLED_SEC_UNLOCK;
46
47 pm8x41_wled_reg_write(QPNP_WLED_SEC_ACCESS_REG(base_addr), reg);
48
49 return 0;
50}
51
52/* set wled to a level of brightness */
53static int qpnp_wled_set_level(struct qpnp_wled *wled, int level)
54{
55 int i, rc;
56 uint8_t reg;
57
58 /* set brightness registers */
59 for (i = 0; i < wled->num_strings; i++) {
60 reg = level & QPNP_WLED_BRIGHT_LSB_MASK;
61 pm8x41_wled_reg_write(QPNP_WLED_BRIGHT_LSB_REG(wled->sink_base,
62 wled->strings[i]), reg);
63
64 reg = level >> QPNP_WLED_BRIGHT_MSB_SHIFT;
65 reg = reg & QPNP_WLED_BRIGHT_MSB_MASK;
66 pm8x41_wled_reg_write(QPNP_WLED_BRIGHT_MSB_REG(wled->sink_base,
67 wled->strings[i]), reg);
68 }
69
70 /* sync */
71 reg = QPNP_WLED_SYNC;
72 pm8x41_wled_reg_write(QPNP_WLED_SYNC_REG(wled->sink_base), reg);
73
74 reg = QPNP_WLED_SYNC_RESET;
75 pm8x41_wled_reg_write(QPNP_WLED_SYNC_REG(wled->sink_base), reg);
76
77 return 0;
78}
79
80static int qpnp_wled_enable(struct qpnp_wled *wled,
81 uint16_t base_addr, bool state)
82{
83 uint8_t reg;
84
85 reg = pm8x41_wled_reg_read(
86 QPNP_WLED_MODULE_EN_REG(base_addr));
87 if (reg < 0)
88 return reg;
89 reg &= QPNP_WLED_MODULE_EN_MASK;
90 reg |= (state << QPNP_WLED_MODULE_EN_SHIFT);
91 pm8x41_wled_reg_write(QPNP_WLED_MODULE_EN_REG(base_addr), reg);
92
93 return 0;
94}
95
96int qpnp_ibb_enable(bool state)
97{
98 int rc = 0;
99 uint8_t reg;
100
101 if (!gwled) {
102 dprintf(CRITICAL, "%s: wled is not initialized yet\n", __func__);
103 return ERROR;
104 }
105
106 /* enable lab */
107 if (gwled->ibb_bias_active) {
108 rc = qpnp_wled_enable(gwled, gwled->lab_base, state);
109 if (rc < 0)
110 return rc;
111 udelay(QPNP_WLED_LAB_START_DLY_US + 1);
112 } else {
113 reg = pm8x41_wled_reg_read(QPNP_WLED_LAB_IBB_RDY_REG(gwled->lab_base));
114 if (reg < 0)
115 return reg;
116
117 reg &= QPNP_WLED_MODULE_EN_MASK;
118 reg |= (state << QPNP_WLED_MODULE_EN_SHIFT);
119 pm8x41_wled_reg_write(QPNP_WLED_LAB_IBB_RDY_REG(gwled->lab_base), reg);
120 }
121
122 rc = qpnp_wled_enable(gwled, gwled->ibb_base, state);
123
124 return rc;
125}
126
127/* enable / disable wled brightness */
128void qpnp_wled_enable_backlight(int enable)
129{
130 int level, rc;
131
132 if (!gwled) {
133 dprintf(CRITICAL, "%s: wled is not initialized yet\n", __func__);
134 return ERROR;
135 }
136
137 if (enable) {
138 rc = qpnp_wled_set_level(gwled, QPNP_WLED_MAX_BR_LEVEL);
139 if (rc) {
140 dprintf(CRITICAL,"wled set level failed\n");
141 return;
142 }
143 }
144 rc = qpnp_wled_enable(gwled, gwled->ctrl_base, enable);
145
146 if (rc) {
147 dprintf(CRITICAL,"wled %sable failed\n",
148 enable ? "en" : "dis");
149 return;
150 }
151
152}
153
154static int qpnp_wled_set_display_type(struct qpnp_wled *wled, uint16_t base_addr)
155{
156 int rc;
157 uint8_t reg = 0;
158
159 /* display type */
160 reg = pm8x41_wled_reg_read(QPNP_WLED_DISP_SEL_REG(base_addr));
161 if (reg < 0)
162 return reg;
163
164 reg &= QPNP_WLED_DISP_SEL_MASK;
165 reg |= (wled->disp_type_amoled << QPNP_WLED_DISP_SEL_SHIFT);
166 pm8x41_wled_reg_write(QPNP_WLED_DISP_SEL_REG(base_addr), reg);
167
168 return 0;
169}
170
171static int qpnp_wled_module_ready(struct qpnp_wled *wled, uint16_t base_addr, bool state)
172{
173 int rc;
174 uint8_t reg;
175
176 reg = pm8x41_wled_reg_read(
177 QPNP_WLED_MODULE_RDY_REG(base_addr));
178 if (reg < 0)
179 return reg;
180 reg &= QPNP_WLED_MODULE_RDY_MASK;
181 reg |= (state << QPNP_WLED_MODULE_RDY_SHIFT);
182 pm8x41_wled_reg_write(QPNP_WLED_MODULE_RDY_REG(base_addr), reg);
183
184 return 0;
185}
186
187/* Configure WLED registers */
188static int qpnp_wled_config(struct qpnp_wled *wled)
189{
190 int rc, i, temp;
191 uint8_t reg = 0;
192
193 /* Configure display type */
194 rc = qpnp_wled_set_display_type(wled, wled->ctrl_base);
195 if (rc < 0)
196 return rc;
197
198 /* Configure the FEEDBACK OUTPUT register */
199 reg = pm8x41_wled_reg_read(
200 QPNP_WLED_FDBK_OP_REG(wled->ctrl_base));
201 if (reg < 0)
202 return reg;
203 reg &= QPNP_WLED_FDBK_OP_MASK;
204 reg |= wled->fdbk_op;
205 pm8x41_wled_reg_write(QPNP_WLED_FDBK_OP_REG(wled->ctrl_base), reg);
206
207 /* Configure the VREF register */
208 if (wled->vref_mv < QPNP_WLED_VREF_MIN_MV)
209 wled->vref_mv = QPNP_WLED_VREF_MIN_MV;
210 else if (wled->vref_mv > QPNP_WLED_VREF_MAX_MV)
211 wled->vref_mv = QPNP_WLED_VREF_MAX_MV;
212
213 reg = pm8x41_wled_reg_read(
214 QPNP_WLED_VREF_REG(wled->ctrl_base));
215 if (reg < 0)
216 return reg;
217 reg &= QPNP_WLED_VREF_MASK;
218 temp = wled->vref_mv - QPNP_WLED_VREF_MIN_MV;
219 reg |= (temp / QPNP_WLED_VREF_STEP_MV);
220 pm8x41_wled_reg_write(QPNP_WLED_VREF_REG(wled->ctrl_base), reg);
221
222 /* Configure the ILIM register */
223 if (wled->ilim_ma < QPNP_WLED_ILIM_MIN_MA)
224 wled->ilim_ma = QPNP_WLED_ILIM_MIN_MA;
225 else if (wled->ilim_ma > QPNP_WLED_ILIM_MAX_MA)
226 wled->ilim_ma = QPNP_WLED_ILIM_MAX_MA;
227
228 reg = pm8x41_wled_reg_read(
229 QPNP_WLED_ILIM_REG(wled->ctrl_base));
230 if (reg < 0)
231 return reg;
232 reg &= QPNP_WLED_ILIM_MASK;
233 reg |= (wled->ilim_ma / QPNP_WLED_ILIM_STEP_MA);
234 pm8x41_wled_reg_write(QPNP_WLED_ILIM_REG(wled->ctrl_base), reg);
235
236 /* Configure the MAX BOOST DUTY register */
237 if (wled->boost_duty_ns < QPNP_WLED_BOOST_DUTY_MIN_NS)
238 wled->boost_duty_ns = QPNP_WLED_BOOST_DUTY_MIN_NS;
239 else if (wled->boost_duty_ns > QPNP_WLED_BOOST_DUTY_MAX_NS)
240 wled->boost_duty_ns = QPNP_WLED_BOOST_DUTY_MAX_NS;
241
242 reg = pm8x41_wled_reg_read(
243 QPNP_WLED_BOOST_DUTY_REG(wled->ctrl_base));
244 if (reg < 0)
245 return reg;
246 reg &= QPNP_WLED_BOOST_DUTY_MASK;
247 reg |= (wled->boost_duty_ns / QPNP_WLED_BOOST_DUTY_STEP_NS);
248 pm8x41_wled_reg_write(QPNP_WLED_BOOST_DUTY_REG(wled->ctrl_base), reg);
249
250 /* Configure the SWITCHING FREQ register */
251 if (wled->switch_freq_khz == QPNP_WLED_SWITCH_FREQ_1600_KHZ)
252 temp = QPNP_WLED_SWITCH_FREQ_1600_KHZ_CODE;
253 else
254 temp = QPNP_WLED_SWITCH_FREQ_800_KHZ_CODE;
255
256 reg = pm8x41_wled_reg_read(
257 QPNP_WLED_SWITCH_FREQ_REG(wled->ctrl_base));
258 if (reg < 0)
259 return reg;
260 reg &= QPNP_WLED_SWITCH_FREQ_MASK;
261 reg |= temp;
262 pm8x41_wled_reg_write(QPNP_WLED_SWITCH_FREQ_REG(wled->ctrl_base), reg);
263
264 /* Configure the OVP register */
265 if (wled->ovp_mv <= QPNP_WLED_OVP_17800_MV) {
266 wled->ovp_mv = QPNP_WLED_OVP_17800_MV;
267 temp = 3;
268 } else if (wled->ovp_mv <= QPNP_WLED_OVP_19400_MV) {
269 wled->ovp_mv = QPNP_WLED_OVP_19400_MV;
270 temp = 2;
271 } else if (wled->ovp_mv <= QPNP_WLED_OVP_29500_MV) {
272 wled->ovp_mv = QPNP_WLED_OVP_29500_MV;
273 temp = 1;
274 } else {
275 wled->ovp_mv = QPNP_WLED_OVP_31000_MV;
276 temp = 0;
277 }
278
279 reg = pm8x41_wled_reg_read(
280 QPNP_WLED_OVP_REG(wled->ctrl_base));
281 if (reg < 0)
282 return reg;
283 reg &= QPNP_WLED_OVP_MASK;
284 reg |= temp;
285 pm8x41_wled_reg_write(QPNP_WLED_OVP_REG(wled->ctrl_base), reg);
286
287 /* Configure the MODULATION register */
288 if (wled->mod_freq_khz <= QPNP_WLED_MOD_FREQ_1200_KHZ) {
289 wled->mod_freq_khz = QPNP_WLED_MOD_FREQ_1200_KHZ;
290 temp = 3;
291 } else if (wled->mod_freq_khz <= QPNP_WLED_MOD_FREQ_2400_KHZ) {
292 wled->mod_freq_khz = QPNP_WLED_MOD_FREQ_2400_KHZ;
293 temp = 2;
294 } else if (wled->mod_freq_khz <= QPNP_WLED_MOD_FREQ_9600_KHZ) {
295 wled->mod_freq_khz = QPNP_WLED_MOD_FREQ_9600_KHZ;
296 temp = 1;
297 } else {
298 wled->mod_freq_khz = QPNP_WLED_MOD_FREQ_19200_KHZ;
299 temp = 0;
300 }
301 reg = pm8x41_wled_reg_read(QPNP_WLED_MOD_REG(wled->sink_base));
302 if (reg < 0)
303 return reg;
304
305 reg &= QPNP_WLED_MOD_FREQ_MASK;
306 reg |= (temp << QPNP_WLED_MOD_FREQ_SHIFT);
307
308 reg &= QPNP_WLED_PHASE_STAG_MASK;
309 reg |= (wled->en_phase_stag << QPNP_WLED_PHASE_STAG_SHIFT);
310
311 reg &= QPNP_WLED_DIM_RES_MASK;
312 reg |= (wled->en_9b_dim_res << QPNP_WLED_DIM_RES_SHIFT);
313
314 if (wled->dim_mode == QPNP_WLED_DIM_HYBRID) {
315 reg &= QPNP_WLED_DIM_HYB_MASK;
316 reg |= (1 << QPNP_WLED_DIM_HYB_SHIFT);
317 } else {
318 reg &= QPNP_WLED_DIM_HYB_MASK;
319 reg |= (0 << QPNP_WLED_DIM_HYB_SHIFT);
320 reg &= QPNP_WLED_DIM_ANA_MASK;
321 reg |= wled->dim_mode;
322 }
323
324 pm8x41_wled_reg_write(QPNP_WLED_MOD_REG(wled->sink_base), reg);
325
326 /* Configure the HYBRID THRESHOLD register */
327 if (wled->hyb_thres < QPNP_WLED_HYB_THRES_MIN)
328 wled->hyb_thres = QPNP_WLED_HYB_THRES_MIN;
329 else if (wled->hyb_thres > QPNP_WLED_HYB_THRES_MAX)
330 wled->hyb_thres = QPNP_WLED_HYB_THRES_MAX;
331
332 reg = pm8x41_wled_reg_read(
333 QPNP_WLED_HYB_THRES_REG(wled->sink_base));
334 if (reg < 0)
335 return reg;
336
337 reg &= QPNP_WLED_HYB_THRES_MASK;
338 temp = fls(wled->hyb_thres / QPNP_WLED_HYB_THRES_MIN) - 1;
339 reg |= temp;
340 pm8x41_wled_reg_write(QPNP_WLED_HYB_THRES_REG(wled->sink_base), reg);
341
342 for (i = 0; i < wled->num_strings; i++) {
343 if (wled->strings[i] >= QPNP_WLED_MAX_STRINGS) {
344 dprintf(CRITICAL,"Invalid string number\n");
345 return ERR_NOT_VALID;
346 }
347
348 /* MODULATOR */
349 reg = pm8x41_wled_reg_read(
350 QPNP_WLED_MOD_EN_REG(wled->sink_base,
351 wled->strings[i]));
352 if (reg < 0)
353 return reg;
354 reg &= QPNP_WLED_MOD_EN_MASK;
355 reg |= (QPNP_WLED_MOD_EN << QPNP_WLED_MOD_EN_SHFT);
356 pm8x41_wled_reg_write(QPNP_WLED_MOD_EN_REG(wled->sink_base,
357 wled->strings[i]), reg);
358
359 /* SYNC DELAY */
360 if (wled->sync_dly_us < QPNP_WLED_SYNC_DLY_MIN_US)
361 wled->sync_dly_us = QPNP_WLED_SYNC_DLY_MIN_US;
362 else if (wled->sync_dly_us > QPNP_WLED_SYNC_DLY_MAX_US)
363 wled->sync_dly_us = QPNP_WLED_SYNC_DLY_MAX_US;
364
365 reg = pm8x41_wled_reg_read(
366 QPNP_WLED_SYNC_DLY_REG(wled->sink_base,
367 wled->strings[i]));
368 if (reg < 0)
369 return reg;
370 reg &= QPNP_WLED_SYNC_DLY_MASK;
371 temp = wled->sync_dly_us / QPNP_WLED_SYNC_DLY_STEP_US;
372 reg |= temp;
373 pm8x41_wled_reg_write(QPNP_WLED_SYNC_DLY_REG(wled->sink_base,
374 wled->strings[i]), reg);
375
376 /* FULL SCALE CURRENT */
377 if (wled->fs_curr_ua < QPNP_WLED_FS_CURR_MIN_UA)
378 wled->fs_curr_ua = QPNP_WLED_FS_CURR_MIN_UA;
379 else if (wled->fs_curr_ua > QPNP_WLED_FS_CURR_MAX_UA)
380 wled->fs_curr_ua = QPNP_WLED_FS_CURR_MAX_UA;
381
382 reg = pm8x41_wled_reg_read(
383 QPNP_WLED_FS_CURR_REG(wled->sink_base,
384 wled->strings[i]));
385 if (reg < 0)
386 return reg;
387 reg &= QPNP_WLED_FS_CURR_MASK;
388 temp = wled->fs_curr_ua / QPNP_WLED_FS_CURR_STEP_UA;
389 reg |= temp;
390 pm8x41_wled_reg_write(QPNP_WLED_FS_CURR_REG(wled->sink_base,
391 wled->strings[i]), reg);
392
393 /* CABC */
394 reg = pm8x41_wled_reg_read(
395 QPNP_WLED_CABC_REG(wled->sink_base,
396 wled->strings[i]));
397 if (reg < 0)
398 return reg;
399 reg &= QPNP_WLED_CABC_MASK;
400 reg |= (wled->en_cabc << QPNP_WLED_CABC_SHIFT);
401 pm8x41_wled_reg_write(QPNP_WLED_CABC_REG(wled->sink_base,
402 wled->strings[i]), reg);
403
404 /* Enable CURRENT SINK */
405 reg = pm8x41_wled_reg_read(
406 QPNP_WLED_CURR_SINK_REG(wled->sink_base));
407 if (reg < 0)
408 return reg;
409 temp = wled->strings[i] + QPNP_WLED_CURR_SINK_SHIFT;
410 reg |= (1 << temp);
411 pm8x41_wled_reg_write(QPNP_WLED_CURR_SINK_REG(wled->sink_base), reg);
412 }
413
414 /* LAB fast precharge */
415 reg = pm8x41_wled_reg_read(
416 QPNP_WLED_LAB_FAST_PC_REG(wled->lab_base));
417 if (reg < 0)
418 return reg;
419 reg &= QPNP_WLED_LAB_FAST_PC_MASK;
420 reg |= (wled->lab_fast_precharge << QPNP_WLED_LAB_FAST_PC_SHIFT);
421 pm8x41_wled_reg_write(QPNP_WLED_LAB_FAST_PC_REG(wled->lab_base), reg);
422
423 /* Configure lab display type */
424 rc = qpnp_wled_set_display_type(wled, wled->lab_base);
425 if (rc < 0)
426 return rc;
427
428 /* make LAB module ready */
429 rc = qpnp_wled_module_ready(wled, wled->lab_base, true);
430 if (rc < 0)
431 return rc;
432
433 /* IBB active bias */
434 if (wled->ibb_pwrup_dly_ms < QPNP_WLED_IBB_PWRUP_DLY_MIN_MS)
435 wled->ibb_pwrup_dly_ms = QPNP_WLED_IBB_PWRUP_DLY_MIN_MS;
436 else if (wled->ibb_pwrup_dly_ms > QPNP_WLED_IBB_PWRUP_DLY_MAX_MS)
437 wled->ibb_pwrup_dly_ms = QPNP_WLED_IBB_PWRUP_DLY_MAX_MS;
438
439 reg = pm8x41_wled_reg_read(
440 QPNP_WLED_IBB_BIAS_REG(wled->ibb_base));
441 if (reg < 0)
442 return reg;
443
444 reg &= QPNP_WLED_IBB_BIAS_MASK;
445 reg |= (!wled->ibb_bias_active << QPNP_WLED_IBB_BIAS_SHIFT);
446
447 temp = fls(wled->ibb_pwrup_dly_ms) - 1;
448 reg &= QPNP_WLED_IBB_PWRUP_DLY_MASK;
449 reg |= (temp << QPNP_WLED_IBB_PWRUP_DLY_SHIFT);
450
451 rc = qpnp_wled_sec_access(wled, wled->ibb_base);
452 if (rc)
453 return rc;
454
455 pm8x41_wled_reg_write(QPNP_WLED_IBB_BIAS_REG(wled->ibb_base), reg);
456
457 /* Configure ibb display type */
458 rc = qpnp_wled_set_display_type(wled, wled->ibb_base);
459 if (rc < 0)
460 return rc;
461
462 /* make IBB module ready */
463 rc = qpnp_wled_module_ready(wled, wled->ibb_base, true);
464 if (rc < 0)
465 return rc;
466
467 return 0;
468}
469
470/* Setup wled default parameters */
471static int qpnp_wled_setup(struct qpnp_wled *wled)
472{
473 int rc, i;
474
475 wled->sink_base = QPNP_WLED_SINK_BASE;
476 wled->ctrl_base = QPNP_WLED_CTRL_BASE;
477 wled->ibb_base = QPNP_WLED_IBB_BASE;
478 wled->lab_base = QPNP_WLED_LAB_BASE;
479 wled->fdbk_op = QPNP_WLED_FDBK_AUTO;
480 wled->vref_mv = QPNP_WLED_DFLT_VREF_MV;
481 wled->switch_freq_khz = QPNP_WLED_SWITCH_FREQ_800_KHZ;
482 wled->ovp_mv = QPNP_WLED_OVP_29500_MV;
483 wled->ilim_ma = QPNP_WLED_DFLT_ILIM_MA;
484 wled->boost_duty_ns = QPNP_WLED_BOOST_DUTY_MIN_NS;
485 wled->mod_freq_khz = QPNP_WLED_MOD_FREQ_19200_KHZ;
486 wled->dim_mode = QPNP_WLED_DIM_HYBRID;
487 wled->dim_shape = QPNP_WLED_DIM_SHAPE_LINEAR;
488
489 if (wled->dim_mode == QPNP_WLED_DIM_HYBRID) {
490 wled->hyb_thres = QPNP_WLED_DFLT_HYB_THRES;
491 }
492
493 wled->sync_dly_us = 800;
494 wled->fs_curr_ua = 16000;
495 wled->en_9b_dim_res = 0;
496 wled->en_phase_stag = true;
497 wled->en_cabc = 0;
498
499 wled->num_strings = QPNP_WLED_MAX_STRINGS;
500 for (i = 0; i < wled->num_strings; i++)
501 wled->strings[i] = i;
502
503 wled->ibb_bias_active = false;
504 wled->ibb_pwrup_dly_ms = 8;
505 wled->lab_fast_precharge = false;
506 wled->disp_type_amoled = false;
507
508 return 0;
509}
510
511int qpnp_wled_init()
512{
513 int rc, i;
514 struct qpnp_wled *wled;
515
516 wled = malloc(sizeof(struct qpnp_wled));
517 if (!wled)
518 return ERR_NO_MEMORY;
519
520 memset(wled, 0, sizeof(struct qpnp_wled));
521
522 rc = qpnp_wled_setup(wled);
523 if (rc) {
524 dprintf(CRITICAL, "Setting WLED parameters failed\n");
525 return rc;
526 }
527
528 rc = qpnp_wled_config(wled);
529 if (rc) {
530 dprintf(CRITICAL, "wled config failed\n");
531 return rc;
532 }
533
534 gwled = wled;
535
536 return rc;
537}