]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
regulator: palams: disallow pmic access post shutdown
authorSang-Hun Lee <sanlee@nvidia.com>
Sun, 1 Jun 2014 06:15:47 +0000 (23:15 -0700)
committerSimone Willett <swillett@nvidia.com>
Wed, 4 Jun 2014 17:18:30 +0000 (10:18 -0700)
 - Once shutdown has been called against pmic, i2c bus
   is shutdown, so pmic cannot enable or disable
   regulators
 - As such, once shutdown has been called, reject
   regulator enable/disable calls

Bug 1510778

Change-Id: I6eb26d4846ed5c51f882761568c1f9152a0ebb24
Signed-off-by: Sang-Hun Lee <sanlee@nvidia.com>
Reviewed-on: http://git-master/r/411684
(cherry picked from commit 7f018564c9da1d4062bca5d258155d43abe8168c)
Reviewed-on: http://git-master/r/416330
Reviewed-by: Mitch Luban <mluban@nvidia.com>
drivers/regulator/palmas-regulator.c
include/linux/mfd/palmas.h

index 094646ca14021208578b36509a6a6e75770b4c77..90204fde0bdb2a4dbb0b5dd359d918bb95c09f08 100644 (file)
@@ -376,7 +376,11 @@ static int palmas_enable_smps(struct regulator_dev *dev)
        struct palmas_pmic *pmic = rdev_get_drvdata(dev);
        int id = rdev_get_id(dev);
        unsigned int reg;
-
+       mutex_lock(&pmic->mutex);
+       if (pmic->shutdown) {
+               mutex_unlock(&pmic->mutex);
+               return -EINVAL;
+       }
        palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, &reg);
 
        reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
@@ -386,6 +390,7 @@ static int palmas_enable_smps(struct regulator_dev *dev)
                reg |= SMPS_CTRL_MODE_ON;
 
        palmas_smps_write(pmic->palmas, palmas_regs_info[id].ctrl_addr, reg);
+       mutex_unlock(&pmic->mutex);
 
        return 0;
 }
@@ -395,12 +400,18 @@ static int palmas_disable_smps(struct regulator_dev *dev)
        struct palmas_pmic *pmic = rdev_get_drvdata(dev);
        int id = rdev_get_id(dev);
        unsigned int reg;
+       mutex_lock(&pmic->mutex);
+       if (pmic->shutdown) {
+               mutex_unlock(&pmic->mutex);
+               return -EINVAL;
+       }
 
        palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, &reg);
 
        reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
 
        palmas_smps_write(pmic->palmas, palmas_regs_info[id].ctrl_addr, reg);
+       mutex_unlock(&pmic->mutex);
 
        return 0;
 }
@@ -1343,9 +1354,12 @@ static int palmas_regulators_probe(struct platform_device *pdev)
        if (!pmic)
                return -ENOMEM;
 
+
+       mutex_init(&pmic->mutex);
        pmic->dev = &pdev->dev;
        pmic->palmas = palmas;
        palmas->pmic = pmic;
+       pmic->shutdown = false;
        platform_set_drvdata(pdev, pmic);
 
        /* Read VREF0P425 of LDO_CTRL register for TPS80036 */
@@ -1712,6 +1726,14 @@ static int palmas_regulators_remove(struct platform_device *pdev)
        return 0;
 }
 
+static void palams_regulators_shutdown(struct platform_device *pdev)
+{
+       struct palmas *palmas = dev_get_drvdata(pdev->dev.parent);
+       mutex_lock(&palmas->pmic->mutex);
+       palmas->pmic->shutdown = true;
+       mutex_unlock(&palmas->pmic->mutex);
+}
+
 static struct of_device_id of_palmas_match_tbl[] = {
        { .compatible = "ti,palmas-pmic", },
        { .compatible = "ti,twl6035-pmic", },
@@ -1786,6 +1808,7 @@ static struct platform_driver palmas_driver = {
        },
        .probe = palmas_regulators_probe,
        .remove = palmas_regulators_remove,
+       .shutdown = palams_regulators_shutdown,
 };
 
 static int __init palmas_init(void)
index d055ed18ed450749538fc68b37d0b266b2370078..04a48ecaf83a13e44a2d024948870504277b939e 100644 (file)
@@ -719,6 +719,7 @@ struct palmas_pmic {
        bool smps10_regulator_enabled;
        int ldo_vref0p425;
        bool smps10_boost_disable_deferred;
+       bool shutdown;
 
        int range[PALMAS_REG_SMPS10_OUT1];
        unsigned int ramp_delay[PALMAS_REG_SMPS10_OUT1];