summaryrefslogtreecommitdiff
path: root/drivers/regulator/virtual.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/regulator/virtual.c')
-rw-r--r--drivers/regulator/virtual.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/regulator/virtual.c b/drivers/regulator/virtual.c
index a6f1c7a9914f..115b9b350f76 100644
--- a/drivers/regulator/virtual.c
+++ b/drivers/regulator/virtual.c
@@ -15,8 +15,11 @@
#include <linux/mutex.h>
#include <linux/platform_device.h>
#include <linux/regulator/consumer.h>
+#include <linux/regulator/of_regulator.h>
#include <linux/slab.h>
#include <linux/module.h>
+#include <linux/of.h>
+
struct virtual_consumer_data {
struct mutex lock;
@@ -285,9 +288,22 @@ static const struct attribute_group regulator_virtual_attr_group = {
.attrs = regulator_virtual_attributes,
};
+static const char *of_get_virt_regulator_config(struct device *dev, struct device_node *np)
+{
+ const char *reg_id;
+ int r;
+
+ r = of_property_read_string(np, "virtual-supply", &reg_id);
+ if (r) {
+ return NULL;
+ }
+ return reg_id;
+}
+
static int regulator_virtual_probe(struct platform_device *pdev)
{
char *reg_id = dev_get_platdata(&pdev->dev);
+ struct device_node *np = pdev->dev.of_node;
struct virtual_consumer_data *drvdata;
int ret;
@@ -296,6 +312,15 @@ static int regulator_virtual_probe(struct platform_device *pdev)
if (drvdata == NULL)
return -ENOMEM;
+ if (np) {
+ reg_id = (char *)of_get_virt_regulator_config(&pdev->dev, np);
+ }
+
+ if (reg_id == NULL) {
+ dev_err(&pdev->dev, "Fail to get reg_id");
+ return -EINVAL;
+ }
+
mutex_init(&drvdata->lock);
drvdata->regulator = devm_regulator_get(&pdev->dev, reg_id);
@@ -318,6 +343,8 @@ static int regulator_virtual_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, drvdata);
+ dev_info(&pdev->dev, "attached: %s\n", reg_id);
+
return 0;
}
@@ -330,14 +357,25 @@ static int regulator_virtual_remove(struct platform_device *pdev)
if (drvdata->enabled)
regulator_disable(drvdata->regulator);
+ platform_set_drvdata(pdev, NULL);
+
return 0;
}
+#if defined(CONFIG_OF)
+static const struct of_device_id regulator_virtual_of_match[] = {
+ { .compatible = "regulator-virtual", },
+ {},
+};
+#endif
+
static struct platform_driver regulator_virtual_consumer_driver = {
.probe = regulator_virtual_probe,
.remove = regulator_virtual_remove,
.driver = {
.name = "reg-virt-consumer",
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(regulator_virtual_of_match),
},
};