Loading Documentation/devicetree/bindings/regulator/da9211.txt 0 → 100644 +63 −0 Original line number Diff line number Diff line * Dialog Semiconductor DA9211/DA9213 Voltage Regulator Required properties: - compatible: "dlg,da9211" or "dlg,da9213". - reg: I2C slave address, usually 0x68. - interrupts: the interrupt outputs of the controller - regulators: A node that houses a sub-node for each regulator within the device. Each sub-node is identified using the node's name, with valid values listed below. The content of each sub-node is defined by the standard binding for regulators; see regulator.txt. BUCKA and BUCKB. Optional properties: - Any optional property defined in regulator.txt Example 1) DA9211 pmic: da9211@68 { compatible = "dlg,da9211"; reg = <0x68>; interrupts = <3 27>; regulators { BUCKA { regulator-name = "VBUCKA"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <2000000>; regulator-max-microamp = <5000000>; }; BUCKB { regulator-name = "VBUCKB"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <2000000>; regulator-max-microamp = <5000000>; }; }; }; Example 2) DA92113 pmic: da9213@68 { compatible = "dlg,da9213"; reg = <0x68>; interrupts = <3 27>; regulators { BUCKA { regulator-name = "VBUCKA"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <3000000>; regulator-max-microamp = <6000000>; }; BUCKB { regulator-name = "VBUCKB"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <3000000>; regulator-max-microamp = <6000000>; }; }; }; drivers/regulator/da9211-regulator.c +78 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <linux/regmap.h> #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/regulator/of_regulator.h> #include <linux/regulator/da9211.h> #include "da9211-regulator.h" Loading Loading @@ -236,6 +237,59 @@ static struct regulator_desc da9211_regulators[] = { DA9211_BUCK(BUCKB), }; #ifdef CONFIG_OF static struct of_regulator_match da9211_matches[] = { [DA9211_ID_BUCKA] = { .name = "BUCKA" }, [DA9211_ID_BUCKB] = { .name = "BUCKB" }, }; static struct da9211_pdata *da9211_parse_regulators_dt( struct device *dev) { struct da9211_pdata *pdata; struct device_node *node; int i, num, n; node = of_get_child_by_name(dev->of_node, "regulators"); if (!node) { dev_err(dev, "regulators node not found\n"); return ERR_PTR(-ENODEV); } num = of_regulator_match(dev, node, da9211_matches, ARRAY_SIZE(da9211_matches)); of_node_put(node); if (num < 0) { dev_err(dev, "Failed to match regulators\n"); return ERR_PTR(-EINVAL); } pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return ERR_PTR(-ENOMEM); pdata->num_buck = num; n = 0; for (i = 0; i < ARRAY_SIZE(da9211_matches); i++) { if (!da9211_matches[i].init_data) continue; pdata->init_data[n] = da9211_matches[i].init_data; n++; }; return pdata; } #else static struct da9211_pdata *da9211_parse_regulators_dt( struct device *dev) { return ERR_PTR(-ENODEV); } #endif static irqreturn_t da9211_irq_handler(int irq, void *data) { struct da9211 *chip = data; Loading Loading @@ -306,7 +360,7 @@ static int da9211_regulator_init(struct da9211 *chip) } for (i = 0; i < chip->num_regulator; i++) { config.init_data = &(chip->pdata->init_data[i]); config.init_data = chip->pdata->init_data[i]; config.dev = chip->dev; config.driver_data = chip; config.regmap = chip->regmap; Loading @@ -332,6 +386,21 @@ static int da9211_regulator_init(struct da9211 *chip) return 0; } static const struct i2c_device_id da9211_i2c_id[] = { {"da9211", DA9211}, {"da9213", DA9213}, {}, }; #ifdef CONFIG_OF static const struct of_device_id da9211_dt_ids[] = { { .compatible = "dlg,da9211", .data = &da9211_i2c_id[0] }, { .compatible = "dlg,da9213", .data = &da9211_i2c_id[1] }, {}, }; #endif /* * I2C driver interface functions */ Loading Loading @@ -377,6 +446,14 @@ static int da9211_i2c_probe(struct i2c_client *i2c, return -ENODEV; } if (!chip->pdata) chip->pdata = da9211_parse_regulators_dt(chip->dev); if (IS_ERR(chip->pdata)) { dev_err(chip->dev, "No regulators defined for the platform\n"); return PTR_ERR(chip->pdata); } chip->chip_irq = i2c->irq; if (chip->chip_irq != 0) { Loading @@ -401,12 +478,6 @@ static int da9211_i2c_probe(struct i2c_client *i2c, return ret; } static const struct i2c_device_id da9211_i2c_id[] = { {"da9211", DA9211}, {"da9213", DA9213}, {}, }; MODULE_DEVICE_TABLE(i2c, da9211_i2c_id); static struct i2c_driver da9211_regulator_driver = { Loading include/linux/regulator/da9211.h +1 −1 Original line number Diff line number Diff line Loading @@ -32,6 +32,6 @@ struct da9211_pdata { * 2 : 2 phase 2 buck */ int num_buck; struct regulator_init_data *init_data; struct regulator_init_data *init_data[DA9211_MAX_REGULATORS]; }; #endif Loading
Documentation/devicetree/bindings/regulator/da9211.txt 0 → 100644 +63 −0 Original line number Diff line number Diff line * Dialog Semiconductor DA9211/DA9213 Voltage Regulator Required properties: - compatible: "dlg,da9211" or "dlg,da9213". - reg: I2C slave address, usually 0x68. - interrupts: the interrupt outputs of the controller - regulators: A node that houses a sub-node for each regulator within the device. Each sub-node is identified using the node's name, with valid values listed below. The content of each sub-node is defined by the standard binding for regulators; see regulator.txt. BUCKA and BUCKB. Optional properties: - Any optional property defined in regulator.txt Example 1) DA9211 pmic: da9211@68 { compatible = "dlg,da9211"; reg = <0x68>; interrupts = <3 27>; regulators { BUCKA { regulator-name = "VBUCKA"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <2000000>; regulator-max-microamp = <5000000>; }; BUCKB { regulator-name = "VBUCKB"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <2000000>; regulator-max-microamp = <5000000>; }; }; }; Example 2) DA92113 pmic: da9213@68 { compatible = "dlg,da9213"; reg = <0x68>; interrupts = <3 27>; regulators { BUCKA { regulator-name = "VBUCKA"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <3000000>; regulator-max-microamp = <6000000>; }; BUCKB { regulator-name = "VBUCKB"; regulator-min-microvolt = < 300000>; regulator-max-microvolt = <1570000>; regulator-min-microamp = <3000000>; regulator-max-microamp = <6000000>; }; }; };
drivers/regulator/da9211-regulator.c +78 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <linux/regmap.h> #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/regulator/of_regulator.h> #include <linux/regulator/da9211.h> #include "da9211-regulator.h" Loading Loading @@ -236,6 +237,59 @@ static struct regulator_desc da9211_regulators[] = { DA9211_BUCK(BUCKB), }; #ifdef CONFIG_OF static struct of_regulator_match da9211_matches[] = { [DA9211_ID_BUCKA] = { .name = "BUCKA" }, [DA9211_ID_BUCKB] = { .name = "BUCKB" }, }; static struct da9211_pdata *da9211_parse_regulators_dt( struct device *dev) { struct da9211_pdata *pdata; struct device_node *node; int i, num, n; node = of_get_child_by_name(dev->of_node, "regulators"); if (!node) { dev_err(dev, "regulators node not found\n"); return ERR_PTR(-ENODEV); } num = of_regulator_match(dev, node, da9211_matches, ARRAY_SIZE(da9211_matches)); of_node_put(node); if (num < 0) { dev_err(dev, "Failed to match regulators\n"); return ERR_PTR(-EINVAL); } pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return ERR_PTR(-ENOMEM); pdata->num_buck = num; n = 0; for (i = 0; i < ARRAY_SIZE(da9211_matches); i++) { if (!da9211_matches[i].init_data) continue; pdata->init_data[n] = da9211_matches[i].init_data; n++; }; return pdata; } #else static struct da9211_pdata *da9211_parse_regulators_dt( struct device *dev) { return ERR_PTR(-ENODEV); } #endif static irqreturn_t da9211_irq_handler(int irq, void *data) { struct da9211 *chip = data; Loading Loading @@ -306,7 +360,7 @@ static int da9211_regulator_init(struct da9211 *chip) } for (i = 0; i < chip->num_regulator; i++) { config.init_data = &(chip->pdata->init_data[i]); config.init_data = chip->pdata->init_data[i]; config.dev = chip->dev; config.driver_data = chip; config.regmap = chip->regmap; Loading @@ -332,6 +386,21 @@ static int da9211_regulator_init(struct da9211 *chip) return 0; } static const struct i2c_device_id da9211_i2c_id[] = { {"da9211", DA9211}, {"da9213", DA9213}, {}, }; #ifdef CONFIG_OF static const struct of_device_id da9211_dt_ids[] = { { .compatible = "dlg,da9211", .data = &da9211_i2c_id[0] }, { .compatible = "dlg,da9213", .data = &da9211_i2c_id[1] }, {}, }; #endif /* * I2C driver interface functions */ Loading Loading @@ -377,6 +446,14 @@ static int da9211_i2c_probe(struct i2c_client *i2c, return -ENODEV; } if (!chip->pdata) chip->pdata = da9211_parse_regulators_dt(chip->dev); if (IS_ERR(chip->pdata)) { dev_err(chip->dev, "No regulators defined for the platform\n"); return PTR_ERR(chip->pdata); } chip->chip_irq = i2c->irq; if (chip->chip_irq != 0) { Loading @@ -401,12 +478,6 @@ static int da9211_i2c_probe(struct i2c_client *i2c, return ret; } static const struct i2c_device_id da9211_i2c_id[] = { {"da9211", DA9211}, {"da9213", DA9213}, {}, }; MODULE_DEVICE_TABLE(i2c, da9211_i2c_id); static struct i2c_driver da9211_regulator_driver = { Loading
include/linux/regulator/da9211.h +1 −1 Original line number Diff line number Diff line Loading @@ -32,6 +32,6 @@ struct da9211_pdata { * 2 : 2 phase 2 buck */ int num_buck; struct regulator_init_data *init_data; struct regulator_init_data *init_data[DA9211_MAX_REGULATORS]; }; #endif