Skip to content

Commit 62a9f46

Browse files
JosephChen2017rkhuangtao
authored andcommitted
power: rk818-charger: use otg_pmic5v to record otg power supply state
without this patch, we use otg_in to stands for otg attach and power supply state(from dc or pmic), there is something wrong with code logic, let's make it clear. Change-Id: I1cdcd3be521039b75badc3b805e70f202ebcac77 Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
1 parent be49c69 commit 62a9f46

1 file changed

Lines changed: 34 additions & 19 deletions

File tree

drivers/power/rk818_charger.c

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ enum charger_t {
102102
DC_TYPE_NONE_CHARGER,
103103
};
104104

105+
enum {
106+
OFFLINE = 0,
107+
ONLINE
108+
};
109+
105110
struct 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

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

18151830
static int rk818_charger_suspend(struct platform_device *pdev,

0 commit comments

Comments
 (0)