1. Removes pmu_voltage_rails stuff and replaces it with regulator_init_data[]

2. Removes voltage_ldoX and other /sys attributes.

3. Introduces s3c2410_pm_begin method to call regulator_suspend_prepare()

4. Removes on-during-standby flag from auto1 and down2 convertors. Specs say
   they are turned off during standby.
---
 arch/arm/mach-s3c2440/mach-gta02.c     |  214 +++++++++------------
 arch/arm/plat-s3c24xx/pm.c             |   12 +
 drivers/i2c/chips/pcf50633.c           |  323 --------------------------------
 drivers/regulator/pcf50633-regulator.c |   38 ++++
 include/linux/pcf50633.h               |   20 --
 5 files changed, 139 insertions(+), 468 deletions(-)

diff --git a/arch/arm/mach-s3c2440/mach-gta02.c 
b/arch/arm/mach-s3c2440/mach-gta02.c
index c95a314..be175b1 100644
--- a/arch/arm/mach-s3c2440/mach-gta02.c
+++ b/arch/arm/mach-s3c2440/mach-gta02.c
@@ -614,99 +614,71 @@ struct pcf50633_platform_data gta02_pcf_pdata = {
        /* warning: these get rewritten during machine init below
         * depending on pcb variant
         */
-       .rails  = {
+       .reg_init_data = {
                [PCF50633_REGULATOR_AUTO] = {
-                       .name           = "io_3v3",
-                       .flags          = PMU_VRAIL_F_SUSPEND_ON,
-                       .voltage        = {
-                               .init   = 3300,
-                               .max    = 3300,
+                       .constraints = {
+                               .min_uV = 3300000,
+                               .max_uV = 3300000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .apply_uV = 1,
                        },
+                       .num_consumer_supplies = 0,
                },
                [PCF50633_REGULATOR_DOWN1] = {
-                       .name           = "core_1v3",
-                       /* Wow, when we are going into suspend, after pcf50633
-                        * runs its suspend (which happens real early since it
-                        * is an i2c device) we are running out of the 22uF cap
-                        * on core_1v3 rail !!!!
-                        */
-                       .voltage        = {
-                               .init   = 1300,
-                               .max    = 1600,
+                       .constraints = {
+                               .min_uV = 1300000,
+                               .max_uV = 1600000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .apply_uV = 1,
                        },
+                       .num_consumer_supplies = 0,
                },
                [PCF50633_REGULATOR_DOWN2] = {
-                       .name           = "core_1v8",
-                       .flags          = PMU_VRAIL_F_SUSPEND_ON,
-                       .voltage        = {
-                               .init   = 1800,
-                               .max    = 1800,
+                       .constraints = {
+                               .min_uV = 1800000,
+                               .max_uV = 1800000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .apply_uV = 1,
                        },
+                       .num_consumer_supplies = 0,
                },
                [PCF50633_REGULATOR_HCLDO] = {
-                       .name           = "sd_3v3",
-                       .voltage        = {
-                               .init   = 2000,
-                               .max    = 3300,
+                       .constraints = {
+                               .min_uV = 2000000,
+                               .max_uV = 3300000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
                        },
+                       .num_consumer_supplies = 1,
+                       .consumer_supplies = hcldo_consumers,
                },
                [PCF50633_REGULATOR_LDO1] = {
-                       .name           = "gsensor_3v3",
-                       .voltage        = {
-                               .init   = 1300,
-                               .max    = 1330,
+                       .constraints = {
+                               .min_uV = 1300000,
+                               .max_uV = 1300000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .apply_uV = 1,
                        },
+                       .num_consumer_supplies = 0,
                },
                [PCF50633_REGULATOR_LDO2] = {
-                       .name           = "codec_3v3",
-                       .voltage        = {
-                               .init   = 3300,
-                               .max    = 3300,
+                       .constraints = {
+                               .min_uV = 3300000,
+                               .max_uV = 3300000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .apply_uV = 1,
                        },
+                       .num_consumer_supplies = 0,
                },
                [PCF50633_REGULATOR_LDO3] = {
-                       .name           = "unused3",
-                       .voltage        = {
-                               .init   = 3000,
-                               .max    = 3000,
-                       },
-               },
-               [PCF50633_REGULATOR_LDO4] = {
-                       .name           = "bt_3v2",
-                       .voltage        = {
-                               .init   = 2500,
-                               .max    = 3300,
-                       },
-               },
-               [PCF50633_REGULATOR_LDO5] = {
-                       .name           = "rf3v",
-                       .voltage        = {
-                               .init   = 1500,
-                               .max    = 1500,
-                       },
-               },
-               [PCF50633_REGULATOR_LDO6] = {
-                       .name           = "lcm_3v",
-                       .flags = PMU_VRAIL_F_SUSPEND_ON,
-                       .voltage        = {
-                               .init   = 0,
-                               .max    = 3300,
-                       },
-               },
-               [PCF50633_REGULATOR_MEMLDO] = {
-                       .name           = "memldo",
-                       .flags = PMU_VRAIL_F_SUSPEND_ON,
-                       .voltage        = {
-                               .init   = 1800,
-                               .max    = 1800,
+                       .constraints = {
+                               .min_uV = 3000000,
+                               .max_uV = 3000000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .apply_uV = 1,
                        },
+                       .num_consumer_supplies = 0,
                },
-       },
-       .defer_resume_backlight = 1,
-       .resume_backlight_ramp_speed = 5,
-       .attach_child_devices = gta02_pcf50633_attach_child_devices,
 
-       .reg_init_data = {
                [PCF50633_REGULATOR_LDO4] = {
                        .constraints = {
                                .min_uV = 3200000,
@@ -719,92 +691,84 @@ struct pcf50633_platform_data gta02_pcf_pdata = {
                },
                [PCF50633_REGULATOR_LDO5] = {
                        .constraints = {
-                               .min_uV = 3000000,
-                               .max_uV = 3000000,
+                               .min_uV = 1500000,
+                               .max_uV = 1500000,
                                .valid_modes_mask = REGULATOR_MODE_NORMAL,
                                .apply_uV = 1,
                        },
                        .num_consumer_supplies = 1,
                        .consumer_supplies = ldo5_consumers,
                },
-               [PCF50633_REGULATOR_HCLDO] = {
+               [PCF50633_REGULATOR_LDO6] = {
                        .constraints = {
-                               .min_uV = 2000000,
+                               .min_uV = 0,
                                .max_uV = 3300000,
                                .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .state_mem = {
+                                       .enabled = 1,
+                               },
                        },
-                       .num_consumer_supplies = 1,
-                       .consumer_supplies = hcldo_consumers,
+                       .num_consumer_supplies = 0,
+               },
+               [PCF50633_REGULATOR_MEMLDO] = {
+                       .constraints = {
+                               .min_uV = 1800000,
+                               .max_uV = 1800000,
+                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
+                               .state_mem = {
+                                       .enabled = 1,
+                               },
+                       },
+                       .num_consumer_supplies = 0,
                },
 
        },
-
+       .defer_resume_backlight = 1,
+       .resume_backlight_ramp_speed = 5,
+       .attach_child_devices = gta02_pcf50633_attach_child_devices,
 };
 
-#if 0 /* currently unused */
-static void cfg_pmu_vrail(struct pmu_voltage_rail *vrail, char *name,
-                         unsigned int flags, unsigned int init,
-                         unsigned int max)
-{
-       vrail->name = name;
-       vrail->flags = flags;
-       vrail->voltage.init = init;
-       vrail->voltage.max = max;
-}
-#endif
-
 static void mangle_pmu_pdata_by_system_rev(void)
 {
+       struct regulator_init_data *reg_init_data;
+
+       reg_init_data = gta02_pcf_pdata.reg_init_data;
+
        switch (system_rev) {
        case GTA02v1_SYSTEM_REV:
                /* FIXME: this is only in v1 due to wrong PMU variant */
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].flags =
-                                                       PMU_VRAIL_F_SUSPEND_ON;
+               reg_init_data[PCF50633_REGULATOR_DOWN2]
+                                       .constraints.state_mem.enabled = 1;
                break;
        case GTA02v2_SYSTEM_REV:
        case GTA02v3_SYSTEM_REV:
        case GTA02v4_SYSTEM_REV:
        case GTA02v5_SYSTEM_REV:
        case GTA02v6_SYSTEM_REV:
-               /* we need to keep the 1.8V going since this is the SDRAM
-                * self-refresh voltage */
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].flags =
-                                                       PMU_VRAIL_F_SUSPEND_ON;
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].name =
-                                                       "io_1v8",
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].name =
-                                                       "gsensor_3v3",
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].voltage.init =
-                                                       3300;
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].voltage.max =
-                                                       3300;
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].flags &=
-                                                       ~PMU_VRAIL_F_SUSPEND_ON;
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO3].flags =
-                                                       PMU_VRAIL_F_UNUSED;
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO5] = ((struct 
pmu_voltage_rail) {
-                                                       .name = "rf_3v",
-                                                       .voltage = {
-                                                               .init = 0,
-                                                               .max = 3000,
-                                                       }
-                                               });
-               gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO6] =
-                                       ((struct pmu_voltage_rail) {
-                                               .name = "lcm_3v",
-                                               .flags = PMU_VRAIL_F_SUSPEND_ON,
-                                               .voltage = {
-                                                       .init = 3000,
-                                                       .max = 3000,
-                                               }
-                                       });
+               reg_init_data[PCF50633_REGULATOR_LDO1]
+                                       .constraints.min_uV = 3300000;
+               reg_init_data[PCF50633_REGULATOR_LDO1]
+                                       .constraints.min_uV = 3300000;
+               reg_init_data[PCF50633_REGULATOR_LDO1]
+                                       .constraints.state_mem.enabled = 0;
+
+               reg_init_data[PCF50633_REGULATOR_LDO5]
+                                       .constraints.min_uV = 3000000;
+               reg_init_data[PCF50633_REGULATOR_LDO5]
+                                       .constraints.max_uV = 3000000;
+               
+               reg_init_data[PCF50633_REGULATOR_LDO6]
+                                       .constraints.min_uV = 3000000;
+               reg_init_data[PCF50633_REGULATOR_LDO6]
+                                       .constraints.max_uV = 3000000;
+               reg_init_data[PCF50633_REGULATOR_LDO6]
+                                       .constraints.apply_uV = 1;
                break;
        default:
                break;
        }
 }
 
-
 #ifdef CONFIG_GTA02_HDQ
 /* HDQ */
 
diff --git a/arch/arm/plat-s3c24xx/pm.c b/arch/arm/plat-s3c24xx/pm.c
index bc37cf4..325631e 100644
--- a/arch/arm/plat-s3c24xx/pm.c
+++ b/arch/arm/plat-s3c24xx/pm.c
@@ -36,6 +36,7 @@
 #include <linux/delay.h>
 #include <linux/serial_core.h>
 #include <linux/io.h>
+#include <linux/regulator/machine.h>
 
 #include <asm/cacheflush.h>
 #include <mach/hardware.h>
@@ -795,9 +796,20 @@ static int s3c2410_pm_enter(suspend_state_t state)
        return 0;
 }
 
+static int s3c2410_pm_begin(suspend_state_t state)
+{
+       int ret = 0;
+
+#ifdef CONFIG_REGULATOR
+       ret = regulator_suspend_prepare(state);
+#endif
+       return ret;
+}
+
 static struct platform_suspend_ops s3c2410_pm_ops = {
        .enter          = s3c2410_pm_enter,
        .valid          = suspend_valid_only_mem,
+       .begin          = s3c2410_pm_begin,
 };
 
 /* s3c2410_pm_init
diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c
index c05f89e..79f626e 100644
--- a/drivers/i2c/chips/pcf50633.c
+++ b/drivers/i2c/chips/pcf50633.c
@@ -310,200 +310,6 @@ static u_int16_t adc_read_result(struct pcf50633_data 
*pcf)
        return ret;
 }
 
-
-
-
-/***********************************************************************
- * Voltage / ADC
- ***********************************************************************/
-
-static u_int8_t auto_voltage(unsigned int millivolts)
-{
-       if (millivolts < 1800)
-               return 0;
-       if (millivolts > 3800)
-               return 0xff;
-
-       millivolts -= 625;
-       return millivolts/25;
-}
-
-static unsigned int auto_2voltage(u_int8_t bits)
-{
-       if (bits < 0x2f)
-               return 0;
-       return 625 + (bits * 25);
-}
-
-static u_int8_t down_voltage(unsigned int millivolts)
-{
-       if (millivolts < 625)
-               return 0;
-       else if (millivolts > 3000)
-               return 0xff;
-
-       millivolts -= 625;
-       return millivolts/25;
-}
-
-static unsigned int down_2voltage(u_int8_t bits)
-{
-       return 625 + (bits*25);
-}
-
-static u_int8_t ldo_voltage(unsigned int millivolts)
-{
-       if (millivolts < 900)
-               return 0;
-       else if (millivolts > 3600)
-               return 0x1f;
-
-       millivolts -= 900;
-       return millivolts/100;
-}
-
-static unsigned int ldo_2voltage(u_int8_t bits)
-{
-       bits &= 0x1f;
-       return 900 + (bits * 100);
-}
-
-static const u_int8_t regulator_registers[__NUM_PCF50633_REGULATORS] = {
-       [PCF50633_REGULATOR_AUTO]       = PCF50633_REG_AUTOOUT,
-       [PCF50633_REGULATOR_DOWN1]      = PCF50633_REG_DOWN1OUT,
-       [PCF50633_REGULATOR_DOWN2]      = PCF50633_REG_DOWN2OUT,
-       [PCF50633_REGULATOR_MEMLDO]     = PCF50633_REG_MEMLDOOUT,
-       [PCF50633_REGULATOR_LDO1]       = PCF50633_REG_LDO1OUT,
-       [PCF50633_REGULATOR_LDO2]       = PCF50633_REG_LDO2OUT,
-       [PCF50633_REGULATOR_LDO3]       = PCF50633_REG_LDO3OUT,
-       [PCF50633_REGULATOR_LDO4]       = PCF50633_REG_LDO4OUT,
-       [PCF50633_REGULATOR_LDO5]       = PCF50633_REG_LDO5OUT,
-       [PCF50633_REGULATOR_LDO6]       = PCF50633_REG_LDO6OUT,
-       [PCF50633_REGULATOR_HCLDO]      = PCF50633_REG_HCLDOOUT,
-};
-
-int pcf50633_onoff_set(struct pcf50633_data *pcf,
-                      enum pcf50633_regulator_id reg, int on)
-{
-       u_int8_t addr;
-
-       if (reg >= __NUM_PCF50633_REGULATORS)
-               return -EINVAL;
-
-       /* the *ENA register is always one after the *OUT register */
-       addr = regulator_registers[reg] + 1;
-
-       if (on == 0)
-               pcf50633_reg_set_bit_mask(pcf, addr, PCF50633_REGULATOR_ON, 0);
-       else
-               pcf50633_reg_set_bit_mask(pcf, addr, PCF50633_REGULATOR_ON,
-                                PCF50633_REGULATOR_ON);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(pcf50633_onoff_set);
-
-int pcf50633_onoff_get(struct pcf50633_data *pcf,
-                      enum pcf50633_regulator_id reg)
-{
-       u_int8_t val, addr;
-
-       if (reg >= __NUM_PCF50633_REGULATORS)
-               return -EINVAL;
-
-       /* the *ENA register is always one after the *OUT register */
-       addr = regulator_registers[reg] + 1;
-       val = pcf50633_reg_read(pcf, addr) & PCF50633_REGULATOR_ON;
-
-       return val;
-}
-EXPORT_SYMBOL_GPL(pcf50633_onoff_get);
-
-int pcf50633_voltage_set(struct pcf50633_data *pcf,
-                        enum pcf50633_regulator_id reg,
-                        unsigned int millivolts)
-{
-       u_int8_t volt_bits;
-       u_int8_t regnr;
-
-       DEBUGP("pcf=%p, reg=%d, mvolts=%d\n", pcf, reg, millivolts);
-
-       if (reg >= __NUM_PCF50633_REGULATORS)
-               return -EINVAL;
-
-       regnr = regulator_registers[reg];
-
-       if (millivolts > pcf->pdata->rails[reg].voltage.max)
-               return -EINVAL;
-
-       switch (reg) {
-       case PCF50633_REGULATOR_AUTO:
-               volt_bits = auto_voltage(millivolts);
-               break;
-       case PCF50633_REGULATOR_DOWN1:
-               volt_bits = down_voltage(millivolts);
-               break;
-       case PCF50633_REGULATOR_DOWN2:
-               volt_bits = down_voltage(millivolts);
-               break;
-       case PCF50633_REGULATOR_LDO1:
-       case PCF50633_REGULATOR_LDO2:
-       case PCF50633_REGULATOR_LDO3:
-       case PCF50633_REGULATOR_LDO4:
-       case PCF50633_REGULATOR_LDO5:
-       case PCF50633_REGULATOR_LDO6:
-       case PCF50633_REGULATOR_HCLDO:
-               volt_bits = ldo_voltage(millivolts);
-               DEBUGP("ldo_voltage(0x%x)=%u\n", millivolts, volt_bits);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return pcf50633_reg_write(pcf, regnr, volt_bits);
-}
-EXPORT_SYMBOL_GPL(pcf50633_voltage_set);
-
-unsigned int pcf50633_voltage_get(struct pcf50633_data *pcf,
-                        enum pcf50633_regulator_id reg)
-{
-       u_int8_t volt_bits;
-       u_int8_t regnr;
-       unsigned int rc = 0;
-
-       if (reg >= __NUM_PCF50633_REGULATORS)
-               return -EINVAL;
-
-       regnr = regulator_registers[reg];
-       volt_bits = pcf50633_reg_read(pcf, regnr);
-
-       switch (reg) {
-       case PCF50633_REGULATOR_AUTO:
-               rc = auto_2voltage(volt_bits);
-               break;
-       case PCF50633_REGULATOR_DOWN1:
-               rc = down_2voltage(volt_bits);
-               break;
-       case PCF50633_REGULATOR_DOWN2:
-               rc = down_2voltage(volt_bits);
-               break;
-       case PCF50633_REGULATOR_LDO1:
-       case PCF50633_REGULATOR_LDO2:
-       case PCF50633_REGULATOR_LDO3:
-       case PCF50633_REGULATOR_LDO4:
-       case PCF50633_REGULATOR_LDO5:
-       case PCF50633_REGULATOR_LDO6:
-       case PCF50633_REGULATOR_HCLDO:
-               rc = ldo_2voltage(volt_bits);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return rc;
-}
-EXPORT_SYMBOL_GPL(pcf50633_voltage_get);
-
 /* go into 'STANDBY' mode, i.e. power off the main CPU and peripherals */
 void pcf50633_go_standby(struct pcf50633_data *pcf)
 {
@@ -1373,97 +1179,6 @@ static ssize_t show_battvolt(struct device *dev, struct 
device_attribute *attr,
 }
 static DEVICE_ATTR(battvolt, S_IRUGO | S_IWUSR, show_battvolt, NULL);
 
-static int reg_id_by_name(const char *name)
-{
-       int reg_id;
-
-       if (!strcmp(name, "voltage_auto"))
-               reg_id = PCF50633_REGULATOR_AUTO;
-       else if (!strcmp(name, "voltage_down1"))
-               reg_id = PCF50633_REGULATOR_DOWN1;
-       else if (!strcmp(name, "voltage_down2"))
-               reg_id = PCF50633_REGULATOR_DOWN2;
-       else if (!strcmp(name, "voltage_memldo"))
-               reg_id = PCF50633_REGULATOR_MEMLDO;
-       else if (!strcmp(name, "voltage_ldo1"))
-               reg_id = PCF50633_REGULATOR_LDO1;
-       else if (!strcmp(name, "voltage_ldo2"))
-               reg_id = PCF50633_REGULATOR_LDO2;
-       else if (!strcmp(name, "voltage_ldo3"))
-               reg_id = PCF50633_REGULATOR_LDO3;
-       else if (!strcmp(name, "voltage_ldo4"))
-               reg_id = PCF50633_REGULATOR_LDO4;
-       else if (!strcmp(name, "voltage_ldo5"))
-               reg_id = PCF50633_REGULATOR_LDO5;
-       else if (!strcmp(name, "voltage_ldo6"))
-               reg_id = PCF50633_REGULATOR_LDO6;
-       else if (!strcmp(name, "voltage_hcldo"))
-               reg_id = PCF50633_REGULATOR_HCLDO;
-       else
-               reg_id = -1;
-
-       return reg_id;
-}
-
-static ssize_t show_vreg(struct device *dev, struct device_attribute *attr,
-                        char *buf)
-{
-       struct i2c_client *client = to_i2c_client(dev);
-       struct pcf50633_data *pcf = i2c_get_clientdata(client);
-       unsigned int reg_id;
-
-       reg_id = reg_id_by_name(attr->attr.name);
-       if (reg_id < 0)
-               return 0;
-
-       if (pcf50633_onoff_get(pcf, reg_id) > 0)
-               return sprintf(buf, "%u\n", pcf50633_voltage_get(pcf, reg_id));
-       else
-               return strlcpy(buf, "0\n", PAGE_SIZE);
-}
-
-static ssize_t set_vreg(struct device *dev, struct device_attribute *attr,
-                       const char *buf, size_t count)
-{
-       struct i2c_client *client = to_i2c_client(dev);
-       struct pcf50633_data *pcf = i2c_get_clientdata(client);
-       unsigned long mvolts = simple_strtoul(buf, NULL, 10);
-       unsigned int reg_id;
-
-       reg_id = reg_id_by_name(attr->attr.name);
-       if (reg_id < 0)
-               return -EIO;
-
-       DEBUGP("attempting to set %s(%d) to %lu mvolts\n", attr->attr.name,
-               reg_id, mvolts);
-
-       if (mvolts == 0) {
-               pcf50633_onoff_set(pcf, reg_id, 0);
-       } else {
-               if (pcf50633_voltage_set(pcf, reg_id, mvolts) < 0) {
-                       dev_warn(dev, "refusing to set %s(%d) to %lu mvolts "
-                                "(max=%u)\n", attr->attr.name, reg_id, mvolts,
-                                pcf->pdata->rails[reg_id].voltage.max);
-                       return -EINVAL;
-               }
-               pcf50633_onoff_set(pcf, reg_id, 1);
-       }
-
-       return count;
-}
-
-static DEVICE_ATTR(voltage_auto, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_down1, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_down2, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_memldo, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_ldo1, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_ldo2, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_ldo3, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_ldo4, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_ldo5, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_ldo6, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-static DEVICE_ATTR(voltage_hcldo, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
-
 /***********************************************************************
  * Charger Control
  ***********************************************************************/
@@ -2024,17 +1739,6 @@ static DEVICE_ATTR(dump_regs, 0400, show_dump_regs, 
NULL);
  * CARE!  This table is modified at runtime!
  */
 static struct attribute *pcf_sysfs_entries[] = {
-       &dev_attr_voltage_auto.attr,
-       &dev_attr_voltage_down1.attr,
-       &dev_attr_voltage_down2.attr,
-       &dev_attr_voltage_memldo.attr,
-       &dev_attr_voltage_ldo1.attr,
-       &dev_attr_voltage_ldo2.attr,
-       &dev_attr_voltage_ldo3.attr,
-       &dev_attr_voltage_ldo4.attr,
-       &dev_attr_voltage_ldo5.attr,
-       &dev_attr_voltage_ldo6.attr,
-       &dev_attr_voltage_hcldo.attr,
        &dev_attr_charger_type.attr,
        &dev_attr_force_usb_limit_dangerous.attr,
        &dev_attr_charger_adc.attr,
@@ -2194,10 +1898,6 @@ static int pcf50633_probe(struct i2c_client *client, 
const struct i2c_device_id
        for (i = 0; i < __NUM_PCF50633_REGULATORS; i++) {
                struct platform_device *pdev;
 
-               /* Reject regulators not used by anyone */
-               if (pdata->reg_init_data[i].num_consumer_supplies == 0)
-                       continue;
-
                pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
                /* FIXME : Handle failure */
 
@@ -2377,28 +2077,7 @@ static int pcf50633_suspend(struct device *dev, 
pm_message_t state)
                                            &pcf->standby_regs.ldo[0]);
        if (ret != sizeof(pcf->standby_regs.ldo))
                dev_err(dev, "Failed to save LDO levels and enables :-(\n");
-
-       /* switch off power supplies that are not needed during suspend */
-       for (i = 0; i < __NUM_PCF50633_REGULATORS; i++) {
-               if ((pcf->pdata->rails[i].flags & PMU_VRAIL_F_SUSPEND_ON))
-                       continue;
-
-               /* we can save ourselves the read part of a read-modify-write
-                * here because we captured all these already
-                */
-               if (i < 4)
-                       tmp = pcf->standby_regs.misc[i * 4 + 1];
-               else
-                       tmp = pcf->standby_regs.ldo[(i - 4) * 2 + 1];
-
-               dev_dbg(dev, "disabling reg %s by setting ENA %d to 0x%02X\n",
-                             pcf->pdata->rails[i].name,
-                             regulator_registers[i] + 1, tmp & 0xfe);
-
-               /* associated enable is always +1 from OUT reg */
-               __reg_write(pcf, regulator_registers[i] + 1, tmp & 0xfe);
-       }
-
+       
        /* set interrupt masks so only those sources we want to wake
         * us are able to
         */
diff --git a/drivers/regulator/pcf50633-regulator.c 
b/drivers/regulator/pcf50633-regulator.c
index bc3e1c3..609a595 100644
--- a/drivers/regulator/pcf50633-regulator.c
+++ b/drivers/regulator/pcf50633-regulator.c
@@ -209,7 +209,7 @@ static int pcf50633_regulator_is_enabled(struct 
regulator_dev *rdev)
 {
        uint8_t val, regnr;
        int regulator_id = rdev_get_id(rdev);
-       struct pcf50633_data *pcf = rdev_get_drvdata(rdev);;
+       struct pcf50633_data *pcf = rdev_get_drvdata(rdev);
 
        if (regulator_id >= __NUM_PCF50633_REGULATORS)
                return -EINVAL;
@@ -221,12 +221,48 @@ static int pcf50633_regulator_is_enabled(struct 
regulator_dev *rdev)
        return val;
 }
 
+static int 
+pcf50633_regulator_set_suspend_state(struct regulator_dev *rdev, int enable)
+{
+       struct pcf50633_data *pcf = rdev_get_drvdata(rdev);
+       int reg, shift;
+       int regulator_id = rdev_get_id(rdev);
+       u_int8_t mask, value;
+
+       /* No standby setting for  AUTO1, DOWN1 and DOWN2 */
+       if (regulator_id < PCF50633_REGULATOR_LDO1)
+               return 0;
+
+       if (regulator_id <= PCF50633_REGULATOR_LDO4)
+               reg = PCF50633_REG_STBYCTL1;
+       else
+               reg = PCF50633_REG_STBYCTL2;
+
+       shift = ((regulator_id - PCF50633_REGULATOR_LDO1) % 4) * 2;
+       mask = 1 << shift;
+       value = enable << shift;
+
+       return pcf50633_reg_set_bit_mask(pcf, reg, mask, value);
+}
+
+static int pcf50633_regulator_suspend_enable(struct regulator_dev *rdev)
+{
+       return pcf50633_regulator_set_suspend_state(rdev, 1);
+}
+
+static int pcf50633_regulator_suspend_disable(struct regulator_dev *rdev)
+{
+       return pcf50633_regulator_set_suspend_state(rdev, 0);
+}
+
 struct regulator_ops pcf50633_regulator_ops = {
        .set_voltage = pcf50633_regulator_set_voltage,
        .get_voltage = pcf50633_regulator_get_voltage,
        .enable = pcf50633_regulator_enable,
        .disable = pcf50633_regulator_disable,
        .is_enabled = pcf50633_regulator_is_enabled,
+       .set_suspend_enable = pcf50633_regulator_suspend_enable,
+       .set_suspend_disable = pcf50633_regulator_suspend_disable,
 };
 
 struct regulator_desc regulators[] = { 
diff --git a/include/linux/pcf50633.h b/include/linux/pcf50633.h
index 18cf2bc..6e77d0a 100644
--- a/include/linux/pcf50633.h
+++ b/include/linux/pcf50633.h
@@ -94,22 +94,6 @@ extern int
 pcf50633_gpio_get(struct pcf50633_data *pcf, enum pcf50633_gpio gpio);
 
 extern int
-pcf50633_voltage_set(struct pcf50633_data *pcf,
-                    enum pcf50633_regulator_id reg,
-                    unsigned int millivolts);
-extern unsigned int
-pcf50633_voltage_get(struct pcf50633_data *pcf,
-                    enum pcf50633_regulator_id reg);
-
-extern int
-pcf50633_onoff_get(struct pcf50633_data *pcf,
-                  enum pcf50633_regulator_id reg);
-
-extern int
-pcf50633_onoff_set(struct pcf50633_data *pcf,
-                  enum pcf50633_regulator_id reg, int on);
-
-extern int
 pcf50633_adc_async_read(struct pcf50633_data *pcf, int mux, int avg,
                void (*callback)(struct pcf50633_data *, void *, int),
                void *callback_param);
@@ -162,10 +146,6 @@ struct pcf50633_platform_data {
         * ordering */
        void (*attach_child_devices)(struct device *parent_device);
 
-       /* voltage regulator related */
-       struct pmu_voltage_rail rails[__NUM_PCF50633_REGULATORS];
-       unsigned int used_regulators;
-
        /* charger related */
        unsigned int r_fix_batt;
        unsigned int r_fix_batt_par;


Reply via email to