diff options
Diffstat (limited to 'drivers/regulator/virtual.c')
-rw-r--r-- | drivers/regulator/virtual.c | 38 |
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", ®_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), }, }; |