From 5893fcdb8d04fe98b49b78f398a7c7f2e92bc9b0 Mon Sep 17 00:00:00 2001 From: mahj8 Date: Thu, 20 Jan 2022 18:21:45 +0800 Subject: [PATCH] charging: add qc3p sw detected for sc89890H add qc3p sw detected for sc89890H Change-Id: I3515a64af3e13861d7187aaf6ee95f1238a86e25 Signed-off-by: mahj8 Reviewed-on: https://gerrit.mot.com/2175557 Reviewed-by: Huosheng Liao SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Submit-Approved: Jira Key --- drivers/power/bq2589x_chg_mmi/Android.mk | 4 + drivers/power/bq2589x_chg_mmi/Kbuild | 4 + .../power/bq2589x_chg_mmi/bq2589x_charger.c | 186 ++++++++++++++++-- drivers/power/bq2589x_chg_mmi/bq2589x_reg.h | 3 +- 4 files changed, 175 insertions(+), 22 deletions(-) diff --git a/drivers/power/bq2589x_chg_mmi/Android.mk b/drivers/power/bq2589x_chg_mmi/Android.mk index f1741a0e7660..7173c89798ca 100644 --- a/drivers/power/bq2589x_chg_mmi/Android.mk +++ b/drivers/power/bq2589x_chg_mmi/Android.mk @@ -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 diff --git a/drivers/power/bq2589x_chg_mmi/Kbuild b/drivers/power/bq2589x_chg_mmi/Kbuild index a5aa81a0ed7e..a82c06f61d9d 100644 --- a/drivers/power/bq2589x_chg_mmi/Kbuild +++ b/drivers/power/bq2589x_chg_mmi/Kbuild @@ -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 diff --git a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c index e3ecb3dc2a37..ba3444d4487a 100644 --- a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c +++ b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c @@ -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<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<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, diff --git a/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h b/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h index 961fe1529162..3d5e2e290289 100644 --- a/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h +++ b/drivers/power/bq2589x_chg_mmi/bq2589x_reg.h @@ -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