regulator: tps65912: Use simple equations to get register address
Axel Lin [Mon, 12 Mar 2012 22:40:48 +0000 (06:40 +0800)]
The address of ctrl and sel registers can be calculated by simple equations.
This patch simplifies the implementation in tps65912_get_ctrl_register and
implements tps65912_get_sel_register to replace tps65912_get_dcdc_sel_register
and tps65912_get_ldo_sel_register.

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

drivers/regulator/tps65912-regulator.c

index 3ab1722..ede688b 100644 (file)
@@ -201,146 +201,30 @@ static unsigned long tps65912_vsel_to_uv_ldo(u8 vsel)
 
 static int tps65912_get_ctrl_register(int id)
 {
-       switch (id) {
-       case TPS65912_REG_DCDC1:
-               return TPS65912_DCDC1_AVS;
-       case TPS65912_REG_DCDC2:
-               return TPS65912_DCDC2_AVS;
-       case TPS65912_REG_DCDC3:
-               return TPS65912_DCDC3_AVS;
-       case TPS65912_REG_DCDC4:
-               return TPS65912_DCDC4_AVS;
-       case TPS65912_REG_LDO1:
-               return TPS65912_LDO1_AVS;
-       case TPS65912_REG_LDO2:
-               return TPS65912_LDO2_AVS;
-       case TPS65912_REG_LDO3:
-               return TPS65912_LDO3_AVS;
-       case TPS65912_REG_LDO4:
-               return TPS65912_LDO4_AVS;
-       case TPS65912_REG_LDO5:
-               return TPS65912_LDO5;
-       case TPS65912_REG_LDO6:
-               return TPS65912_LDO6;
-       case TPS65912_REG_LDO7:
-               return TPS65912_LDO7;
-       case TPS65912_REG_LDO8:
-               return TPS65912_LDO8;
-       case TPS65912_REG_LDO9:
-               return TPS65912_LDO9;
-       case TPS65912_REG_LDO10:
-               return TPS65912_LDO10;
-       default:
+       if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4)
+               return id * 3 + TPS65912_DCDC1_AVS;
+       else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10)
+               return id - TPS65912_REG_LDO5 + TPS65912_LDO5;
+       else
                return -EINVAL;
-       }
 }
 
-static int tps65912_get_dcdc_sel_register(struct tps65912_reg *pmic, int id)
+static int tps65912_get_sel_register(struct tps65912_reg *pmic, int id)
 {
        struct tps65912 *mfd = pmic->mfd;
-       int opvsel = 0, sr = 0;
+       int opvsel;
        u8 reg = 0;
 
-       if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_DCDC4)
-               return -EINVAL;
-
-       switch (id) {
-       case TPS65912_REG_DCDC1:
-               opvsel = tps65912_reg_read(mfd, TPS65912_DCDC1_OP);
-               sr = ((opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT);
-               if (sr)
-                       reg = TPS65912_DCDC1_AVS;
+       if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) {
+               opvsel = tps65912_reg_read(mfd, id * 3 + TPS65912_DCDC1_OP);
+               if (opvsel & OP_SELREG_MASK)
+                       reg = id * 3 + TPS65912_DCDC1_AVS;
                else
-                       reg = TPS65912_DCDC1_OP;
-               break;
-       case TPS65912_REG_DCDC2:
-               opvsel = tps65912_reg_read(mfd, TPS65912_DCDC2_OP);
-               sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
-               if (sr)
-                       reg = TPS65912_DCDC2_AVS;
-               else
-                       reg = TPS65912_DCDC2_OP;
-               break;
-       case TPS65912_REG_DCDC3:
-               opvsel = tps65912_reg_read(mfd, TPS65912_DCDC3_OP);
-               sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
-               if (sr)
-                       reg = TPS65912_DCDC3_AVS;
-               else
-                       reg = TPS65912_DCDC3_OP;
-               break;
-       case TPS65912_REG_DCDC4:
-               opvsel = tps65912_reg_read(mfd, TPS65912_DCDC4_OP);
-               sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
-               if (sr)
-                       reg = TPS65912_DCDC4_AVS;
-               else
-                       reg = TPS65912_DCDC4_OP;
-               break;
-       }
-       return reg;
-}
-
-static int tps65912_get_ldo_sel_register(struct tps65912_reg *pmic, int id)
-{
-       struct tps65912 *mfd = pmic->mfd;
-       int opvsel = 0, sr = 0;
-       u8 reg = 0;
-
-       if (id < TPS65912_REG_LDO1 || id > TPS65912_REG_LDO10)
+                       reg = id * 3 + TPS65912_DCDC1_OP;
+       } else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) {
+               reg = id - TPS65912_REG_LDO5 + TPS65912_LDO5;
+       } else {
                return -EINVAL;
-
-       switch (id) {
-       case TPS65912_REG_LDO1:
-               opvsel = tps65912_reg_read(mfd, TPS65912_LDO1_OP);
-               sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
-               if (sr)
-                       reg = TPS65912_LDO1_AVS;
-               else
-                       reg = TPS65912_LDO1_OP;
-               break;
-       case TPS65912_REG_LDO2:
-               opvsel = tps65912_reg_read(mfd, TPS65912_LDO2_OP);
-               sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
-               if (sr)
-                       reg = TPS65912_LDO2_AVS;
-               else
-                       reg = TPS65912_LDO2_OP;
-               break;
-       case TPS65912_REG_LDO3:
-               opvsel = tps65912_reg_read(mfd, TPS65912_LDO3_OP);
-               sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
-               if (sr)
-                       reg = TPS65912_LDO3_AVS;
-               else
-                       reg = TPS65912_LDO3_OP;
-               break;
-       case TPS65912_REG_LDO4:
-               opvsel = tps65912_reg_read(mfd, TPS65912_LDO4_OP);
-               sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
-               if (sr)
-                       reg = TPS65912_LDO4_AVS;
-               else
-                       reg = TPS65912_LDO4_OP;
-               break;
-       case TPS65912_REG_LDO5:
-               reg = TPS65912_LDO5;
-               break;
-       case TPS65912_REG_LDO6:
-               reg = TPS65912_LDO6;
-               break;
-       case TPS65912_REG_LDO7:
-               reg = TPS65912_LDO7;
-               break;
-       case TPS65912_REG_LDO8:
-               reg = TPS65912_LDO8;
-               break;
-       case TPS65912_REG_LDO9:
-               reg = TPS65912_LDO9;
-               break;
-       case TPS65912_REG_LDO10:
-               reg = TPS65912_LDO10;
-               break;
        }
 
        return reg;
@@ -567,7 +451,7 @@ static int tps65912_set_voltage_dcdc_sel(struct regulator_dev *dev,
        int value;
        u8 reg;
 
-       reg = tps65912_get_dcdc_sel_register(pmic, id);
+       reg = tps65912_get_sel_register(pmic, id);
        value = tps65912_reg_read(mfd, reg);
        value &= 0xC0;
        return tps65912_reg_write(mfd, reg, selector | value);
@@ -581,7 +465,7 @@ static int tps65912_get_voltage_ldo(struct regulator_dev *dev)
        int vsel = 0;
        u8 reg;
 
-       reg = tps65912_get_ldo_sel_register(pmic, id);
+       reg = tps65912_get_sel_register(pmic, id);
        vsel = tps65912_reg_read(mfd, reg);
        vsel &= 0x3F;
 
@@ -595,7 +479,7 @@ static int tps65912_set_voltage_ldo_sel(struct regulator_dev *dev,
        struct tps65912 *mfd = pmic->mfd;
        int id = rdev_get_id(dev), reg, value;
 
-       reg = tps65912_get_ldo_sel_register(pmic, id);
+       reg = tps65912_get_sel_register(pmic, id);
        value = tps65912_reg_read(mfd, reg);
        value &= 0xC0;
        return tps65912_reg_write(mfd, reg, selector | value);
@@ -718,22 +602,12 @@ static struct platform_driver tps65912_driver = {
        .remove = __devexit_p(tps65912_remove),
 };
 
-/**
- * tps65912_init
- *
- * Module init function
- */
 static int __init tps65912_init(void)
 {
        return platform_driver_register(&tps65912_driver);
 }
 subsys_initcall(tps65912_init);
 
-/**
- * tps65912_cleanup
- *
- * Module exit function
- */
 static void __exit tps65912_cleanup(void)
 {
        platform_driver_unregister(&tps65912_driver);