2012-06-25 12:05:12

by AnilKumar, Chimata

[permalink] [raw]
Subject: [PATCH 0/3] Add device tree support for AM33XX regulators

Add device tree support for regulators present on AM33XX family of
devices like AM335X-EVM and AM335X-Bone. TPS65217 regulator is present
on AM335X-Bone and TPS65910 on AM335X-EVM.

First patch adds the device tree support to tps65217 regulator so
that it will take the parameters from am335x-bone.dts file and
convert to regulator parameters.

Second patch adds tps65217 device tree data to am335x-bone.dts file
with i2c salve address. Created seperate file tps65217, which contains
the generic tps65217 device tree data.

Third patch adds tps65910 device tree data to am335x-evm.dts file
with i2c salve address. Created seperate file tps65910, which contains
the generic tps65910 device tree data.

These patches were tested along with these patches
* DT addition to AM33XX family
http://marc.info/?l=linux-omap&m=134035826700991&w=2

AnilKumar Ch (3):
regulator: tps65217: Add device tree support
ARM: OMAP2+: AM33XX: Add tps65217 device tree data
ARM: OMAP2+: AM33XX: Add tps65910 device tree data

.../devicetree/bindings/regulator/tps65217.txt | 66 +++++++++++++++++
arch/arm/boot/dts/am335x-bone.dts | 10 +++
arch/arm/boot/dts/am335x-evm.dts | 10 +++
arch/arm/boot/dts/tps65217.dtsi | 67 +++++++++++++++++
arch/arm/boot/dts/tps65910.dtsi | 76 ++++++++++++++++++++
drivers/mfd/tps65217.c | 67 ++++++++++++++++-
drivers/regulator/tps65217-regulator.c | 1 +
include/linux/mfd/tps65217.h | 3 +-
8 files changed, 297 insertions(+), 3 deletions(-)
create mode 100644 Documentation/devicetree/bindings/regulator/tps65217.txt
create mode 100644 arch/arm/boot/dts/tps65217.dtsi
create mode 100644 arch/arm/boot/dts/tps65910.dtsi

--
1.7.9.5


2012-06-25 12:05:14

by AnilKumar, Chimata

[permalink] [raw]
Subject: [PATCH 1/3] regulator: tps65217: Add device tree support

This commit adds device tree support for tps65217 pmic. And usage
details are added to device tree documentation.

Driver is tested by using kernel module with regulator set and get
APIs.

Signed-off-by: AnilKumar Ch <[email protected]>
---
These patches were tested along with these patches
* DT addition to AM33XX family
http://marc.info/?l=linux-omap&m=134035826700991&w=2

.../devicetree/bindings/regulator/tps65217.txt | 66 +++++++++++++++++++
drivers/mfd/tps65217.c | 67 +++++++++++++++++++-
drivers/regulator/tps65217-regulator.c | 1 +
include/linux/mfd/tps65217.h | 3 +-
4 files changed, 134 insertions(+), 3 deletions(-)
create mode 100644 Documentation/devicetree/bindings/regulator/tps65217.txt

diff --git a/Documentation/devicetree/bindings/regulator/tps65217.txt b/Documentation/devicetree/bindings/regulator/tps65217.txt
new file mode 100644
index 0000000..e84d26c
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/tps65217.txt
@@ -0,0 +1,66 @@
+TPS65217 family of regulators
+
+Required properties:
+- compatible: "ti,tps65217"
+- reg: I2C slave address
+- regulators: list of regulators provided by this controller, must be named
+ after their hardware counterparts: dcdc[1-3] and ldo[1-4]
+
+Each regulator is defined using the standard binding for regulators.
+
+Example:
+
+ tps: tps@24 {
+ compatible = "ti,tps65217";
+
+ regulators {
+ dcdc1_reg: dcdc1 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ dcdc2_reg: dcdc2 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ dcdc3_reg: dcdc3 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo1_reg: ldo1 {
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo2_reg: ldo2 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo3_reg: ldo3 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo4_reg: ldo4 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+ };
+ };
diff --git a/drivers/mfd/tps65217.c b/drivers/mfd/tps65217.c
index db194e4..61c097a 100644
--- a/drivers/mfd/tps65217.c
+++ b/drivers/mfd/tps65217.c
@@ -24,6 +24,7 @@
#include <linux/slab.h>
#include <linux/regmap.h>
#include <linux/err.h>
+#include <linux/regulator/of_regulator.h>

#include <linux/mfd/core.h>
#include <linux/mfd/tps65217.h>
@@ -132,6 +133,61 @@ int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg,
}
EXPORT_SYMBOL_GPL(tps65217_clear_bits);

+#ifdef CONFIG_OF
+static struct of_regulator_match reg_matches[] = {
+ { .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 },
+ { .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 },
+ { .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 },
+ { .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 },
+ { .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 },
+ { .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 },
+ { .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 },
+};
+
+static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client)
+{
+ struct device_node *node = client->dev.of_node;
+ struct tps65217_board *pdata;
+ struct device_node *regs;
+ int count = ARRAY_SIZE(reg_matches);
+ int ret, i;
+
+ regs = of_find_node_by_name(node, "regulators");
+ if (!regs)
+ return NULL;
+
+ ret = of_regulator_match(&client->dev, regs, reg_matches, count);
+ of_node_put(regs);
+ if ((ret < 0) || (ret > count))
+ return NULL;
+
+ count = ret;
+ pdata = devm_kzalloc(&client->dev, count * sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return NULL;
+
+ for (i = 0; i < count; i++) {
+ if (!reg_matches[i].init_data || !reg_matches[i].of_node)
+ continue;
+
+ pdata->tps65217_init_data[i] = reg_matches[i].init_data;
+ pdata->of_node[i] = reg_matches[i].of_node;
+ }
+
+ return pdata;
+}
+
+static struct of_device_id tps65217_of_match[] = {
+ { .compatible = "ti,tps65217", },
+ { },
+};
+#else
+static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client)
+{
+ return NULL;
+}
+#endif
+
static struct regmap_config tps65217_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -141,10 +197,14 @@ static int __devinit tps65217_probe(struct i2c_client *client,
const struct i2c_device_id *ids)
{
struct tps65217 *tps;
+ struct regulator_init_data *reg_data;
struct tps65217_board *pdata = client->dev.platform_data;
int i, ret;
unsigned int version;

+ if (!pdata && client->dev.of_node)
+ pdata = tps65217_parse_dt(client);
+
tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
if (!tps)
return -ENOMEM;
@@ -182,8 +242,9 @@ static int __devinit tps65217_probe(struct i2c_client *client,
}

pdev->dev.parent = tps->dev;
- platform_device_add_data(pdev, &pdata->tps65217_init_data[i],
- sizeof(pdata->tps65217_init_data[i]));
+ pdev->dev.of_node = pdata->of_node[i];
+ reg_data = pdata->tps65217_init_data[i];
+ platform_device_add_data(pdev, reg_data, sizeof(*reg_data));
tps->regulator_pdev[i] = pdev;

platform_device_add(pdev);
@@ -212,6 +273,8 @@ MODULE_DEVICE_TABLE(i2c, tps65217_id_table);
static struct i2c_driver tps65217_driver = {
.driver = {
.name = "tps65217",
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(tps65217_of_match),
},
.id_table = tps65217_id_table,
.probe = tps65217_probe,
diff --git a/drivers/regulator/tps65217-regulator.c b/drivers/regulator/tps65217-regulator.c
index 9d371d2..75401c7 100644
--- a/drivers/regulator/tps65217-regulator.c
+++ b/drivers/regulator/tps65217-regulator.c
@@ -326,6 +326,7 @@ static int __devinit tps65217_regulator_probe(struct platform_device *pdev)
tps->info[pdev->id] = info;

config.dev = &pdev->dev;
+ config.of_node = pdev->dev.of_node;
config.init_data = pdev->dev.platform_data;
config.driver_data = tps;

diff --git a/include/linux/mfd/tps65217.h b/include/linux/mfd/tps65217.h
index e030ef9..10e0595 100644
--- a/include/linux/mfd/tps65217.h
+++ b/include/linux/mfd/tps65217.h
@@ -217,7 +217,8 @@ enum tps65217_regulator_id {
* Board data may be used to initialize regulator.
*/
struct tps65217_board {
- struct regulator_init_data *tps65217_init_data;
+ struct regulator_init_data *tps65217_init_data[TPS65217_NUM_REGULATOR];
+ struct device_node *of_node[TPS65217_NUM_REGULATOR];
};

/**
--
1.7.9.5

2012-06-25 12:05:29

by AnilKumar, Chimata

[permalink] [raw]
Subject: [PATCH 3/3] ARM: OMAP2+: AM33XX: Add tps65910 device tree data

Add device tree data for tps65910 regulator by adding all the
consumers necessary for AM335X-EVM. The data will be map to a
regulator constraints which is required for regulator set_voltage
and get_voltage calls.

All tps65910 PMIC regulator constraints are placed in a seperate
device tree include file (tps65910.dtsi).

This patch also adds the I2C slave address of TPS65910 pmic to
am335x-evm.dts file.

Signed-off-by: AnilKumar Ch <[email protected]>
---
These patches were tested along with these patches
* DT addition to AM33XX family
http://marc.info/?l=linux-omap&m=134035826700991&w=2

arch/arm/boot/dts/am335x-evm.dts | 10 +++++
arch/arm/boot/dts/tps65910.dtsi | 76 ++++++++++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+)
create mode 100644 arch/arm/boot/dts/tps65910.dtsi

diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index d6a97d9..15d03ba 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -18,3 +18,13 @@
reg = <0x80000000 0x10000000>; /* 256 MB */
};
};
+
+&i2c1 {
+ clock-frequency = <400000>;
+
+ tps: tps@2D {
+ reg = <0x2D>;
+ };
+};
+
+/include/ "tps65910.dtsi"
diff --git a/arch/arm/boot/dts/tps65910.dtsi b/arch/arm/boot/dts/tps65910.dtsi
new file mode 100644
index 0000000..c4f5d85
--- /dev/null
+++ b/arch/arm/boot/dts/tps65910.dtsi
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/*
+ * Integrated Power Management Chip
+ * http://www.ti.com/lit/ds/symlink/tps65910.pdf
+ */
+
+&tps {
+ compatible = "ti,tps65910";
+
+ regulators {
+ vrtc_reg: vrtc {
+ regulator-always-on;
+ };
+
+ vio_reg: vio {
+ regulator-always-on;
+ };
+
+ vdd1_reg: vdd1 {
+ regulator-min-microvolt = <600000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ vdd2_reg: vdd2 {
+ regulator-min-microvolt = <600000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ vdd3_reg: vdd3 {
+ regulator-always-on;
+ };
+
+ vdig1_reg: vdig1 {
+ regulator-always-on;
+ };
+
+ vdig2_reg: vdig2 {
+ regulator-always-on;
+ };
+
+ vpll_reg: vpll {
+ regulator-always-on;
+ };
+
+ vdac_reg: vdac {
+ regulator-always-on;
+ };
+
+ vaux1_reg: vaux1 {
+ regulator-always-on;
+ };
+
+ vaux2_reg: vaux2 {
+ regulator-always-on;
+ };
+
+ vaux33_reg: vaux33 {
+ regulator-always-on;
+ };
+
+ vmmc_reg: vmmc {
+ regulator-always-on;
+ };
+ };
+};
--
1.7.9.5

2012-06-25 12:05:23

by AnilKumar, Chimata

[permalink] [raw]
Subject: [PATCH 2/3] ARM: OMAP2+: AM33XX: Add tps65217 device tree data

Add device tree data for tps65217 regulator by adding all the consumers
necessary for AM335X-BeagleBone. The data will be map to a regulator
constraints which is required for regulator set_voltage and get_voltage
calls.

All tps65217 PMIC regulator constraints are placed in a seperate device
tree include file (tps65217.dtsi).

This patch also adds the I2C slave address of TPS65217 pmic to
am335x-bone.dts file.

Signed-off-by: AnilKumar Ch <[email protected]>
---
These patches were tested along with these patches
* DT addition to AM33XX family
http://marc.info/?l=linux-omap&m=134035826700991&w=2

arch/arm/boot/dts/am335x-bone.dts | 10 ++++++
arch/arm/boot/dts/tps65217.dtsi | 67 +++++++++++++++++++++++++++++++++++++
2 files changed, 77 insertions(+)
create mode 100644 arch/arm/boot/dts/tps65217.dtsi

diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts
index a9af4db..a4d4415 100644
--- a/arch/arm/boot/dts/am335x-bone.dts
+++ b/arch/arm/boot/dts/am335x-bone.dts
@@ -18,3 +18,13 @@
reg = <0x80000000 0x10000000>; /* 256 MB */
};
};
+
+&i2c1 {
+ clock-frequency = <400000>;
+
+ tps: tps@24 {
+ reg = <0x24>;
+ };
+};
+
+/include/ "tps65217.dtsi"
diff --git a/arch/arm/boot/dts/tps65217.dtsi b/arch/arm/boot/dts/tps65217.dtsi
new file mode 100644
index 0000000..5b9850b
--- /dev/null
+++ b/arch/arm/boot/dts/tps65217.dtsi
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/*
+ * Integrated Power Management Chip
+ * http://www.ti.com/lit/ds/symlink/tps65217.pdf
+ */
+
+&tps {
+ compatible = "ti,tps65217";
+
+ regulators {
+ dcdc1_reg: dcdc1 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ dcdc2_reg: dcdc2 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ dcdc3_reg: dcdc3 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo1_reg: ldo1 {
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo2_reg: ldo2 {
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo3_reg: ldo3 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo4_reg: ldo4 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+ };
+};
--
1.7.9.5

2012-06-25 12:12:24

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 1/3] regulator: tps65217: Add device tree support

On Mon, Jun 25, 2012 at 05:34:36PM +0530, AnilKumar Ch wrote:
> This commit adds device tree support for tps65217 pmic. And usage
> details are added to device tree documentation.
>
> Driver is tested by using kernel module with regulator set and get
> APIs.

This needs to be updated for the patches Laxman recently posted for the
regulator-compatible property (which are currently blocked on review
from the ST Ericcsson guys but I'll probably apply them in the next
couple of days if I don't hear back from them).


Attachments:
(No filename) (518.00 B)
signature.asc (836.00 B)
Digital signature
Download all attachments

2012-06-25 12:28:30

by AnilKumar, Chimata

[permalink] [raw]
Subject: RE: [PATCH 1/3] regulator: tps65217: Add device tree support

Hi Mark,

Thanks for quick reply.

On Mon, Jun 25, 2012 at 17:42:20, Mark Brown wrote:
> On Mon, Jun 25, 2012 at 05:34:36PM +0530, AnilKumar Ch wrote:
> > This commit adds device tree support for tps65217 pmic. And usage
> > details are added to device tree documentation.
> >
> > Driver is tested by using kernel module with regulator set and get
> > APIs.
>
> This needs to be updated for the patches Laxman recently posted for the
> regulator-compatible property (which are currently blocked on review
> from the ST Ericcsson guys but I'll probably apply them in the next
> couple of days if I don't hear back from them).
>

In that case, I will resubmit the patches once "regulator-compatible
property" patches are pushed to "linux-next".

Thanks
AnilKumar