Skip to content

Commit

Permalink
mfd: Add device-tree support for da9502 i2c driver
Browse files Browse the repository at this point in the history
This patch adds device-tree support for dialog MFD and the binding
documentations.

Signed-off-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Ashish Jangam <ashish.jangam@kpitcummins.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Ying-Chun Liu (PaulLiu) authored and Samuel Ortiz committed May 1, 2012
1 parent 465c29d commit 58d114b
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 8 deletions.
60 changes: 60 additions & 0 deletions Documentation/devicetree/bindings/mfd/da9052-i2c.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
* Dialog DA9052/53 Power Management Integrated Circuit (PMIC)

Required properties:
- compatible : Should be "dlg,da9052", "dlg,da9053-aa",
"dlg,da9053-ab", or "dlg,da9053-bb"

Sub-nodes:
- regulators : Contain the regulator nodes. The DA9052/53 regulators are
bound using their names as listed below:

buck0 : regulator BUCK0
buck1 : regulator BUCK1
buck2 : regulator BUCK2
buck3 : regulator BUCK3
ldo4 : regulator LDO4
ldo5 : regulator LDO5
ldo6 : regulator LDO6
ldo7 : regulator LDO7
ldo8 : regulator LDO8
ldo9 : regulator LDO9
ldo10 : regulator LDO10
ldo11 : regulator LDO11
ldo12 : regulator LDO12
ldo13 : regulator LDO13

The bindings details of individual regulator device can be found in:
Documentation/devicetree/bindings/regulator/regulator.txt

Examples:

i2c@63fc8000 { /* I2C1 */
status = "okay";

pmic: dialog@48 {
compatible = "dlg,da9053-aa";
reg = <0x48>;

regulators {
buck0 {
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <2075000>;
};

buck1 {
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <2075000>;
};

buck2 {
regulator-min-microvolt = <925000>;
regulator-max-microvolt = <2500000>;
};

buck3 {
regulator-min-microvolt = <925000>;
regulator-max-microvolt = <2500000>;
};
};
};
};
50 changes: 42 additions & 8 deletions drivers/mfd/da9052-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
#include <linux/mfd/da9052/da9052.h>
#include <linux/mfd/da9052/reg.h>

#ifdef CONFIG_OF
#include <linux/of.h>
#include <linux/of_device.h>
#endif

static int da9052_i2c_enable_multiwrite(struct da9052 *da9052)
{
int reg_val, ret;
Expand All @@ -41,6 +46,24 @@ static int da9052_i2c_enable_multiwrite(struct da9052 *da9052)
return 0;
}

static struct i2c_device_id da9052_i2c_id[] = {
{"da9052", DA9052},
{"da9053-aa", DA9053_AA},
{"da9053-ba", DA9053_BA},
{"da9053-bb", DA9053_BB},
{}
};

#ifdef CONFIG_OF
static const struct of_device_id dialog_dt_ids[] = {
{ .compatible = "dlg,da9052", .data = &da9052_i2c_id[0] },
{ .compatible = "dlg,da9053-aa", .data = &da9052_i2c_id[1] },
{ .compatible = "dlg,da9053-ab", .data = &da9052_i2c_id[2] },
{ .compatible = "dlg,da9053-bb", .data = &da9052_i2c_id[3] },
{ /* sentinel */ }
};
#endif

static int __devinit da9052_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
Expand Down Expand Up @@ -76,6 +99,22 @@ static int __devinit da9052_i2c_probe(struct i2c_client *client,
if (ret < 0)
goto err_regmap;

#ifdef CONFIG_OF
if (!id) {
struct device_node *np = client->dev.of_node;
const struct of_device_id *deviceid;

deviceid = of_match_node(np, dialog_dt_ids);
id = (const struct i2c_device_id *)deviceid->data;
}
#endif

if (!id) {
ret = -ENODEV;
dev_err(&client->dev, "id is null.\n");
goto err_regmap;
}

ret = da9052_device_init(da9052, id->driver_data);
if (ret != 0)
goto err_regmap;
Expand All @@ -100,21 +139,16 @@ static int __devexit da9052_i2c_remove(struct i2c_client *client)
return 0;
}

static struct i2c_device_id da9052_i2c_id[] = {
{"da9052", DA9052},
{"da9053-aa", DA9053_AA},
{"da9053-ba", DA9053_BA},
{"da9053-bb", DA9053_BB},
{}
};

static struct i2c_driver da9052_i2c_driver = {
.probe = da9052_i2c_probe,
.remove = __devexit_p(da9052_i2c_remove),
.id_table = da9052_i2c_id,
.driver = {
.name = "da9052",
.owner = THIS_MODULE,
#ifdef CONFIG_OF
.of_match_table = dialog_dt_ids,
#endif
},
};

Expand Down

0 comments on commit 58d114b

Please sign in to comment.