diff options
author | Haoran.Wang <elven.wang@nxp.com> | 2018-02-05 16:26:29 +0800 |
---|---|---|
committer | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-24 12:41:33 +0300 |
commit | 857b634ced79bcd22f2eb75632b7cef4fa647b22 (patch) | |
tree | 5bcde1dc7e0f24f3060a4ca3149d994cebefe9ff /drivers/regulator/virtual.c | |
parent | dc54840f4345ffce4dcf77dfbb96faf65d84c606 (diff) |
MLK-18205-9 Support BD71837 PMIC chip on i.MX platforms
Signed-off-by: Haoran.Wang <elven.wang@nxp.com>
Signed-off-by: Robin Gong <yibin.gong@nxp.com>
Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
(cherry picked from commit 37f67d291e74a3428310cb5c98f556411042f810)
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), }, }; |