regulator: palmas: implement errata for ES1.0,ES2.0 and ES2.1
Laxman Dewangan [Sat, 9 Feb 2013 19:36:38 +0000 (00:36 +0530)]
The device has the errata and sw need to implement the WAR for
proper functioning of the device.

The errata are:
1. SMPS- slew rate (TSTEP) is slower than expected
-----------------------------------------------
when output voltage target is close to previous one

IMPACT: The settling time is greater than specified slew rate in
register map and datasheet for voltage scaling of the SMPS.

DESCRIPTION: Measurement done on WCSP ES2.0, SMPS8, SMPS6, SMPS12
for TSTEP=0x02(5mV/us)
- step from VOUT= 0.5v to 1.65V ==>slew rate is around 5mV/us
- step from VOUT= 0.96v to 1.04V ==>slew rate is around 2.5mV/us
for TSTEP=0x03(2.5mV/us)
- step from VOUT= 0.5v to 1.65V ==>slew rate is around 2.5mV/us
- step from VOUT= 0.96v to 1.04V ==>slew rate is around 1.6mV/us

WORKAROUND: Adapt wait time using above value.

REVISION IMPACTED: ES1.0/ES2.0/ES2.1

2. LDO8_TRACKING: PD in tracking mode
-------------------------------------
IMPACT: Higher consumption and performance impact when LDO8 is set in
tracking mode and LDO is set to have its pull down enabled in OFF mode.

DESCRIPTION: When LDO8 is set in tracking mode and the LDO is set to have
its pull down enabled in OFF, the pull down is also enabled in ACTIVE mode.

WORKAROUND: In tracking mode, bit7 of LDO_PD_CTRL1 register must be set to 0.
When LDO8 is disabled, to have the pull down, bit7 of LDO_PD_CTRL1 register must
then be set to 1.
 In LDO8 regulation mode, behavior is the same as the other LDOs.

REVISION IMPACTED: ES 2.1 ES2.0 ES1.0

bug 1228386
bug 1195226

Change-Id: Ib19a21cb722b1bc07d93a0cf866c134672ef8735
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/199132
Reviewed-by: Automatic_Commit_Validation_User

drivers/regulator/palmas-regulator.c
include/linux/mfd/palmas.h

index 7ac6fdb..5c233bf 100644 (file)
@@ -457,7 +457,9 @@ static int palma_smps_set_voltage_smps_time_sel(struct regulator_dev *rdev,
        unsigned int ramp_delay = pmic->ramp_delay[id];
 
        /* ES2.1, have the 1.5X slower slew rate than configured */
-       ramp_delay = (ramp_delay * 15)/10;
+       if (palmas_is_es_version_or_less(pmic->palmas, 2, 1))
+               ramp_delay = (ramp_delay * 15)/10;
+
        if (!ramp_delay)
                return 0;
 
@@ -1060,20 +1062,25 @@ static void palmas_enable_ldo8_track(struct palmas *palmas)
        }
 
        /*
+        * Errata ES1.0, 2,0 and 2.1
         * When Tracking is enbled, it need to disable Pull-Down for LDO8 and
         * when tracking is disabled, SW has to enabe Pull-Down.
         */
-       addr = PALMAS_LDO_PD_CTRL1;
-       ret = palmas_ldo_read(palmas, addr, &reg);
-       if (ret < 0) {
-               dev_err(palmas->dev, "Error in reading pulldown control reg\n");
-               return;
-       }
-       reg &= ~PALMAS_LDO_PD_CTRL1_LDO8;
-       ret = palmas_ldo_write(palmas, addr, reg);
-       if (ret < 0) {
-               dev_err(palmas->dev, "Error in setting pulldown control reg\n");
-               return;
+       if (palmas_is_es_version_or_less(palmas, 2, 1)) {
+               addr = PALMAS_LDO_PD_CTRL1;
+               ret = palmas_ldo_read(palmas, addr, &reg);
+               if (ret < 0) {
+                       dev_err(palmas->dev,
+                               "Error in reading pulldown control reg\n");
+                       return;
+               }
+               reg &= ~PALMAS_LDO_PD_CTRL1_LDO8;
+               ret = palmas_ldo_write(palmas, addr, reg);
+               if (ret < 0) {
+                       dev_err(palmas->dev,
+                               "Error in setting pulldown control reg\n");
+                       return;
+               }
        }
 
        return;
@@ -1119,20 +1126,25 @@ static void palmas_disable_ldo8_track(struct palmas *palmas)
        }
 
        /*
+        * Errata ES1.0, 2,0 and 2.1
         * When Tracking is enbled, it need to disable Pull-Down for LDO8 and
         * when tracking is disabled, SW has to enabe Pull-Down.
         */
-       addr = PALMAS_LDO_PD_CTRL1;
-       ret = palmas_ldo_read(palmas, addr, &reg);
-       if (ret < 0) {
-               dev_err(palmas->dev, "Error in reading pulldown control reg\n");
-               return;
-       }
-       reg |= PALMAS_LDO_PD_CTRL1_LDO8;
-       ret = palmas_ldo_write(palmas, addr, reg);
-       if (ret < 0) {
-               dev_err(palmas->dev, "Error in setting pulldown control reg\n");
-               return;
+       if (palmas_is_es_version_or_less(palmas, 2, 1)) {
+               addr = PALMAS_LDO_PD_CTRL1;
+               ret = palmas_ldo_read(palmas, addr, &reg);
+               if (ret < 0) {
+                       dev_err(palmas->dev,
+                               "Error in reading pulldown control reg\n");
+                       return;
+               }
+               reg |= PALMAS_LDO_PD_CTRL1_LDO8;
+               ret = palmas_ldo_write(palmas, addr, reg);
+               if (ret < 0) {
+                       dev_err(palmas->dev,
+                               "Error in setting pulldown control reg\n");
+                       return;
+               }
        }
 
        return;
index a3a6599..4dfc50b 100644 (file)
@@ -2805,4 +2805,16 @@ static inline int palmas_irq_get_virq(struct palmas *palmas, int irq)
        return regmap_irq_get_virq(palmas->irq_data, irq);
 }
 
+static inline int palmas_is_es_version_or_less(struct palmas *palmas,
+       int major, int minor)
+{
+       if (palmas->es_major_version < major)
+               return true;
+
+       if ((palmas->es_major_version == major) &&
+               (palmas->es_minor_version <= minor))
+               return true;
+
+       return false;
+}
 #endif /*  __LINUX_MFD_PALMAS_H */