diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/regulator/arizona-micsupp.c | 54 | ||||
| -rw-r--r-- | drivers/regulator/core.c | 3 | ||||
| -rw-r--r-- | drivers/regulator/gpio-regulator.c | 7 | ||||
| -rw-r--r-- | drivers/regulator/pfuze100-regulator.c | 12 |
4 files changed, 70 insertions, 6 deletions
diff --git a/drivers/regulator/arizona-micsupp.c b/drivers/regulator/arizona-micsupp.c index 724706a97dc4..fd3154d86901 100644 --- a/drivers/regulator/arizona-micsupp.c +++ b/drivers/regulator/arizona-micsupp.c | |||
| @@ -174,6 +174,33 @@ static const struct regulator_desc arizona_micsupp = { | |||
| 174 | .owner = THIS_MODULE, | 174 | .owner = THIS_MODULE, |
| 175 | }; | 175 | }; |
| 176 | 176 | ||
| 177 | static const struct regulator_linear_range arizona_micsupp_ext_ranges[] = { | ||
| 178 | REGULATOR_LINEAR_RANGE(900000, 0, 0x14, 25000), | ||
| 179 | REGULATOR_LINEAR_RANGE(1500000, 0x15, 0x27, 100000), | ||
| 180 | }; | ||
| 181 | |||
| 182 | static const struct regulator_desc arizona_micsupp_ext = { | ||
| 183 | .name = "MICVDD", | ||
| 184 | .supply_name = "CPVDD", | ||
| 185 | .type = REGULATOR_VOLTAGE, | ||
| 186 | .n_voltages = 40, | ||
| 187 | .ops = &arizona_micsupp_ops, | ||
| 188 | |||
| 189 | .vsel_reg = ARIZONA_LDO2_CONTROL_1, | ||
| 190 | .vsel_mask = ARIZONA_LDO2_VSEL_MASK, | ||
| 191 | .enable_reg = ARIZONA_MIC_CHARGE_PUMP_1, | ||
| 192 | .enable_mask = ARIZONA_CPMIC_ENA, | ||
| 193 | .bypass_reg = ARIZONA_MIC_CHARGE_PUMP_1, | ||
| 194 | .bypass_mask = ARIZONA_CPMIC_BYPASS, | ||
| 195 | |||
| 196 | .linear_ranges = arizona_micsupp_ext_ranges, | ||
| 197 | .n_linear_ranges = ARRAY_SIZE(arizona_micsupp_ext_ranges), | ||
| 198 | |||
| 199 | .enable_time = 3000, | ||
| 200 | |||
| 201 | .owner = THIS_MODULE, | ||
| 202 | }; | ||
| 203 | |||
| 177 | static const struct regulator_init_data arizona_micsupp_default = { | 204 | static const struct regulator_init_data arizona_micsupp_default = { |
| 178 | .constraints = { | 205 | .constraints = { |
| 179 | .valid_ops_mask = REGULATOR_CHANGE_STATUS | | 206 | .valid_ops_mask = REGULATOR_CHANGE_STATUS | |
| @@ -186,9 +213,22 @@ static const struct regulator_init_data arizona_micsupp_default = { | |||
| 186 | .num_consumer_supplies = 1, | 213 | .num_consumer_supplies = 1, |
| 187 | }; | 214 | }; |
| 188 | 215 | ||
| 216 | static const struct regulator_init_data arizona_micsupp_ext_default = { | ||
| 217 | .constraints = { | ||
| 218 | .valid_ops_mask = REGULATOR_CHANGE_STATUS | | ||
| 219 | REGULATOR_CHANGE_VOLTAGE | | ||
| 220 | REGULATOR_CHANGE_BYPASS, | ||
| 221 | .min_uV = 900000, | ||
| 222 | .max_uV = 3300000, | ||
| 223 | }, | ||
| 224 | |||
| 225 | .num_consumer_supplies = 1, | ||
| 226 | }; | ||
| 227 | |||
| 189 | static int arizona_micsupp_probe(struct platform_device *pdev) | 228 | static int arizona_micsupp_probe(struct platform_device *pdev) |
| 190 | { | 229 | { |
| 191 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); | 230 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); |
| 231 | const struct regulator_desc *desc; | ||
| 192 | struct regulator_config config = { }; | 232 | struct regulator_config config = { }; |
| 193 | struct arizona_micsupp *micsupp; | 233 | struct arizona_micsupp *micsupp; |
| 194 | int ret; | 234 | int ret; |
| @@ -207,7 +247,17 @@ static int arizona_micsupp_probe(struct platform_device *pdev) | |||
| 207 | * default init_data for it. This will be overridden with | 247 | * default init_data for it. This will be overridden with |
| 208 | * platform data if provided. | 248 | * platform data if provided. |
| 209 | */ | 249 | */ |
| 210 | micsupp->init_data = arizona_micsupp_default; | 250 | switch (arizona->type) { |
| 251 | case WM5110: | ||
| 252 | desc = &arizona_micsupp_ext; | ||
| 253 | micsupp->init_data = arizona_micsupp_ext_default; | ||
| 254 | break; | ||
| 255 | default: | ||
| 256 | desc = &arizona_micsupp; | ||
| 257 | micsupp->init_data = arizona_micsupp_default; | ||
| 258 | break; | ||
| 259 | } | ||
| 260 | |||
| 211 | micsupp->init_data.consumer_supplies = &micsupp->supply; | 261 | micsupp->init_data.consumer_supplies = &micsupp->supply; |
| 212 | micsupp->supply.supply = "MICVDD"; | 262 | micsupp->supply.supply = "MICVDD"; |
| 213 | micsupp->supply.dev_name = dev_name(arizona->dev); | 263 | micsupp->supply.dev_name = dev_name(arizona->dev); |
| @@ -226,7 +276,7 @@ static int arizona_micsupp_probe(struct platform_device *pdev) | |||
| 226 | ARIZONA_CPMIC_BYPASS, 0); | 276 | ARIZONA_CPMIC_BYPASS, 0); |
| 227 | 277 | ||
| 228 | micsupp->regulator = devm_regulator_register(&pdev->dev, | 278 | micsupp->regulator = devm_regulator_register(&pdev->dev, |
| 229 | &arizona_micsupp, | 279 | desc, |
| 230 | &config); | 280 | &config); |
| 231 | if (IS_ERR(micsupp->regulator)) { | 281 | if (IS_ERR(micsupp->regulator)) { |
| 232 | ret = PTR_ERR(micsupp->regulator); | 282 | ret = PTR_ERR(micsupp->regulator); |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 6382f0af353b..3fe13130baec 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
| @@ -2184,6 +2184,9 @@ int regulator_list_voltage(struct regulator *regulator, unsigned selector) | |||
| 2184 | struct regulator_ops *ops = rdev->desc->ops; | 2184 | struct regulator_ops *ops = rdev->desc->ops; |
| 2185 | int ret; | 2185 | int ret; |
| 2186 | 2186 | ||
| 2187 | if (rdev->desc->fixed_uV && rdev->desc->n_voltages == 1 && !selector) | ||
| 2188 | return rdev->desc->fixed_uV; | ||
| 2189 | |||
| 2187 | if (!ops->list_voltage || selector >= rdev->desc->n_voltages) | 2190 | if (!ops->list_voltage || selector >= rdev->desc->n_voltages) |
| 2188 | return -EINVAL; | 2191 | return -EINVAL; |
| 2189 | 2192 | ||
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c index 04406a918c04..234960dc9607 100644 --- a/drivers/regulator/gpio-regulator.c +++ b/drivers/regulator/gpio-regulator.c | |||
| @@ -139,6 +139,7 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np) | |||
| 139 | struct property *prop; | 139 | struct property *prop; |
| 140 | const char *regtype; | 140 | const char *regtype; |
| 141 | int proplen, gpio, i; | 141 | int proplen, gpio, i; |
| 142 | int ret; | ||
| 142 | 143 | ||
| 143 | config = devm_kzalloc(dev, | 144 | config = devm_kzalloc(dev, |
| 144 | sizeof(struct gpio_regulator_config), | 145 | sizeof(struct gpio_regulator_config), |
| @@ -202,7 +203,11 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np) | |||
| 202 | } | 203 | } |
| 203 | config->nr_states = i; | 204 | config->nr_states = i; |
| 204 | 205 | ||
| 205 | of_property_read_string(np, "regulator-type", ®type); | 206 | ret = of_property_read_string(np, "regulator-type", ®type); |
| 207 | if (ret < 0) { | ||
| 208 | dev_err(dev, "Missing 'regulator-type' property\n"); | ||
| 209 | return ERR_PTR(-EINVAL); | ||
| 210 | } | ||
| 206 | 211 | ||
| 207 | if (!strncmp("voltage", regtype, 7)) | 212 | if (!strncmp("voltage", regtype, 7)) |
| 208 | config->type = REGULATOR_VOLTAGE; | 213 | config->type = REGULATOR_VOLTAGE; |
diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c index ba67b2c4e2e7..032df3799efb 100644 --- a/drivers/regulator/pfuze100-regulator.c +++ b/drivers/regulator/pfuze100-regulator.c | |||
| @@ -308,9 +308,15 @@ static int pfuze_identify(struct pfuze_chip *pfuze_chip) | |||
| 308 | if (ret) | 308 | if (ret) |
| 309 | return ret; | 309 | return ret; |
| 310 | 310 | ||
| 311 | if (value & 0x0f) { | 311 | switch (value & 0x0f) { |
| 312 | dev_warn(pfuze_chip->dev, "Illegal ID: %x\n", value); | 312 | /* Freescale misprogrammed 1-3% of parts prior to week 8 of 2013 as ID=8 */ |
| 313 | return -ENODEV; | 313 | case 0x8: |
| 314 | dev_info(pfuze_chip->dev, "Assuming misprogrammed ID=0x8"); | ||
| 315 | case 0x0: | ||
| 316 | break; | ||
| 317 | default: | ||
| 318 | dev_warn(pfuze_chip->dev, "Illegal ID: %x\n", value); | ||
| 319 | return -ENODEV; | ||
| 314 | } | 320 | } |
| 315 | 321 | ||
| 316 | ret = regmap_read(pfuze_chip->regmap, PFUZE100_REVID, &value); | 322 | ret = regmap_read(pfuze_chip->regmap, PFUZE100_REVID, &value); |
