PLATFORM_DEVID_AUTO, cell, 1, NULL, 0, NULL);
 }
 
+static struct tps6105x_platform_data *tps6105x_parse_dt(struct device *dev)
+{
+       struct device_node *np = dev->of_node;
+       struct tps6105x_platform_data *pdata;
+       struct device_node *child;
+
+       if (!np)
+               return ERR_PTR(-EINVAL);
+       if (of_get_available_child_count(np) > 1) {
+               dev_err(dev, "cannot support multiple operational modes");
+               return ERR_PTR(-EINVAL);
+       }
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
+               return ERR_PTR(-ENOMEM);
+       pdata->mode = TPS6105X_MODE_SHUTDOWN;
+       for_each_available_child_of_node(np, child) {
+               if (child->name && !of_node_cmp(child->name, "regulator"))
+                       pdata->mode = TPS6105X_MODE_VOLTAGE;
+               else if (child->name && !of_node_cmp(child->name, "led"))
+                       pdata->mode = TPS6105X_MODE_TORCH;
+       }
+
+       return pdata;
+}
+
 static int tps6105x_probe(struct i2c_client *client,
                        const struct i2c_device_id *id)
 {
        int ret;
 
        pdata = dev_get_platdata(&client->dev);
-       if (!pdata) {
-               dev_err(&client->dev, "missing platform data\n");
-               return -ENODEV;
+       if (!pdata)
+               pdata = tps6105x_parse_dt(&client->dev);
+       if (IS_ERR(pdata)) {
+               dev_err(&client->dev, "No platform data or DT found");
+               return PTR_ERR(pdata);
        }
 
        tps6105x = devm_kmalloc(&client->dev, sizeof(*tps6105x), GFP_KERNEL);