--- /dev/null
+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]
+- regulators: This is the list of child nodes that specify the regulator
+  initialization data for defined regulators. Not all regulators for the given
+  device need to be present. The definition for each of these nodes is defined
+  using the standard binding for regulators found at
+  Documentation/devicetree/bindings/regulator/regulator.txt.
+
+  The valid names for regulators are:
+  tps65217: dcdc1, dcdc2, dcdc3, ldo1, ldo2, ldo3 and ldo4
+
+Each regulator is defined using the standard binding for regulators.
+
+Example:
+
+       tps: tps@24 {
+               compatible = "ti,tps65217";
+
+               regulators {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       dcdc1_reg: regulator@0 {
+                               reg = <0>;
+                               regulator-compatible = "dcdc1";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       dcdc2_reg: regulator@1 {
+                               reg = <1>;
+                               regulator-compatible = "dcdc2";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       dcdc3_reg: regulator@2 {
+                               reg = <2>;
+                               regulator-compatible = "dcdc3";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1500000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo1_reg: regulator@3 {
+                               reg = <3>;
+                               regulator-compatible = "ldo1";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo2_reg: regulator@4 {
+                               reg = <4>;
+                               regulator-compatible = "ldo2";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo3_reg: regulator@5 {
+                               reg = <5>;
+                               regulator-compatible = "ldo3";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo4_reg: regulator@6 {
+                               reg = <6>;
+                               regulator-compatible = "ldo4";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
 
 #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>
 }
 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,
                                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;
                }
 
                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);
 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,