Commit 64b285ad authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/topic/max1586',...

Merge remote-tracking branches 'regulator/topic/max1586', 'regulator/topic/max77802' and 'regulator/topic/of' into regulator-next
Maxim MAX1586 voltage regulator
Required properties:
- compatible: must be "maxim,max1586"
- reg: I2C slave address, usually 0x14
- v3-gain: integer specifying the V3 gain as per datasheet
(1 + R24/R25 + R24/185.5kOhm)
- any required generic properties defined in regulator.txt
Example:
i2c_master {
max1586@14 {
compatible = "maxim,max1586";
reg = <0x14>;
v3-gain = <1000000>;
regulators {
vcc_core: v3 {
regulator-name = "vcc_core";
regulator-compatible = "Output_V3";
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1705000>;
regulator-always-on;
};
};
};
};
Binding for Maxim MAX77802 regulators
This is a part of device tree bindings of MAX77802 multi-function device.
More information can be found in bindings/mfd/max77802.txt file.
The MAX77802 PMIC has 10 high-efficiency Buck and 32 Low-dropout (LDO)
regulators that can be controlled over I2C.
Following properties should be present in main device node of the MFD chip.
Optional node:
- regulators : The regulators of max77802 have to be instantiated
under subnode named "regulators" using the following format.
regulator-name {
standard regulator constraints....
};
refer Documentation/devicetree/bindings/regulator/regulator.txt
The regulator node name should be initialized with a string to get matched
with their hardware counterparts as follow. The valid names are:
-LDOn : for LDOs, where n can lie in ranges 1-15, 17-21, 23-30
and 32-35.
example: LDO1, LDO2, LDO35.
-BUCKn : for BUCKs, where n can lie in range 1 to 10.
example: BUCK1, BUCK5, BUCK10.
Example:
max77802@09 {
compatible = "maxim,max77802";
interrupt-parent = <&wakeup_eint>;
interrupts = <26 0>;
reg = <0x09>;
#address-cells = <1>;
#size-cells = <0>;
regulators {
ldo11_reg: LDO11 {
regulator-name = "vdd_ldo11";
regulator-min-microvolt = <1900000>;
regulator-max-microvolt = <1900000>;
regulator-always-on;
};
buck1_reg: BUCK1 {
regulator-name = "vdd_mif";
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1300000>;
regulator-always-on;
regulator-boot-on;
};
};
...@@ -405,6 +405,15 @@ config REGULATOR_MAX77693 ...@@ -405,6 +405,15 @@ config REGULATOR_MAX77693
and one current regulator 'CHARGER'. This is suitable for and one current regulator 'CHARGER'. This is suitable for
Exynos-4x12 chips. Exynos-4x12 chips.
config REGULATOR_MAX77802
tristate "Maxim 77802 regulator"
depends on MFD_MAX77686
help
This driver controls a Maxim 77802 regulator
via I2C bus. The provided regulator is suitable for
Exynos5420/Exynos5800 SoCs to control various voltages.
It includes support for control of voltage and ramp speed.
config REGULATOR_MC13XXX_CORE config REGULATOR_MC13XXX_CORE
tristate tristate
......
...@@ -54,6 +54,7 @@ obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o ...@@ -54,6 +54,7 @@ obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o
obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o
obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o
obj-$(CONFIG_REGULATOR_MAX77693) += max77693.o obj-$(CONFIG_REGULATOR_MAX77693) += max77693.o
obj-$(CONFIG_REGULATOR_MAX77802) += max77802.o
obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o
obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o
obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o
......
...@@ -35,8 +35,18 @@ struct regulator { ...@@ -35,8 +35,18 @@ struct regulator {
struct dentry *debugfs; struct dentry *debugfs;
}; };
#ifdef CONFIG_OF
struct regulator_init_data *regulator_of_get_init_data(struct device *dev, struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
const struct regulator_desc *desc, const struct regulator_desc *desc,
struct device_node **node); struct device_node **node);
#else
static inline struct regulator_init_data *
regulator_of_get_init_data(struct device *dev,
const struct regulator_desc *desc,
struct device_node **node)
{
return NULL;
}
#endif
#endif #endif
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include <linux/regulator/driver.h> #include <linux/regulator/driver.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/regulator/max1586.h> #include <linux/regulator/max1586.h>
#include <linux/of_device.h>
#include <linux/regulator/of_regulator.h>
#define MAX1586_V3_MAX_VSEL 31 #define MAX1586_V3_MAX_VSEL 31
#define MAX1586_V6_MAX_VSEL 3 #define MAX1586_V6_MAX_VSEL 3
...@@ -157,13 +159,87 @@ static struct regulator_desc max1586_reg[] = { ...@@ -157,13 +159,87 @@ static struct regulator_desc max1586_reg[] = {
}, },
}; };
static int of_get_max1586_platform_data(struct device *dev,
struct max1586_platform_data *pdata)
{
struct max1586_subdev_data *sub;
struct of_regulator_match rmatch[ARRAY_SIZE(max1586_reg)];
struct device_node *np = dev->of_node;
int i, matched;
if (of_property_read_u32(np, "v3-gain",
&pdata->v3_gain) < 0) {
dev_err(dev, "%s has no 'v3-gain' property\n", np->full_name);
return -EINVAL;
}
np = of_get_child_by_name(np, "regulators");
if (!np) {
dev_err(dev, "missing 'regulators' subnode in DT\n");
return -EINVAL;
}
for (i = 0; i < ARRAY_SIZE(rmatch); i++)
rmatch[i].name = max1586_reg[i].name;
matched = of_regulator_match(dev, np, rmatch, ARRAY_SIZE(rmatch));
of_node_put(np);
/*
* If matched is 0, ie. neither Output_V3 nor Output_V6 have been found,
* return 0, which signals the normal situation where no subregulator is
* available. This is normal because the max1586 doesn't provide any
* readback support, so the subregulators can't report any status
* anyway. If matched < 0, return the error.
*/
if (matched <= 0)
return matched;
pdata->subdevs = devm_kzalloc(dev, sizeof(struct max1586_subdev_data) *
matched, GFP_KERNEL);
if (!pdata->subdevs)
return -ENOMEM;
pdata->num_subdevs = matched;
sub = pdata->subdevs;
for (i = 0; i < matched; i++) {
sub->id = i;
sub->name = rmatch[i].of_node->name;
sub->platform_data = rmatch[i].init_data;
sub++;
}
return 0;
}
static const struct of_device_id max1586_of_match[] = {
{ .compatible = "maxim,max1586", },
{},
};
MODULE_DEVICE_TABLE(of, max1586_of_match);
static int max1586_pmic_probe(struct i2c_client *client, static int max1586_pmic_probe(struct i2c_client *client,
const struct i2c_device_id *i2c_id) const struct i2c_device_id *i2c_id)
{ {
struct max1586_platform_data *pdata = dev_get_platdata(&client->dev); struct max1586_platform_data *pdata, pdata_of;
struct regulator_config config = { }; struct regulator_config config = { };
struct max1586_data *max1586; struct max1586_data *max1586;
int i, id; int i, id, ret;
const struct of_device_id *match;
pdata = dev_get_platdata(&client->dev);
if (client->dev.of_node && !pdata) {
match = of_match_device(of_match_ptr(max1586_of_match),
&client->dev);
if (!match) {
dev_err(&client->dev, "Error: No device match found\n");
return -ENODEV;
}
ret = of_get_max1586_platform_data(&client->dev, &pdata_of);
if (ret < 0)
return ret;
pdata = &pdata_of;
}
max1586 = devm_kzalloc(&client->dev, sizeof(struct max1586_data), max1586 = devm_kzalloc(&client->dev, sizeof(struct max1586_data),
GFP_KERNEL); GFP_KERNEL);
...@@ -229,6 +305,7 @@ static struct i2c_driver max1586_pmic_driver = { ...@@ -229,6 +305,7 @@ static struct i2c_driver max1586_pmic_driver = {
.driver = { .driver = {
.name = "max1586", .name = "max1586",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = of_match_ptr(max1586_of_match),
}, },
.id_table = max1586_id, .id_table = max1586_id,
}; };
......
This diff is collapsed.
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
*/ */
struct max1586_subdev_data { struct max1586_subdev_data {
int id; int id;
char *name; const char *name;
struct regulator_init_data *platform_data; struct regulator_init_data *platform_data;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment