diff --git a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c index 2c7cf6c57742..ba580623692c 100644 --- a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c +++ b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c @@ -164,6 +164,7 @@ struct bq2589x { /*mmi qc3*/ bool mmi_qc3_support; + struct semaphore sem_dpdm; struct task_struct *mmi_qc3_authen_task; wait_queue_head_t mmi_qc3_wait_que; bool mmi_qc3_trig_flag; @@ -1708,6 +1709,8 @@ static int mmi_hvdcp_detect_kthread(void *param) if (kthread_should_stop()) break; + down(&bq->sem_dpdm); + dev_info(bq->dev, "mmi_hvdcp_detect_kthread begin\n"); bq->mmi_qc3_trig_flag = false; bq->mmi_is_qc3_authen = true; bq2589x_set_input_current_limit(bq, MMI_HVDCP_DETECT_ICL_LIMIT); @@ -1740,6 +1743,8 @@ static int mmi_hvdcp_detect_kthread(void *param) out: bq2589x_set_input_current_limit(bq, bq->input_current_cache); bq->mmi_is_qc3_authen = false; + up(&bq->sem_dpdm); + dev_info(bq->dev, "mmi_hvdcp_detect_kthread end\n"); }while(!kthread_should_stop()); dev_dbg(bq->dev, "qc3 kthread stop\n"); @@ -1748,14 +1753,16 @@ static int mmi_hvdcp_detect_kthread(void *param) static void mmi_start_hvdcp_detect(struct bq2589x *bq) { - dev_err(bq->dev, "start hvdcp detect\n"); if (bq->mmi_qc3_support - && bq->real_charger_type == POWER_SUPPLY_TYPE_USB_DCP - && !bq->mmi_is_qc3_authen) { + && bq->real_charger_type == POWER_SUPPLY_TYPE_USB_DCP) { + //down(&bq->sem_dpdm); + dev_info(bq->dev, "start hvdcp detect\n"); bq->mmi_qc3_trig_flag = true; wake_up_interruptible(&bq->mmi_qc3_wait_que); + //up(&bq->sem_dpdm); } + } static void bq2589x_adapter_in_func(struct bq2589x *bq) @@ -1766,8 +1773,10 @@ static void bq2589x_adapter_in_func(struct bq2589x *bq) bq->vbus_type == BQ2589X_VBUS_NONSTAND || bq->vbus_type == BQ2589X_VBUS_UNKNOWN) && (!bq->typec_apsd_rerun_done)) { + down(&bq->sem_dpdm); dev_err(bq->dev, "rerun apsd for 0x%x\n", bq->vbus_type); bq2589x_rerun_apsd_if_required(bq); + up(&bq->sem_dpdm); return; } @@ -2367,6 +2376,8 @@ static int bq2589x_charger_probe(struct i2c_client *client, g_bq = bq; + sema_init(&bq->sem_dpdm, 1); + if (client->dev.of_node) bq2589x_parse_dt(&client->dev, bq); diff --git a/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c b/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c index 016de370fd85..4ae019f3d981 100644 --- a/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c +++ b/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c @@ -1439,6 +1439,8 @@ static int mmi_hvdcp_detect_kthread(void *param) if (kthread_should_stop()) break; + down(&sgm->sem_dpdm); + dev_info(sgm->dev, "mmi_hvdcp_detect_kthread begin\n"); sgm->mmi_qc3_trig_flag = false; sgm->mmi_is_qc3_authen = true; sgm4154x_set_input_curr_lim(sgm, MMI_HVDCP_DETECT_ICL_LIMIT); @@ -1471,6 +1473,8 @@ static int mmi_hvdcp_detect_kthread(void *param) out: sgm4154x_set_input_curr_lim(sgm, sgm->input_current_cache); sgm->mmi_is_qc3_authen = false; + up(&sgm->sem_dpdm); + dev_info(sgm->dev, "mmi_hvdcp_detect_kthread end\n"); }while(!kthread_should_stop()); dev_dbg(sgm->dev, "qc3 kthread stop\n"); @@ -1479,11 +1483,10 @@ static int mmi_hvdcp_detect_kthread(void *param) static void mmi_start_hvdcp_detect(struct sgm4154x_device *sgm) { - dev_err(sgm->dev, "start hvdcp detect\n"); if (sgm->mmi_qc3_support - && sgm->real_charger_type == POWER_SUPPLY_TYPE_USB_DCP - && !sgm->mmi_is_qc3_authen) { + && sgm->real_charger_type == POWER_SUPPLY_TYPE_USB_DCP) { + dev_info(sgm->dev, "start hvdcp detect\n"); sgm->mmi_qc3_trig_flag = true; wake_up_interruptible(&sgm->mmi_qc3_wait_que); } @@ -1536,8 +1539,10 @@ static void charger_detect_work_func(struct work_struct *work) (sgm->state.chrg_type == SGM4154x_NON_STANDARD) || (sgm->state.chrg_type == SGM4154x_UNKNOWN)) && (!sgm->typec_apsd_rerun_done)) { + down(&sgm->sem_dpdm); dev_err(sgm->dev, "rerun apsd for 0x%x\n", sgm->state.chrg_type); schedule_work(&sgm->rerun_apsd_work); + up(&sgm->sem_dpdm); goto err; } @@ -2353,6 +2358,8 @@ static int sgm4154x_probe(struct i2c_client *client, return ret; } + sema_init(&sgm->sem_dpdm, 1); + // Customer customization ret = sgm4154x_parse_dt(sgm); if (ret) { diff --git a/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.h b/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.h index fc149c1b8b43..a0ff03432e6b 100644 --- a/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.h +++ b/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.h @@ -324,6 +324,7 @@ struct sgm4154x_device { /*mmi qc3*/ bool mmi_qc3_support; + struct semaphore sem_dpdm; struct task_struct *mmi_qc3_authen_task; wait_queue_head_t mmi_qc3_wait_que; bool mmi_qc3_trig_flag;