diff options
| -rw-r--r-- | Documentation/devicetree/bindings/regulator/max8973-regulator.txt | 21 | ||||
| -rw-r--r-- | drivers/regulator/max8973-regulator.c | 49 |
2 files changed, 53 insertions, 17 deletions
diff --git a/Documentation/devicetree/bindings/regulator/max8973-regulator.txt b/Documentation/devicetree/bindings/regulator/max8973-regulator.txt new file mode 100644 index 000000000000..4f15d8a1bfd0 --- /dev/null +++ b/Documentation/devicetree/bindings/regulator/max8973-regulator.txt | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | * Maxim MAX8973 Voltage Regulator | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | |||
| 5 | - compatible: must be "maxim,max8973" | ||
| 6 | - reg: the i2c slave address of the regulator. It should be 0x1b. | ||
| 7 | |||
| 8 | Any standard regulator properties can be used to configure the single max8973 | ||
| 9 | DCDC. | ||
| 10 | |||
| 11 | Example: | ||
| 12 | |||
| 13 | max8973@1b { | ||
| 14 | compatible = "maxim,max8973"; | ||
| 15 | reg = <0x1b>; | ||
| 16 | |||
| 17 | regulator-min-microvolt = <935000>; | ||
| 18 | regulator-max-microvolt = <1200000>; | ||
| 19 | regulator-boot-on; | ||
| 20 | regulator-always-on; | ||
| 21 | }; | ||
diff --git a/drivers/regulator/max8973-regulator.c b/drivers/regulator/max8973-regulator.c index adb1414e5e37..0c5195a842e2 100644 --- a/drivers/regulator/max8973-regulator.c +++ b/drivers/regulator/max8973-regulator.c | |||
| @@ -26,10 +26,12 @@ | |||
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
| 28 | #include <linux/err.h> | 28 | #include <linux/err.h> |
| 29 | #include <linux/of.h> | ||
| 29 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
| 30 | #include <linux/regulator/driver.h> | 31 | #include <linux/regulator/driver.h> |
| 31 | #include <linux/regulator/machine.h> | 32 | #include <linux/regulator/machine.h> |
| 32 | #include <linux/regulator/max8973-regulator.h> | 33 | #include <linux/regulator/max8973-regulator.h> |
| 34 | #include <linux/regulator/of_regulator.h> | ||
| 33 | #include <linux/gpio.h> | 35 | #include <linux/gpio.h> |
| 34 | #include <linux/i2c.h> | 36 | #include <linux/i2c.h> |
| 35 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
| @@ -100,6 +102,7 @@ struct max8973_chip { | |||
| 100 | int curr_vout_reg; | 102 | int curr_vout_reg; |
| 101 | int curr_gpio_val; | 103 | int curr_gpio_val; |
| 102 | bool valid_dvs_gpio; | 104 | bool valid_dvs_gpio; |
| 105 | struct regulator_ops ops; | ||
| 103 | }; | 106 | }; |
| 104 | 107 | ||
| 105 | /* | 108 | /* |
| @@ -240,7 +243,7 @@ static unsigned int max8973_dcdc_get_mode(struct regulator_dev *rdev) | |||
| 240 | REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL; | 243 | REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL; |
| 241 | } | 244 | } |
| 242 | 245 | ||
| 243 | static struct regulator_ops max8973_dcdc_ops = { | 246 | static const struct regulator_ops max8973_dcdc_ops = { |
| 244 | .get_voltage_sel = max8973_dcdc_get_voltage_sel, | 247 | .get_voltage_sel = max8973_dcdc_get_voltage_sel, |
| 245 | .set_voltage_sel = max8973_dcdc_set_voltage_sel, | 248 | .set_voltage_sel = max8973_dcdc_set_voltage_sel, |
| 246 | .list_voltage = regulator_list_voltage_linear, | 249 | .list_voltage = regulator_list_voltage_linear, |
| @@ -369,7 +372,8 @@ static int max8973_probe(struct i2c_client *client, | |||
| 369 | int ret; | 372 | int ret; |
| 370 | 373 | ||
| 371 | pdata = client->dev.platform_data; | 374 | pdata = client->dev.platform_data; |
| 372 | if (!pdata) { | 375 | |
| 376 | if (!pdata && !client->dev.of_node) { | ||
| 373 | dev_err(&client->dev, "No Platform data"); | 377 | dev_err(&client->dev, "No Platform data"); |
| 374 | return -EIO; | 378 | return -EIO; |
| 375 | } | 379 | } |
| @@ -388,30 +392,36 @@ static int max8973_probe(struct i2c_client *client, | |||
| 388 | } | 392 | } |
| 389 | 393 | ||
| 390 | i2c_set_clientdata(client, max); | 394 | i2c_set_clientdata(client, max); |
| 395 | max->ops = max8973_dcdc_ops; | ||
| 391 | max->dev = &client->dev; | 396 | max->dev = &client->dev; |
| 392 | max->desc.name = id->name; | 397 | max->desc.name = id->name; |
| 393 | max->desc.id = 0; | 398 | max->desc.id = 0; |
| 394 | max->desc.ops = &max8973_dcdc_ops; | 399 | max->desc.ops = &max->ops; |
| 395 | max->desc.type = REGULATOR_VOLTAGE; | 400 | max->desc.type = REGULATOR_VOLTAGE; |
| 396 | max->desc.owner = THIS_MODULE; | 401 | max->desc.owner = THIS_MODULE; |
| 397 | max->desc.min_uV = MAX8973_MIN_VOLATGE; | 402 | max->desc.min_uV = MAX8973_MIN_VOLATGE; |
| 398 | max->desc.uV_step = MAX8973_VOLATGE_STEP; | 403 | max->desc.uV_step = MAX8973_VOLATGE_STEP; |
| 399 | max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE; | 404 | max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE; |
| 400 | 405 | ||
| 401 | if (!pdata->enable_ext_control) { | 406 | if (!pdata || !pdata->enable_ext_control) { |
| 402 | max->desc.enable_reg = MAX8973_VOUT; | 407 | max->desc.enable_reg = MAX8973_VOUT; |
| 403 | max->desc.enable_mask = MAX8973_VOUT_ENABLE; | 408 | max->desc.enable_mask = MAX8973_VOUT_ENABLE; |
| 404 | max8973_dcdc_ops.enable = regulator_enable_regmap; | 409 | max->ops.enable = regulator_enable_regmap; |
| 405 | max8973_dcdc_ops.disable = regulator_disable_regmap; | 410 | max->ops.disable = regulator_disable_regmap; |
| 406 | max8973_dcdc_ops.is_enabled = regulator_is_enabled_regmap; | 411 | max->ops.is_enabled = regulator_is_enabled_regmap; |
| 412 | } | ||
| 413 | |||
| 414 | if (pdata) { | ||
| 415 | max->dvs_gpio = pdata->dvs_gpio; | ||
| 416 | max->enable_external_control = pdata->enable_ext_control; | ||
| 417 | max->curr_gpio_val = pdata->dvs_def_state; | ||
| 418 | max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state; | ||
| 419 | } else { | ||
| 420 | max->dvs_gpio = -EINVAL; | ||
| 421 | max->curr_vout_reg = MAX8973_VOUT; | ||
| 407 | } | 422 | } |
| 408 | 423 | ||
| 409 | max->enable_external_control = pdata->enable_ext_control; | ||
| 410 | max->dvs_gpio = pdata->dvs_gpio; | ||
| 411 | max->curr_gpio_val = pdata->dvs_def_state; | ||
| 412 | max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state; | ||
| 413 | max->lru_index[0] = max->curr_vout_reg; | 424 | max->lru_index[0] = max->curr_vout_reg; |
| 414 | max->valid_dvs_gpio = false; | ||
| 415 | 425 | ||
| 416 | if (gpio_is_valid(max->dvs_gpio)) { | 426 | if (gpio_is_valid(max->dvs_gpio)) { |
| 417 | int gpio_flags; | 427 | int gpio_flags; |
| @@ -437,16 +447,21 @@ static int max8973_probe(struct i2c_client *client, | |||
| 437 | max->lru_index[i] = i; | 447 | max->lru_index[i] = i; |
| 438 | max->lru_index[0] = max->curr_vout_reg; | 448 | max->lru_index[0] = max->curr_vout_reg; |
| 439 | max->lru_index[max->curr_vout_reg] = 0; | 449 | max->lru_index[max->curr_vout_reg] = 0; |
| 450 | } else { | ||
| 451 | max->valid_dvs_gpio = false; | ||
| 440 | } | 452 | } |
| 441 | 453 | ||
| 442 | ret = max8973_init_dcdc(max, pdata); | 454 | if (pdata) { |
| 443 | if (ret < 0) { | 455 | ret = max8973_init_dcdc(max, pdata); |
| 444 | dev_err(max->dev, "Max8973 Init failed, err = %d\n", ret); | 456 | if (ret < 0) { |
| 445 | return ret; | 457 | dev_err(max->dev, "Max8973 Init failed, err = %d\n", ret); |
| 458 | return ret; | ||
| 459 | } | ||
| 446 | } | 460 | } |
| 447 | 461 | ||
| 448 | config.dev = &client->dev; | 462 | config.dev = &client->dev; |
| 449 | config.init_data = pdata->reg_init_data; | 463 | config.init_data = pdata ? pdata->reg_init_data : |
| 464 | of_get_regulator_init_data(&client->dev, client->dev.of_node); | ||
| 450 | config.driver_data = max; | 465 | config.driver_data = max; |
| 451 | config.of_node = client->dev.of_node; | 466 | config.of_node = client->dev.of_node; |
| 452 | config.regmap = max->regmap; | 467 | config.regmap = max->regmap; |
