Commit a4d9f179 authored by Laxman Dewangan's avatar Laxman Dewangan Committed by Mark Brown

regulator: fixed: Support for open drain gpio pin

Adding flag on fixed regulator board configuration structure
to specify whether gpio is open drain type or not.
Passing this information to gpio library when requesting
gpio so that gpio driver can set the pin state accordingly,
for open drain type:
- Pin can be set HIGH as setting as input, PULL UP on
  pin make this as HIGH.
- Pin can be set LOW as setting it as output and drive to LOW.

The non-open drain pin can be  set HIGH/LOW by setting it to
output and driving it to HIGH/LOW.
Signed-off-by: default avatarLaxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent d1cf4f65
...@@ -202,6 +202,7 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -202,6 +202,7 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
drvdata->startup_delay = config->startup_delay; drvdata->startup_delay = config->startup_delay;
if (gpio_is_valid(config->gpio)) { if (gpio_is_valid(config->gpio)) {
int gpio_flag;
drvdata->enable_high = config->enable_high; drvdata->enable_high = config->enable_high;
/* FIXME: Remove below print warning /* FIXME: Remove below print warning
...@@ -219,27 +220,25 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -219,27 +220,25 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
dev_warn(&pdev->dev, dev_warn(&pdev->dev,
"using GPIO 0 for regulator enable control\n"); "using GPIO 0 for regulator enable control\n");
ret = gpio_request(config->gpio, config->supply_name); /*
if (ret) { * set output direction without changing state
dev_err(&pdev->dev,
"Could not obtain regulator enable GPIO %d: %d\n",
config->gpio, ret);
goto err_name;
}
/* set output direction without changing state
* to prevent glitch * to prevent glitch
*/ */
drvdata->is_enabled = config->enabled_at_boot; drvdata->is_enabled = config->enabled_at_boot;
ret = drvdata->is_enabled ? ret = drvdata->is_enabled ?
config->enable_high : !config->enable_high; config->enable_high : !config->enable_high;
gpio_flag = ret ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
if (config->gpio_is_open_drain)
gpio_flag |= GPIOF_OPEN_DRAIN;
ret = gpio_direction_output(config->gpio, ret); ret = gpio_request_one(config->gpio, gpio_flag,
config->supply_name);
if (ret) { if (ret) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Could not configure regulator enable GPIO %d direction: %d\n", "Could not obtain regulator enable GPIO %d: %d\n",
config->gpio, ret); config->gpio, ret);
goto err_gpio; goto err_name;
} }
drvdata->desc.ops = &fixed_voltage_gpio_ops; drvdata->desc.ops = &fixed_voltage_gpio_ops;
......
...@@ -26,6 +26,12 @@ struct regulator_init_data; ...@@ -26,6 +26,12 @@ struct regulator_init_data;
* @gpio: GPIO to use for enable control * @gpio: GPIO to use for enable control
* set to -EINVAL if not used * set to -EINVAL if not used
* @startup_delay: Start-up time in microseconds * @startup_delay: Start-up time in microseconds
* @gpio_is_open_drain: Gpio pin is open drain or normal type.
* If it is open drain type then HIGH will be set
* through PULL-UP with setting gpio as input
* and low will be set as gpio-output with driven
* to low. For non-open-drain case, the gpio will
* will be in output and drive to low/high accordingly.
* @enable_high: Polarity of enable GPIO * @enable_high: Polarity of enable GPIO
* 1 = Active high, 0 = Active low * 1 = Active high, 0 = Active low
* @enabled_at_boot: Whether regulator has been enabled at * @enabled_at_boot: Whether regulator has been enabled at
...@@ -43,6 +49,7 @@ struct fixed_voltage_config { ...@@ -43,6 +49,7 @@ struct fixed_voltage_config {
int microvolts; int microvolts;
int gpio; int gpio;
unsigned startup_delay; unsigned startup_delay;
unsigned gpio_is_open_drain:1;
unsigned enable_high:1; unsigned enable_high:1;
unsigned enabled_at_boot:1; unsigned enabled_at_boot:1;
struct regulator_init_data *init_data; struct regulator_init_data *init_data;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment