diff options
Diffstat (limited to 'drivers/regulator/fixed.c')
-rw-r--r-- | drivers/regulator/fixed.c | 72 |
1 files changed, 23 insertions, 49 deletions
diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c index cb5d785817..0edb5ceb10 100644 --- a/drivers/regulator/fixed.c +++ b/drivers/regulator/fixed.c @@ -1,33 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-only /* * fixed regulator support * * Copyright (c) 2014 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * */ #include <common.h> #include <malloc.h> #include <init.h> #include <regulator.h> #include <of.h> -#include <of_gpio.h> -#include <gpio.h> +#include <linux/gpio/consumer.h> struct regulator_fixed { - int gpio; - int active_low; - int always_on; + struct gpio_desc *gpio; struct regulator_dev rdev; struct regulator_desc rdesc; }; @@ -36,23 +21,14 @@ static int regulator_fixed_enable(struct regulator_dev *rdev) { struct regulator_fixed *fix = container_of(rdev, struct regulator_fixed, rdev); - if (!gpio_is_valid(fix->gpio)) - return 0; - - return gpio_direction_output(fix->gpio, !fix->active_low); + return gpiod_direction_output(fix->gpio, true); } static int regulator_fixed_disable(struct regulator_dev *rdev) { struct regulator_fixed *fix = container_of(rdev, struct regulator_fixed, rdev); - if (fix->always_on) - return 0; - - if (!gpio_is_valid(fix->gpio)) - return 0; - - return gpio_direction_output(fix->gpio, fix->active_low); + return gpiod_direction_output(fix->gpio, false); } const static struct regulator_ops fixed_ops = { @@ -60,40 +36,37 @@ const static struct regulator_ops fixed_ops = { .disable = regulator_fixed_disable, }; -static int regulator_fixed_probe(struct device_d *dev) +static int regulator_fixed_probe(struct device *dev) { + struct device_node *np = dev->of_node; struct regulator_fixed *fix; - enum of_gpio_flags gpioflags; + u32 delay; int ret; - if (!dev->device_node) + if (!dev->of_node) return -EINVAL; fix = xzalloc(sizeof(*fix)); - fix->gpio = -EINVAL; - - if (of_get_property(dev->device_node, "gpio", NULL)) { - fix->gpio = of_get_named_gpio_flags(dev->device_node, "gpio", 0, &gpioflags); - if (fix->gpio < 0) { - ret = fix->gpio; - goto err; - } - if (gpioflags & OF_GPIO_ACTIVE_LOW) - fix->active_low = 1; + fix->gpio = gpiod_get_optional(dev, NULL, GPIOD_ASIS); + if (IS_ERR(fix->gpio)) { + ret = PTR_ERR(fix->gpio); + goto err; } fix->rdesc.ops = &fixed_ops; fix->rdev.desc = &fix->rdesc; + fix->rdev.dev = dev; - if (of_find_property(dev->device_node, "regulator-always-on", NULL)) { - fix->always_on = 1; - regulator_fixed_enable(&fix->rdev); - } + if (!of_property_read_u32(np, "off-on-delay-us", &delay)) + fix->rdesc.off_on_delay = delay; + + if (of_find_property(np, "vin-supply", NULL)) + fix->rdesc.supply_name = "vin"; - ret = of_regulator_register(&fix->rdev, dev->device_node); + ret = of_regulator_register(&fix->rdev, np); if (ret) - return ret; + goto err; return 0; err: @@ -106,8 +79,9 @@ static struct of_device_id regulator_fixed_of_ids[] = { { .compatible = "regulator-fixed", }, { } }; +MODULE_DEVICE_TABLE(of, regulator_fixed_of_ids); -static struct driver_d regulator_fixed_driver = { +static struct driver regulator_fixed_driver = { .name = "regulator-fixed", .probe = regulator_fixed_probe, .of_compatible = DRV_OF_COMPAT(regulator_fixed_of_ids), |