Skip to content

Commit a2b672f

Browse files
JosephChen2017rkhuangtao
authored andcommitted
power: rk818 charger: fix otg supply on/off error
As we register regmap irq to manage rk818 irqs, it should not enable/disable irq by modifying register directly. And check otg on/off line state before setting new state. Change-Id: I45d45d62bea05b1c489337ac7f3334fbafcd4166 Signed-off-by: Jianhong Chen <chenjh@rock-chips.com>
1 parent fffb397 commit a2b672f

1 file changed

Lines changed: 38 additions & 34 deletions

File tree

drivers/power/rk818_charger.c

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

158160
static 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

Comments
 (0)