diff options
| -rw-r--r-- | drivers/regulator/fixed.c | 23 | ||||
| -rw-r--r-- | include/linux/regulator/fixed.h | 7 | 
2 files changed, 18 insertions, 12 deletions
diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c index 8a1e22acc20..9a7d70a9c8d 100644 --- a/drivers/regulator/fixed.c +++ b/drivers/regulator/fixed.c @@ -202,6 +202,7 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)  	drvdata->startup_delay = config->startup_delay;  	if (gpio_is_valid(config->gpio)) { +		int gpio_flag;  		drvdata->enable_high = config->enable_high;  		/* FIXME: Remove below print warning @@ -219,27 +220,25 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)  			dev_warn(&pdev->dev,  				"using GPIO 0 for regulator enable control\n"); -		ret = gpio_request(config->gpio, config->supply_name); -		if (ret) { -			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 +		/* +		 * set output direction without changing state  		 * to prevent glitch  		 */  		drvdata->is_enabled = config->enabled_at_boot;  		ret = drvdata->is_enabled ?  				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) {  			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); -			goto err_gpio; +			goto err_name;  		}  		drvdata->desc.ops = &fixed_voltage_gpio_ops; diff --git a/include/linux/regulator/fixed.h b/include/linux/regulator/fixed.h index 936a7d8c11a..f83f7440b48 100644 --- a/include/linux/regulator/fixed.h +++ b/include/linux/regulator/fixed.h @@ -26,6 +26,12 @@ struct regulator_init_data;   * @gpio:		GPIO to use for enable control   * 			set to -EINVAL if not used   * @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   *			1 = Active high, 0 = Active low   * @enabled_at_boot:	Whether regulator has been enabled at @@ -43,6 +49,7 @@ struct fixed_voltage_config {  	int microvolts;  	int gpio;  	unsigned startup_delay; +	unsigned gpio_is_open_drain:1;  	unsigned enable_high:1;  	unsigned enabled_at_boot:1;  	struct regulator_init_data *init_data;  |