From aecb04a1c3eb82994feb9a1ef43256075f19985c Mon Sep 17 00:00:00 2001 From: Abhijeet Dharmapurikar Date: Tue, 23 Aug 2016 11:54:12 -0700 Subject: [PATCH 1/2] smb138x: fix WD bite Commit 85635da429d67f9fdf1e ("qcom-charger: smb138x: fix buck damage on v1.1 hardware") introduced wa_flags as the first member in the struct. However there are implict assumptions in the driver that the first member is the library structure. This causes memory corruption and an eventual watch dog bite reset. Fix it by ensuring that the library struct is explicitly initialized from the parent struct. CRs-Fixed: 1055113 Change-Id: I38474a228ec7b245dc330b4a37847c9f1bf29c2a Signed-off-by: Abhijeet Dharmapurikar --- drivers/power/qcom-charger/smb138x-charger.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/power/qcom-charger/smb138x-charger.c b/drivers/power/qcom-charger/smb138x-charger.c index 329ee7210c1f..54cd5c158411 100644 --- a/drivers/power/qcom-charger/smb138x-charger.c +++ b/drivers/power/qcom-charger/smb138x-charger.c @@ -77,10 +77,10 @@ struct smb_dt_props { }; struct smb138x { - u32 wa_flags; struct smb_charger chg; struct smb_dt_props dt; struct power_supply *parallel_psy; + u32 wa_flags; }; static int __debug_mask; @@ -269,7 +269,8 @@ static int smb138x_batt_get_prop(struct power_supply *psy, enum power_supply_property prop, union power_supply_propval *val) { - struct smb_charger *chg = power_supply_get_drvdata(psy); + struct smb138x *chip = power_supply_get_drvdata(psy); + struct smb_charger *chg = &chip->chg; int rc = 0; switch (prop) { @@ -304,7 +305,8 @@ static int smb138x_batt_set_prop(struct power_supply *psy, enum power_supply_property prop, const union power_supply_propval *val) { - struct smb_charger *chg = power_supply_get_drvdata(psy); + struct smb138x *chip = power_supply_get_drvdata(psy); + struct smb_charger *chg = &chip->chg; int rc = 0; switch (prop) { @@ -378,7 +380,8 @@ static int smb138x_parallel_get_prop(struct power_supply *psy, enum power_supply_property prop, union power_supply_propval *val) { - struct smb_charger *chg = power_supply_get_drvdata(psy); + struct smb138x *chip = power_supply_get_drvdata(psy); + struct smb_charger *chg = &chip->chg; int rc = 0; u8 temp; @@ -418,7 +421,8 @@ static int smb138x_parallel_set_prop(struct power_supply *psy, enum power_supply_property prop, const union power_supply_propval *val) { - struct smb_charger *chg = power_supply_get_drvdata(psy); + struct smb138x *chip = power_supply_get_drvdata(psy); + struct smb_charger *chg = &chip->chg; int rc = 0; switch (prop) { From c56229417c0aad311618ccf128849ce73a4ce3e9 Mon Sep 17 00:00:00 2001 From: Abhijeet Dharmapurikar Date: Thu, 18 Aug 2016 14:45:59 -0700 Subject: [PATCH 2/2] qcom-charger: smb138x: fix buck damage on v1.1 hardware Buck damage was seen to go away once the dead time were increased in addition to increasing the OOB comparator threshold. CRs-Fixed: 1055113 Change-Id: I8979d203fc7c35ec23e23874c8dd8f980a1cc619 Signed-off-by: Abhijeet Dharmapurikar --- drivers/power/qcom-charger/smb138x-charger.c | 22 +++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/power/qcom-charger/smb138x-charger.c b/drivers/power/qcom-charger/smb138x-charger.c index 54cd5c158411..c77204482553 100644 --- a/drivers/power/qcom-charger/smb138x-charger.c +++ b/drivers/power/qcom-charger/smb138x-charger.c @@ -32,7 +32,11 @@ /* Registers that are not common to be mentioned in smb-reg.h */ #define SMB2CHG_MISC_ENG_SDCDC_CFG2 (MISC_BASE + 0xC1) -#define ENG_SDCDC_SEL_OOB_VTH_BIT BIT(0) +#define ENG_SDCDC_SEL_OOB_VTH_BIT BIT(0) + +#define SMB2CHG_MISC_ENG_SDCDC_CFG6 (MISC_BASE + 0xC5) +#define DEAD_TIME_MASK GENMASK(7, 4) +#define HIGH_DEAD_TIME_MASK GENMASK(7, 4) enum { OOB_COMP_WA_BIT = BIT(0), @@ -648,6 +652,14 @@ static int smb138x_init_hw(struct smb138x *chip) "Couldn't configure the oob comp threh rc = %d\n", rc); return rc; } + + rc = smblib_masked_write(chg, SMB2CHG_MISC_ENG_SDCDC_CFG6, + DEAD_TIME_MASK, HIGH_DEAD_TIME_MASK); + if (rc < 0) { + dev_err(chg->dev, + "Couldn't configure the sdcdc cfg 6 reg rc = %d\n", rc); + return rc; + } } return rc; @@ -927,6 +939,14 @@ static int smb138x_slave_probe(struct smb138x *chip) "Couldn't configure the oob comp threh rc = %d\n", rc); return rc; } + + rc = smblib_masked_write(chg, SMB2CHG_MISC_ENG_SDCDC_CFG6, + DEAD_TIME_MASK, HIGH_DEAD_TIME_MASK); + if (rc < 0) { + dev_err(chg->dev, + "Couldn't configure the sdcdc cfg 6 reg rc = %d\n", rc); + return rc; + } } /* suspend usb input */