@@ -102,6 +102,11 @@ enum charger_t {
102102 DC_TYPE_NONE_CHARGER ,
103103};
104104
105+ enum {
106+ OFFLINE = 0 ,
107+ ONLINE
108+ };
109+
105110struct temp_chrg_table {
106111 int temperature ;
107112 u32 chrg_current ;
@@ -159,7 +164,8 @@ struct rk818_charger {
159164 struct regulator * otg5v_rdev ;
160165 u8 ac_in ;
161166 u8 usb_in ;
162- u8 otg_in ;
167+ u8 otg_in ; /* OTG device attached status */
168+ u8 otg_pmic5v ; /* OTG device power supply from PMIC */
163169 u8 dc_in ;
164170 u8 prop_status ;
165171 u8 chrg_voltage ;
@@ -503,8 +509,8 @@ static void rk818_cg_pr_info(struct rk818_charger *cg)
503509
504510 usb_ctrl = rk818_reg_read (cg , RK818_USB_CTRL_REG );
505511 chrg_ctrl1 = rk818_reg_read (cg , RK818_CHRG_CTRL_REG1 );
506- CG_INFO ("ac=%d usb=%d dc=%d otg=%d v=%d chrg=%d input=%d virt=%d\n" ,
507- cg -> ac_in , cg -> usb_in , cg -> dc_in , cg -> otg_in ,
512+ CG_INFO ("ac=%d usb=%d dc=%d otg=%d 5v=%d, v=%d chrg=%d input=%d virt=%d\n" ,
513+ cg -> ac_in , cg -> usb_in , cg -> dc_in , cg -> otg_in , cg -> otg_pmic5v ,
508514 chrg_vol_sel_array [(chrg_ctrl1 & 0x70 ) >> 4 ],
509515 chrg_cur_sel_array [chrg_ctrl1 & 0x0f ] * cg -> res_div ,
510516 chrg_cur_input_array [usb_ctrl & 0x0f ],
@@ -663,16 +669,20 @@ static void rk818_cg_set_chrg_param(struct rk818_charger *cg,
663669 msecs_to_jiffies (1000 ));
664670}
665671
666- static void rk818_cg_set_otg_state (struct rk818_charger * cg , int state )
672+ static void rk818_cg_set_otg_in (struct rk818_charger * cg , int online )
673+ {
674+ cg -> otg_in = online ;
675+ }
676+
677+ static void rk818_cg_set_otg_power (struct rk818_charger * cg , int state )
667678{
668679 int ret ;
669680
670681 switch (state ) {
671682 case USB_OTG_POWER_ON :
672- if (cg -> otg_in ) {
683+ if (cg -> otg_pmic5v ) {
673684 CG_INFO ("otg5v is on yet, ignore..\n" );
674685 } else {
675- cg -> otg_in = 1 ;
676686 if (IS_ERR (cg -> otg5v_rdev )) {
677687 CG_INFO ("not get otg_switch regulator!\n" );
678688 return ;
@@ -686,17 +696,17 @@ static void rk818_cg_set_otg_state(struct rk818_charger *cg, int state)
686696 return ;
687697 }
688698 }
699+ cg -> otg_pmic5v = 1 ;
689700 disable_irq (cg -> plugin_irq );
690701 disable_irq (cg -> plugout_irq );
691702 CG_INFO ("enable otg5v\n" );
692703 }
693704 break ;
694705
695706 case USB_OTG_POWER_OFF :
696- if (!cg -> otg_in ) {
707+ if (!cg -> otg_pmic5v ) {
697708 CG_INFO ("otg5v is off yet, ignore..\n" );
698709 } else {
699- cg -> otg_in = 0 ;
700710 if (IS_ERR (cg -> otg5v_rdev )) {
701711 CG_INFO ("not get otg_switch regulator!\n" );
702712 return ;
@@ -710,6 +720,7 @@ static void rk818_cg_set_otg_state(struct rk818_charger *cg, int state)
710720 return ;
711721 }
712722 }
723+ cg -> otg_pmic5v = 0 ;
713724 enable_irq (cg -> plugin_irq );
714725 enable_irq (cg -> plugout_irq );
715726 CG_INFO ("disable otg5v\n" );
@@ -747,14 +758,14 @@ static void rk818_cg_dc_det_worker(struct work_struct *work)
747758 /* check otg supply */
748759 if (cg -> otg_in && cg -> pdata -> power_dc2otg ) {
749760 CG_INFO ("otg power from dc adapter\n" );
750- rk818_cg_set_otg_state (cg , USB_OTG_POWER_OFF );
761+ rk818_cg_set_otg_power (cg , USB_OTG_POWER_OFF );
751762 }
752763 } else {
753764 CG_INFO ("detect dc charger out..\n" );
754765 rk818_cg_set_chrg_param (cg , DC_TYPE_NONE_CHARGER );
755766 /* check otg supply, power on anyway */
756767 if (cg -> otg_in )
757- rk818_cg_set_otg_state (cg , USB_OTG_POWER_ON );
768+ rk818_cg_set_otg_power (cg , USB_OTG_POWER_ON );
758769 }
759770
760771 rk_send_wakeup_key ();
@@ -975,13 +986,15 @@ static void rk818_cg_bc_evt_worker(struct work_struct *work)
975986 rk818_cg_set_chrg_param (cg , USB_TYPE_CDP_CHARGER );
976987 break ;
977988 case USB_OTG_POWER_ON :
989+ rk818_cg_set_otg_in (cg , ONLINE );
978990 if (cg -> pdata -> power_dc2otg && cg -> dc_in )
979991 CG_INFO ("otg power from dc adapter\n" );
980992 else
981- rk818_cg_set_otg_state (cg , USB_OTG_POWER_ON );
993+ rk818_cg_set_otg_power (cg , USB_OTG_POWER_ON );
982994 break ;
983995 case USB_OTG_POWER_OFF :
984- rk818_cg_set_otg_state (cg , USB_OTG_POWER_OFF );
996+ rk818_cg_set_otg_in (cg , OFFLINE );
997+ rk818_cg_set_otg_power (cg , USB_OTG_POWER_OFF );
985998 break ;
986999 default :
9871000 break ;
@@ -1171,14 +1184,16 @@ static void rk818_cg_host_evt_worker(struct work_struct *work)
11711184
11721185 /* Determine cable/charger type */
11731186 if (extcon_get_cable_state_ (edev , EXTCON_USB_VBUS_EN ) > 0 ) {
1187+ rk818_cg_set_otg_in (cg , ONLINE );
11741188 CG_INFO ("receive type-c notifier event: OTG ON...\n" );
11751189 if (cg -> dc_in && cg -> pdata -> power_dc2otg )
11761190 CG_INFO ("otg power from dc adapter\n" );
11771191 else
1178- rk818_cg_set_otg_state (cg , USB_OTG_POWER_ON );
1192+ rk818_cg_set_otg_power (cg , USB_OTG_POWER_ON );
11791193 } else if (extcon_get_cable_state_ (edev , EXTCON_USB_VBUS_EN ) == 0 ) {
11801194 CG_INFO ("receive type-c notifier event: OTG OFF...\n" );
1181- rk818_cg_set_otg_state (cg , USB_OTG_POWER_OFF );
1195+ rk818_cg_set_otg_in (cg , OFFLINE );
1196+ rk818_cg_set_otg_power (cg , USB_OTG_POWER_OFF );
11821197 }
11831198
11841199 rk818_cg_pr_info (cg );
@@ -1379,8 +1394,8 @@ static void rk818_cg_init_charger_state(struct rk818_charger *cg)
13791394 rk818_cg_init_finish_sig (cg );
13801395 rk818_cg_set_chrg_param (cg , cg -> dc_charger );
13811396 rk818_cg_set_chrg_param (cg , cg -> usb_charger );
1382- CG_INFO ("ac=%d, usb=%d, dc=%d, otg=%d\n" ,
1383- cg -> ac_in , cg -> usb_in , cg -> dc_in , cg -> otg_in );
1397+ CG_INFO ("ac=%d, usb=%d, dc=%d, otg=%d, 5v=%d \n" ,
1398+ cg -> ac_in , cg -> usb_in , cg -> dc_in , cg -> otg_in , cg -> otg_pmic5v );
13841399}
13851400
13861401static int rk818_cg_temperature_notifier_call (struct notifier_block * nb ,
@@ -1775,7 +1790,7 @@ static void rk818_charger_shutdown(struct platform_device *pdev)
17751790 cancel_delayed_work_sync (& cg -> discnt_work );
17761791 }
17771792
1778- rk818_cg_set_otg_state (cg , USB_OTG_POWER_OFF );
1793+ rk818_cg_set_otg_power (cg , USB_OTG_POWER_OFF );
17791794 disable_irq (cg -> plugin_irq );
17801795 disable_irq (cg -> plugout_irq );
17811796
@@ -1808,8 +1823,8 @@ static void rk818_charger_shutdown(struct platform_device *pdev)
18081823
18091824 rk818_cg_set_finish_sig (cg , CHRG_FINISH_ANA_SIGNAL );
18101825
1811- CG_INFO ("shutdown: ac=%d usb=%d dc=%d otg=%d\n" ,
1812- cg -> ac_in , cg -> usb_in , cg -> dc_in , cg -> otg_in );
1826+ CG_INFO ("shutdown: ac=%d usb=%d dc=%d otg=%d 5v=%d \n" ,
1827+ cg -> ac_in , cg -> usb_in , cg -> dc_in , cg -> otg_in , cg -> otg_pmic5v );
18131828}
18141829
18151830static int rk818_charger_suspend (struct platform_device * pdev ,
0 commit comments