lkml.org 
[lkml]   [2012]   [Apr]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v3] mfd: da9052: add device-tree support for i2c driver
On Sat, Apr 14, 2012 at 09:39:06PM +0800, Ying-Chun Liu (PaulLiu) wrote:
> From: "Ying-Chun Liu (PaulLiu)" <paul.liu@linaro.org>
>
> 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>
> ---
> .../devicetree/bindings/mfd/da9052-i2c.txt | 60 ++++++++++++++++++++
> drivers/mfd/da9052-i2c.c | 51 ++++++++++++++---
> 2 files changed, 103 insertions(+), 8 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/mfd/da9052-i2c.txt
>
> diff --git a/Documentation/devicetree/bindings/mfd/da9052-i2c.txt b/Documentation/devicetree/bindings/mfd/da9052-i2c.txt
> new file mode 100644
> index 0000000..1857f4a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/da9052-i2c.txt
> @@ -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>;
> + };
> + };
> + };
> +};
> diff --git a/drivers/mfd/da9052-i2c.c b/drivers/mfd/da9052-i2c.c
> index 36b88e3..b946b0ff 100644
> --- a/drivers/mfd/da9052-i2c.c
> +++ b/drivers/mfd/da9052-i2c.c
> @@ -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
> +
I'm not a big fan of "#ifdef CONFIG_OF", but maintainers may like
to compile out DT support for non-DT build, so I leave it there.

> static int da9052_i2c_enable_multiwrite(struct da9052 *da9052)
> {
> int reg_val, ret;
> @@ -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)
> {
> @@ -76,6 +99,23 @@ static int __devinit da9052_i2c_probe(struct i2c_client *client,
> if (ret < 0)
> goto err_regmap;
>
> +#ifdef CONFIG_OF
> + if (!id) {
> + int i;

What is this for?

> + 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);

Unnecessary parentheses around deviceid->data.

Regards,
Shawn

> + }
> +#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;
> @@ -100,14 +140,6 @@ 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),
> @@ -115,6 +147,9 @@ static struct i2c_driver da9052_i2c_driver = {
> .driver = {
> .name = "da9052",
> .owner = THIS_MODULE,
> +#ifdef CONFIG_OF
> + .of_match_table = dialog_dt_ids,
> +#endif
> },
> };
>
> --
> 1.7.9.5
>


\
 
 \ /
  Last update: 2012-04-15 04:03    [W:0.059 / U:0.028 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site