From 49ca45badc6aac637e0a1312d801ec1c50727e6f Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Tue, 13 Dec 2011 15:14:35 +0530 Subject: [PATCH] mfd: pmic8058: Remove reset_pwr_off, smpl control and WD reset control APIs These APIs are implemented as a part of pm8xxx_reset_power_off, pm8xxx_smpl_*, pm8xxx_watchdog_reset_control APIs in the pm8xxx-misc driver. Change-Id: I8eaf83e0c4d3551d16ecc7fc94c62514711b9a7d Signed-off-by: Anirudh Ghayal --- drivers/mfd/pmic8058.c | 379 ----------------------------------- include/linux/mfd/pmic8058.h | 45 ----- 2 files changed, 424 deletions(-) diff --git a/drivers/mfd/pmic8058.c b/drivers/mfd/pmic8058.c index ae721e44cca..7c56dd6b385 100644 --- a/drivers/mfd/pmic8058.c +++ b/drivers/mfd/pmic8058.c @@ -42,15 +42,6 @@ #define REG_TEMP_ALRM_CTRL 0x1B #define REG_TEMP_ALRM_PWM 0x9B -/* PON CNTL 1 register */ -#define SSBI_REG_ADDR_PON_CNTL_1 0x01C - -#define PM8058_PON_PUP_MASK 0xF0 - -#define PM8058_PON_WD_EN_MASK 0x08 -#define PM8058_PON_WD_EN_RESET 0x08 -#define PM8058_PON_WD_EN_PWR_OFF 0x00 - /* PON CNTL 4 register */ #define SSBI_REG_ADDR_PON_CNTL_4 0x98 #define PM8058_PON_RESET_EN_MASK 0x01 @@ -59,60 +50,6 @@ #define SSBI_REG_ADDR_PON_CNTL_5 0x7B #define PM8058_HARD_RESET_EN_MASK 0x08 -/* Regulator master enable addresses */ -#define SSBI_REG_ADDR_VREG_EN_MSM 0x018 -#define SSBI_REG_ADDR_VREG_EN_GRP_5_4 0x1C8 - -/* Regulator control registers for shutdown/reset */ -#define SSBI_REG_ADDR_S0_CTRL 0x004 -#define SSBI_REG_ADDR_S1_CTRL 0x005 -#define SSBI_REG_ADDR_S3_CTRL 0x111 -#define SSBI_REG_ADDR_L21_CTRL 0x120 -#define SSBI_REG_ADDR_L22_CTRL 0x121 - -#define REGULATOR_ENABLE_MASK 0x80 -#define REGULATOR_ENABLE 0x80 -#define REGULATOR_DISABLE 0x00 -#define REGULATOR_PULL_DOWN_MASK 0x40 -#define REGULATOR_PULL_DOWN_EN 0x40 -#define REGULATOR_PULL_DOWN_DIS 0x00 - -/* Buck CTRL register */ -#define SMPS_LEGACY_VREF_SEL 0x20 -#define SMPS_LEGACY_VPROG_MASK 0x1F -#define SMPS_ADVANCED_BAND_MASK 0xC0 -#define SMPS_ADVANCED_BAND_SHIFT 6 -#define SMPS_ADVANCED_VPROG_MASK 0x3F - -/* Buck TEST2 registers for shutdown/reset */ -#define SSBI_REG_ADDR_S0_TEST2 0x084 -#define SSBI_REG_ADDR_S1_TEST2 0x085 -#define SSBI_REG_ADDR_S3_TEST2 0x11A - -#define REGULATOR_BANK_WRITE 0x80 -#define REGULATOR_BANK_MASK 0x70 -#define REGULATOR_BANK_SHIFT 4 -#define REGULATOR_BANK_SEL(n) ((n) << REGULATOR_BANK_SHIFT) - -/* Buck TEST2 register bank 1 */ -#define SMPS_LEGACY_VLOW_SEL 0x01 - -/* Buck TEST2 register bank 7 */ -#define SMPS_ADVANCED_MODE_MASK 0x02 -#define SMPS_ADVANCED_MODE 0x02 -#define SMPS_LEGACY_MODE 0x00 - -/* SLEEP CNTL register */ -#define SSBI_REG_ADDR_SLEEP_CNTL 0x02B - -#define PM8058_SLEEP_SMPL_EN_MASK 0x04 -#define PM8058_SLEEP_SMPL_EN_RESET 0x04 -#define PM8058_SLEEP_SMPL_EN_PWR_OFF 0x00 - -#define PM8058_SLEEP_SMPL_SEL_MASK 0x03 -#define PM8058_SLEEP_SMPL_SEL_MIN 0 -#define PM8058_SLEEP_SMPL_SEL_MAX 3 - /* GP_TEST1 register */ #define SSBI_REG_ADDR_GP_TEST_1 0x07A @@ -154,322 +91,6 @@ ssbi_write(struct device *dev, u16 addr, u8 *buf, size_t len) return msm_ssbi_write(dev->parent, addr, buf, len); } -static int pm8058_masked_write(u16 addr, u8 val, u8 mask) -{ - int rc; - u8 reg; - - if (pmic_chip == NULL) - return -ENODEV; - - rc = ssbi_read(pmic_chip->dev, addr, ®, 1); - if (rc) { - pr_err("%s: ssbi_read(0x%03X) failed: rc=%d\n", __func__, addr, - rc); - goto done; - } - - reg &= ~mask; - reg |= val & mask; - - rc = ssbi_write(pmic_chip->dev, addr, ®, 1); - if (rc) - pr_err("%s: ssbi_write(0x%03X)=0x%02X failed: rc=%d\n", - __func__, addr, reg, rc); -done: - return rc; -} - -/** - * pm8058_smpl_control - enables/disables SMPL detection - * @enable: 0 = shutdown PMIC on power loss, 1 = reset PMIC on power loss - * - * This function enables or disables the Sudden Momentary Power Loss detection - * module. If SMPL detection is enabled, then when a sufficiently long power - * loss event occurs, the PMIC will automatically reset itself. If SMPL - * detection is disabled, then the PMIC will shutdown when power loss occurs. - * - * RETURNS: an appropriate -ERRNO error value on error, or zero for success. - */ -int pm8058_smpl_control(int enable) -{ - return pm8058_masked_write(SSBI_REG_ADDR_SLEEP_CNTL, - (enable ? PM8058_SLEEP_SMPL_EN_RESET - : PM8058_SLEEP_SMPL_EN_PWR_OFF), - PM8058_SLEEP_SMPL_EN_MASK); -} -EXPORT_SYMBOL(pm8058_smpl_control); - -/** - * pm8058_smpl_set_delay - sets the SMPL detection time delay - * @delay: enum value corresponding to delay time - * - * This function sets the time delay of the SMPL detection module. If power - * is reapplied within this interval, then the PMIC reset automatically. The - * SMPL detection module must be enabled for this delay time to take effect. - * - * RETURNS: an appropriate -ERRNO error value on error, or zero for success. - */ -int pm8058_smpl_set_delay(enum pm8058_smpl_delay delay) -{ - if (delay < PM8058_SLEEP_SMPL_SEL_MIN - || delay > PM8058_SLEEP_SMPL_SEL_MAX) { - pr_err("%s: invalid delay specified: %d\n", __func__, delay); - return -EINVAL; - } - - return pm8058_masked_write(SSBI_REG_ADDR_SLEEP_CNTL, delay, - PM8058_SLEEP_SMPL_SEL_MASK); -} -EXPORT_SYMBOL(pm8058_smpl_set_delay); - -/** - * pm8058_watchdog_reset_control - enables/disables watchdog reset detection - * @enable: 0 = shutdown when PS_HOLD goes low, 1 = reset when PS_HOLD goes low - * - * This function enables or disables the PMIC watchdog reset detection feature. - * If watchdog reset detection is enabled, then the PMIC will reset itself - * when PS_HOLD goes low. If it is not enabled, then the PMIC will shutdown - * when PS_HOLD goes low. - * - * RETURNS: an appropriate -ERRNO error value on error, or zero for success. - */ -int pm8058_watchdog_reset_control(int enable) -{ - return pm8058_masked_write(SSBI_REG_ADDR_PON_CNTL_1, - (enable ? PM8058_PON_WD_EN_RESET - : PM8058_PON_WD_EN_PWR_OFF), - PM8058_PON_WD_EN_MASK); -} -EXPORT_SYMBOL(pm8058_watchdog_reset_control); - -/* - * Set an SMPS regulator to be disabled in its CTRL register, but enabled - * in the master enable register. Also set it's pull down enable bit. - * Take care to make sure that the output voltage doesn't change if switching - * from advanced mode to legacy mode. - */ -static int disable_smps_locally_set_pull_down(u16 ctrl_addr, u16 test2_addr, - u16 master_enable_addr, u8 master_enable_bit) -{ - int rc = 0; - u8 vref_sel, vlow_sel, band, vprog, bank, reg; - - if (pmic_chip == NULL) - return -ENODEV; - - bank = REGULATOR_BANK_SEL(7); - rc = ssbi_write(pmic_chip->dev, test2_addr, &bank, 1); - if (rc) { - pr_err("%s: FAIL ssbi_write(0x%03X): rc=%d\n", __func__, - test2_addr, rc); - goto done; - } - - rc = ssbi_read(pmic_chip->dev, test2_addr, ®, 1); - if (rc) { - pr_err("%s: FAIL pm8058_read(0x%03X): rc=%d\n", - __func__, test2_addr, rc); - goto done; - } - - /* Check if in advanced mode. */ - if ((reg & SMPS_ADVANCED_MODE_MASK) == SMPS_ADVANCED_MODE) { - /* Determine current output voltage. */ - rc = ssbi_read(pmic_chip->dev, ctrl_addr, ®, 1); - if (rc) { - pr_err("%s: FAIL pm8058_read(0x%03X): rc=%d\n", - __func__, ctrl_addr, rc); - goto done; - } - - band = (reg & SMPS_ADVANCED_BAND_MASK) - >> SMPS_ADVANCED_BAND_SHIFT; - switch (band) { - case 3: - vref_sel = 0; - vlow_sel = 0; - break; - case 2: - vref_sel = SMPS_LEGACY_VREF_SEL; - vlow_sel = 0; - break; - case 1: - vref_sel = SMPS_LEGACY_VREF_SEL; - vlow_sel = SMPS_LEGACY_VLOW_SEL; - break; - default: - pr_err("%s: regulator already disabled\n", __func__); - return -EPERM; - } - vprog = (reg & SMPS_ADVANCED_VPROG_MASK); - /* Round up if fine step is in use. */ - vprog = (vprog + 1) >> 1; - if (vprog > SMPS_LEGACY_VPROG_MASK) - vprog = SMPS_LEGACY_VPROG_MASK; - - /* Set VLOW_SEL bit. */ - bank = REGULATOR_BANK_SEL(1); - rc = ssbi_write(pmic_chip->dev, test2_addr, &bank, 1); - if (rc) { - pr_err("%s: FAIL ssbi_write(0x%03X): rc=%d\n", - __func__, test2_addr, rc); - goto done; - } - rc = pm8058_masked_write(test2_addr, - REGULATOR_BANK_WRITE | REGULATOR_BANK_SEL(1) - | vlow_sel, - REGULATOR_BANK_WRITE | REGULATOR_BANK_MASK - | SMPS_LEGACY_VLOW_SEL); - if (rc) - goto done; - - /* Switch to legacy mode */ - bank = REGULATOR_BANK_SEL(7); - rc = ssbi_write(pmic_chip->dev, test2_addr, &bank, 1); - if (rc) { - pr_err("%s: FAIL ssbi_write(0x%03X): rc=%d\n", __func__, - test2_addr, rc); - goto done; - } - rc = pm8058_masked_write(test2_addr, - REGULATOR_BANK_WRITE | REGULATOR_BANK_SEL(7) - | SMPS_LEGACY_MODE, - REGULATOR_BANK_WRITE | REGULATOR_BANK_MASK - | SMPS_ADVANCED_MODE_MASK); - if (rc) - goto done; - - /* Enable locally, enable pull down, keep voltage the same. */ - rc = pm8058_masked_write(ctrl_addr, - REGULATOR_ENABLE | REGULATOR_PULL_DOWN_EN - | vref_sel | vprog, - REGULATOR_ENABLE_MASK | REGULATOR_PULL_DOWN_MASK - | SMPS_LEGACY_VREF_SEL | SMPS_LEGACY_VPROG_MASK); - if (rc) - goto done; - } - - /* Enable in master control register. */ - rc = pm8058_masked_write(master_enable_addr, master_enable_bit, - master_enable_bit); - if (rc) - goto done; - - /* Disable locally and enable pull down. */ - rc = pm8058_masked_write(ctrl_addr, - REGULATOR_DISABLE | REGULATOR_PULL_DOWN_EN, - REGULATOR_ENABLE_MASK | REGULATOR_PULL_DOWN_MASK); - -done: - return rc; -} - -static int disable_ldo_locally_set_pull_down(u16 ctrl_addr, - u16 master_enable_addr, u8 master_enable_bit) -{ - int rc; - - /* Enable LDO in master control register. */ - rc = pm8058_masked_write(master_enable_addr, master_enable_bit, - master_enable_bit); - if (rc) - goto done; - - /* Disable LDO in CTRL register and set pull down */ - rc = pm8058_masked_write(ctrl_addr, - REGULATOR_DISABLE | REGULATOR_PULL_DOWN_EN, - REGULATOR_ENABLE_MASK | REGULATOR_PULL_DOWN_MASK); - -done: - return rc; -} - -int pm8058_reset_pwr_off(int reset) -{ - int rc; - u8 pon, ctrl, smpl; - - if (pmic_chip == NULL) - return -ENODEV; - - /* When shutting down, enable active pulldowns on important rails. */ - if (!reset) { - /* Disable SMPS's 0,1,3 locally and set pulldown enable bits. */ - disable_smps_locally_set_pull_down(SSBI_REG_ADDR_S0_CTRL, - SSBI_REG_ADDR_S0_TEST2, SSBI_REG_ADDR_VREG_EN_MSM, BIT(7)); - disable_smps_locally_set_pull_down(SSBI_REG_ADDR_S1_CTRL, - SSBI_REG_ADDR_S1_TEST2, SSBI_REG_ADDR_VREG_EN_MSM, BIT(6)); - disable_smps_locally_set_pull_down(SSBI_REG_ADDR_S3_CTRL, - SSBI_REG_ADDR_S3_TEST2, SSBI_REG_ADDR_VREG_EN_GRP_5_4, - BIT(7) | BIT(4)); - /* Disable LDO 21 locally and set pulldown enable bit. */ - disable_ldo_locally_set_pull_down(SSBI_REG_ADDR_L21_CTRL, - SSBI_REG_ADDR_VREG_EN_GRP_5_4, BIT(1)); - } - - /* Set regulator L22 to 1.225V in high power mode. */ - rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_L22_CTRL, &ctrl, 1); - if (rc) { - pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n", __func__, - SSBI_REG_ADDR_L22_CTRL, rc); - goto get_out3; - } - /* Leave pull-down state intact. */ - ctrl &= 0x40; - ctrl |= 0x93; - rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_L22_CTRL, &ctrl, 1); - if (rc) - pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n", __func__, - SSBI_REG_ADDR_L22_CTRL, ctrl, rc); - -get_out3: - if (!reset) { - /* Only modify the SLEEP_CNTL reg if shutdown is desired. */ - rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_SLEEP_CNTL, - &smpl, 1); - if (rc) { - pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n", - __func__, SSBI_REG_ADDR_SLEEP_CNTL, rc); - goto get_out2; - } - - smpl &= ~PM8058_SLEEP_SMPL_EN_MASK; - smpl |= PM8058_SLEEP_SMPL_EN_PWR_OFF; - - rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_SLEEP_CNTL, - &smpl, 1); - if (rc) - pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n", - __func__, SSBI_REG_ADDR_SLEEP_CNTL, smpl, rc); - } - -get_out2: - rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_1, &pon, 1); - if (rc) { - pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n", - __func__, SSBI_REG_ADDR_PON_CNTL_1, rc); - goto get_out; - } - - pon &= ~PM8058_PON_WD_EN_MASK; - pon |= reset ? PM8058_PON_WD_EN_RESET : PM8058_PON_WD_EN_PWR_OFF; - - /* Enable all pullups */ - pon |= PM8058_PON_PUP_MASK; - - rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_1, &pon, 1); - if (rc) { - pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n", - __func__, SSBI_REG_ADDR_PON_CNTL_1, pon, rc); - goto get_out; - } - -get_out: - return rc; -} -EXPORT_SYMBOL(pm8058_reset_pwr_off); - /** * pm8058_stay_on - enables stay_on feature * diff --git a/include/linux/mfd/pmic8058.h b/include/linux/mfd/pmic8058.h index cf753b5dfa6..0699c465be5 100644 --- a/include/linux/mfd/pmic8058.h +++ b/include/linux/mfd/pmic8058.h @@ -144,53 +144,8 @@ struct pm8058_platform_data { struct pmic8058_charger_data *charger_pdata; }; -#ifdef CONFIG_PMIC8058 -int pm8058_reset_pwr_off(int reset); -#else -static inline int pm8058_reset_pwr_off(int reset) { return 0; } -#endif - - int pm8058_hard_reset_config(enum pon_config config); -/** - * pm8058_smpl_control - enables/disables SMPL detection - * @enable: 0 = shutdown PMIC on power loss, 1 = reset PMIC on power loss - * - * This function enables or disables the Sudden Momentary Power Loss detection - * module. If SMPL detection is enabled, then when a sufficiently long power - * loss event occurs, the PMIC will automatically reset itself. If SMPL - * detection is disabled, then the PMIC will shutdown when power loss occurs. - * - * RETURNS: an appropriate -ERRNO error value on error, or zero for success. - */ -int pm8058_smpl_control(int enable); - -/** - * pm8058_smpl_set_delay - sets the SMPL detection time delay - * @delay: enum value corresponding to delay time - * - * This function sets the time delay of the SMPL detection module. If power - * is reapplied within this interval, then the PMIC reset automatically. The - * SMPL detection module must be enabled for this delay time to take effect. - * - * RETURNS: an appropriate -ERRNO error value on error, or zero for success. - */ -int pm8058_smpl_set_delay(enum pm8058_smpl_delay delay); - -/** - * pm8058_watchdog_reset_control - enables/disables watchdog reset detection - * @enable: 0 = shutdown when PS_HOLD goes low, 1 = reset when PS_HOLD goes low - * - * This function enables or disables the PMIC watchdog reset detection feature. - * If watchdog reset detection is enabled, then the PMIC will reset itself - * when PS_HOLD goes low. If it is not enabled, then the PMIC will shutdown - * when PS_HOLD goes low. - * - * RETURNS: an appropriate -ERRNO error value on error, or zero for success. - */ -int pm8058_watchdog_reset_control(int enable); - /** * pm8058_stay_on - enables stay_on feature *