diff options
-rw-r--r-- | drivers/regulator/twl-regulator.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index 5ce841087447..a8365229ea6d 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c | |||
@@ -863,7 +863,7 @@ static struct regulator_ops twlsmps_ops = { | |||
863 | 0x0, TWL6030, twl6030fixed_ops) | 863 | 0x0, TWL6030, twl6030fixed_ops) |
864 | 864 | ||
865 | #define TWL4030_ADJUSTABLE_LDO(label, offset, num, turnon_delay, remap_conf) \ | 865 | #define TWL4030_ADJUSTABLE_LDO(label, offset, num, turnon_delay, remap_conf) \ |
866 | static struct twlreg_info TWL4030_INFO_##label = { \ | 866 | static const struct twlreg_info TWL4030_INFO_##label = { \ |
867 | .base = offset, \ | 867 | .base = offset, \ |
868 | .id = num, \ | 868 | .id = num, \ |
869 | .table_len = ARRAY_SIZE(label##_VSEL_table), \ | 869 | .table_len = ARRAY_SIZE(label##_VSEL_table), \ |
@@ -881,7 +881,7 @@ static struct twlreg_info TWL4030_INFO_##label = { \ | |||
881 | } | 881 | } |
882 | 882 | ||
883 | #define TWL4030_ADJUSTABLE_SMPS(label, offset, num, turnon_delay, remap_conf) \ | 883 | #define TWL4030_ADJUSTABLE_SMPS(label, offset, num, turnon_delay, remap_conf) \ |
884 | static struct twlreg_info TWL4030_INFO_##label = { \ | 884 | static const struct twlreg_info TWL4030_INFO_##label = { \ |
885 | .base = offset, \ | 885 | .base = offset, \ |
886 | .id = num, \ | 886 | .id = num, \ |
887 | .remap = remap_conf, \ | 887 | .remap = remap_conf, \ |
@@ -896,7 +896,7 @@ static struct twlreg_info TWL4030_INFO_##label = { \ | |||
896 | } | 896 | } |
897 | 897 | ||
898 | #define TWL6030_ADJUSTABLE_SMPS(label) \ | 898 | #define TWL6030_ADJUSTABLE_SMPS(label) \ |
899 | static struct twlreg_info TWL6030_INFO_##label = { \ | 899 | static const struct twlreg_info TWL6030_INFO_##label = { \ |
900 | .desc = { \ | 900 | .desc = { \ |
901 | .name = #label, \ | 901 | .name = #label, \ |
902 | .id = TWL6030_REG_##label, \ | 902 | .id = TWL6030_REG_##label, \ |
@@ -907,7 +907,7 @@ static struct twlreg_info TWL6030_INFO_##label = { \ | |||
907 | } | 907 | } |
908 | 908 | ||
909 | #define TWL6030_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) \ | 909 | #define TWL6030_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) \ |
910 | static struct twlreg_info TWL6030_INFO_##label = { \ | 910 | static const struct twlreg_info TWL6030_INFO_##label = { \ |
911 | .base = offset, \ | 911 | .base = offset, \ |
912 | .min_mV = min_mVolts, \ | 912 | .min_mV = min_mVolts, \ |
913 | .max_mV = max_mVolts, \ | 913 | .max_mV = max_mVolts, \ |
@@ -922,7 +922,7 @@ static struct twlreg_info TWL6030_INFO_##label = { \ | |||
922 | } | 922 | } |
923 | 923 | ||
924 | #define TWL6025_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) \ | 924 | #define TWL6025_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) \ |
925 | static struct twlreg_info TWL6025_INFO_##label = { \ | 925 | static const struct twlreg_info TWL6025_INFO_##label = { \ |
926 | .base = offset, \ | 926 | .base = offset, \ |
927 | .min_mV = min_mVolts, \ | 927 | .min_mV = min_mVolts, \ |
928 | .max_mV = max_mVolts, \ | 928 | .max_mV = max_mVolts, \ |
@@ -938,7 +938,7 @@ static struct twlreg_info TWL6025_INFO_##label = { \ | |||
938 | 938 | ||
939 | #define TWL_FIXED_LDO(label, offset, mVolts, num, turnon_delay, remap_conf, \ | 939 | #define TWL_FIXED_LDO(label, offset, mVolts, num, turnon_delay, remap_conf, \ |
940 | family, operations) \ | 940 | family, operations) \ |
941 | static struct twlreg_info TWLFIXED_INFO_##label = { \ | 941 | static const struct twlreg_info TWLFIXED_INFO_##label = { \ |
942 | .base = offset, \ | 942 | .base = offset, \ |
943 | .id = num, \ | 943 | .id = num, \ |
944 | .min_mV = mVolts, \ | 944 | .min_mV = mVolts, \ |
@@ -968,7 +968,7 @@ static struct twlreg_info TWLRES_INFO_##label = { \ | |||
968 | } | 968 | } |
969 | 969 | ||
970 | #define TWL6025_ADJUSTABLE_SMPS(label, offset) \ | 970 | #define TWL6025_ADJUSTABLE_SMPS(label, offset) \ |
971 | static struct twlreg_info TWLSMPS_INFO_##label = { \ | 971 | static const struct twlreg_info TWLSMPS_INFO_##label = { \ |
972 | .base = offset, \ | 972 | .base = offset, \ |
973 | .min_mV = 600, \ | 973 | .min_mV = 600, \ |
974 | .max_mV = 2100, \ | 974 | .max_mV = 2100, \ |
@@ -1125,6 +1125,7 @@ static int __devinit twlreg_probe(struct platform_device *pdev) | |||
1125 | { | 1125 | { |
1126 | int i, id; | 1126 | int i, id; |
1127 | struct twlreg_info *info; | 1127 | struct twlreg_info *info; |
1128 | const struct twlreg_info *template; | ||
1128 | struct regulator_init_data *initdata; | 1129 | struct regulator_init_data *initdata; |
1129 | struct regulation_constraints *c; | 1130 | struct regulation_constraints *c; |
1130 | struct regulator_dev *rdev; | 1131 | struct regulator_dev *rdev; |
@@ -1134,17 +1135,17 @@ static int __devinit twlreg_probe(struct platform_device *pdev) | |||
1134 | 1135 | ||
1135 | match = of_match_device(twl_of_match, &pdev->dev); | 1136 | match = of_match_device(twl_of_match, &pdev->dev); |
1136 | if (match) { | 1137 | if (match) { |
1137 | info = match->data; | 1138 | template = match->data; |
1138 | id = info->desc.id; | 1139 | id = template->desc.id; |
1139 | initdata = of_get_regulator_init_data(&pdev->dev, | 1140 | initdata = of_get_regulator_init_data(&pdev->dev, |
1140 | pdev->dev.of_node); | 1141 | pdev->dev.of_node); |
1141 | drvdata = NULL; | 1142 | drvdata = NULL; |
1142 | } else { | 1143 | } else { |
1143 | id = pdev->id; | 1144 | id = pdev->id; |
1144 | initdata = pdev->dev.platform_data; | 1145 | initdata = pdev->dev.platform_data; |
1145 | for (i = 0, info = NULL; i < ARRAY_SIZE(twl_of_match); i++) { | 1146 | for (i = 0, template = NULL; i < ARRAY_SIZE(twl_of_match); i++) { |
1146 | info = twl_of_match[i].data; | 1147 | template = twl_of_match[i].data; |
1147 | if (info && info->desc.id == id) | 1148 | if (template && template->desc.id == id) |
1148 | break; | 1149 | break; |
1149 | } | 1150 | } |
1150 | if (i == ARRAY_SIZE(twl_of_match)) | 1151 | if (i == ARRAY_SIZE(twl_of_match)) |
@@ -1155,12 +1156,16 @@ static int __devinit twlreg_probe(struct platform_device *pdev) | |||
1155 | return -EINVAL; | 1156 | return -EINVAL; |
1156 | } | 1157 | } |
1157 | 1158 | ||
1158 | if (!info) | 1159 | if (!template) |
1159 | return -ENODEV; | 1160 | return -ENODEV; |
1160 | 1161 | ||
1161 | if (!initdata) | 1162 | if (!initdata) |
1162 | return -EINVAL; | 1163 | return -EINVAL; |
1163 | 1164 | ||
1165 | info = kmemdup(template, sizeof (*info), GFP_KERNEL); | ||
1166 | if (!info) | ||
1167 | return -ENOMEM; | ||
1168 | |||
1164 | if (drvdata) { | 1169 | if (drvdata) { |
1165 | /* copy the driver data into regulator data */ | 1170 | /* copy the driver data into regulator data */ |
1166 | info->features = drvdata->features; | 1171 | info->features = drvdata->features; |
@@ -1221,6 +1226,7 @@ static int __devinit twlreg_probe(struct platform_device *pdev) | |||
1221 | if (IS_ERR(rdev)) { | 1226 | if (IS_ERR(rdev)) { |
1222 | dev_err(&pdev->dev, "can't register %s, %ld\n", | 1227 | dev_err(&pdev->dev, "can't register %s, %ld\n", |
1223 | info->desc.name, PTR_ERR(rdev)); | 1228 | info->desc.name, PTR_ERR(rdev)); |
1229 | kfree(info); | ||
1224 | return PTR_ERR(rdev); | 1230 | return PTR_ERR(rdev); |
1225 | } | 1231 | } |
1226 | platform_set_drvdata(pdev, rdev); | 1232 | platform_set_drvdata(pdev, rdev); |
@@ -1242,7 +1248,11 @@ static int __devinit twlreg_probe(struct platform_device *pdev) | |||
1242 | 1248 | ||
1243 | static int __devexit twlreg_remove(struct platform_device *pdev) | 1249 | static int __devexit twlreg_remove(struct platform_device *pdev) |
1244 | { | 1250 | { |
1245 | regulator_unregister(platform_get_drvdata(pdev)); | 1251 | struct regulator_dev *rdev = platform_get_drvdata(pdev); |
1252 | struct twlreg_info *info = rdev->reg_data; | ||
1253 | |||
1254 | regulator_unregister(rdev); | ||
1255 | kfree(info); | ||
1246 | return 0; | 1256 | return 0; |
1247 | } | 1257 | } |
1248 | 1258 | ||