mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-12 07:37:31 -04:00
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:
parent
3aa525eb21
commit
f298e1bd95
1 changed files with 130 additions and 114 deletions
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue