]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
regulator: max16989: add support to read value from OTP
authorLaxman Dewangan <ldewangan@nvidia.com>
Thu, 4 Jun 2015 13:59:25 +0000 (19:29 +0530)
committerLaxman Dewangan <ldewangan@nvidia.com>
Tue, 9 Jun 2015 05:42:57 +0000 (22:42 -0700)
Add support to read parameters from device OTP if properties
are not provided from DT. This help on not changing the HW
OTP value if not required.

bug 200111792

Change-Id: I736d52025ac065d3943ed0731eb4b2472ad2f2c7
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
(cherry picked from commit b3aa7e61446b6300fe0c87b79955e876292a3987)
Reviewed-on: http://git-master/r/754585

drivers/regulator/max16989-regulator.c

index ea51f084fc1807dccff5eb29ce50d131c77909a6..a034643990a5c9a69a680810b2437ec0b2133454 100644 (file)
@@ -46,7 +46,7 @@
 #define MAX16989_CONFIG_VSTEP                  BIT(7)
 #define MAX16989_CONFIG_FPWM                   BIT(3)
 #define MAX16989_CONFIG_SS                     BIT(2)
-#define MAX16989_CONFIG_SYNC_OUTPUT            0x00
+#define MAX16989_CONFIG_SYNC_OUTPUT            0x02
 
 #define MAX16989_TCONFIG_ENTRK                 BIT(7)
 
@@ -139,6 +139,10 @@ static struct regulator_ops max16989_ops = {
        .get_mode               = max16989_get_mode,
        .set_voltage_time_sel   = max16989_set_voltage_time_sel,
 };
+static int slew_table_startup[] = {
+       22000, 11000, 5500, 11000, 5500, 22000, 22000, 11000, 5500, 5500};
+static int slew_table_rising[] = {
+       22000, 22000, 22000, 11000, 11000, 22000, 22000, 22000, 22000, 5500};
 
 static int max16989_init(struct max16989_chip *mchip,
        struct max16989_regulator_platform_data *pdata)
@@ -152,6 +156,21 @@ static int max16989_init(struct max16989_chip *mchip,
        int vsel;
 
        config = 0;
+       if (pdata->voltage_step_uv == -EINVAL) {
+               ret = regmap_read(mchip->rmap, MAX16989_CONFIG_REG, &config);
+               if (ret < 0) {
+                       dev_err(mchip->dev, "CONFIG reg read failed: %d\n", ret);
+                       return ret;
+               }
+               pdata->voltage_step_uv = (config & MAX16989_CONFIG_VSTEP) ?
+                                               12500 : 10000;
+
+               pdata->enable_clock_ss = !!(config & MAX16989_CONFIG_SS);
+               pdata->enable_sync_output = ((config & 0x3) ==
+                                               MAX16989_CONFIG_SYNC_OUTPUT);
+               config = 0;
+       }
+
        if (pdata->voltage_step_uv == 12500)
                config |= MAX16989_CONFIG_VSTEP;
        if (pdata->enable_clock_ss)
@@ -234,6 +253,21 @@ static int max16989_init(struct max16989_chip *mchip,
                return ret;
        }
 
+       if (pdata->slew_rate == -EINVAL) {
+               slew = 0;
+               ret = regmap_read(mchip->rmap, MAX16989_SLEW_REG, &slew);
+               if (ret < 0) {
+                       dev_err(mchip->dev, "SLEW reg read failed: %d\n", ret);
+                       return ret;
+               }
+
+               slew = slew & 0xF;
+               if (slew > 0x9)
+                       slew = 0x9;
+               startup = slew_table_startup[slew];
+               rising = slew_table_rising[slew];
+               goto slew_done;
+       }
        startup = 22000;
        rising = 22000;
        slew = 0;
@@ -276,6 +310,7 @@ static int max16989_init(struct max16989_chip *mchip,
                dev_err(mchip->dev, "SLEW write failed: %d\n", ret);
                return ret;
        }
+slew_done:
        if (pdata->voltage_step_uv == 12500) {
                rising = DIV_ROUND_UP(rising * 5, 4);
                startup = DIV_ROUND_UP(startup * 5, 4);
@@ -403,7 +438,7 @@ static struct max16989_regulator_platform_data *
        }
 
        ret = of_property_read_u32(np, "regulator-voltage-steps", &pval);
-       pdata->voltage_step_uv = (ret) ? 12500 : pval;
+       pdata->voltage_step_uv = (ret) ? -EINVAL : pval;
 
        pdata->enable_sync_output = of_property_read_bool(np,
                                "maxim,enable-sync-output");
@@ -426,7 +461,7 @@ static struct max16989_regulator_platform_data *
        pdata->tracking_device_i2c_address = (ret) ? 0 : pval;
 
        ret = of_property_read_u32(np, "maxim,slew-rate", &pval);
-       pdata->slew_rate = (ret) ? 0 : pval;
+       pdata->slew_rate = (ret) ? -EINVAL : pval;
        return pdata;
 }