charging:Ignore request dpdm

Add interface to set ignore sc89890h and bq25890
 request dpdm in factory mode.

Change-Id: Ie6dcf7990a0a258f6500a735f75d467c46d508b7
Signed-off-by: Guocheng Wang <wanggc6@motorola.com>
Reviewed-on: https://gerrit.mot.com/2264918
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Wei Wei <weiweij@motorola.com>
Reviewed-by: Huosheng Liao <liaohs@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
Guocheng Wang 2022-05-10 19:36:30 +08:00 • committed by wanggc6
commit f298e1bd95

View file

@ -136,6 +136,7 @@ struct bq2589x {
int rsoc;
int chg_en_gpio;
int wls_en_gpio;
bool ignore_request_dpdm;
const char *chg_dev_name;
@ -197,6 +198,8 @@ struct pe_ctrl {
};
static struct pe_ctrl pe;
extern bool mmi_is_factory_mode(void);
static int bq2589x_read_byte(struct bq2589x *bq, u8 *data, u8 reg)
{
int ret;
@ -1418,8 +1421,7 @@ static int bq2589x_parse_dt(struct device *dev, struct bq2589x *bq)
/*wls outout en control*/
bq->wls_en_gpio = of_get_named_gpio(bq->dev->of_node, "mmi,wls-en-gpio", 0);
if (gpio_is_valid(bq->wls_en_gpio))
{
if (gpio_is_valid(bq->wls_en_gpio)) {
ret = gpio_request(bq->wls_en_gpio, "mmi wls en pin");
if (ret) {
dev_err(bq->dev, "%s: %d gpio(wls en) request failed\n", __func__, bq->wls_en_gpio);
@ -1517,6 +1519,10 @@ static bq2589x_reuqest_dpdm(struct bq2589x *bq, bool enable)
{
int ret = 0;
if(mmi_is_factory_mode() && bq->ignore_request_dpdm) {
dev_err(bq->dev, "%s ignore_request_dpdm\n", __func__);
return ret;
}
mutex_lock(&bq->regulator_lock);
/* fetch the DPDM regulator */
if (!bq->dpdm_reg && of_get_property(bq->dev->of_node, "dpdm-supply", NULL)) {
@ -1644,136 +1650,136 @@ static void bq2589x_adjust_absolute_vindpm(struct bq2589x *bq)
#ifndef CONFIG_MMI_QC3P_WT6670_DETECTED
static int mmi_adjust_qc20_hvdcp_5v(struct bq2589x *bq)
{
int ret;
int dp_val, dm_val;
/* dp 0.6v and dm 0v out 5V */
{
int ret;
int dp_val, dm_val;
/* dp 0.6v and dm 0v out 5V */
dm_val = 0x1<<BQ2589X_DM_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DM_VSEL_MASK, dm_val); //dm 0v
if (ret)
return ret;
if (ret)
return ret;
dp_val = 0x2<<BQ2589X_DP_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DP_VSEL_MASK, dp_val); //dp 0.6v
return ret;
return ret;
}
static int mmi_detected_qc20_hvdcp(struct bq2589x *bq, int *charger_type)
{
int ret;
int dp_val, dm_val;
{
int ret;
int dp_val, dm_val;
int vbus_voltage;
/*dp and dm connected,dp 0.6V dm 0.6V*/
/*dp and dm connected,dp 0.6V dm 0.6V*/
dp_val = 0x2<<BQ2589X_DP_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DP_VSEL_MASK, dp_val); //dp 0.6V
if (ret)
return ret;
if (ret)
return ret;
dm_val = 0x2<<BQ2589X_DM_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DM_VSEL_MASK, dm_val); //dm 0.6V
if (ret)
return ret;
msleep(1300);
if (ret)
return ret;
msleep(1300);
dm_val = 0x1<<BQ2589X_DM_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DM_VSEL_MASK, dm_val); //dm 0V
if (ret)
return ret;
mdelay(500);
/* dp 3.3v and dm 0.6v out 9V */
if (ret)
return ret;
mdelay(500);
/* dp 3.3v and dm 0.6v out 9V */
dp_val = 0x6<<BQ2589X_DP_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DP_VSEL_MASK, dp_val); //dp 3.3v
if (ret)
if (ret)
return ret;
dm_val = 0x2<<BQ2589X_DM_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DM_VSEL_MASK, dm_val); //dm 0.6v
if (ret)
return ret;
msleep(200);//need tunning
if (ret)
return ret;
msleep(200);//need tunning
mmi_get_usb_voltage_now(bq, &vbus_voltage);
dev_info(bq->dev, "vbus voltage now = %d\n", vbus_voltage);
if (vbus_voltage > MMI_HVDCP2_VOLTAGE_STANDARD) {
dev_info(bq->dev, "QC20 charger detected\n");
*charger_type = POWER_SUPPLY_TYPE_USB_HVDCP;
} else {
*charger_type = POWER_SUPPLY_TYPE_USB_HVDCP;
} else {
dev_info(bq->dev, "charger type is not HVDCP\n");
}
}
ret = mmi_adjust_qc20_hvdcp_5v(bq);
if (ret) {
if (ret) {
dev_err(bq->dev, "Cann't adjust qc20 hvdcp 5V\n");
}
msleep(300);//need tunning
}
msleep(300);//need tunning
mmi_get_usb_voltage_now(bq, &vbus_voltage);
dev_info(bq->dev, "vbus voltage now = %d after qc20 detected\n", vbus_voltage);
return ret;
return ret;
}
#endif
// Must enter 3.0 mode to call ,otherwise cannot step correctly.
// Must enter 3.0 mode to call ,otherwise cannot step correctly.
static int mmi_qc30_step_up_vbus(struct bq2589x *bq)
{
int ret;
int dp_val;
/* dm 3.3v to dm 0.6v step up 200mV when IC is QC3.0 mode*/
{
int ret;
int dp_val;
/* dm 3.3v to dm 0.6v step up 200mV when IC is QC3.0 mode*/
dp_val = 0x6<<BQ2589X_DP_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DP_VSEL_MASK, dp_val); //dp 3.3v
if (ret)
return ret;
udelay(2500);
if (ret)
return ret;
udelay(2500);
dp_val = 0x2<<BQ2589X_DP_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DP_VSEL_MASK, dp_val); //dp 0.6v
if (ret)
return ret;
udelay(2500);
return ret;
if (ret)
return ret;
udelay(2500);
return ret;
}
// Must enter 3.0 mode to call ,otherwise cannot step correctly.
// Must enter 3.0 mode to call ,otherwise cannot step correctly.
static int mmi_qc30_step_down_vbus(struct bq2589x *bq)
{
int ret;
int dm_val;
/* dp 0.6v and dm 0.6v step down 200mV when IC is QC3.0 mode*/
{
int ret;
int dm_val;
/* dp 0.6v and dm 0.6v step down 200mV when IC is QC3.0 mode*/
dm_val = 0x2<<BQ2589X_DM_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DM_VSEL_MASK, dm_val); //dm 0.6V
if (ret)
return ret;
udelay(2500);
if (ret)
return ret;
udelay(2500);
dm_val = 0x6<<BQ2589X_DM_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DM_VSEL_MASK, dm_val); //dm 3.3v
udelay(2500);
return ret;
udelay(2500);
return ret;
}
#ifndef CONFIG_MMI_QC3P_WT6670_DETECTED
@ -1784,54 +1790,54 @@ static int mmi_qc30_step_down_vbus(struct bq2589x *bq)
#define QC3P_AUTHEN_27W_THR_MV 7200000
#define QC3P_AUTHEN_18W_THR_MV 6200000
static int mmi_detected_qc30_hvdcp(struct bq2589x *bq, int *charger_type)
{
int ret = 0;
int dp_val, dm_val;
int i=0, vbus_voltage;
/* dp 0.6v and dm 3.3v entry QC3.0 mode */
{
int ret = 0;
int dp_val, dm_val;
int i=0, vbus_voltage;
/* dp 0.6v and dm 3.3v entry QC3.0 mode */
dp_val = 0x2<<BQ2589X_DP_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DP_VSEL_MASK, dp_val); //dp 0.6v
if (ret)
return ret;
if (ret)
return ret;
dm_val = 0x6<<BQ2589X_DM_VSEL_SHIFT;
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
BQ2589X_DM_VSEL_MASK, dm_val); //dm 3.3v
if (ret)
return ret;
mdelay(100);
for (i = 0; i < 16; i++) {
if (ret)
return ret;
mdelay(100);
for (i = 0; i < 16; i++) {
ret = mmi_qc30_step_up_vbus(bq);
if (ret)
if (ret)
dev_err(bq->dev, "%s qc30 step up vbus error\n", __func__);
}
mdelay(100);//need tunning
}
mdelay(100);//need tunning
mmi_get_usb_voltage_now(bq, &vbus_voltage);
dev_info(bq->dev, "%s vbus voltage now = %d in detected qc30\n", __func__,vbus_voltage);
if (vbus_voltage > MMI_HVDCP3_VOLTAGE_STANDARD) {
*charger_type = POWER_SUPPLY_TYPE_USB_HVDCP_3;
*charger_type = POWER_SUPPLY_TYPE_USB_HVDCP_3;
dev_info(bq->dev, "%s QC3.0 charger detected\n", __func__);
}
for (i = 0; i < 16; i++) {
}
for (i = 0; i < 16; i++) {
ret = mmi_qc30_step_down_vbus(bq);
if (ret)
if (ret)
dev_err(bq->dev, "%s qc30 step down vbus error\n", __func__);
}
}
#ifndef CONFIG_MMI_QC3P_TURBO_CHARGER
mmi_get_usb_voltage_now(bq, &vbus_voltage);
dev_info(bq->dev, "%s vbus voltage now = %d after detected qc30\n", __func__,vbus_voltage);
#endif
return ret;
return ret;
}
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
@ -2617,6 +2623,14 @@ static int mmi_set_dp_dm(struct charger_device *chg_dev, int val)
dev_dbg(bq->dev, "DP_DM_DM_PULSE rc=%d cnt=%d\n",
rc, bq->pulse_cnt);
break;
case MMI_POWER_SUPPLY_IGNORE_REQUEST_DPDM:
bq->ignore_request_dpdm = true;
dev_err(bq->dev, "MMI_POWER_SUPPLY_IGNORE_REQUEST_DPDM\n");
break;
case MMI_POWER_SUPPLY_DONOT_IGNORE_REQUEST_DPDM:
bq->ignore_request_dpdm = false;
dev_err(bq->dev, "MMI_POWER_SUPPLY_DONOT_IGNORE_REQUEST_DPDM\n");
break;
default:
break;
}
@ -2850,17 +2864,19 @@ static int bq2589x_charger_probe(struct i2c_client *client,
bq->client = client;
i2c_set_clientdata(client, bq);
bq->ignore_request_dpdm = false;
ret = bq2589x_detect_device(bq);
if (!ret && bq->part_no == BQ25890) {
bq->status |= BQ2589X_STATUS_EXIST;
dev_info(dev, "%s: charger device bq25890 detected, revision:%d\n", __func__, bq->revision);
} else if (!ret && bq->part_no == SC89890H) {
bq->status |= BQ2589X_STATUS_EXIST;
dev_info(dev, "%s: charger device sc89890h detected, revision:%d\n", __func__, bq->revision);
} else {
dev_info(dev, "%s: no bq25890 charger device found:%d\n", __func__, ret);
return -ENODEV;
}
if (!ret && bq->part_no == BQ25890) {
bq->status |= BQ2589X_STATUS_EXIST;
dev_info(dev, "%s: charger device bq25890 detected, revision:%d\n", __func__, bq->revision);
} else if (!ret && bq->part_no == SC89890H) {
bq->status |= BQ2589X_STATUS_EXIST;
dev_info(dev, "%s: charger device sc89890h detected, revision:%d\n", __func__, bq->revision);
} else {
dev_info(dev, "%s: no bq25890 charger device found:%d\n", __func__, ret);
return -ENODEV;
}
bq->batt_psy = power_supply_get_by_name("bms");