regulator: tps80031: support for min voltage tolerance
Laxman Dewangan [Fri, 22 Jun 2012 06:42:38 +0000 (11:42 +0530)]
Sometimes the system allow to run in less than requested
minimum voltage and if this tolerance allow the regulator
to set voltage in lower side range than this saves the power.
For the example, if client request vmin = 975mV for regulator
voltage then it sets the voltage to 987.5mv as the nearest to this
desired value. The next lower side for the voltage is 974.8mv.
So if system runs on tolerance of 1mv and if it request for
975mv then driver can look for minimum voltage as 975 - tolerance(1)
= 974mv and possible configure 974.8mv rather than 987.5mV and so
it can save the power equivalent to 12.5mV higher voltage.

Support the configuration of tolerance value.

Change-Id: Ic8312bb397c2615a3ee0f84072ec394e513525ea
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/110523
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>

drivers/regulator/tps80031-regulator.c
include/linux/regulator/tps80031-regulator.h

index a2f8477..937c0ea 100644 (file)
@@ -101,6 +101,7 @@ struct tps80031_regulator {
        /* chip constraints on regulator behavior */
        u16                     min_mV;
        u16                     max_mV;
+       unsigned int            tolerance_uv;
 
        /* regulator specific turn-on delay */
        int                     delay;
@@ -297,6 +298,8 @@ static int __tps80031_dcdc_set_voltage(struct device *parent,
        int vsel = 0;
        int ret;
 
+       min_uV = min_uV - ri->tolerance_uv;
+
        switch (ri->flags) {
        case 0:
                if (min_uV == 0)
@@ -1026,6 +1029,7 @@ static int __devinit tps80031_regulator_probe(struct platform_device *pdev)
        ri->dev = &pdev->dev;
        if (tps_pdata->delay_us > 0)
                ri->delay = tps_pdata->delay_us;
+       ri->tolerance_uv = tps_pdata->tolerance_uv;
 
        check_smps_mode_mult(pdev->dev.parent, ri);
        ri->platform_flags = tps_pdata->flags;
index 1670d14..4dfdf79 100644 (file)
@@ -74,6 +74,9 @@ enum {
  * @flags: Configuration flag to configure the rails. It should be ORed of
  *      above enums.
  * @delay_us: Delay in microsecond after setting the desired voltage.
+ * @tolerance_uv: Tolerance micorvolts in minimum side. The voltage min
+ *     will be adjusted to this tolerance like
+ *             actual_vmin = vmin - tolerance_uv
  */
 
 struct tps80031_regulator_platform_data {
@@ -84,6 +87,7 @@ struct tps80031_regulator_platform_data {
        unsigned int ext_ctrl_flag;
        unsigned int flags;
        int delay_us;
+       unsigned int tolerance_uv;
 };
 
 #endif /* __REGULATOR_TPS80031_H */