15
15
#include "als.h"
16
16
#include "bd99992gw.h"
17
17
#include "button.h"
18
+ #include "battery.h"
18
19
#include "charge_state.h"
19
20
#include "charger.h"
20
21
#include "chipset.h"
@@ -496,56 +497,123 @@ static void check_chassis_open(int init)
496
497
}
497
498
}
498
499
499
- void charge_psys_onoff (uint8_t enable )
500
+ void charge_gate_onoff (uint8_t enable )
500
501
{
501
502
int control0 = 0x0000 ;
502
503
int control1 = 0x0000 ;
504
+
505
+ if (i2c_read16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
506
+ ISL9241_REG_CONTROL0 , & control0 )) {
507
+ CPRINTS ("read gate control1 fail" );
508
+ }
509
+
510
+ if (i2c_read16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
511
+ ISL9241_REG_CONTROL1 , & control1 )) {
512
+ CPRINTS ("read gate control1 fail" );
513
+ }
514
+
515
+ if (enable ) {
516
+ control0 &= ~ISL9241_CONTROL0_NGATE ;
517
+ control1 &= ~ISL9241_CONTROL1_BGATE ;
518
+ CPRINTS ("B&N Gate off" );
519
+ } else {
520
+ control0 |= ISL9241_CONTROL0_NGATE ;
521
+ control1 |= ISL9241_CONTROL1_BGATE ;
522
+ CPRINTS ("B&N Gate on" );
523
+ }
524
+
525
+ if (i2c_write16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
526
+ ISL9241_REG_CONTROL0 , control0 )) {
527
+ CPRINTS ("Update gate control0 fail" );
528
+ }
529
+
530
+ if (i2c_write16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
531
+ ISL9241_REG_CONTROL1 , control1 )) {
532
+ CPRINTS ("Update gate control1 fail" );
533
+ }
534
+
535
+ }
536
+
537
+
538
+ void charge_psys_onoff (uint8_t enable )
539
+ {
540
+ int control1 = 0x0000 ;
503
541
int control4 = 0x0000 ;
504
542
int data = 0x0000 ;
505
543
506
544
if (i2c_read16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
507
545
ISL9241_REG_CONTROL1 , & control1 )) {
508
- CPRINTS ("read charger control1 fail" );
546
+ CPRINTS ("read psys control1 fail" );
509
547
}
510
548
511
549
if (enable ) {
512
- control0 &= ~ISL9241_CONTROL0_NGATE ;
513
- control1 &= ~(ISL9241_CONTROL1_IMON | ISL9241_CONTROL1_BGATE );
550
+ control1 &= ~ISL9241_CONTROL1_IMON ;
514
551
control1 |= ISL9241_CONTROL1_PSYS ;
515
552
control4 &= ~ISL9241_CONTROL4_GP_COMPARATOR ;
516
- data = 0x0B00 ;
553
+ data = 0x0B00 ; /* Set ACOK reference to 4.544V */
517
554
CPRINTS ("Power saving disable" );
518
555
} else {
519
- control0 |= ISL9241_CONTROL0_NGATE ;
520
- control1 |= (ISL9241_CONTROL1_IMON | ISL9241_CONTROL1_BGATE );
556
+ control1 |= ISL9241_CONTROL1_IMON ;
521
557
control1 &= ~ISL9241_CONTROL1_PSYS ;
522
558
control4 |= ISL9241_CONTROL4_GP_COMPARATOR ;
523
- data = 0x0000 ;
559
+ data = 0x0000 ; /* Set ACOK reference to 0V */
524
560
CPRINTS ("Power saving enable" );
525
561
}
526
562
527
-
528
563
if (i2c_write16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
529
564
ISL9241_REG_ACOK_REFERENCE , data )) {
530
- CPRINTS ("Update charger ACOK reference fail" );
531
- }
532
-
533
- if (i2c_write16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
534
- ISL9241_REG_CONTROL0 , control0 )) {
535
- CPRINTS ("Update charger control0 fail" );
565
+ CPRINTS ("Update ACOK reference fail" );
536
566
}
537
567
538
568
if (i2c_write16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
539
569
ISL9241_REG_CONTROL1 , control1 )) {
540
- CPRINTS ("Update charger control1 fail" );
570
+ CPRINTS ("Update psys control1 fail" );
541
571
}
542
572
543
573
if (i2c_write16 (I2C_PORT_CHARGER , ISL9241_ADDR_FLAGS ,
544
574
ISL9241_REG_CONTROL4 , control4 )) {
545
- CPRINTS ("Update charger control4 fail" );
575
+ CPRINTS ("Update psys control4 fail" );
546
576
}
547
577
}
548
578
579
+
580
+ /*
581
+ * Charger Low Power Mode Process
582
+ * modern standby should not turn off Bfet and Nfet
583
+ * DC only at S5 need enable
584
+ * AC+DC at S5 & Fully charge need enable
585
+ * AC+DC at Modern standby & Fully charge need enable
586
+ * AC only need disable
587
+ */
588
+ void charger_low_power_update (void )
589
+ {
590
+ static int ac_state ;
591
+ static int dc_state ;
592
+ int batt_status ;
593
+
594
+ ac_state = extpower_is_present ();
595
+ dc_state = battery_is_present ();
596
+ battery_status (& batt_status );
597
+
598
+ if (dc_state && !ac_state &&
599
+ chipset_in_state (CHIPSET_STATE_ANY_OFF )) {
600
+ charge_gate_onoff (0 );
601
+ charge_psys_onoff (0 );
602
+ } else if (ac_state && dc_state &&
603
+ batt_status & STATUS_FULLY_CHARGED ) {
604
+ if (chipset_in_state (CHIPSET_STATE_ANY_OFF )) {
605
+ charge_gate_onoff (0 );
606
+ charge_psys_onoff (0 );
607
+ } else if (chipset_in_state (CHIPSET_STATE_STANDBY ))
608
+ charge_psys_onoff (0 );
609
+ } else if (ac_state && !dc_state ) {
610
+ charge_gate_onoff (1 );
611
+ charge_psys_onoff (1 );
612
+ }
613
+ }
614
+ DECLARE_HOOK (HOOK_AC_CHANGE , charger_low_power_update , HOOK_PRIO_DEFAULT );
615
+ DECLARE_HOOK (HOOK_BATTERY_SOC_CHANGE , charger_low_power_update , HOOK_PRIO_DEFAULT );
616
+
549
617
/* Initialize board. */
550
618
static void board_init (void )
551
619
{
@@ -579,6 +647,7 @@ static void board_chipset_startup(void)
579
647
if (version > 6 )
580
648
gpio_set_level (GPIO_EN_INVPWR , 1 );
581
649
650
+ charge_gate_onoff (1 );
582
651
charge_psys_onoff (1 );
583
652
}
584
653
DECLARE_HOOK (HOOK_CHIPSET_STARTUP ,
@@ -588,17 +657,21 @@ DECLARE_HOOK(HOOK_CHIPSET_STARTUP,
588
657
/* Called on AP S3 -> S5 transition */
589
658
static void board_chipset_shutdown (void )
590
659
{
591
- int version = board_get_version ();
660
+ int batt_status ;
661
+
662
+ battery_status (& batt_status );
592
663
593
664
CPRINTS (" HOOK_CHIPSET_SHUTDOWN board_chipset_shutdown" );
594
665
595
666
#ifdef CONFIG_EMI_REGION1
596
667
lpc_set_host_event_mask (LPC_HOST_EVENT_SCI , 0 );
597
668
#endif
598
- if (version > 6 )
599
- gpio_set_level (GPIO_EN_INVPWR , 0 );
600
669
601
- charge_psys_onoff (0 );
670
+ /* avoid AC mode enable charger LPM when charging*/
671
+ if (!extpower_is_present () || (batt_status & STATUS_FULLY_CHARGED )) {
672
+ charge_gate_onoff (0 );
673
+ charge_psys_onoff (0 );
674
+ }
602
675
}
603
676
DECLARE_HOOK (HOOK_CHIPSET_SHUTDOWN ,
604
677
board_chipset_shutdown ,
@@ -611,6 +684,7 @@ static void board_chipset_resume(void)
611
684
/*gpio_set_level(GPIO_ENABLE_BACKLIGHT, 1);*/
612
685
gpio_set_level (GPIO_EC_MUTE_L , 1 );
613
686
gpio_set_level (GPIO_CAM_EN , 1 );
687
+ charge_psys_onoff (1 );
614
688
}
615
689
DECLARE_HOOK (HOOK_CHIPSET_RESUME , board_chipset_resume ,
616
690
MOTION_SENSE_HOOK_PRIO - 1 );
@@ -624,6 +698,7 @@ static void board_chipset_suspend(void)
624
698
gpio_set_level (GPIO_EC_MUTE_L , 0 );
625
699
gpio_set_level (GPIO_CAM_EN , 0 );
626
700
}
701
+ charge_psys_onoff (0 );
627
702
}
628
703
DECLARE_HOOK (HOOK_CHIPSET_SUSPEND ,
629
704
board_chipset_suspend ,
0 commit comments