regulator: max77663: register all regulators in single probe
Laxman Dewangan [Tue, 28 Aug 2012 06:46:33 +0000 (11:46 +0530)]
Register the max77663 regulator sub driver as regulator-pmic and
register all regulators in single probe calls.
This will ease the DT porting.

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

arch/arm/mach-tegra/board-cardhu-pm298-power-rails.c
arch/arm/mach-tegra/board-curacao-power.c
arch/arm/mach-tegra/board-dalmore-power.c
arch/arm/mach-tegra/board-kai-power.c
drivers/mfd/max77663-core.c
drivers/regulator/max77663-regulator.c
include/linux/mfd/max77663-core.h
include/linux/regulator/max77663-regulator.h

index a25ea7f..041c121 100644 (file)
@@ -162,7 +162,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
        },
 };
 
-#define MAX77663_PDATA_INIT(_id, _min_uV, _max_uV, _supply_reg,                \
+#define MAX77663_PDATA_INIT(_rid, _id, _min_uV, _max_uV, _supply_reg,  \
                            _always_on, _boot_on, _apply_uV,            \
                            _init_apply, _init_enable, _init_uV,        \
                            _fps_src, _fps_pu_period, _fps_pd_period, _flags) \
@@ -188,6 +188,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
        static struct max77663_regulator_platform_data max77663_regulator_pdata_##_id = \
        {                                                               \
                .reg_init_data = &max77663_regulator_idata_##_id,       \
+               .id = MAX77663_REGULATOR_ID_##_rid,                     \
                .init_apply = _init_apply,                              \
                .init_enable = _init_enable,                            \
                .init_uV = _init_uV,                                    \
@@ -198,54 +199,48 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
                .flags = _flags,                                        \
        }
 
-MAX77663_PDATA_INIT(sd0,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD0, sd0,  600000, 3387500, NULL, 1, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, EN2_CTRL_SD0 | SD_FSRADE_DISABLE);
 
-MAX77663_PDATA_INIT(sd1,  800000, 1587500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD1, sd1,  800000, 1587500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, SD_FSRADE_DISABLE);
 
-MAX77663_PDATA_INIT(sd2,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD2, sd2,  600000, 3387500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(sd3,  600000, 3387500, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(SD3, sd3,  600000, 3387500, NULL, 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo0, 800000, 2350000, max77663_rails(sd2), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO0, ldo0, 800000, 2350000, max77663_rails(sd2), 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo1, 800000, 2350000, max77663_rails(sd2), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO1, ldo1, 800000, 2350000, max77663_rails(sd2), 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo2, 800000, 3950000, max77663_rails(sd2), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO2, ldo2, 800000, 3950000, max77663_rails(sd2), 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo3, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO3, ldo3, 800000, 3950000, NULL, 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo4, 800000, 1587500, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO4, ldo4, 800000, 1587500, NULL, 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo5, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO5, ldo5, 800000, 3950000, NULL, 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo6, 800000, 3950000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(LDO6, ldo6, 800000, 3950000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo7, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO7, ldo7, 800000, 3950000, NULL, 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo8, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO8, ldo8, 800000, 3950000, NULL, 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-#define MAX77663_REG(_id, _data)                                       \
-       {                                                               \
-               .name = "max77663-regulator",                           \
-               .id = MAX77663_REGULATOR_ID_##_id,                      \
-               .platform_data = &max77663_regulator_pdata_##_data,     \
-               .pdata_size = sizeof(max77663_regulator_pdata_##_data), \
-       }
+#define MAX77663_REG(_id, _data) &max77663_regulator_pdata_##_data
 
-static struct mfd_cell max77663_subdevs[] = {
+static struct max77663_regulator_platform_data *max77663_reg_pdata[] = {
        MAX77663_REG(SD0, sd0),
        MAX77663_REG(SD1, sd1),
        MAX77663_REG(SD2, sd2),
@@ -325,8 +320,8 @@ static struct max77663_platform_data max7763_pdata = {
        .num_gpio_cfgs = ARRAY_SIZE(max77663_gpio_cfgs),
        .gpio_cfgs = max77663_gpio_cfgs,
 
-       .num_subdevs    = ARRAY_SIZE(max77663_subdevs),
-       .sub_devices    = max77663_subdevs,
+       .regulator_pdata = max77663_reg_pdata,
+       .num_regulator_pdata = ARRAY_SIZE(max77663_reg_pdata),
 
        .use_power_off  = true,
 };
index d6e6256..dd44785 100644 (file)
@@ -113,7 +113,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
        },
 };
 
-#define MAX77663_PDATA_INIT(_id, _min_uV, _max_uV, _supply_reg,                \
+#define MAX77663_PDATA_INIT(_rid, _id, _min_uV, _max_uV, _supply_reg,  \
                _always_on, _boot_on, _apply_uV,                        \
                _init_apply, _init_enable, _init_uV,                    \
                _fps_src, _fps_pu_period, _fps_pd_period, _flags)       \
@@ -139,6 +139,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
        static struct max77663_regulator_platform_data max77663_regulator_pdata_##_id = \
        {                                                               \
                .reg_init_data = &max77663_regulator_idata_##_id,       \
+               .id = MAX77663_REGULATOR_ID_##_rid,                     \
                .init_apply = _init_apply,                              \
                .init_enable = _init_enable,                            \
                .init_uV = _init_uV,                                    \
@@ -149,54 +150,48 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
                .flags = _flags,                                        \
        }
 
-MAX77663_PDATA_INIT(sd0,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD0, sd0,  600000, 3387500, NULL, 1, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, EN2_CTRL_SD0 | SD_FSRADE_DISABLE);
 
-MAX77663_PDATA_INIT(sd1,  800000, 1587500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD1, sd1,  800000, 1587500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, SD_FSRADE_DISABLE);
 
-MAX77663_PDATA_INIT(sd2,  1800000, 1800000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD2, sd2,  1800000, 1800000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(sd3,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD3, sd3,  600000, 3387500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo0, 800000, 2350000, max77663_rails(sd3), 1, 0, 0,
+MAX77663_PDATA_INIT(LDO0, ldo0, 800000, 2350000, max77663_rails(sd3), 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo1, 800000, 2350000, max77663_rails(sd3), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO1, ldo1, 800000, 2350000, max77663_rails(sd3), 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo2, 800000, 3950000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(LDO2, ldo2, 800000, 3950000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo3, 800000, 3950000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(LDO3, ldo3, 800000, 3950000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo4, 800000, 1587500, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO4, ldo4, 800000, 1587500, NULL, 0, 0, 0,
                    1, 1, 1000000, FPS_SRC_NONE, -1, -1, LDO4_EN_TRACKING);
 
-MAX77663_PDATA_INIT(ldo5, 800000, 2800000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO5, ldo5, 800000, 2800000, NULL, 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo6, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO6, ldo6, 800000, 3950000, NULL, 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo7, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO7, ldo7, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo8, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO8, ldo8, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-#define MAX77663_REG(_id, _data)                                       \
-       {                                                               \
-               .name = "max77663-regulator",                           \
-               .id = MAX77663_REGULATOR_ID_##_id,                      \
-               .platform_data = &max77663_regulator_pdata_##_data,     \
-               .pdata_size = sizeof(max77663_regulator_pdata_##_data), \
-       }
+#define MAX77663_REG(_id, _data) &max77663_regulator_pdata_##_data
 
-static struct mfd_cell max77663_subdevs[] = {
+static struct max77663_regulator_platform_data *max77663_reg_pdata[] = {
        MAX77663_REG(SD0, sd0),
        MAX77663_REG(SD1, sd1),
        MAX77663_REG(SD2, sd2),
@@ -276,8 +271,8 @@ static struct max77663_platform_data max7763_pdata = {
        .num_gpio_cfgs  = ARRAY_SIZE(max77663_gpio_cfgs),
        .gpio_cfgs      = max77663_gpio_cfgs,
 
-       .num_subdevs    = ARRAY_SIZE(max77663_subdevs),
-       .sub_devices    = max77663_subdevs,
+       .regulator_pdata = max77663_reg_pdata,
+       .num_regulator_pdata = ARRAY_SIZE(max77663_reg_pdata),
 
        .rtc_i2c_addr   = 0x68,
 
index c233a1c..12a82c2 100644 (file)
@@ -129,7 +129,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
        },
 };
 
-#define MAX77663_PDATA_INIT(_id, _min_uV, _max_uV, _supply_reg,                \
+#define MAX77663_PDATA_INIT(_rid, _id, _min_uV, _max_uV, _supply_reg,  \
                _always_on, _boot_on, _apply_uV,                        \
                _init_apply, _init_enable, _init_uV,                    \
                _fps_src, _fps_pu_period, _fps_pd_period, _flags)       \
@@ -155,6 +155,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
 static struct max77663_regulator_platform_data max77663_regulator_pdata_##_id =\
 {                                                                      \
                .reg_init_data = &max77663_regulator_idata_##_id,       \
+               .id = MAX77663_REGULATOR_ID_##_rid,                     \
                .init_apply = _init_apply,                              \
                .init_enable = _init_enable,                            \
                .init_uV = _init_uV,                                    \
@@ -165,54 +166,48 @@ static struct max77663_regulator_platform_data max77663_regulator_pdata_##_id =\
                .flags = _flags,                                        \
        }
 
-MAX77663_PDATA_INIT(sd0,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD0, sd0,  600000, 3387500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, SD_FSRADE_DISABLE);
 
-MAX77663_PDATA_INIT(sd1,  800000, 1587500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD1, sd1,  800000, 1587500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, SD_FSRADE_DISABLE);
 
-MAX77663_PDATA_INIT(sd2,  1800000, 1800000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD2, sd2,  1800000, 1800000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_0, -1, -1, 0);
 
-MAX77663_PDATA_INIT(sd3,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD3, sd3,  600000, 3387500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo0, 800000, 2350000, max77663_rails(sd2), 1, 0, 0,
+MAX77663_PDATA_INIT(LDO0, ldo0, 800000, 2350000, max77663_rails(sd2), 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo1, 800000, 2350000, max77663_rails(sd2), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO1, ldo1, 800000, 2350000, max77663_rails(sd2), 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo2, 2850000, 2850000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(LDO2, ldo2, 2850000, 2850000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo3, 800000, 3950000, max77663_rails(sd2), 1, 0, 0,
+MAX77663_PDATA_INIT(LDO3, ldo3, 800000, 3950000, max77663_rails(sd2), 1, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo4, 800000, 1587500, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO4, ldo4, 800000, 1587500, NULL, 0, 0, 0,
                    1, 1, 1000000, FPS_SRC_NONE, -1, -1, LDO4_EN_TRACKING);
 
-MAX77663_PDATA_INIT(ldo5, 800000, 2800000, max77663_rails(sd2), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO5, ldo5, 800000, 2800000, max77663_rails(sd2), 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo6, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO6, ldo6, 800000, 3950000, NULL, 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo7, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO7, ldo7, 800000, 3950000, NULL, 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo8, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO8, ldo8, 800000, 3950000, NULL, 0, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-#define MAX77663_REG(_id, _data)                                       \
-       {                                                               \
-               .name = "max77663-regulator",                           \
-               .id = MAX77663_REGULATOR_ID_##_id,                      \
-               .platform_data = &max77663_regulator_pdata_##_data,     \
-               .pdata_size = sizeof(max77663_regulator_pdata_##_data), \
-       }
+#define MAX77663_REG(_id, _data) &max77663_regulator_pdata_##_data
 
-static struct mfd_cell max77663_subdevs[] = {
+static struct max77663_regulator_platform_data *max77663_reg_pdata[] = {
        MAX77663_REG(SD0, sd0),
        MAX77663_REG(SD1, sd1),
        MAX77663_REG(SD2, sd2),
@@ -297,9 +292,8 @@ static struct max77663_platform_data max7763_pdata = {
        .num_gpio_cfgs  = ARRAY_SIZE(max77663_gpio_cfgs),
        .gpio_cfgs      = max77663_gpio_cfgs,
 
-
-       .num_subdevs    = ARRAY_SIZE(max77663_subdevs),
-       .sub_devices    = max77663_subdevs,
+       .regulator_pdata = max77663_reg_pdata,
+       .num_regulator_pdata = ARRAY_SIZE(max77663_reg_pdata),
 
        .rtc_i2c_addr   = 0x68,
 
index bd9adbb..7e989cb 100644 (file)
@@ -142,7 +142,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
        },
 };
 
-#define MAX77663_PDATA_INIT(_id, _min_uV, _max_uV, _supply_reg,                \
+#define MAX77663_PDATA_INIT(_rid, _id, _min_uV, _max_uV, _supply_reg,  \
                            _always_on, _boot_on, _apply_uV,            \
                            _init_apply, _init_enable, _init_uV,        \
                            _fps_src, _fps_pu_period, _fps_pd_period, _flags) \
@@ -168,6 +168,7 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
        static struct max77663_regulator_platform_data max77663_regulator_pdata_##_id = \
        {                                                               \
                .reg_init_data = &max77663_regulator_idata_##_id,       \
+               .id = MAX77663_REGULATOR_ID_##_rid,                     \
                .init_apply = _init_apply,                              \
                .init_enable = _init_enable,                            \
                .init_uV = _init_uV,                                    \
@@ -178,54 +179,48 @@ static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = {
                .flags = _flags,                                        \
        }
 
-MAX77663_PDATA_INIT(sd0,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD0, sd0,  600000, 3387500, NULL, 1, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, EN2_CTRL_SD0);
 
-MAX77663_PDATA_INIT(sd1,  800000, 1587500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD1, sd1,  800000, 1587500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, FPS_POWER_PERIOD_1, FPS_POWER_PERIOD_6, 0);
 
-MAX77663_PDATA_INIT(sd2,  1800000, 1800000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD2, sd2,  1800000, 1800000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_0, -1, -1, 0);
 
-MAX77663_PDATA_INIT(sd3,  600000, 3387500, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(SD3, sd3,  600000, 3387500, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_0, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo0, 800000, 2350000, max77663_rails(sd3), 1, 0, 0,
+MAX77663_PDATA_INIT(LDO0, ldo0, 800000, 2350000, max77663_rails(sd3), 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo1, 800000, 2350000, max77663_rails(sd3), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO1, ldo1, 800000, 2350000, max77663_rails(sd3), 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo2, 800000, 3950000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(LDO2, ldo2, 800000, 3950000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo3, 800000, 3950000, NULL, 1, 0, 0,
+MAX77663_PDATA_INIT(LDO3, ldo3, 800000, 3950000, NULL, 1, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo4, 800000, 1587500, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO4, ldo4, 800000, 1587500, NULL, 0, 0, 0,
                    1, 1, 1000000, FPS_SRC_0, -1, -1, LDO4_EN_TRACKING);
 
-MAX77663_PDATA_INIT(ldo5, 800000, 2800000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO5, ldo5, 800000, 2800000, NULL, 0, 0, 0,
                    1, 1, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo6, 800000, 3950000, NULL, 0, 0, 0,
+MAX77663_PDATA_INIT(LDO6, ldo6, 800000, 3950000, NULL, 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo7, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO7, ldo7, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
                    0, 0, -1, FPS_SRC_NONE, -1, -1, 0);
 
-MAX77663_PDATA_INIT(ldo8, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
+MAX77663_PDATA_INIT(LDO8, ldo8, 800000, 3950000, max77663_rails(sd3), 0, 0, 0,
                    1, 1, -1, FPS_SRC_1, -1, -1, 0);
 
-#define MAX77663_REG(_id, _data)                                       \
-       {                                                               \
-               .name = "max77663-regulator",                           \
-               .id = MAX77663_REGULATOR_ID_##_id,                      \
-               .platform_data = &max77663_regulator_pdata_##_data,     \
-               .pdata_size = sizeof(max77663_regulator_pdata_##_data), \
-       }
+#define MAX77663_REG(_id, _data) &max77663_regulator_pdata_##_data
 
-static struct mfd_cell max77663_subdevs[] = {
+static struct max77663_regulator_platform_data  *max77663_reg_pdata[] = {
        MAX77663_REG(SD0, sd0),
        MAX77663_REG(SD1, sd1),
        MAX77663_REG(SD2, sd2),
@@ -305,8 +300,8 @@ static struct max77663_platform_data max7763_pdata = {
        .num_gpio_cfgs  = ARRAY_SIZE(max77663_gpio_cfgs),
        .gpio_cfgs      = max77663_gpio_cfgs,
 
-       .num_subdevs    = ARRAY_SIZE(max77663_subdevs),
-       .sub_devices    = max77663_subdevs,
+       .regulator_pdata = max77663_reg_pdata,
+       .num_regulator_pdata = ARRAY_SIZE(max77663_reg_pdata),
 
        .rtc_i2c_addr   = 0x68,
 
index cc27596..c06c721 100644 (file)
@@ -185,6 +185,8 @@ static struct mfd_cell max77663_cells[] = {
                .num_resources  = ARRAY_SIZE(gpio_resources),
                .resources      = &gpio_resources[0],
        }, {
+               .name = "max77663-pmic",
+       }, {
                .name = "max77663-rtc",
                .num_resources  = ARRAY_SIZE(rtc_resources),
                .resources      = &rtc_resources[0],
index 468fb80..6407952 100644 (file)
@@ -857,54 +857,94 @@ static struct max77663_regulator_info max77663_regs_info[MAX77663_REGULATOR_ID_N
 
 static int max77663_regulator_probe(struct platform_device *pdev)
 {
+       struct max77663_platform_data *pdata =
+                                       dev_get_platdata(pdev->dev.parent);
        struct regulator_desc *rdesc;
        struct max77663_regulator *reg;
+       struct max77663_regulator *max_regs;
+       struct max77663_regulator_platform_data *reg_pdata;
        int ret = 0;
+       int id;
+       int reg_id;
+       int reg_count;
 
-       if ((pdev->id < 0) || (pdev->id >= MAX77663_REGULATOR_ID_NR)) {
-               dev_err(&pdev->dev, "Invalid device id %d\n", pdev->id);
+       if (!pdata) {
+               dev_err(&pdev->dev, "No Platform data\n");
                return -ENODEV;
        }
 
-       reg = devm_kzalloc(&pdev->dev, sizeof(*reg), GFP_KERNEL);
-       if (!reg) {
+       reg_count = pdata->num_regulator_pdata;
+       max_regs = devm_kzalloc(&pdev->dev,
+                       reg_count * sizeof(*max_regs), GFP_KERNEL);
+       if (!max_regs) {
                dev_err(&pdev->dev, "mem alloc for reg failed\n");
                return -ENOMEM;
        }
 
-       rdesc = &max77663_regs_info[pdev->id].desc;
-       reg->rinfo = &max77663_regs_info[pdev->id];
-       reg->dev = &pdev->dev;
-       reg->pdata = dev_get_platdata(&pdev->dev);
-       reg->regulator_mode = REGULATOR_MODE_NORMAL;
-       reg->power_mode = POWER_MODE_NORMAL;
-
-       dev_dbg(&pdev->dev, "probe: name=%s\n", rdesc->name);
+       for (id = 0; id < reg_count; ++id) {
+               reg_pdata = pdata->regulator_pdata[id];
+               if (!reg_pdata) {
+                       dev_err(&pdev->dev,
+                               "Regulator pltform data not there\n");
+                       goto clean_exit;
+               }
 
-       ret = max77663_regulator_preinit(reg);
-       if (ret) {
-               dev_err(&pdev->dev, "probe: Failed to preinit regulator %s\n",
-                       rdesc->name);
-               return ret;
-       }
+               reg_id = reg_pdata->id;
+               reg  = &max_regs[id];
+               rdesc = &max77663_regs_info[reg_id].desc;
+               reg->rinfo = &max77663_regs_info[reg_id];
+               reg->dev = &pdev->dev;
+               reg->pdata = reg_pdata;
+               reg->regulator_mode = REGULATOR_MODE_NORMAL;
+               reg->power_mode = POWER_MODE_NORMAL;
+
+               dev_dbg(&pdev->dev, "probe: name=%s\n", rdesc->name);
+
+               ret = max77663_regulator_preinit(reg);
+               if (ret) {
+                       dev_err(&pdev->dev, "Failed to preinit regulator %s\n",
+                               rdesc->name);
+                       goto clean_exit;
+               }
 
-       reg->rdev = regulator_register(rdesc, &pdev->dev,
-                                      reg->pdata->reg_init_data, reg, NULL);
-       if (IS_ERR(reg->rdev)) {
-               dev_err(&pdev->dev, "probe: Failed to register regulator %s\n",
+               reg->rdev = regulator_register(rdesc, &pdev->dev,
+                                       reg->pdata->reg_init_data, reg, NULL);
+               if (IS_ERR(reg->rdev)) {
+                       dev_err(&pdev->dev, "Failed to register regulator %s\n",
                        rdesc->name);
-               return PTR_ERR(reg->rdev);
+                       ret = PTR_ERR(reg->rdev);
+                       goto clean_exit;
+               }
        }
-       platform_set_drvdata(pdev, reg);
+       platform_set_drvdata(pdev, max_regs);
 
        return 0;
+
+clean_exit:
+       while (--id >= 0) {
+               reg  = &max_regs[id];
+               regulator_unregister(reg->rdev);
+       }
+       return ret;
 }
 
 static int max77663_regulator_remove(struct platform_device *pdev)
 {
-       struct regulator_dev *rdev = platform_get_drvdata(pdev);
+       struct max77663_regulator *max_regs = platform_get_drvdata(pdev);
+       struct max77663_regulator *reg;
+       struct max77663_platform_data *pdata =
+                                       dev_get_platdata(pdev->dev.parent);
+       int reg_count;
+
+       if (!pdata)
+               return 0;
+
+       reg_count = pdata->num_regulator_pdata;
+       while (--reg_count >= 0) {
+               reg  = &max_regs[reg_count];
+               regulator_unregister(reg->rdev);
+       }
 
-       regulator_unregister(rdev);
        return 0;
 }
 
@@ -912,7 +952,7 @@ static struct platform_driver max77663_regulator_driver = {
        .probe = max77663_regulator_probe,
        .remove = __devexit_p(max77663_regulator_remove),
        .driver = {
-               .name = "max77663-regulator",
+               .name = "max77663-pmic",
                .owner = THIS_MODULE,
        },
 };
index 20961db..e53f254 100644 (file)
@@ -136,6 +136,9 @@ struct max77663_platform_data {
        int num_subdevs;
        struct mfd_cell *sub_devices;
 
+       struct max77663_regulator_platform_data **regulator_pdata;
+       int num_regulator_pdata;
+
        unsigned int flags;
 
        unsigned char rtc_i2c_addr;
index 7cf4a53..e21105f 100644 (file)
@@ -115,6 +115,7 @@ struct max77663_regulator_fps_cfg {
 
 struct max77663_regulator_platform_data {
        struct regulator_init_data *reg_init_data;
+       int id;
        bool init_apply;
        bool init_enable;
        int init_uV;