blob: b6f967851f6dfb90542deb4fdd7e11ab98a2176a [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/*********************************************************************
2 Copyright 2016 by ZIXC Corporation.
3*
4* FileName:: zx234290.c
5* File Mark:
6* Description:
7* Others:
8* Version:
9* Author:
10* Date:
11
12* History 1:
13* Date:
14* Version:
15* Author:
16* Modification:
17* History 2:
18**********************************************************************/
19
20#include <common.h>
21#include <errno.h>
22#include <command.h>
23#include <malloc.h>
24#include <asm/io.h>
25#include <boot_mode.h>
26#include <i2c.h>
27#include <drvs_gpio.h>
28#include <power.h>
29#include <zx234290.h>
30#include <zx234502.h>
xf.libdd93d52023-05-12 07:10:14 -070031#include <watchdog.h>
lh9ed821d2023-04-07 01:36:19 -070032
33int zx234290_write_flag(UINT8 val);
34
35#define PIN_PSHOLD_NUM GPIO24
36#define GPIO_PSHOLD_FUNC_SEL GPIO24_GPIO24
37
38static boot_reason_t s_boot_reason = UNKNOWN_BOOT_REASON;
39
40/*******************************************************************************
41 * Function: zx234290_i2c_read_reg
42 * Description:
43 * Parameters:
44 * Input:
45 *
46 * Output:
47 *
48 * Returns:
49 *
50 *
51 * Others:
52 ********************************************************************************/
53int zx234290_i2c_read_reg(ushort reg, uchar *val)
54{
55 return i2c_read(0, ZX234290_I2C_SLAVE_ADDR, reg, 8, val, 1);
56}
57
58/*******************************************************************************
59 * Function: zx234290_i2c_write_reg
60 * Description:
61 * Parameters:
62 * Input:
63 *
64 * Output:
65 *
66 * Returns:
67 *
68 *
69 * Others:
70 ********************************************************************************/
71int zx234290_i2c_write_reg(ushort reg, uchar *val)
72{
73 return i2c_write(0, ZX234290_I2C_SLAVE_ADDR, reg, 8, val, 1);
74}
75
76int zx234290_reset_flag(void)
77{
78#if 0
79 int ret = 0;
80 int val = 0;
81
82 /*
83 int val = 0xff;
84 ret = zx234290_i2c_write_reg(0x0f,&val);
85 */
86 ret = zx234290_i2c_read_reg(BUCK_MODE_CONTROL0, &val);
87 val &= (~0x30);
88 ret += zx234290_i2c_write_reg(BUCK_MODE_CONTROL0, &val);
89
90 return ret;
91#else
92 return zx234290_write_flag(ZX234290_USER_RST_UNDEFINE);
93#endif
94}
95
96int zx234290_write_flag(UINT8 val)
97{
98#if 0
99 int ret = 0;
100 int tmp = 0;
101
102 if(val > 3)
103 {
104 return -1;
105 }
106 ret = zx234290_i2c_read_reg(BUCK_MODE_CONTROL0, &tmp);
107 tmp &= (~0x30);
108 tmp |= (val<<4);
109 ret += zx234290_i2c_write_reg(BUCK_MODE_CONTROL0, &tmp);
110
111 return ret;
112#else
113 int ret = 0;
114 uchar tmp = 0;
115
116 /*
117 ret = zx234290_i2c_read_reg(ZX234290_REG_ADDR_USER_RESERVED, &tmp);
118 tmp &= ~(0x03<<2);
119 tmp |= (val<<2);
120 */
121 tmp = val;
122 ret |= zx234290_i2c_write_reg(ZX234290_REG_USER, &tmp);
123
124 return ret;
125#endif
126}
127
128/*******************************************************************************
129 * Function: zx234290_get_boot_reason
130 * Description:
131 * Parameters:
132 * Input:
133 *
134 * Output:
135 *
136 * Returns:
137 *
138 *
139 * Others:
140 ********************************************************************************/
141int zx234290_get_boot_reason(boot_reason_t *boot_reason)
142{
143 if (boot_reason == NULL)
144 {
145 return -1;
146 }
147
148 if(s_boot_reason == UNKNOWN_BOOT_REASON)
149 {
150 return -EIO;
151 }
152 *boot_reason = s_boot_reason;
153
154 return 0;
155}
156
157/*******************************************************************************
158 * Function: zx234290_get_boot_reason
159 * Description:
160 * Parameters:
161 * Input:
162 *
163 * Output:
164 *
165 * Returns:
166 *
167 *
168 * Others:
169 ********************************************************************************/
170static int zx234290_get_boot_reason_prev(void)
171{
172 int ret = 0;
173 uchar reg_user = ZX234290_USER_RST_UNDEFINE;
174 uchar reg_start = 0;
175 uchar reg_write = 0;
176
177 /* ¶Á²¢ÇåSTART_UP_STATUS */
178 ret = zx234290_i2c_read_reg(START_UP_STATUS, &reg_start);
179 if( ret != 0 )
180 {
181 return -EIO;
182 }
183 printf( " [%s][START_UP_STATUS = 0x%X] ...\n", __FUNCTION__, reg_start);
xf.libdd93d52023-05-12 07:10:14 -0700184 (*(volatile unsigned long *)(START_UP_STATUS_BASE))=reg_start;
lh9ed821d2023-04-07 01:36:19 -0700185
186 /* ¶Á²¢ÇåZX234290_REG_USER */
187 ret = zx234290_i2c_read_reg(ZX234290_REG_USER, &reg_user);
188 if(reg_user != ZX234290_USER_RST_UNDEFINE)
189 {
190 reg_write = ZX234290_USER_RST_UNDEFINE; /* write back the reset value */
191
192 ret |= zx234290_i2c_write_reg(ZX234290_REG_USER, &reg_write);
193 }
194 if ( ret != 0 )
195 {
196 return -EIO;
197 }
198 printf( " [%s][USER_RESERVED = 0x%X] ...\n", __FUNCTION__, reg_user);
xf.libdd93d52023-05-12 07:10:14 -0700199 (*(volatile unsigned long *)(USER_RESERVED_BASE)) =reg_user;
lh9ed821d2023-04-07 01:36:19 -0700200
201 /* 1. Õý³£¿ª»ú¼ì²â */
202 if( reg_start & PWR_ON_START_UP )
203 /* ÏµÍ³ÖØÆô,Èç¹ûZX234290_REG_USER²»Îª³õÖµ£¬ÔòÎªÖØÆô */
204 {
205 s_boot_reason = RB_POWER_KEY;
206 return 0;
207 }
208 else if( reg_start & PS_HOLD_START_UP )
209 {
210 s_boot_reason = RB_USB_INSERT;
211
212 /* ZX234290_REG_USERΪÉϵ縴λֵ»ò·Ç·¨Öµ */
213 return 0;
214 }
215 else if( reg_start & RTC_ALARM_START_UP )
216 /* 2. Õý³£¿ª»ú¼ì²â */
217 {
218 uchar rtc_ctrl2 = 0xF0;
219
220 ret = zx234290_i2c_read_reg(ZX234290_REG_RTC_CONTROL2, &rtc_ctrl2);
221 printf( " [%s][RTC_CONTROL2 = 0x%X]\n", __FUNCTION__, rtc_ctrl2);
222
223 if (rtc_ctrl2 & RTC_CONTROL2_AF) {
224 s_boot_reason = RB_RTC;
225 } else if (rtc_ctrl2 & RTC_CONTROL2_TF) {
226 s_boot_reason = RB_RESET_NOMAL;
227 }
228
229 return ret;
230 }
231 else if( reg_start & LLP_RESTART_UP )
232 {
233 s_boot_reason = RB_POWER_KEY_LONG;
234 return 0;
235 }
236 /* reg_startΪ0£¬¼´reg_start¶ÁÇåÖ®ºóδµôµç£¬¼´ÏµÍ³ÖØÆô */
237
238 /* 2. ÖØÆô¼ì²â */
239
240 /* ÏµÍ³ÖØÆô,Èç¹ûZX234290_REG_USER²»Îª³õÖµ£¬ÔòÎªÖØÆô */
241 switch (reg_user)
242 {
243 case ZX234290_USER_RST_TO_NORMAL:
244 {
245 s_boot_reason = RB_RESET_NOMAL;
246 return 0;
247 }
248
249 case ZX234290_USER_RST_TO_CHARGER:
250 {
251 s_boot_reason = RB_RESET_USB_OFF;
252 return 0;
253 }
254
255 case ZX234290_USER_RST_TO_ALARM:
256 {
257 s_boot_reason = RB_RESET_ALARM;
258 return 0;
259 }
260
261 /* ZX234290_REG_USERΪÉϵ縴λֵ»ò·Ç·¨Öµ */
262 default:
263 {
264 if ((reg_user & 0xF0) == ZX234290_WDT_RST_FLAG) {
265 s_boot_reason = reg_user;
266 return 0;
267 }
268 break;
269 }
270 }
271
272 s_boot_reason = RB_USB_INSERT;
273
274 return 0;
275}
276
277/*******************************************************************************
278 * Function: zx234290_ps_hold_pull_on
279 * Description:
280 * Parameters:
281 * Input:
282 *
283 * Output:
284 *
285 * Returns:
286 *
287 *
288 * Others:
289 ********************************************************************************/
290int zx234290_ps_hold_pull_on(void)
291{
292 zDrvGpio_PullUpDown(PIN_PSHOLD_NUM, 0);
293 //gpio_set_reuse(PS_HOLD_PIN, 0);
294 zDrvGpio_SetFunc(PIN_PSHOLD_NUM,GPIO_PSHOLD_FUNC_SEL);
295 zDrvGpio_SetDirection(PIN_PSHOLD_NUM,GPIO_IN); //set output;v3 gpio24(pshold) direction is reverse
296 zDrvGpio_SetOutputValue(PIN_PSHOLD_NUM,GPIO_HIGH);
297 return 0;
298}
299
300/*******************************************************************************
301 * Function: zx234290_ps_hold_pull_off
302 * Description:
303 * Parameters:
304 * Input:
305 *
306 * Output:
307 *
308 * Returns:
309 *
310 *
311 * Others:
312 ********************************************************************************/
313int zx234290_ps_hold_pull_off(void)
314{
315 zDrvGpio_PullUpDown(PIN_PSHOLD_NUM, 0);
316 //gpio_set_reuse(PS_HOLD_PIN, 0);
317 //gpio_direction_output(PS_HOLD_PIN, GPIO_LOW);
318 zDrvGpio_SetFunc(PIN_PSHOLD_NUM,GPIO_PSHOLD_FUNC_SEL);
319 zDrvGpio_SetDirection(PIN_PSHOLD_NUM,GPIO_IN); //set output;v3 gpio24(pshold) direction is reverse
320 zDrvGpio_SetOutputValue(PIN_PSHOLD_NUM,GPIO_LOW);
321 return 0;
322}
323
324/*******************************************************************************
325 * Function: zx234290_power_off
326 * Description:
327 * Parameters:
328 * Input:
329 *
330 * Output:
331 *
332 * Returns:
333 *
334 *
335 * Others:
336 ********************************************************************************/
337int zx234290_power_off(void)
338{
339 return zx234290_ps_hold_pull_off();
340}
341
342/*******************************************************************************
343 * Function:
344 * Description:
345 * Parameters:
346 * Input:
347 *
348 * Output:
349 *
350 * Returns:
351 *
352 *
353 * Others:
354 ********************************************************************************/
355int pmu_init(void)
356{
357 int ret = 0;
358 struct pmu_opt pmu = {NULL};
359
360 /* GPIO init */
361 //gpio_set_reuse(PS_HOLD_PIN, 0x0);
362 //gpio_direction_output(PS_HOLD_PIN,GPIO_LOW);
363
364 // gpio_set_reuse(POWER_KEY_PIN,0x0);
365 // gpio_direction_input(POWER_KEY_PIN);
366
367 // gpio_noaction(POWER_KEY_PIN);
368
369 /* register pmu opt */
370 pmu.read_reg = zx234290_i2c_read_reg;
371 pmu.write_reg = zx234290_i2c_write_reg;
372 pmu.get_boot_reason = zx234290_get_boot_reason;
373 pmu.ps_hold_pull_on = pmu_pull_on_ps_hold;
374 pmu.ps_hold_pull_off = pmu_pull_off_ps_hold;
375 pmu.power_off = zx234290_power_off;
376 ret = register_pmu_opt(&pmu);
377 /*
378 if( ret != 0 )
379 {
380 return -EIO;
381 }
382 */
383 ret = zx234290_get_boot_reason_prev();
384
385 return ret;
386}
387
388/* ================================================================================
389 * pmu_init:
390 */
391int pmu_pull_off_ps_hold(void)
392{
393 return zx234290_ps_hold_pull_off();
394}
395
396/* ================================================================================
397 * pmu_init:
398 */
399int pmu_pull_on_ps_hold(void)
400{
401 return zx234290_ps_hold_pull_on();
402}
403
404/* ================================================================================
405 * system_power_off:
406 */
407void system_power_off(void)
408{
409 zx234290_power_off();
410}
411
412int zx234290_get_adc2_voltage(void)
413{
414 int nTempAdc = 0, ret = -1;
415 int adcReadInt = -1;
416 int msb=0, lsb=0;
417 int num;
418 uchar status_a=0;
419 uchar adcEnable = 0x28;
420 uchar sys_ctrl;
421
422 ret = zx234290_i2c_read_reg(ZX234290_REG_SYS_CTRL, &sys_ctrl);
423 if (ret != SUCCESS)
424 {
425 return -EIO;
426 }
427 sys_ctrl = (sys_ctrl & (1 << 7)) | adcEnable;
428
429 /*enable adc*/
430#if 0
431 ret = zx234290_i2c_write_reg(ZX234290_REG_SYS_CTRL,&sys_ctrl);
432 if (ret != SUCCESS)
433 {
434 return -EIO;
435 }
436#else
437 for(num=1; num <= 50; num++)
438 {
439 ret = zx234290_i2c_write_reg(ZX234290_REG_SYS_CTRL, &sys_ctrl);
440 if (ret != SUCCESS)
441 {
442 return -EIO;
443 }
444 udelay((100000/3000)*5); /* delay 5ms */
445 ret = zx234290_i2c_read_reg(ZX234290_REG_ADDR_STSA, &status_a);
446 if (ret != SUCCESS)
447 {
448 return -EIO;
449 }
450
451 if(status_a & 0x04)
452 {
453 printf( "adc2 get adc,break num =%d ...\n", num);
454 break;
455 }
456 }
457#endif
458 udelay((100000/3000)*20); /* delay 20ms */
459
460 /*read adc*/
461 ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_ADC2MSB, &msb);
462 if (ret != SUCCESS)
463 {
464 return -EIO;
465 }
466 ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_ADC2LSB, &lsb);
467 if (ret != SUCCESS)
468 {
469 return -EIO;
470 }
471
472 /*clear int*/
473 ret = zx234290_i2c_read_reg(ZX234290_REG_INTA, &adcReadInt);
474 if (ret != SUCCESS)
475 {
476 return -EIO;
477 }
478 ret =zx234290_i2c_read_reg(ZX234290_REG_INTB, &adcReadInt);
479 if (ret != SUCCESS)
480 {
481 return -EIO;
482 }
483
484 nTempAdc = ((msb<<4)|(lsb>>4));
485
486 nTempAdc = (int)((double)(5000-0)*(nTempAdc)/4096);
487
488 return nTempAdc;
489}
490
491int zx234290_get_adc1_voltage(void) /*read adc1*/
492{
493 int nTempAdc = 0,adcEnable = 0,ret = -1;
494 int adcReadInt = -1;
495 int msb=0, lsb=0;
496 int num;
497 uchar status_a=0;
498 adcEnable = 0x30; /*read adc1*/
499 uchar sys_ctrl;
500
501 ret = zx234290_i2c_read_reg(ZX234290_REG_SYS_CTRL, &sys_ctrl);
502 if (ret != SUCCESS)
503 {
504 return -EIO;
505 }
506 sys_ctrl = (sys_ctrl & (1 << 7)) | adcEnable;
507
508 /*enable adc*/
509#if 0
510 ret = zx234290_i2c_write_reg(ZX234290_REG_SYS_CTRL,&sys_ctrl);
511 if (ret != SUCCESS)
512 {
513 return -EIO;
514 }
515#else
516 for(num=1; num <= 50; num++)
517 {
518 ret = zx234290_i2c_write_reg(ZX234290_REG_SYS_CTRL, &sys_ctrl);
519 if (ret != SUCCESS)
520 {
521 return -EIO;
522 }
523 udelay((100000/3000)*5); /* delay 5ms */
524 ret = zx234290_i2c_read_reg(ZX234290_REG_ADDR_STSA, &status_a);
525 if (ret != SUCCESS)
526 {
527 return -EIO;
528 }
529 if(status_a & 0x04)
530 {
531 printf( "adc1 get adc,break num =%d ...\n", num);
532 break;
533 }
534 }
535#endif
536
537 udelay((100000/3000)*20); /* delay 20ms */
538
539 /*read adc*/
540 ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_ADC1MSB, &msb);
541 if (ret != SUCCESS)
542 {
543 return -EIO;
544 }
545 ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_ADC1LSB, &lsb);
546 if (ret != SUCCESS)
547 {
548 return -EIO;
549 }
550
551 /*clear int*/
552 ret = zx234290_i2c_read_reg(ZX234290_REG_INTA, &adcReadInt);
553 if (ret != SUCCESS)
554 {
555 return -EIO;
556 }
557 ret =zx234290_i2c_read_reg(ZX234290_REG_INTB, &adcReadInt);
558 if (ret != SUCCESS)
559 {
560 return -EIO;
561 }
562
563 nTempAdc = ((msb<<4)|(lsb>>4));
564
565 nTempAdc = (int)((double)(5000-0)*(nTempAdc)/4096);
566
567 return nTempAdc;
568}
569
570int zx234290_get_vbat_voltage(void)
571{
572 int nTempAdc = 0,adcEnable = 0,ret = -1;
573 int adcReadInt = -1;
574 int msb=0, lsb=0;
575 int num;
576 uchar status_a=0;
577 //adcEnable = 0x30;
578 adcEnable = 0x20;
579 uchar sys_ctrl;
580
581 ret = zx234290_i2c_read_reg(ZX234290_REG_SYS_CTRL, &sys_ctrl);
582 if (ret != SUCCESS)
583 {
584 return -EIO;
585 }
586 sys_ctrl = (sys_ctrl & (1 << 7)) | adcEnable;
587
588#if 0
589 ret = zx234290_i2c_write_reg(ZX234290_REG_SYS_CTRL,&sys_ctrl);
590 if (ret != SUCCESS)
591 {
592 return -EIO;
593 }
594#else
595 for(num=1; num <= 50; num++)
596 {
597 ret = zx234290_i2c_write_reg(ZX234290_REG_SYS_CTRL, &sys_ctrl);
598 if (ret != SUCCESS)
599 {
600 return -EIO;
601 }
602 udelay((100000/3000)*5); /* delay 5ms */
603 ret = zx234290_i2c_read_reg(ZX234290_REG_ADDR_STSA, &status_a);
604 if (ret != SUCCESS)
605 {
606 return -EIO;
607 }
608 if(status_a & 0x04)
609 {
610 printf( "vbat get adc,break num =%d ...\n", num);
611 break;
612 }
613 }
614#endif
615 //ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_ADC1MSB, &msb);
616 ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_VBATMSB, &msb);
617 if (ret != SUCCESS)
618 {
619 return -EIO;
620 }
621 //ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_ADC1LSB, &lsb);
622 ret = zx234290_i2c_read_reg(ZX234290_REG_ADC_VBATLSB, &lsb);
623 if (ret != SUCCESS)
624 {
625 return -EIO;
626 }
627 ret = zx234290_i2c_read_reg(ZX234290_REG_INTA, &adcReadInt);
628 if (ret != SUCCESS)
629 {
630 return -EIO;
631 }
632 ret =zx234290_i2c_read_reg(ZX234290_REG_INTB, &adcReadInt);
633 if (ret != SUCCESS)
634 {
635 return -EIO;
636 }
637 nTempAdc = ((msb<<4)|(lsb>>4));
638 nTempAdc = (int)((double)(5000-0)*(nTempAdc)/4096);
639 return nTempAdc;
640}
641
642int zx234290_set_llp_enable(void)
643{
644 int ret = -1;
645 ushort reg=ZX234290_REG_ADDR_PWRON;
646 uchar val=0x05;
647
648 ret = zx234290_i2c_write_reg(reg, &val);
649 if (ret != SUCCESS)
650 {
651 return -EIO;
652 }
653 return ret;
654}
655
656/*get the poweron key state 0x1<<5: poweron press 0:poweron up*/
657int zx234290_get_poweron_state(void)
658{
659 int val = 0,ret = -1;
660 uchar reg = 0;
661
662 ret = zx234290_i2c_read_reg(STATUS_A,&reg);
663 if (ret != SUCCESS)
664 {
665 return -EIO;
666 }
667 val = reg&STATUS_PWR_ON;
668 return val;
669}
670
671/* get the rtc_alarm status: bit0 in reg 0x05 */
672int zx234290_get_rtc_state(void)
673{
674 int val = 0,ret = -1;
675 uchar reg = 0;
676
677 ret = zx234290_i2c_read_reg(STATUS_B, &reg);
678 if (ret != SUCCESS)
679 {
680 return -EIO;
681 }
682 val = reg & STATUS_RTC_ALARM;
683 return val;
684}
685
686/* Set or clear SoftOn bit in ZX234290_REG_SYS_CTRL */
687int zx234290_set_softon(int on)
688{
689 uchar reg = 0;
690 int ret;
691
692 ret = zx234290_i2c_read_reg(ZX234290_REG_SYS_CTRL, &reg);
693 if (ret != SUCCESS)
694 {
695 return -EIO;
696 }
697
698 if ((reg >> 7) != on) {
699 reg ^= (0x01<<7);
700 ret = zx234290_i2c_write_reg(ZX234290_REG_SYS_CTRL, &reg);
701 if (ret != SUCCESS)
702 {
703 return -EIO;
704 }
705 }
706 return 0;
707}
708
709/*set ldo8 SD VOL*/
710int zx234290_set_ldo8_voltage(T_ZDrvZx234290_VldoD vol)
711{
712 int ret = 0;
713 unsigned char reg_addr=0, reg_val=0;
714
715 if(vol > VLDOD_MAX)
716 {
717 return -EINVAL;
718 }
719 reg_addr = ZX234290_REG_ADDR_LDO78_VOL;
720 ret = zx234290_i2c_read_reg(reg_addr,&reg_val);
721 if (ret != SUCCESS)
722 {
723 return -EIO;
724 }
725 reg_val &= ~(0xf<<ZX234290_LDO8_VSEL_LSH);
726 reg_val |= (vol<<ZX234290_LDO8_VSEL_LSH);
727
728 ret = zx234290_i2c_write_reg(reg_addr, &reg_val);
729 if (ret != SUCCESS)
730 {
731 return -EIO;
732 }
733
734 return 0;
735}
736
737int zx234290_set_ldo8_sleep_voltage(T_ZDrvZx234290_VldoD vol)
738{
739 int ret = 0;
740 unsigned char reg_addr=0, reg_val=0;
741
742 if(vol > VLDOD_MAX)
743 {
744 return -EINVAL;
745 }
746 reg_addr = ZX234290_REG_ADDR_LDO78_VOL;
747 ret = zx234290_i2c_read_reg(reg_addr,&reg_val);
748 if (ret != SUCCESS)
749 {
750 return -EIO;
751 }
752 reg_val &= ~(0xf<<ZX234290_LDO8_SLP_VSEL_LSH);
753 reg_val |= (vol<<ZX234290_LDO8_SLP_VSEL_LSH);
754
755 ret = zx234290_i2c_write_reg(reg_addr, &reg_val);
756 if (ret != SUCCESS)
757 {
758 return -EIO;
759 }
760
761 return 0;
762}
763
764
765/* clear SoftOn bit in ZX234290_REG_SYS_CTRL bit7 */
766int zx234290_ldo8_enable(int enable)
767{
768 int ret = -1;
769 uchar reg = 0;
770
771 ret = zx234290_i2c_read_reg(ZX234290_REG_LDO_EN1, &reg);
772 if (ret != SUCCESS)
773 {
774 return -EIO;
775 }
776 reg &= ~(0x01<<7);
777 reg |= (enable<<7);
778 ret = zx234290_i2c_write_reg(ZX234290_REG_LDO_EN1, &reg);
779 if (ret != SUCCESS)
780 {
781 return -EIO;
782 }
783 return 0;
784}
785int zx234290_set_sink(T_ZX234290_SINK sink_num, int is_on, T_ZX234297_SINK_CURRENT sink_current)
786{
787 int ret = 0;
788 unsigned char lsh_on, lsh_current;
789 uchar reg = 0;
790
791 ret = zx234290_i2c_read_reg(ZX234297_REG_ADDR_SINK_CONTROL, &reg);
792 if (ret != SUCCESS)
793 {
794 return -EIO;
795 }
796 if(0xff==reg){
797 printf("pmu zx234296 no sink\n");
798 return SUCCESS;
799 }
800 if (sink_num == SINK_1) {
801 lsh_on = ZX234297_SINK1_ON_LSH;
802 lsh_current = ZX234297_SINK1_CURRENT_LSH;
803 } else if (sink_num == SINK_2) {
804 lsh_on = ZX234297_SINK2_ON_LSH;
805 lsh_current = ZX234297_SINK2_CURRENT_LSH;
806 } else
807 return -EINVAL;
808
809 if (is_on) {
810 if (sink_current >= SINK_CURRENT_MAX)
811 sink_current = SINK_CURRENT_120MA;
812
813 ret = zx234290_i2c_read_reg(ZX234297_REG_ADDR_SINK_CONTROL, &reg);
814 if (ret != SUCCESS)
815 {
816 return -EIO;
817 }
818 reg &= ~(0xf<<lsh_current);
819 reg |= (sink_current<<lsh_current);
820 ret = zx234290_i2c_write_reg(ZX234297_REG_ADDR_SINK_CONTROL, &reg);
821 if (ret != SUCCESS)
822 {
823 return -EIO;
824 }
825 }
826
827 is_on = !!is_on;
828 ret = zx234290_i2c_read_reg(ZX234290_REG_ADDR_LDO_EN2, &reg);
829 if (ret != SUCCESS)
830 {
831 return -EIO;
832 }
833 reg &= ~(0x1<<lsh_on);
834 reg |= (is_on<<lsh_on);
835 ret = zx234290_i2c_write_reg(ZX234290_REG_ADDR_LDO_EN2, &reg);
836 if (ret != SUCCESS)
837 {
838 return -EIO;
839 }
840
841 return 0;
842}
843
844#if 0
845int zx234290_SetVldo8(Zx234290_VldoD vol)
846{
847 int reg = 0,val = 0,ret = -1;
848 ret = zx234290_i2c_read_reg(ZX234290_REG_LD78_VOL, &reg);
849 if (ret != SUCCESS)
850 {
851 return -EIO;
852 }
853 BOOT_PRINTF(UBOOT_ERR, "********First REG0x15=0x%x!!!\n",reg);
854 reg &= 0xf;/*00001111*/
855 reg |= (vol<<4);
856 ret = zx234290_i2c_write_reg(ZX234290_REG_LD78_VOL, &reg);
857 if (ret != SUCCESS)
858 {
859 return -EIO;
860 }
861 ret = zx234290_i2c_read_reg(ZX234290_REG_LD78_VOL, &reg);
862 if (ret != SUCCESS)
863 {
864 return -EIO;
865 }
866 BOOT_PRINTF(UBOOT_ERR, "********Last REG0x15=0x%x!!!\n",reg);
867 return 0;
868}
869
870#endif
871
872