@@ -151,8 +151,10 @@ struct rk818_charger {
151151 u8 chrg_input ;
152152 u8 chrg_current ;
153153 u8 res_div ;
154- u8 plug_in_irq ;
155- u8 plug_out_irq ;
154+ u8 plugin_trigger ;
155+ u8 plugout_trigger ;
156+ int plugin_irq ;
157+ int plugout_irq ;
156158};
157159
158160static int rk818_reg_read (struct rk818_charger * cg , u8 reg )
@@ -520,17 +522,28 @@ static void rk818_cg_set_otg_state(struct rk818_charger *cg, int state)
520522{
521523 switch (state ) {
522524 case USB_OTG_POWER_ON :
523- rk818_reg_set_bits (cg , RK818_INT_STS_MSK_REG2 ,
524- PLUG_IN_MSK , PLUG_IN_MSK );
525- rk818_reg_set_bits (cg , RK818_INT_STS_MSK_REG2 ,
526- PLUG_OUT_MSK , PLUG_OUT_MSK );
527- rk818_reg_set_bits (cg , RK818_DCDC_EN_REG ,
528- OTG_EN_MASK , OTG_EN_MASK );
525+ if (cg -> otg_in ) {
526+ CG_INFO ("otg5v is on yet, ignore..\n" );
527+ } else {
528+ cg -> otg_in = 1 ;
529+ disable_irq (cg -> plugin_irq );
530+ disable_irq (cg -> plugout_irq );
531+ rk818_reg_set_bits (cg , RK818_DCDC_EN_REG ,
532+ OTG_EN_MASK , OTG_EN_MASK );
533+ CG_INFO ("enable otg5v\n" );
534+ }
529535 break ;
530536 case USB_OTG_POWER_OFF :
531- rk818_reg_clear_bits (cg , RK818_INT_STS_MSK_REG2 , PLUG_IN_MSK );
532- rk818_reg_clear_bits (cg , RK818_INT_STS_MSK_REG2 , PLUG_OUT_MSK );
533- rk818_reg_clear_bits (cg , RK818_DCDC_EN_REG , OTG_EN_MASK );
537+ if (!cg -> otg_in ) {
538+ CG_INFO ("otg5v is off yet, ignore..\n" );
539+ } else {
540+ cg -> otg_in = 0 ;
541+ enable_irq (cg -> plugin_irq );
542+ enable_irq (cg -> plugout_irq );
543+ rk818_reg_clear_bits (cg , RK818_DCDC_EN_REG ,
544+ OTG_EN_MASK );
545+ CG_INFO ("disable otg5v\n" );
546+ }
534547 break ;
535548 default :
536549 dev_err (cg -> dev , "error otg type\n" );
@@ -570,10 +583,8 @@ static void rk818_cg_dc_det_worker(struct work_struct *work)
570583 CG_INFO ("detect dc charger out..\n" );
571584 rk818_cg_set_chrg_param (cg , DC_TYPE_NONE_CHARGER );
572585 /* check otg supply, power on anyway */
573- if (cg -> otg_in ) {
574- CG_INFO ("disable charge, enable otg\n" );
586+ if (cg -> otg_in )
575587 rk818_cg_set_otg_state (cg , USB_OTG_POWER_ON );
576- }
577588 }
578589
579590 rk_send_wakeup_key ();
@@ -730,18 +741,13 @@ static void rk818_cg_bc_evt_worker(struct work_struct *work)
730741 rk818_cg_set_chrg_param (cg , USB_TYPE_CDP_CHARGER );
731742 break ;
732743 case USB_OTG_POWER_ON :
733- cg -> otg_in = 1 ;
734- if (cg -> pdata -> power_dc2otg && cg -> dc_in ) {
744+ if (cg -> pdata -> power_dc2otg && cg -> dc_in )
735745 CG_INFO ("otg power from dc adapter\n" );
736- } else {
746+ else
737747 rk818_cg_set_otg_state (cg , USB_OTG_POWER_ON );
738- CG_INFO ("disable charge, enable otg\n" );
739- }
740748 break ;
741749 case USB_OTG_POWER_OFF :
742- cg -> otg_in = 0 ;
743750 rk818_cg_set_otg_state (cg , USB_OTG_POWER_OFF );
744- CG_INFO ("enable charge, disable otg\n" );
745751 break ;
746752 default :
747753 break ;
@@ -757,13 +763,13 @@ static void rk818_cg_irq_delay_work(struct work_struct *work)
757763 struct rk818_charger * cg = container_of (work ,
758764 struct rk818_charger , irq_work .work );
759765
760- if (cg -> plug_in_irq ) {
766+ if (cg -> plugin_trigger ) {
761767 CG_INFO ("pmic: plug in\n" );
762- cg -> plug_in_irq = 0 ;
768+ cg -> plugin_trigger = 0 ;
763769 rk_send_wakeup_key ();
764- } else if (cg -> plug_out_irq ) {
770+ } else if (cg -> plugout_trigger ) {
765771 CG_INFO ("pmic: plug out\n" );
766- cg -> plug_out_irq = 0 ;
772+ cg -> plugout_trigger = 0 ;
767773 rk818_cg_set_chrg_param (cg , USB_TYPE_NONE_CHARGER );
768774 rk818_cg_set_chrg_param (cg , DC_TYPE_NONE_CHARGER );
769775 rk_send_wakeup_key ();
@@ -778,7 +784,7 @@ static irqreturn_t rk818_plug_in_isr(int irq, void *cg)
778784 struct rk818_charger * icg ;
779785
780786 icg = (struct rk818_charger * )cg ;
781- icg -> plug_in_irq = 1 ;
787+ icg -> plugin_trigger = 1 ;
782788 queue_delayed_work (icg -> usb_charger_wq , & icg -> irq_work ,
783789 msecs_to_jiffies (10 ));
784790
@@ -790,7 +796,7 @@ static irqreturn_t rk818_plug_out_isr(int irq, void *cg)
790796 struct rk818_charger * icg ;
791797
792798 icg = (struct rk818_charger * )cg ;
793- icg -> plug_out_irq = 1 ;
799+ icg -> plugout_trigger = 1 ;
794800 queue_delayed_work (icg -> usb_charger_wq , & icg -> irq_work ,
795801 msecs_to_jiffies (10 ));
796802
@@ -848,6 +854,9 @@ static int rk818_cg_init_irqs(struct rk818_charger *cg)
848854 return ret ;
849855 }
850856
857+ cg -> plugin_irq = plug_in_irq ;
858+ cg -> plugout_irq = plug_out_irq ;
859+
851860 INIT_DELAYED_WORK (& cg -> irq_work , rk818_cg_irq_delay_work );
852861
853862 return 0 ;
@@ -926,18 +935,13 @@ static void rk818_cg_host_evt_worker(struct work_struct *work)
926935 /* Determine cable/charger type */
927936 if (extcon_get_cable_state_ (edev , EXTCON_USB_HOST ) > 0 ) {
928937 CG_INFO ("receive type-c notifier event: OTG ON...\n" );
929- cg -> otg_in = 1 ;
930- if (cg -> dc_in && cg -> pdata -> power_dc2otg ) {
938+ if (cg -> dc_in && cg -> pdata -> power_dc2otg )
931939 CG_INFO ("otg power from dc adapter\n" );
932- } else {
940+ else
933941 rk818_cg_set_otg_state (cg , USB_OTG_POWER_ON );
934- CG_INFO ("disable charge, enable otg\n" );
935- }
936942 } else if (extcon_get_cable_state_ (edev , EXTCON_USB_HOST ) == 0 ) {
937943 CG_INFO ("receive type-c notifier event: OTG OFF...\n" );
938- cg -> otg_in = 0 ;
939944 rk818_cg_set_otg_state (cg , USB_OTG_POWER_OFF );
940- CG_INFO ("enble charge, disable otg\n" );
941945 }
942946
943947 rk818_cg_pr_info (cg );
0 commit comments