Merge remote-tracking branch 'regulator/topic/max8973' into regulator-next
This commit is contained in:
commit
5ee6c72880
Documentation/devicetree/bindings/regulator
drivers/regulator
|
@ -0,0 +1,21 @@
|
||||||
|
* Maxim MAX8973 Voltage Regulator
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible: must be "maxim,max8973"
|
||||||
|
- reg: the i2c slave address of the regulator. It should be 0x1b.
|
||||||
|
|
||||||
|
Any standard regulator properties can be used to configure the single max8973
|
||||||
|
DCDC.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
max8973@1b {
|
||||||
|
compatible = "maxim,max8973";
|
||||||
|
reg = <0x1b>;
|
||||||
|
|
||||||
|
regulator-min-microvolt = <935000>;
|
||||||
|
regulator-max-microvolt = <1200000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
|
@ -26,10 +26,12 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/regulator/driver.h>
|
#include <linux/regulator/driver.h>
|
||||||
#include <linux/regulator/machine.h>
|
#include <linux/regulator/machine.h>
|
||||||
#include <linux/regulator/max8973-regulator.h>
|
#include <linux/regulator/max8973-regulator.h>
|
||||||
|
#include <linux/regulator/of_regulator.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
@ -100,6 +102,7 @@ struct max8973_chip {
|
||||||
int curr_vout_reg;
|
int curr_vout_reg;
|
||||||
int curr_gpio_val;
|
int curr_gpio_val;
|
||||||
bool valid_dvs_gpio;
|
bool valid_dvs_gpio;
|
||||||
|
struct regulator_ops ops;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -240,7 +243,7 @@ static unsigned int max8973_dcdc_get_mode(struct regulator_dev *rdev)
|
||||||
REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
|
REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct regulator_ops max8973_dcdc_ops = {
|
static const struct regulator_ops max8973_dcdc_ops = {
|
||||||
.get_voltage_sel = max8973_dcdc_get_voltage_sel,
|
.get_voltage_sel = max8973_dcdc_get_voltage_sel,
|
||||||
.set_voltage_sel = max8973_dcdc_set_voltage_sel,
|
.set_voltage_sel = max8973_dcdc_set_voltage_sel,
|
||||||
.list_voltage = regulator_list_voltage_linear,
|
.list_voltage = regulator_list_voltage_linear,
|
||||||
|
@ -369,7 +372,8 @@ static int max8973_probe(struct i2c_client *client,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pdata = client->dev.platform_data;
|
pdata = client->dev.platform_data;
|
||||||
if (!pdata) {
|
|
||||||
|
if (!pdata && !client->dev.of_node) {
|
||||||
dev_err(&client->dev, "No Platform data");
|
dev_err(&client->dev, "No Platform data");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -388,30 +392,36 @@ static int max8973_probe(struct i2c_client *client,
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_set_clientdata(client, max);
|
i2c_set_clientdata(client, max);
|
||||||
|
max->ops = max8973_dcdc_ops;
|
||||||
max->dev = &client->dev;
|
max->dev = &client->dev;
|
||||||
max->desc.name = id->name;
|
max->desc.name = id->name;
|
||||||
max->desc.id = 0;
|
max->desc.id = 0;
|
||||||
max->desc.ops = &max8973_dcdc_ops;
|
max->desc.ops = &max->ops;
|
||||||
max->desc.type = REGULATOR_VOLTAGE;
|
max->desc.type = REGULATOR_VOLTAGE;
|
||||||
max->desc.owner = THIS_MODULE;
|
max->desc.owner = THIS_MODULE;
|
||||||
max->desc.min_uV = MAX8973_MIN_VOLATGE;
|
max->desc.min_uV = MAX8973_MIN_VOLATGE;
|
||||||
max->desc.uV_step = MAX8973_VOLATGE_STEP;
|
max->desc.uV_step = MAX8973_VOLATGE_STEP;
|
||||||
max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE;
|
max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE;
|
||||||
|
|
||||||
if (!pdata->enable_ext_control) {
|
if (!pdata || !pdata->enable_ext_control) {
|
||||||
max->desc.enable_reg = MAX8973_VOUT;
|
max->desc.enable_reg = MAX8973_VOUT;
|
||||||
max->desc.enable_mask = MAX8973_VOUT_ENABLE;
|
max->desc.enable_mask = MAX8973_VOUT_ENABLE;
|
||||||
max8973_dcdc_ops.enable = regulator_enable_regmap;
|
max->ops.enable = regulator_enable_regmap;
|
||||||
max8973_dcdc_ops.disable = regulator_disable_regmap;
|
max->ops.disable = regulator_disable_regmap;
|
||||||
max8973_dcdc_ops.is_enabled = regulator_is_enabled_regmap;
|
max->ops.is_enabled = regulator_is_enabled_regmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdata) {
|
||||||
|
max->dvs_gpio = pdata->dvs_gpio;
|
||||||
|
max->enable_external_control = pdata->enable_ext_control;
|
||||||
|
max->curr_gpio_val = pdata->dvs_def_state;
|
||||||
|
max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state;
|
||||||
|
} else {
|
||||||
|
max->dvs_gpio = -EINVAL;
|
||||||
|
max->curr_vout_reg = MAX8973_VOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
max->enable_external_control = pdata->enable_ext_control;
|
|
||||||
max->dvs_gpio = pdata->dvs_gpio;
|
|
||||||
max->curr_gpio_val = pdata->dvs_def_state;
|
|
||||||
max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state;
|
|
||||||
max->lru_index[0] = max->curr_vout_reg;
|
max->lru_index[0] = max->curr_vout_reg;
|
||||||
max->valid_dvs_gpio = false;
|
|
||||||
|
|
||||||
if (gpio_is_valid(max->dvs_gpio)) {
|
if (gpio_is_valid(max->dvs_gpio)) {
|
||||||
int gpio_flags;
|
int gpio_flags;
|
||||||
|
@ -437,16 +447,21 @@ static int max8973_probe(struct i2c_client *client,
|
||||||
max->lru_index[i] = i;
|
max->lru_index[i] = i;
|
||||||
max->lru_index[0] = max->curr_vout_reg;
|
max->lru_index[0] = max->curr_vout_reg;
|
||||||
max->lru_index[max->curr_vout_reg] = 0;
|
max->lru_index[max->curr_vout_reg] = 0;
|
||||||
|
} else {
|
||||||
|
max->valid_dvs_gpio = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = max8973_init_dcdc(max, pdata);
|
if (pdata) {
|
||||||
if (ret < 0) {
|
ret = max8973_init_dcdc(max, pdata);
|
||||||
dev_err(max->dev, "Max8973 Init failed, err = %d\n", ret);
|
if (ret < 0) {
|
||||||
return ret;
|
dev_err(max->dev, "Max8973 Init failed, err = %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
config.dev = &client->dev;
|
config.dev = &client->dev;
|
||||||
config.init_data = pdata->reg_init_data;
|
config.init_data = pdata ? pdata->reg_init_data :
|
||||||
|
of_get_regulator_init_data(&client->dev, client->dev.of_node);
|
||||||
config.driver_data = max;
|
config.driver_data = max;
|
||||||
config.of_node = client->dev.of_node;
|
config.of_node = client->dev.of_node;
|
||||||
config.regmap = max->regmap;
|
config.regmap = max->regmap;
|
||||||
|
|
Loading…
Reference in New Issue