mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-08 12:58:12 -04:00
charging: add qc3p sw detected for sc89890H
add qc3p sw detected for sc89890H Change-Id: I3515a64af3e13861d7187aaf6ee95f1238a86e25 Signed-off-by: mahj8 <mahj8@motorola.com> Reviewed-on: https://gerrit.mot.com/2175557 Reviewed-by: Huosheng Liao <liaohs@motorola.com> SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Submit-Approved: Jira Key
This commit is contained in:
parent
53d7fd804a
commit
5893fcdb8d
4 changed files with 175 additions and 22 deletions
|
|
@ -9,6 +9,10 @@ ifeq ($(MMI_QC3P_TURBO_CHARGER),true)
|
|||
KERNEL_CFLAGS += CONFIG_MMI_QC3P_TURBO_CHARGER=y
|
||||
endif
|
||||
|
||||
ifeq ($(MMI_QC3P_WT6670_DETECTED),true)
|
||||
KERNEL_CFLAGS += CONFIG_MMI_QC3P_WT6670_DETECTED=y
|
||||
endif
|
||||
|
||||
LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT)
|
||||
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(KERNEL_MODULES_OUT)/mmi_discrete_charger_class.ko
|
||||
|
|
|
|||
|
|
@ -9,4 +9,8 @@ ifneq ($(filter m y,$(CONFIG_MMI_QC3P_TURBO_CHARGER)),)
|
|||
EXTRA_CFLAGS += -DCONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
endif
|
||||
|
||||
ifneq ($(filter m y,$(CONFIG_MMI_QC3P_WT6670_DETECTED)),)
|
||||
EXTRA_CFLAGS += -DCONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
endif
|
||||
|
||||
KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../mmi_discrete_charger/$(GKI_OBJ_MODULE_DIR)/Module.symvers
|
||||
|
|
|
|||
|
|
@ -43,10 +43,7 @@
|
|||
|
||||
static struct bq2589x *g_bq;
|
||||
static DEFINE_MUTEX(bq2589x_i2c_lock);
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
static bool g_qc3p_detected = false;
|
||||
bool qc3p_update_policy(struct bq2589x *chip);
|
||||
#endif
|
||||
|
||||
#define MMI_HVDCP2_VOLTAGE_STANDARD 8000000
|
||||
#define MMI_HVDCP3_VOLTAGE_STANDARD 7500000
|
||||
#define MMI_HVDCP_DETECT_ICL_LIMIT 500
|
||||
|
|
@ -57,6 +54,13 @@ enum {
|
|||
MMI_POWER_SUPPLY_DP_DM_DM_PULSE = 2,
|
||||
};
|
||||
|
||||
enum mmi_qc3p_power {
|
||||
MMI_POWER_SUPPLY_QC3P_NONE,
|
||||
MMI_POWER_SUPPLY_QC3P_18W,
|
||||
MMI_POWER_SUPPLY_QC3P_27W,
|
||||
MMI_POWER_SUPPLY_QC3P_45W,
|
||||
};
|
||||
|
||||
struct bq2589x_iio {
|
||||
struct iio_channel *usbin_v_chan;
|
||||
};
|
||||
|
|
@ -175,8 +179,13 @@ struct bq2589x {
|
|||
bool mmi_is_qc3_authen;
|
||||
u32 input_current_cache;
|
||||
int pulse_cnt;
|
||||
|
||||
/*mmi qc3p*/
|
||||
bool mmi_qc3p_rerun_done;
|
||||
int mmi_qc3p_power;
|
||||
|
||||
struct bq2589x_iio iio;
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
#ifdef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
struct iio_channel **ext_iio_chans;
|
||||
#endif
|
||||
};
|
||||
|
|
@ -669,7 +678,6 @@ int bq2589x_get_hiz_mode(struct bq2589x *bq, u8 *state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
int bq2589x_is_enabled_charging(struct charger_device *chg_dev, bool *en)
|
||||
{
|
||||
u8 val;
|
||||
|
|
@ -683,7 +691,6 @@ int bq2589x_is_enabled_charging(struct charger_device *chg_dev, bool *en)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int bq2589x_pumpx_enable(struct bq2589x *bq, int enable)
|
||||
{
|
||||
|
|
@ -1629,7 +1636,7 @@ static void bq2589x_adjust_absolute_vindpm(struct bq2589x *bq)
|
|||
|
||||
}
|
||||
|
||||
#ifndef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
#ifndef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
static int mmi_adjust_qc20_hvdcp_5v(struct bq2589x *bq)
|
||||
{
|
||||
int ret;
|
||||
|
|
@ -1763,7 +1770,13 @@ static int mmi_qc30_step_down_vbus(struct bq2589x *bq)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
#ifndef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
#define QC3P_AUTHEN_LOW_THR_MV 5500000
|
||||
#define QC3P_AUTHEN_HIGH_THR_MV 6500000
|
||||
#define QC3P_AUTHEN_NONE_THR_MV 9200000
|
||||
#define QC3P_AUTHEN_45W_THR_MV 8200000
|
||||
#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;
|
||||
|
|
@ -1806,15 +1819,127 @@ static int mmi_detected_qc30_hvdcp(struct bq2589x *bq, int *charger_type)
|
|||
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;
|
||||
}
|
||||
|
||||
static int bq2589x_detected_qc3p_hvdcp(struct bq2589x *bq, int *charger_type)
|
||||
{
|
||||
int ret = 0;
|
||||
int dp_val, dm_val;
|
||||
int i=0, vbus_voltage;
|
||||
|
||||
mdelay(100);//need tunning
|
||||
|
||||
mmi_get_usb_voltage_now(bq, &vbus_voltage);
|
||||
|
||||
if (vbus_voltage < QC3P_AUTHEN_LOW_THR_MV
|
||||
|| vbus_voltage > QC3P_AUTHEN_HIGH_THR_MV) {
|
||||
bq->mmi_qc3p_power = MMI_POWER_SUPPLY_QC3P_NONE;
|
||||
/*do qc3p rerun*/
|
||||
dev_err(bq->dev, "qc3p voltage is invalid, rerun qc3p detect\n");
|
||||
if (!bq->mmi_qc3p_rerun_done) {
|
||||
bq->mmi_qc3p_rerun_done = true;
|
||||
dp_val = 0x0<<BQ2589X_DP_VSEL_SHIFT;
|
||||
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
|
||||
BQ2589X_DP_VSEL_MASK, dp_val); //dp HIZ
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dm_val = 0x0<<BQ2589X_DM_VSEL_SHIFT;
|
||||
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
|
||||
BQ2589X_DM_VSEL_MASK, dm_val); //dm HIZ
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
msleep(30);//need tunning
|
||||
|
||||
bq2589x_rerun_apsd_if_required(bq);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0;i < 3; i++) {
|
||||
ret = mmi_qc30_step_up_vbus(bq);
|
||||
if (ret)
|
||||
dev_err(bq->dev, "%s qc3p step up vbus error\n", __func__);
|
||||
|
||||
ret = mmi_qc30_step_down_vbus(bq);
|
||||
if (ret)
|
||||
dev_err(bq->dev, "%s qc3p step down vbus error\n", __func__);
|
||||
|
||||
}
|
||||
|
||||
mdelay(30);//need tuning
|
||||
|
||||
mmi_get_usb_voltage_now(bq, &vbus_voltage);
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
ret = mmi_qc30_step_up_vbus(bq);
|
||||
if (ret)
|
||||
dev_err(bq->dev, "%s qc3p step up vbus error\n", __func__);
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
ret = mmi_qc30_step_down_vbus(bq);
|
||||
if (ret)
|
||||
dev_err(bq->dev, "%s qc3p step down vbus error\n", __func__);
|
||||
}
|
||||
|
||||
msleep(30);
|
||||
|
||||
dev_info(bq->dev, "%s vbus voltage now = %d after detected qc3p\n", __func__,vbus_voltage);
|
||||
|
||||
if (vbus_voltage > QC3P_AUTHEN_NONE_THR_MV)
|
||||
bq->mmi_qc3p_power = MMI_POWER_SUPPLY_QC3P_NONE;
|
||||
else if (vbus_voltage > QC3P_AUTHEN_45W_THR_MV)
|
||||
bq->mmi_qc3p_power = MMI_POWER_SUPPLY_QC3P_45W;
|
||||
else if (vbus_voltage > QC3P_AUTHEN_27W_THR_MV)
|
||||
bq->mmi_qc3p_power = MMI_POWER_SUPPLY_QC3P_27W;
|
||||
else if (vbus_voltage > QC3P_AUTHEN_18W_THR_MV)
|
||||
bq->mmi_qc3p_power = MMI_POWER_SUPPLY_QC3P_18W;
|
||||
else
|
||||
bq->mmi_qc3p_power = MMI_POWER_SUPPLY_QC3P_NONE;
|
||||
|
||||
if (bq->mmi_qc3p_power != MMI_POWER_SUPPLY_QC3P_NONE) {
|
||||
*charger_type = POWER_SUPPLY_TYPE_USB_HVDCP_3P5;
|
||||
dev_info(bq->dev, "%s detected qc3p, qc3p power = %d\n",
|
||||
__func__,bq->mmi_qc3p_power);
|
||||
} else {
|
||||
dev_err(bq->dev, "qc3p power is invalid, rerun qc3p detect\n");
|
||||
//do rerun qc3p
|
||||
if (!bq->mmi_qc3p_rerun_done) {
|
||||
bq->mmi_qc3p_rerun_done = true;
|
||||
dp_val = 0x0<<BQ2589X_DP_VSEL_SHIFT;
|
||||
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
|
||||
BQ2589X_DP_VSEL_MASK, dp_val); //dp HIZ
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dm_val = 0x0<<BQ2589X_DM_VSEL_SHIFT;
|
||||
ret = bq2589x_update_bits(bq, BQ2589X_REG_01,
|
||||
BQ2589X_DM_VSEL_MASK, dm_val); //dm HIZ
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
msleep(30);//need tunning
|
||||
|
||||
bq2589x_rerun_apsd_if_required(bq);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
#ifdef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
bool is_chan_valid(struct bq2589x *chip,
|
||||
enum mmi_qc3p_ext_iio_channels chan)
|
||||
{
|
||||
|
|
@ -1977,7 +2102,7 @@ static int mmi_hvdcp_detect_kthread(void *param)
|
|||
bq->mmi_is_qc3_authen = true;
|
||||
bq2589x_set_input_current_limit(bq, MMI_HVDCP_DETECT_ICL_LIMIT);
|
||||
|
||||
#ifndef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
#ifndef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
//do qc2.0 detected
|
||||
ret = mmi_detected_qc20_hvdcp(bq, &charger_type);
|
||||
if (ret) {
|
||||
|
|
@ -1993,6 +2118,17 @@ static int mmi_hvdcp_detect_kthread(void *param)
|
|||
if (ret) {
|
||||
dev_err(bq->dev, "Cann't detected qc30 hvdcp\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
//do qc3p detected
|
||||
if (charger_type == POWER_SUPPLY_TYPE_USB_HVDCP_3) {
|
||||
ret = bq2589x_detected_qc3p_hvdcp(bq, &charger_type);
|
||||
if (ret) {
|
||||
dev_err(bq->dev, "Cann't detected qc3p hvdcp\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
bq2589x_enable_termination(bq->chg_dev, true);
|
||||
qc3p_start_detection(bq);
|
||||
|
|
@ -2013,7 +2149,6 @@ static int mmi_hvdcp_detect_kthread(void *param)
|
|||
dev_err(bq->dev, "QC3P 27W have been detected !\n");
|
||||
charger_type = POWER_SUPPLY_TYPE_USB_HVDCP_3P5;
|
||||
qc3p_update_policy(bq);
|
||||
g_qc3p_detected = true;
|
||||
break;
|
||||
default:
|
||||
dev_info(bq->dev, "No HDVCP detected\n");
|
||||
|
|
@ -2084,9 +2219,6 @@ static void bq2589x_adapter_in_func(struct bq2589x *bq)
|
|||
case BQ2589X_VBUS_USB_DCP:
|
||||
dev_info(bq->dev, "%s:DCP adapter plugged in\n", __func__);
|
||||
bq->real_charger_type = POWER_SUPPLY_TYPE_USB_DCP;
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
if(g_qc3p_detected == false)
|
||||
#endif
|
||||
mmi_start_hvdcp_detect(bq);
|
||||
schedule_delayed_work(&bq->check_pe_tuneup_work, 0);
|
||||
break;
|
||||
|
|
@ -2141,14 +2273,17 @@ static void bq2589x_adapter_out_func(struct bq2589x *bq)
|
|||
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
bq2589x_enable_termination(bq->chg_dev, true);
|
||||
g_qc3p_detected = false;
|
||||
#ifdef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
qc3p_update_policy(bq);
|
||||
#endif
|
||||
#endif
|
||||
bq->pulse_cnt = 0;
|
||||
bq->mmi_qc3p_rerun_done = false;
|
||||
bq->typec_apsd_rerun_done = false;
|
||||
bq->chg_dev->noti.apsd_done = false;
|
||||
bq->chg_dev->noti.hvdcp_done = false;
|
||||
bq->real_charger_type = POWER_SUPPLY_TYPE_UNKNOWN;
|
||||
bq->mmi_qc3p_power = MMI_POWER_SUPPLY_QC3P_NONE;
|
||||
bq2589x_reuqest_dpdm(bq, false);
|
||||
charger_dev_notify(bq->chg_dev);
|
||||
}
|
||||
|
|
@ -2420,6 +2555,15 @@ static irqreturn_t bq2589x_charger_interrupt(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int mmi_get_qc3p_power(struct charger_device *chg_dev, int *qc3p_power)
|
||||
{
|
||||
struct bq2589x *bq = dev_get_drvdata(&chg_dev->dev);
|
||||
|
||||
*qc3p_power = bq->mmi_qc3p_power;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mmi_get_pulse_cnt(struct charger_device *chg_dev, int *count)
|
||||
{
|
||||
struct bq2589x *bq = dev_get_drvdata(&chg_dev->dev);
|
||||
|
|
@ -2654,10 +2798,9 @@ static struct charger_ops bq2589x_chg_ops = {
|
|||
.is_charge_halted = bq2589x_is_charging_halted,
|
||||
|
||||
.dump_registers = bq2589x_dump_registers,
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
.is_enabled_charging = bq2589x_is_enabled_charging,
|
||||
.enable_termination = bq2589x_enable_termination,
|
||||
#endif
|
||||
.get_qc3p_power = mmi_get_qc3p_power,
|
||||
};
|
||||
|
||||
static int bq2589x_charger_probe(struct i2c_client *client,
|
||||
|
|
@ -2772,7 +2915,8 @@ static int bq2589x_charger_probe(struct i2c_client *client,
|
|||
ret = bq2589x_set_recharge_volt(bq, 100);//100mv
|
||||
if (ret)
|
||||
goto err_0;
|
||||
|
||||
#endif
|
||||
#ifdef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
ret = mmi_init_iio_psy(bq, dev);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@
|
|||
#define BQ2589X_DEV_REV_SHIFT 0
|
||||
|
||||
|
||||
#ifdef CONFIG_MMI_QC3P_TURBO_CHARGER
|
||||
#ifdef CONFIG_MMI_QC3P_WT6670_DETECTED
|
||||
enum WT_charger_type{
|
||||
WT_CHG_TYPE_BEGIN = 0,
|
||||
WT_CHG_TYPE_FC,
|
||||
|
|
@ -412,5 +412,6 @@ static const char * const mmi_qc3p_ext_iio_chan_name[] = {
|
|||
[SMB5_QC3P_DETECTION_READY] "wt6670_detection_ready",
|
||||
[SMB5_QC3P_START_POLICY] "qc3p_start_policy",
|
||||
};
|
||||
bool qc3p_update_policy(struct bq2589x *chip);
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue