devon:charger bring up

devon charger bring up
add charge type detect function

Change-Id: Icfe4ae8d0ab68b7e2870fd76a738e1eeb0bb57cf
Signed-off-by: longc102 <longc102@motorola.com>
Reviewed-on: https://gerrit.mot.com/2220902
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Submit-Approved: Jira Key
Tested-by: Jira Key
Reviewed-by: Qiong Xie <xieq2@motorola.com>
Reviewed-on: https://gerrit.mot.com/2221219
Reviewed-by: Wang Wang <wangwang1@lenovo.com>
This commit is contained in:
longc102 2022-03-19 16:15:43 +08:00 • committed by Qiong Xie
commit 868438e48d
4 changed files with 117 additions and 3 deletions

View file

@ -70,6 +70,8 @@ static const struct wt6670_iio_channels wt6670_iio_psy_channels[] = {
wt6670_CHAN_INDEX("wt6670_start_detection", PSY_IIO_START_DETECTION)
wt6670_CHAN_INDEX("wt6670_detection_ready", PSY_IIO_DETECTION_READY)
wt6670_CHAN_INDEX("wt6670_firmware_num", PSY_IIO_QC3P_FIRMWARE_NUM)
wt6670_CHAN_INDEX("wt6670_start_bc12_detection", PSY_IIO_START_BC12_DETECTION)
wt6670_CHAN_INDEX("wt6670_detection_bc12_ready", PSY_IIO_DETECTION_BC12_READY)
};
int wt6670f_isp_flow(struct wt6670f *chip);

View file

@ -596,6 +596,11 @@ static int wt6670_iio_write_raw(struct iio_dev *indio_dev,
wt6670f_set_volt_count(val1);
pr_info("wt6670 set volt count:%d\n",val1);
break;
case PSY_IIO_START_BC12_DETECTION:
wt6670f_reset_chg_type();
wt6670f_start_detection();
pr_info("wt6670 start bc1.2 detection\n");
break;
default:
pr_err("Unsupported wt6670 IIO chan %d\n", chan->channel);
rc = -EINVAL;
@ -663,6 +668,11 @@ static int wt6670_iio_read_raw(struct iio_dev *indio_dev,
pr_info("could not get device id for used\n");
}
*val1 = result;
break;
case PSY_IIO_DETECTION_BC12_READY:
result = wt6670f_is_charger_ready();
pr_info("wt6670 get bc1.2 ready status:%d\n", result);
*val1 = result;
break;
default:

View file

@ -1809,6 +1809,53 @@ bool qc3p_update_policy(struct sgm4154x_device *chip )
dev_info(chip->dev, "write SMB5_QC3P_START_POLICY IIO :%d\n",val);
return val;
}
#ifdef CONFIG_MMI_SGM41513_CHARGER
int bc12_start_detection(struct sgm4154x_device *chip)
{
int ret = 0;
ret = mmi_charger_write_iio_chan(chip, SMB5_BC12_START_DETECT, true);
if(ret )
dev_err(chip->dev, "Cann't write SMB5_BC12_START_DETECT IIO\n");
dev_info(chip->dev, "write SMB5_BC12_START_DETECT IIO success\n");
return 0;
}
bool bc12_detection_done(struct sgm4154x_device *chip)
{
int ret = 0;
int val = 0;
int delay_count =0;
do {
ret = mmi_charger_read_iio_chan(chip, SMB5_BC12_DETECTION_READY, &val);
if(ret )
dev_err(chip->dev, "Cann't read SMB5_BC12_DETECTION_READY IIO\n");
dev_info(chip->dev, "read SMB5_BC12_DETECTION_READY IIO :%d\n",val);
msleep(100);
delay_count ++;
}while(val == false && delay_count <= 35);
dev_info(chip->dev, "read SMB5_BC12_DETECTION_READY IIO :%d\n",val);
return val;
}
int bc12_read_charger_type(struct sgm4154x_device *chip)
{
int ret = 0;
int val = 0;
ret = mmi_charger_read_iio_chan(chip, SMB5_USB_REAL_TYPE, &val);
if(ret )
dev_err(chip->dev, "Cann't read SMB5_USB_REAL_TYPE IIO\n");
dev_info(chip->dev, "read SMB5_USB_REAL_TYPE IIO :%d\n",val);
return val;
}
#endif
#endif
static int mmi_hvdcp_detect_kthread(void *param)
@ -1918,6 +1965,50 @@ static void mmi_start_hvdcp_detect(struct sgm4154x_device *sgm)
}
}
#ifdef CONFIG_MMI_SGM41513_CHARGER
static bool mmi_start_bc12_charger_type_detect(struct sgm4154x_device *sgm, int *real_charger_type)
{
bool result;
int ret;
bc12_start_detection(sgm);
bc12_detection_done(sgm);
ret = bc12_read_charger_type(sgm);
switch(ret) {
case WT6670_CHG_TYPE_UNKNOWN:
case WT_CHG_TYPE_FC:
case WT_CHG_TYPE_OCP:
dev_err(sgm->dev, "unkown type have been detected !\n");
*real_charger_type = POWER_SUPPLY_TYPE_USB_FLOAT;
result = true;
break;
case WT_CHG_TYPE_SDP:
dev_err(sgm->dev, "SDP have been detected !\n");
*real_charger_type = POWER_SUPPLY_TYPE_USB;
result = true;
break;
case WT_CHG_TYPE_CDP:
dev_err(sgm->dev, "CDP have been detected !\n");
*real_charger_type = POWER_SUPPLY_TYPE_USB_CDP;
result = true;
break;
case WT_CHG_TYPE_DCP:
dev_err(sgm->dev, "DCP have been detected !\n");
*real_charger_type = POWER_SUPPLY_TYPE_USB_DCP;
mmi_start_hvdcp_detect(sgm);
result = true;
break;
default:
pr_err("bc12 charger type: default\n");
result = false;
break;
}
return result;
}
#endif
static void sgm4154x_vbus_remove(struct sgm4154x_device * sgm)
{
dev_err(sgm->dev, "Vbus removed, disable charge\n");
@ -1949,7 +2040,9 @@ static void sgm4154x_vbus_remove(struct sgm4154x_device * sgm)
static void sgm4154x_vbus_plugin(struct sgm4154x_device * sgm)
{
#ifdef CONFIG_MMI_SGM41513_CHARGER
bool ret;
#endif
#if defined(__SGM41542_CHIP_ID__)|| defined(__SGM41516D_CHIP_ID__)
if (((sgm->state.chrg_type == SGM4154x_USB_SDP) ||
(sgm->state.chrg_type == SGM4154x_NON_STANDARD) ||
@ -1967,11 +2060,17 @@ static void sgm4154x_vbus_plugin(struct sgm4154x_device * sgm)
}
}
#endif
sgm->state.chrg_type = SGM4154x_USB_DCP;
switch(sgm->state.chrg_type) {
case SGM4154x_USB_SDP:
pr_err("SGM4154x charger type: SDP\n");
#ifndef CONFIG_MMI_SGM41513_CHARGER
sgm->real_charger_type = POWER_SUPPLY_TYPE_USB;
#else
ret = mmi_start_bc12_charger_type_detect(sgm, &sgm->real_charger_type);
if (!ret)
return;
#endif
break;
case SGM4154x_USB_CDP:
@ -1999,7 +2098,6 @@ static void sgm4154x_vbus_plugin(struct sgm4154x_device * sgm)
pr_err("SGM4154x charger type: default\n");
return;
}
#endif
schedule_delayed_work(&sgm->charge_monitor_work, 0);

View file

@ -398,6 +398,8 @@ enum mmi_qc3p_ext_iio_channels {
SMB5_QC3P_START_DETECT,
SMB5_QC3P_DETECTION_READY,
SMB5_QC3P_START_POLICY,
SMB5_BC12_START_DETECT,
SMB5_BC12_DETECTION_READY,
};
static const char * const mmi_qc3p_ext_iio_chan_name[] = {
@ -407,6 +409,8 @@ static const char * const mmi_qc3p_ext_iio_chan_name[] = {
[SMB5_QC3P_START_DETECT] = "wt6670_start_detection",
[SMB5_QC3P_DETECTION_READY] "wt6670_detection_ready",
[SMB5_QC3P_START_POLICY] "qc3p_start_policy",
[SMB5_BC12_START_DETECT] = "wt6670_start_bc12_detection",
[SMB5_BC12_DETECTION_READY] = "wt6670_detection_bc12_ready",
};
bool qc3p_update_policy(struct sgm4154x_device *chip);
#endif