diff options
27 files changed, 395 insertions, 698 deletions
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index a8810f83a57..d54969be0a5 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c @@ -226,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = {  static void __init omap_2430sdp_init(void)  { -	int ret; -  	omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC);  	omap_board_config = sdp2430_config; @@ -246,9 +244,8 @@ static void __init omap_2430sdp_init(void)  	board_smc91x_init();  	/* Turn off secondary LCD backlight */ -	ret = gpio_request(SECONDARY_LCD_GPIO, "Secondary LCD backlight"); -	if (ret == 0) -		gpio_direction_output(SECONDARY_LCD_GPIO, 0); +	gpio_request_one(SECONDARY_LCD_GPIO, GPIOF_OUT_INIT_LOW, +			 "Secondary LCD backlight");  }  static void __init omap_2430sdp_map_io(void) diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 951e5857ad3..99218a5299c 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c @@ -126,8 +126,11 @@ static struct twl4030_keypad_data sdp3430_kp_data = {  #define SDP3430_LCD_PANEL_BACKLIGHT_GPIO	8  #define SDP3430_LCD_PANEL_ENABLE_GPIO		5 -static unsigned backlight_gpio; -static unsigned enable_gpio; +static struct gpio sdp3430_dss_gpios[] __initdata = { +	{SDP3430_LCD_PANEL_ENABLE_GPIO,    GPIOF_OUT_INIT_LOW, "LCD reset"    }, +	{SDP3430_LCD_PANEL_BACKLIGHT_GPIO, GPIOF_OUT_INIT_LOW, "LCD Backlight"}, +}; +  static int lcd_enabled;  static int dvi_enabled; @@ -135,29 +138,11 @@ static void __init sdp3430_display_init(void)  {  	int r; -	enable_gpio    = SDP3430_LCD_PANEL_ENABLE_GPIO; -	backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; - -	r = gpio_request(enable_gpio, "LCD reset"); -	if (r) { -		printk(KERN_ERR "failed to get LCD reset GPIO\n"); -		goto err0; -	} - -	r = gpio_request(backlight_gpio, "LCD Backlight"); -	if (r) { -		printk(KERN_ERR "failed to get LCD backlight GPIO\n"); -		goto err1; -	} - -	gpio_direction_output(enable_gpio, 0); -	gpio_direction_output(backlight_gpio, 0); +	r = gpio_request_array(sdp3430_dss_gpios, +			       ARRAY_SIZE(sdp3430_dss_gpios)); +	if (r) +		printk(KERN_ERR "failed to get LCD control GPIOs\n"); -	return; -err1: -	gpio_free(enable_gpio); -err0: -	return;  }  static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev) @@ -167,8 +152,8 @@ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)  		return -EINVAL;  	} -	gpio_direction_output(enable_gpio, 1); -	gpio_direction_output(backlight_gpio, 1); +	gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 1); +	gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 1);  	lcd_enabled = 1; @@ -179,8 +164,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)  {  	lcd_enabled = 0; -	gpio_direction_output(enable_gpio, 0); -	gpio_direction_output(backlight_gpio, 0); +	gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 0); +	gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 0);  }  static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev) @@ -308,12 +293,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev,  	omap2_hsmmc_init(mmc);  	/* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */ -	gpio_request(gpio + 7, "sub_lcd_en_bkl"); -	gpio_direction_output(gpio + 7, 0); +	gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl");  	/* gpio + 15 is "sub_lcd_nRST" (output) */ -	gpio_request(gpio + 15, "sub_lcd_nRST"); -	gpio_direction_output(gpio + 15, 0); +	gpio_request_one(gpio + 15, GPIOF_OUT_INIT_LOW, "sub_lcd_nRST");  	return 0;  } diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 707354222d4..ae3153c5396 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -252,58 +252,22 @@ static struct spi_board_info sdp4430_spi_board_info[] __initdata = {  	},  }; +static struct gpio sdp4430_eth_gpios[] __initdata = { +	{ ETH_KS8851_POWER_ON,	GPIOF_OUT_INIT_HIGH,	"eth_power"	}, +	{ ETH_KS8851_QUART,	GPIOF_OUT_INIT_HIGH,	"quart"		}, +	{ ETH_KS8851_IRQ,	GPIOF_IN,		"eth_irq"	}, +}; +  static int omap_ethernet_init(void)  {  	int status;  	/* Request of GPIO lines */ +	status = gpio_request_array(sdp4430_eth_gpios, +				    ARRAY_SIZE(sdp4430_eth_gpios)); +	if (status) +		pr_err("Cannot request ETH GPIOs\n"); -	status = gpio_request(ETH_KS8851_POWER_ON, "eth_power"); -	if (status) { -		pr_err("Cannot request GPIO %d\n", ETH_KS8851_POWER_ON); -		return status; -	} - -	status = gpio_request(ETH_KS8851_QUART, "quart"); -	if (status) { -		pr_err("Cannot request GPIO %d\n", ETH_KS8851_QUART); -		goto error1; -	} - -	status = gpio_request(ETH_KS8851_IRQ, "eth_irq"); -	if (status) { -		pr_err("Cannot request GPIO %d\n", ETH_KS8851_IRQ); -		goto error2; -	} - -	/* Configuration of requested GPIO lines */ - -	status = gpio_direction_output(ETH_KS8851_POWER_ON, 1); -	if (status) { -		pr_err("Cannot set output GPIO %d\n", ETH_KS8851_IRQ); -		goto error3; -	} - -	status = gpio_direction_output(ETH_KS8851_QUART, 1); -	if (status) { -		pr_err("Cannot set output GPIO %d\n", ETH_KS8851_QUART); -		goto error3; -	} - -	status = gpio_direction_input(ETH_KS8851_IRQ); -	if (status) { -		pr_err("Cannot set input GPIO %d\n", ETH_KS8851_IRQ); -		goto error3; -	} - -	return 0; - -error3: -	gpio_free(ETH_KS8851_IRQ); -error2: -	gpio_free(ETH_KS8851_QUART); -error1: -	gpio_free(ETH_KS8851_POWER_ON);  	return status;  } @@ -602,21 +566,13 @@ static int __init omap4_i2c_init(void)  static void __init omap_sfh7741prox_init(void)  { -	int  error; +	int error; -	error = gpio_request(OMAP4_SFH7741_ENABLE_GPIO, "sfh7741"); -	if (error < 0) { +	error = gpio_request_one(OMAP4_SFH7741_ENABLE_GPIO, +				 GPIOF_OUT_INIT_LOW, "sfh7741"); +	if (error < 0)  		pr_err("%s:failed to request GPIO %d, error %d\n",  			__func__, OMAP4_SFH7741_ENABLE_GPIO, error); -		return; -	} - -	error = gpio_direction_output(OMAP4_SFH7741_ENABLE_GPIO , 0); -	if (error < 0) { -		pr_err("%s: GPIO configuration failed: GPIO %d,error %d\n", -			 __func__, OMAP4_SFH7741_ENABLE_GPIO, error); -		gpio_free(OMAP4_SFH7741_ENABLE_GPIO); -	}  }  static void sdp4430_hdmi_mux_init(void) @@ -633,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void)  			OMAP_PIN_INPUT_PULLUP);  } +static struct gpio sdp4430_hdmi_gpios[] = { +	{ HDMI_GPIO_HPD,	GPIOF_OUT_INIT_HIGH,	"hdmi_gpio_hpd"   }, +	{ HDMI_GPIO_LS_OE,	GPIOF_OUT_INIT_HIGH,	"hdmi_gpio_ls_oe" }, +}; +  static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev)  {  	int status; -	status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, -							"hdmi_gpio_hpd"); -	if (status) { -		pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); -		return status; -	} -	status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, -							"hdmi_gpio_ls_oe"); -	if (status) { -		pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE); -		goto error1; -	} - -	return 0; - -error1: -	gpio_free(HDMI_GPIO_HPD); +	status = gpio_request_array(sdp4430_hdmi_gpios, +				    ARRAY_SIZE(sdp4430_hdmi_gpios)); +	if (status) +		pr_err("%s: Cannot request HDMI GPIOs\n", __func__);  	return status;  } diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index a890d244fec..5e438a77cd7 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c @@ -89,19 +89,13 @@ static void __init am3517_crane_init(void)  		return;  	} -	ret = gpio_request(GPIO_USB_POWER, "usb_ehci_enable"); +	ret = gpio_request_one(GPIO_USB_POWER, GPIOF_OUT_INIT_HIGH, +			       "usb_ehci_enable");  	if (ret < 0) {  		pr_err("Can not request GPIO %d\n", GPIO_USB_POWER);  		return;  	} -	ret = gpio_direction_output(GPIO_USB_POWER, 1); -	if (ret < 0) { -		gpio_free(GPIO_USB_POWER); -		pr_err("Unable to initialize EHCI power\n"); -		return; -	} -  	usbhs_init(&usbhs_bdata);  } diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index ce7d5e6e415..6c470603880 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c @@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void)  	int r;  	omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP); -	r = gpio_request(GPIO_RTCS35390A_IRQ, "rtcs35390a-irq"); + +	r = gpio_request_one(GPIO_RTCS35390A_IRQ, GPIOF_IN, "rtcs35390a-irq");  	if (r < 0) {  		printk(KERN_WARNING "failed to request GPIO#%d\n",  				GPIO_RTCS35390A_IRQ);  		return;  	} -	r = gpio_direction_input(GPIO_RTCS35390A_IRQ); -	if (r < 0) { -		printk(KERN_WARNING "GPIO#%d cannot be configured as input\n", -				GPIO_RTCS35390A_IRQ); -		gpio_free(GPIO_RTCS35390A_IRQ); -		return; -	} +  	am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);  } @@ -242,6 +237,15 @@ static int dvi_enabled;  #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \  		defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) +static struct gpio am3517_evm_dss_gpios[] __initdata = { +	/* GPIO 182 = LCD Backlight Power */ +	{ LCD_PANEL_BKLIGHT_PWR, GPIOF_OUT_INIT_HIGH, "lcd_backlight_pwr" }, +	/* GPIO 181 = LCD Panel PWM */ +	{ LCD_PANEL_PWM,	 GPIOF_OUT_INIT_HIGH, "lcd bl enable"	  }, +	/* GPIO 176 = LCD Panel Power enable pin */ +	{ LCD_PANEL_PWR,	 GPIOF_OUT_INIT_HIGH, "dvi enable"	  }, +}; +  static void __init am3517_evm_display_init(void)  {  	int r; @@ -249,41 +253,15 @@ static void __init am3517_evm_display_init(void)  	omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);  	omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);  	omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN); -	/* -	 * Enable GPIO 182 = LCD Backlight Power -	 */ -	r = gpio_request(LCD_PANEL_BKLIGHT_PWR, "lcd_backlight_pwr"); + +	r = gpio_request_array(am3517_evm_dss_gpios, +			       ARRAY_SIZE(am3517_evm_dss_gpios));  	if (r) { -		printk(KERN_ERR "failed to get lcd_backlight_pwr\n"); +		printk(KERN_ERR "failed to get DSS panel control GPIOs\n");  		return;  	} -	gpio_direction_output(LCD_PANEL_BKLIGHT_PWR, 1); -	/* -	 * Enable GPIO 181 = LCD Panel PWM -	 */ -	r = gpio_request(LCD_PANEL_PWM, "lcd_pwm"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_pwm\n"); -		goto err_1; -	} -	gpio_direction_output(LCD_PANEL_PWM, 1); -	/* -	 * Enable GPIO 176 = LCD Panel Power enable pin -	 */ -	r = gpio_request(LCD_PANEL_PWR, "lcd_panel_pwr"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_panel_pwr\n"); -		goto err_2; -	} -	gpio_direction_output(LCD_PANEL_PWR, 1);  	printk(KERN_INFO "Display initialized successfully\n"); -	return; - -err_2: -	gpio_free(LCD_PANEL_PWM); -err_1: -	gpio_free(LCD_PANEL_BKLIGHT_PWR);  }  #else  static void __init am3517_evm_display_init(void) {} diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index f4f8374a029..f3beb8eeef7 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c @@ -202,6 +202,7 @@ static inline void __init apollon_init_smc91x(void)  	unsigned int rate;  	struct clk *gpmc_fck;  	int eth_cs; +	int err;  	gpmc_fck = clk_get(NULL, "gpmc_fck");	/* Always on ENABLE_ON_INIT */  	if (IS_ERR(gpmc_fck)) { @@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void)  	apollon_smc91x_resources[0].end   = base + 0x30f;  	udelay(100); -	omap_mux_init_gpio(74, 0); -	if (gpio_request(APOLLON_ETHR_GPIO_IRQ, "SMC91x irq") < 0) { +	omap_mux_init_gpio(APOLLON_ETHR_GPIO_IRQ, 0); +	err = gpio_request_one(APOLLON_ETHR_GPIO_IRQ, GPIOF_IN, "SMC91x irq"); +	if (err) {  		printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",  			APOLLON_ETHR_GPIO_IRQ);  		gpmc_cs_free(APOLLON_ETH_CS); -		goto out;  	} -	gpio_direction_input(APOLLON_ETHR_GPIO_IRQ); -  out:  	clk_disable(gpmc_fck);  	clk_put(gpmc_fck); @@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void)  	omap2_init_common_devices(NULL, NULL);  } +static struct gpio apollon_gpio_leds[] __initdata = { +	{ LED0_GPIO13, GPIOF_OUT_INIT_LOW, "LED0" }, /* LED0 - AA10 */ +	{ LED1_GPIO14, GPIOF_OUT_INIT_LOW, "LED1" }, /* LED1 - AA6  */ +	{ LED2_GPIO15, GPIOF_OUT_INIT_LOW, "LED2" }, /* LED2 - AA4  */ +}; +  static void __init apollon_led_init(void)  { -	/* LED0 - AA10 */  	omap_mux_init_signal("vlynq_clk.gpio_13", 0); -	gpio_request(LED0_GPIO13, "LED0"); -	gpio_direction_output(LED0_GPIO13, 0); -	/* LED1  - AA6 */  	omap_mux_init_signal("vlynq_rx1.gpio_14", 0); -	gpio_request(LED1_GPIO14, "LED1"); -	gpio_direction_output(LED1_GPIO14, 0); -	/* LED2  - AA4 */  	omap_mux_init_signal("vlynq_rx0.gpio_15", 0); -	gpio_request(LED2_GPIO15, "LED2"); -	gpio_direction_output(LED2_GPIO15, 0); + +	gpio_request_array(apollon_gpio_leds, ARRAY_SIZE(apollon_gpio_leds));  }  static void __init apollon_usb_init(void) @@ -301,8 +299,7 @@ static void __init apollon_usb_init(void)  	/* USB device */  	/* DEVICE_SUSPEND */  	omap_mux_init_signal("mcbsp2_clkx.gpio_12", 0); -	gpio_request(12, "USB suspend"); -	gpio_direction_output(12, 0); +	gpio_request_one(12, GPIOF_OUT_INIT_LOW, "USB suspend");  	omap2_usbfs_init(&apollon_usb_config);  } diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index e0e2d483800..6063be82b56 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c @@ -182,10 +182,6 @@ static inline void cm_t35_init_nand(void) {}  #define CM_T35_LCD_BL_GPIO 58  #define CM_T35_DVI_EN_GPIO 54 -static int lcd_bl_gpio; -static int lcd_en_gpio; -static int dvi_en_gpio; -  static int lcd_enabled;  static int dvi_enabled; @@ -196,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev)  		return -EINVAL;  	} -	gpio_set_value(lcd_en_gpio, 1); -	gpio_set_value(lcd_bl_gpio, 1); +	gpio_set_value(CM_T35_LCD_EN_GPIO, 1); +	gpio_set_value(CM_T35_LCD_BL_GPIO, 1);  	lcd_enabled = 1; @@ -208,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)  {  	lcd_enabled = 0; -	gpio_set_value(lcd_bl_gpio, 0); -	gpio_set_value(lcd_en_gpio, 0); +	gpio_set_value(CM_T35_LCD_BL_GPIO, 0); +	gpio_set_value(CM_T35_LCD_EN_GPIO, 0);  }  static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) @@ -219,7 +215,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)  		return -EINVAL;  	} -	gpio_set_value(dvi_en_gpio, 0); +	gpio_set_value(CM_T35_DVI_EN_GPIO, 0);  	dvi_enabled = 1;  	return 0; @@ -227,7 +223,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)  static void cm_t35_panel_disable_dvi(struct omap_dss_device *dssdev)  { -	gpio_set_value(dvi_en_gpio, 1); +	gpio_set_value(CM_T35_DVI_EN_GPIO, 1);  	dvi_enabled = 0;  } @@ -309,62 +305,38 @@ static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = {  	},  }; +static struct gpio cm_t35_dss_gpios[] __initdata = { +	{ CM_T35_LCD_EN_GPIO, GPIOF_OUT_INIT_LOW,  "lcd enable"    }, +	{ CM_T35_LCD_BL_GPIO, GPIOF_OUT_INIT_LOW,  "lcd bl enable" }, +	{ CM_T35_DVI_EN_GPIO, GPIOF_OUT_INIT_HIGH, "dvi enable"    }, +}; +  static void __init cm_t35_init_display(void)  {  	int err; -	lcd_en_gpio = CM_T35_LCD_EN_GPIO; -	lcd_bl_gpio = CM_T35_LCD_BL_GPIO; -	dvi_en_gpio = CM_T35_DVI_EN_GPIO; -  	spi_register_board_info(cm_t35_lcd_spi_board_info,  				ARRAY_SIZE(cm_t35_lcd_spi_board_info)); -	err = gpio_request(lcd_en_gpio, "LCD RST"); -	if (err) { -		pr_err("CM-T35: failed to get LCD reset GPIO\n"); -		goto out; -	} - -	err = gpio_request(lcd_bl_gpio, "LCD BL"); +	err = gpio_request_array(cm_t35_dss_gpios, +				 ARRAY_SIZE(cm_t35_dss_gpios));  	if (err) { -		pr_err("CM-T35: failed to get LCD backlight control GPIO\n"); -		goto err_lcd_bl; +		pr_err("CM-T35: failed to request DSS control GPIOs\n"); +		return;  	} -	err = gpio_request(dvi_en_gpio, "DVI EN"); -	if (err) { -		pr_err("CM-T35: failed to get DVI reset GPIO\n"); -		goto err_dvi_en; -	} - -	gpio_export(lcd_en_gpio, 0); -	gpio_export(lcd_bl_gpio, 0); -	gpio_export(dvi_en_gpio, 0); -	gpio_direction_output(lcd_en_gpio, 0); -	gpio_direction_output(lcd_bl_gpio, 0); -	gpio_direction_output(dvi_en_gpio, 1); +	gpio_export(CM_T35_LCD_EN_GPIO, 0); +	gpio_export(CM_T35_LCD_BL_GPIO, 0); +	gpio_export(CM_T35_DVI_EN_GPIO, 0);  	msleep(50); -	gpio_set_value(lcd_en_gpio, 1); +	gpio_set_value(CM_T35_LCD_EN_GPIO, 1);  	err = omap_display_init(&cm_t35_dss_data);  	if (err) {  		pr_err("CM-T35: failed to register DSS device\n"); -		goto err_dev_reg; +		gpio_free_array(cm_t35_dss_gpios, ARRAY_SIZE(cm_t35_dss_gpios));  	} - -	return; - -err_dev_reg: -	gpio_free(dvi_en_gpio); -err_dvi_en: -	gpio_free(lcd_bl_gpio); -err_lcd_bl: -	gpio_free(lcd_en_gpio); -out: - -	return;  }  static struct regulator_consumer_supply cm_t35_vmmc1_supply = { @@ -497,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,  {  	int wlan_rst = gpio + 2; -	if ((gpio_request(wlan_rst, "WLAN RST") == 0) && -	    (gpio_direction_output(wlan_rst, 1) == 0)) { +	if (gpio_request_one(wlan_rst, GPIOF_OUT_INIT_HIGH, "WLAN RST") == 0) {  		gpio_export(wlan_rst, 0); -  		udelay(10);  		gpio_set_value(wlan_rst, 0);  		udelay(10); diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index a27e3eee829..08f08e81249 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c @@ -148,14 +148,13 @@ static void __init cm_t3517_init_rtc(void)  {  	int err; -	err = gpio_request(RTC_CS_EN_GPIO, "rtc cs en"); +	err = gpio_request_one(RTC_CS_EN_GPIO, GPIOF_OUT_INIT_HIGH, +			       "rtc cs en");  	if (err) {  		pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err);  		return;  	} -	gpio_direction_output(RTC_CS_EN_GPIO, 1); -  	platform_device_register(&cm_t3517_rtc_device);  }  #else @@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void)  {  	int err; -	err = gpio_request(USB_HUB_RESET_GPIO, "usb hub rst"); +	err = gpio_request_one(USB_HUB_RESET_GPIO, GPIOF_OUT_INIT_LOW, +			       "usb hub rst");  	if (err) {  		pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err);  	} else { -		gpio_direction_output(USB_HUB_RESET_GPIO, 0);  		udelay(10);  		gpio_set_value(USB_HUB_RESET_GPIO, 1);  		msleep(1); diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 405542af6ca..3bd344a527e 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c @@ -242,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,  	/* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */  	devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0;  	ret = gpio_request_one(devkit8000_lcd_device.reset_gpio, -			GPIOF_DIR_OUT | GPIOF_INIT_LOW, "LCD_PWREN"); +			       GPIOF_OUT_INIT_LOW, "LCD_PWREN");  	if (ret < 0) {  		devkit8000_lcd_device.reset_gpio = -EINVAL;  		printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n"); @@ -251,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,  	/* gpio + 7 is "DVI_PD" (out, active low) */  	devkit8000_dvi_device.reset_gpio = gpio + 7;  	ret = gpio_request_one(devkit8000_dvi_device.reset_gpio, -			GPIOF_DIR_OUT | GPIOF_INIT_LOW, "DVI PowerDown"); +			       GPIOF_OUT_INIT_LOW, "DVI PowerDown");  	if (ret < 0) {  		devkit8000_dvi_device.reset_gpio = -EINVAL;  		printk(KERN_ERR "Failed to request GPIO for DVI PowerDown\n"); @@ -483,14 +483,14 @@ static void __init omap_dm9000_init(void)  {  	unsigned char *eth_addr = omap_dm9000_platdata.dev_addr;  	struct omap_die_id odi; +	int ret; -	if (gpio_request(OMAP_DM9000_GPIO_IRQ, "dm9000 irq") < 0) { +	ret = gpio_request_one(OMAP_DM9000_GPIO_IRQ, GPIOF_IN, "dm9000 irq"); +	if (ret < 0) {  		printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n",  			OMAP_DM9000_GPIO_IRQ);  		return; -		} - -	gpio_direction_input(OMAP_DM9000_GPIO_IRQ); +	}  	/* init the mac address using DIE id */  	omap_get_die_id(&odi); diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 2c9a9197d2b..c62c297e0a3 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c @@ -78,22 +78,22 @@ static void __init igep2_get_revision(void)  	omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT); -	if ((gpio_request(IGEP2_GPIO_LED1_RED, "GPIO_HW0_REV") == 0) && -	    (gpio_direction_input(IGEP2_GPIO_LED1_RED) == 0)) { -		ret = gpio_get_value(IGEP2_GPIO_LED1_RED); -		if (ret == 0) { -			pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n"); -			hwrev = IGEP2_BOARD_HWREV_C; -		} else if (ret ==  1) { -			pr_info("IGEP2: Hardware Revision B/C (B compatible)\n"); -			hwrev = IGEP2_BOARD_HWREV_B; -		} else { -			pr_err("IGEP2: Unknown Hardware Revision\n"); -			hwrev = -1; -		} -	} else { +	if (gpio_request_one(IGEP2_GPIO_LED1_RED, GPIOF_IN, "GPIO_HW0_REV")) {  		pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n");  		pr_err("IGEP2: Unknown Hardware Revision\n"); +		return; +	} + +	ret = gpio_get_value(IGEP2_GPIO_LED1_RED); +	if (ret == 0) { +		pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n"); +		hwrev = IGEP2_BOARD_HWREV_C; +	} else if (ret ==  1) { +		pr_info("IGEP2: Hardware Revision B/C (B compatible)\n"); +		hwrev = IGEP2_BOARD_HWREV_B; +	} else { +		pr_err("IGEP2: Unknown Hardware Revision\n"); +		hwrev = -1;  	}  	gpio_free(IGEP2_GPIO_LED1_RED); @@ -339,32 +339,35 @@ static void __init igep2_leds_init(void)  }  #else +static struct gpio igep2_gpio_leds[] __initdata = { +	{ IGEP2_GPIO_LED0_RED,	 GPIOF_OUT_INIT_LOW, "gpio-led:red:d0"   }, +	{ IGEP2_GPIO_LED0_GREEN, GPIOF_OUT_INIT_LOW, "gpio-led:green:d0" }, +	{ IGEP2_GPIO_LED1_RED,	 GPIOF_OUT_INIT_LOW, "gpio-led:red:d1"   }, +}; +  static inline void igep2_leds_init(void)  { -	if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) && -	    (gpio_direction_output(IGEP2_GPIO_LED0_RED, 0) == 0)) -		gpio_export(IGEP2_GPIO_LED0_RED, 0); -	else -		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n"); - -	if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) && -	    (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 0) == 0)) -		gpio_export(IGEP2_GPIO_LED0_GREEN, 0); -	else -		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n"); - -	if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) && -	    (gpio_direction_output(IGEP2_GPIO_LED1_RED, 0) == 0)) -		gpio_export(IGEP2_GPIO_LED1_RED, 0); -	else -		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n"); +	if (gpio_request_array(igep2_gpio_leds, ARRAY_SIZE(igep2_gpio_leds))) { +		pr_warning("IGEP v2: Could not obtain leds gpios\n"); +		return; +	} +	gpio_export(IGEP2_GPIO_LED0_RED, 0); +	gpio_export(IGEP2_GPIO_LED0_GREEN, 0); +	gpio_export(IGEP2_GPIO_LED1_RED, 0);  }  #endif +static struct gpio igep2_twl_gpios[] = { +	{ -EINVAL, GPIOF_IN,		"GPIO_EHCI_NOC"  }, +	{ -EINVAL, GPIOF_OUT_INIT_LOW,	"GPIO_USBH_CPEN" }, +}; +  static int igep2_twl_gpio_setup(struct device *dev,  		unsigned gpio, unsigned ngpio)  { +	int ret; +  	/* gpio + 0 is "mmc0_cd" (input/IRQ) */  	mmc[0].gpio_cd = gpio + 0;  	omap2_hsmmc_init(mmc); @@ -373,22 +376,20 @@ static int igep2_twl_gpio_setup(struct device *dev,  	 * REVISIT: need ehci-omap hooks for external VBUS  	 * power switch and overcurrent detect  	 */ -	if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) || -	    (gpio_direction_input(gpio + 1) < 0)) -		pr_err("IGEP2: Could not obtain gpio for EHCI NOC"); +	igep2_twl_gpios[0].gpio = gpio + 1; -	/* -	 * TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN -	 * (out, active low) -	 */ -	if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) || -	    (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0)) +	/* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN (out, active low) */ +	igep2_twl_gpios[1].gpio = gpio + TWL4030_GPIO_MAX; + +	ret = gpio_request_array(igep2_twl_gpios, ARRAY_SIZE(igep2_twl_gpios)); +	if (ret < 0)  		pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");  	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */  #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) -	if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0) -	    && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) +	ret = gpio_request_one(gpio + TWL4030_GPIO_MAX + 1, GPIOF_OUT_INIT_HIGH, +			       "gpio-led:green:d1"); +	if (ret == 0)  		gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);  	else  		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n"); @@ -469,8 +470,9 @@ static struct regulator_init_data igep2_vpll2 = {  static void __init igep2_display_init(void)  { -	if (gpio_request(IGEP2_GPIO_DVI_PUP, "GPIO_DVI_PUP") && -	    gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1)) +	int err = gpio_request_one(IGEP2_GPIO_DVI_PUP, GPIOF_OUT_INIT_HIGH, +				   "GPIO_DVI_PUP"); +	if (err)  		pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");  } @@ -577,44 +579,43 @@ static struct omap_board_mux board_mux[] __initdata = {  #endif  #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) +static struct gpio igep2_wlan_bt_gpios[] __initdata = { +	{ -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NPD"	   }, +	{ -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NRESET" }, +	{ -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_BT_NRESET"   }, +};  static void __init igep2_wlan_bt_init(void)  { -	unsigned npd, wreset, btreset; +	int err;  	/* GPIO's for WLAN-BT combo depends on hardware revision */  	if (hwrev == IGEP2_BOARD_HWREV_B) { -		npd = IGEP2_RB_GPIO_WIFI_NPD; -		wreset = IGEP2_RB_GPIO_WIFI_NRESET; -		btreset = IGEP2_RB_GPIO_BT_NRESET; +		igep2_wlan_bt_gpios[0].gpio = IGEP2_RB_GPIO_WIFI_NPD; +		igep2_wlan_bt_gpios[1].gpio = IGEP2_RB_GPIO_WIFI_NRESET; +		igep2_wlan_bt_gpios[2].gpio = IGEP2_RB_GPIO_BT_NRESET;  	} else if (hwrev == IGEP2_BOARD_HWREV_C) { -		npd = IGEP2_RC_GPIO_WIFI_NPD; -		wreset = IGEP2_RC_GPIO_WIFI_NRESET; -		btreset = IGEP2_RC_GPIO_BT_NRESET; +		igep2_wlan_bt_gpios[0].gpio = IGEP2_RC_GPIO_WIFI_NPD; +		igep2_wlan_bt_gpios[1].gpio = IGEP2_RC_GPIO_WIFI_NRESET; +		igep2_wlan_bt_gpios[2].gpio = IGEP2_RC_GPIO_BT_NRESET;  	} else  		return; -	/* Set GPIO's for  WLAN-BT combo module */ -	if ((gpio_request(npd, "GPIO_WIFI_NPD") == 0) && -	    (gpio_direction_output(npd, 1) == 0)) { -		gpio_export(npd, 0); -	} else -		pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NPD\n"); +	err = gpio_request_array(igep2_wlan_bt_gpios, +				 ARRAY_SIZE(igep2_wlan_bt_gpios)); +	if (err) { +		pr_warning("IGEP2: Could not obtain WIFI/BT gpios\n"); +		return; +	} -	if ((gpio_request(wreset, "GPIO_WIFI_NRESET") == 0) && -	    (gpio_direction_output(wreset, 1) == 0)) { -		gpio_export(wreset, 0); -		gpio_set_value(wreset, 0); -		udelay(10); -		gpio_set_value(wreset, 1); -	} else -		pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NRESET\n"); +	gpio_export(igep2_wlan_bt_gpios[0].gpio, 0); +	gpio_export(igep2_wlan_bt_gpios[1].gpio, 0); +	gpio_export(igep2_wlan_bt_gpios[2].gpio, 0); + +	gpio_set_value(igep2_wlan_bt_gpios[1].gpio, 0); +	udelay(10); +	gpio_set_value(igep2_wlan_bt_gpios[1].gpio, 1); -	if ((gpio_request(btreset, "GPIO_BT_NRESET") == 0) && -	    (gpio_direction_output(btreset, 1) == 0)) { -		gpio_export(btreset, 0); -	} else -		pr_warning("IGEP2: Could not obtain gpio GPIO_BT_NRESET\n");  }  #else  static inline void __init igep2_wlan_bt_init(void) { } diff --git a/arch/arm/mach-omap2/board-igep0030.c b/arch/arm/mach-omap2/board-igep0030.c index 512a7eb9c2d..83f6be2a0de 100644 --- a/arch/arm/mach-omap2/board-igep0030.c +++ b/arch/arm/mach-omap2/board-igep0030.c @@ -269,49 +269,43 @@ static void __init igep3_leds_init(void)  }  #else +static struct gpio igep3_gpio_leds[] __initdata = { +	{ IGEP3_GPIO_LED0_RED,	 GPIOF_OUT_INIT_HIGH, "gpio-led:red:d0"	  }, +	{ IGEP3_GPIO_LED0_GREEN, GPIOF_OUT_INIT_HIGH, "gpio-led:green:d0" }, +	{ IGEP3_GPIO_LED1_RED,	 GPIOF_OUT_INIT_HIGH, "gpio-led:red:d1"	  }, +}; +  static inline void igep3_leds_init(void)  { -	if ((gpio_request(IGEP3_GPIO_LED0_RED, "gpio-led:red:d0") == 0) && -	    (gpio_direction_output(IGEP3_GPIO_LED0_RED, 1) == 0)) { -		gpio_export(IGEP3_GPIO_LED0_RED, 0); -		gpio_set_value(IGEP3_GPIO_LED0_RED, 1); -	} else -		pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_RED\n"); - -	if ((gpio_request(IGEP3_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) && -	    (gpio_direction_output(IGEP3_GPIO_LED0_GREEN, 1) == 0)) { -		gpio_export(IGEP3_GPIO_LED0_GREEN, 0); -		gpio_set_value(IGEP3_GPIO_LED0_GREEN, 1); -	} else -		pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_GREEN\n"); - -	if ((gpio_request(IGEP3_GPIO_LED1_RED, "gpio-led:red:d1") == 0) && -		(gpio_direction_output(IGEP3_GPIO_LED1_RED, 1) == 0)) { -		gpio_export(IGEP3_GPIO_LED1_RED, 0); -		gpio_set_value(IGEP3_GPIO_LED1_RED, 1); -	} else -		pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_RED\n"); +	if (gpio_request_array(igep3_gpio_leds, ARRAY_SIZE(igep3_gpio_leds))) { +		pr_warning("IGEP3: Could not obtain leds gpios\n"); +		return; +	} +	gpio_export(IGEP3_GPIO_LED0_RED, 0); +	gpio_export(IGEP3_GPIO_LED0_GREEN, 0); +	gpio_export(IGEP3_GPIO_LED1_RED, 0);  }  #endif  static int igep3_twl4030_gpio_setup(struct device *dev,  		unsigned gpio, unsigned ngpio)  { -	/* gpio + 0 is "mmc0_cd" (input/IRQ) */ -	mmc[0].gpio_cd = gpio + 0; -	omap2_hsmmc_init(mmc); +#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) +	int ret;  	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ -#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) -	if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0) -	    && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) { -		gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0); -		gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0); -	} else +	ret = gpio_request_one(gpio + TWL4030_GPIO_MAX + 1, GPIOF_OUT_INIT_HIGH, +			       "gpio-led:green:d1"); +	if (ret)  		pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_GREEN\n"); +	else +		gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);  #else  	igep3_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;  #endif +	/* gpio + 0 is "mmc0_cd" (input/IRQ) */ +	mmc[0].gpio_cd = gpio + 0; +	omap2_hsmmc_init(mmc);  	return 0;  }; @@ -358,35 +352,36 @@ static int __init igep3_i2c_init(void)  }  #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) +static struct gpio igep3_wlan_bt_gpios[] __initdata = { +	{ IGEP3_GPIO_WIFI_NPD,	  GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NPD"	  }, +	{ IGEP3_GPIO_WIFI_NRESET, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NRESET" }, +	{ IGEP3_GPIO_BT_NRESET,	  GPIOF_OUT_INIT_HIGH, "GPIO_BT_NRESET"	  }, +};  static void __init igep3_wifi_bt_init(void)  { +	int err; +  	/* Configure MUX values for W-LAN + Bluetooth GPIO's */  	omap_mux_init_gpio(IGEP3_GPIO_WIFI_NPD, OMAP_PIN_OUTPUT);  	omap_mux_init_gpio(IGEP3_GPIO_WIFI_NRESET, OMAP_PIN_OUTPUT);  	omap_mux_init_gpio(IGEP3_GPIO_BT_NRESET, OMAP_PIN_OUTPUT);  	/* Set GPIO's for  W-LAN + Bluetooth combo module */ -	if ((gpio_request(IGEP3_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) && -	    (gpio_direction_output(IGEP3_GPIO_WIFI_NPD, 1) == 0)) { -		gpio_export(IGEP3_GPIO_WIFI_NPD, 0); -	} else -		pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NPD\n"); +	err = gpio_request_array(igep3_wlan_bt_gpios, +				 ARRAY_SIZE(igep3_wlan_bt_gpios)); +	if (err) { +		pr_warning("IGEP3: Could not obtain WIFI/BT gpios\n"); +		return; +	} -	if ((gpio_request(IGEP3_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) && -	    (gpio_direction_output(IGEP3_GPIO_WIFI_NRESET, 1) == 0)) { -		gpio_export(IGEP3_GPIO_WIFI_NRESET, 0); -		gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 0); -		udelay(10); -		gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 1); -	} else -		pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NRESET\n"); +	gpio_export(IGEP3_GPIO_WIFI_NPD, 0); +	gpio_export(IGEP3_GPIO_WIFI_NRESET, 0); +	gpio_export(IGEP3_GPIO_BT_NRESET, 0); -	if ((gpio_request(IGEP3_GPIO_BT_NRESET, "GPIO_BT_NRESET") == 0) && -	    (gpio_direction_output(IGEP3_GPIO_BT_NRESET, 1) == 0)) { -		gpio_export(IGEP3_GPIO_BT_NRESET, 0); -	} else -		pr_warning("IGEP3: Could not obtain gpio GPIO_BT_NRESET\n"); +	gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 0); +	udelay(10); +	gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 1);  }  #else  void __init igep3_wifi_bt_init(void) {} diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index e710cd9e079..8d74318ed49 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -106,14 +106,13 @@ static void __init n8x0_usb_init(void)  	static char	announce[] __initdata = KERN_INFO "TUSB 6010\n";  	/* PM companion chip power control pin */ -	ret = gpio_request(TUSB6010_GPIO_ENABLE, "TUSB6010 enable"); +	ret = gpio_request_one(TUSB6010_GPIO_ENABLE, GPIOF_OUT_INIT_LOW, +			       "TUSB6010 enable");  	if (ret != 0) {  		printk(KERN_ERR "Could not get TUSB power GPIO%i\n",  		       TUSB6010_GPIO_ENABLE);  		return;  	} -	gpio_direction_output(TUSB6010_GPIO_ENABLE, 0); -  	tusb_set_power(0);  	ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2, @@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = {  static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC]; -static void __init n8x0_mmc_init(void) +static struct gpio n810_emmc_gpios[] __initdata = { +	{ N810_EMMC_VSD_GPIO, GPIOF_OUT_INIT_LOW,  "MMC slot 2 Vddf" }, +	{ N810_EMMC_VIO_GPIO, GPIOF_OUT_INIT_LOW,  "MMC slot 2 Vdd"  }, +}; +static void __init n8x0_mmc_init(void)  {  	int err; @@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void)  		mmc1_data.slots[1].ban_openended = 1;  	} -	err = gpio_request(N8X0_SLOT_SWITCH_GPIO, "MMC slot switch"); +	err = gpio_request_one(N8X0_SLOT_SWITCH_GPIO, GPIOF_OUT_INIT_LOW, +			       "MMC slot switch");  	if (err)  		return; -	gpio_direction_output(N8X0_SLOT_SWITCH_GPIO, 0); -  	if (machine_is_nokia_n810()) { -		err = gpio_request(N810_EMMC_VSD_GPIO, "MMC slot 2 Vddf"); -		if (err) { -			gpio_free(N8X0_SLOT_SWITCH_GPIO); -			return; -		} -		gpio_direction_output(N810_EMMC_VSD_GPIO, 0); - -		err = gpio_request(N810_EMMC_VIO_GPIO, "MMC slot 2 Vdd"); +		err = gpio_request_array(n810_emmc_gpios, +					 ARRAY_SIZE(n810_emmc_gpios));  		if (err) {  			gpio_free(N8X0_SLOT_SWITCH_GPIO); -			gpio_free(N810_EMMC_VSD_GPIO);  			return;  		} -		gpio_direction_output(N810_EMMC_VIO_GPIO, 0);  	}  	mmc_data[0] = &mmc1_data; diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index bc30ab092d1..3ff3a2c4b86 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -80,6 +80,12 @@ static u8 omap3_beagle_get_rev(void)  	return omap3_beagle_version;  } +static struct gpio omap3_beagle_rev_gpios[] __initdata = { +	{ 171, GPIOF_IN, "rev_id_0"    }, +	{ 172, GPIOF_IN, "rev_id_1" }, +	{ 173, GPIOF_IN, "rev_id_2"    }, +}; +  static void __init omap3_beagle_init_rev(void)  {  	int ret; @@ -89,21 +95,13 @@ static void __init omap3_beagle_init_rev(void)  	omap_mux_init_gpio(172, OMAP_PIN_INPUT_PULLUP);  	omap_mux_init_gpio(173, OMAP_PIN_INPUT_PULLUP); -	ret = gpio_request(171, "rev_id_0"); -	if (ret < 0) -		goto fail0; - -	ret = gpio_request(172, "rev_id_1"); -	if (ret < 0) -		goto fail1; - -	ret = gpio_request(173, "rev_id_2"); -	if (ret < 0) -		goto fail2; - -	gpio_direction_input(171); -	gpio_direction_input(172); -	gpio_direction_input(173); +	ret = gpio_request_array(omap3_beagle_rev_gpios, +				 ARRAY_SIZE(omap3_beagle_rev_gpios)); +	if (ret < 0) { +		printk(KERN_ERR "Unable to get revision detection GPIO pins\n"); +		omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN; +		return; +	}  	beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1)  			| (gpio_get_value(173) << 2); @@ -129,18 +127,6 @@ static void __init omap3_beagle_init_rev(void)  		printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev);  		omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;  	} - -	return; - -fail2: -	gpio_free(172); -fail1: -	gpio_free(171); -fail0: -	printk(KERN_ERR "Unable to get revision detection GPIO pins\n"); -	omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN; - -	return;  }  static struct mtd_partition omap3beagle_nand_partitions[] = { @@ -235,13 +221,10 @@ static void __init beagle_display_init(void)  {  	int r; -	r = gpio_request(beagle_dvi_device.reset_gpio, "DVI reset"); -	if (r < 0) { +	r = gpio_request_one(beagle_dvi_device.reset_gpio, GPIOF_OUT_INIT_LOW, +			     "DVI reset"); +	if (r < 0)  		printk(KERN_ERR "Unable to get DVI reset GPIO\n"); -		return; -	} - -	gpio_direction_output(beagle_dvi_device.reset_gpio, 0);  }  #include "sdram-micron-mt46h32m32lf-6.h" @@ -268,7 +251,7 @@ static struct gpio_led gpio_leds[];  static int beagle_twl_gpio_setup(struct device *dev,  		unsigned gpio, unsigned ngpio)  { -	int r; +	int r, usb_pwr_level;  	if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {  		mmc[0].gpio_wp = -EINVAL; @@ -287,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev,  	beagle_vmmc1_supply.dev = mmc[0].dev;  	beagle_vsim_supply.dev = mmc[0].dev; -	/* REVISIT: need ehci-omap hooks for external VBUS -	 * power switch and overcurrent detect -	 */ -	if (omap3_beagle_get_rev() != OMAP3BEAGLE_BOARD_XM) { -		r = gpio_request(gpio + 1, "EHCI_nOC"); -		if (!r) { -			r = gpio_direction_input(gpio + 1); -			if (r) -				gpio_free(gpio + 1); -		} -		if (r) -			pr_err("%s: unable to configure EHCI_nOC\n", __func__); -	} -  	/*  	 * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active  	 * high / others active low) -	 */ -	gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); -	if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) -		gpio_direction_output(gpio + TWL4030_GPIO_MAX, 1); -	else -		gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); - -	/* DVI reset GPIO is different between beagle revisions */ -	if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) -		beagle_dvi_device.reset_gpio = 129; -	else -		beagle_dvi_device.reset_gpio = 170; - -	/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ -	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; - -	/* -	 * gpio + 1 on Xm controls the TFP410's enable line (active low) -	 * gpio + 2 control varies depending on the board rev as follows: -	 * P7/P8 revisions(prototype): Camera EN -	 * A2+ revisions (production): LDO (supplies DVI, serial, led blocks) +	 * DVI reset GPIO is different between beagle revisions  	 */  	if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { -		r = gpio_request(gpio + 1, "nDVI_PWR_EN"); -		if (!r) { -			r = gpio_direction_output(gpio + 1, 0); -			if (r) -				gpio_free(gpio + 1); -		} +		usb_pwr_level = GPIOF_OUT_INIT_HIGH; +		beagle_dvi_device.reset_gpio = 129; +		/* +		 * gpio + 1 on Xm controls the TFP410's enable line (active low) +		 * gpio + 2 control varies depending on the board rev as below: +		 * P7/P8 revisions(prototype): Camera EN +		 * A2+ revisions (production): LDO (DVI, serial, led blocks) +		 */ +		r = gpio_request_one(gpio + 1, GPIOF_OUT_INIT_LOW, +				     "nDVI_PWR_EN");  		if (r)  			pr_err("%s: unable to configure nDVI_PWR_EN\n",  				__func__); -		r = gpio_request(gpio + 2, "DVI_LDO_EN"); -		if (!r) { -			r = gpio_direction_output(gpio + 2, 1); -			if (r) -				gpio_free(gpio + 2); -		} +		r = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH, +				     "DVI_LDO_EN");  		if (r)  			pr_err("%s: unable to configure DVI_LDO_EN\n",  				__func__); +	} else { +		usb_pwr_level = GPIOF_OUT_INIT_LOW; +		beagle_dvi_device.reset_gpio = 170; +		/* +		 * REVISIT: need ehci-omap hooks for external VBUS +		 * power switch and overcurrent detect +		 */ +		if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC")) +			pr_err("%s: unable to configure EHCI_nOC\n", __func__);  	} +	gpio_request_one(gpio + TWL4030_GPIO_MAX, usb_pwr_level, "nEN_USB_PWR"); + +	/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ +	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; +  	return 0;  } @@ -608,9 +571,8 @@ static void __init omap3_beagle_init(void)  	omap_serial_init();  	omap_mux_init_gpio(170, OMAP_PIN_INPUT); -	gpio_request(170, "DVI_nPD");  	/* REVISIT leave DVI powered down until it's needed ... */ -	gpio_direction_output(170, true); +	gpio_request_one(170, GPIOF_OUT_INIT_HIGH, "DVI_nPD");  	usb_musb_init(NULL);  	usbhs_init(&usbhs_bdata); diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 5066b0bbf63..02e1ad29e1e 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c @@ -149,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; }  #define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO	210  #define OMAP3EVM_DVI_PANEL_EN_GPIO	199 +static struct gpio omap3_evm_dss_gpios[] __initdata = { +	{ OMAP3EVM_LCD_PANEL_RESB,  GPIOF_OUT_INIT_HIGH, "lcd_panel_resb"  }, +	{ OMAP3EVM_LCD_PANEL_INI,   GPIOF_OUT_INIT_HIGH, "lcd_panel_ini"   }, +	{ OMAP3EVM_LCD_PANEL_QVGA,  GPIOF_OUT_INIT_LOW,  "lcd_panel_qvga"  }, +	{ OMAP3EVM_LCD_PANEL_LR,    GPIOF_OUT_INIT_HIGH, "lcd_panel_lr"    }, +	{ OMAP3EVM_LCD_PANEL_UD,    GPIOF_OUT_INIT_HIGH, "lcd_panel_ud"    }, +	{ OMAP3EVM_LCD_PANEL_ENVDD, GPIOF_OUT_INIT_LOW,  "lcd_panel_envdd" }, +}; +  static int lcd_enabled;  static int dvi_enabled; @@ -156,61 +165,10 @@ static void __init omap3_evm_display_init(void)  {  	int r; -	r = gpio_request(OMAP3EVM_LCD_PANEL_RESB, "lcd_panel_resb"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_panel_resb\n"); -		return; -	} -	gpio_direction_output(OMAP3EVM_LCD_PANEL_RESB, 1); - -	r = gpio_request(OMAP3EVM_LCD_PANEL_INI, "lcd_panel_ini"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_panel_ini\n"); -		goto err_1; -	} -	gpio_direction_output(OMAP3EVM_LCD_PANEL_INI, 1); - -	r = gpio_request(OMAP3EVM_LCD_PANEL_QVGA, "lcd_panel_qvga"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_panel_qvga\n"); -		goto err_2; -	} -	gpio_direction_output(OMAP3EVM_LCD_PANEL_QVGA, 0); - -	r = gpio_request(OMAP3EVM_LCD_PANEL_LR, "lcd_panel_lr"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_panel_lr\n"); -		goto err_3; -	} -	gpio_direction_output(OMAP3EVM_LCD_PANEL_LR, 1); - -	r = gpio_request(OMAP3EVM_LCD_PANEL_UD, "lcd_panel_ud"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_panel_ud\n"); -		goto err_4; -	} -	gpio_direction_output(OMAP3EVM_LCD_PANEL_UD, 1); - -	r = gpio_request(OMAP3EVM_LCD_PANEL_ENVDD, "lcd_panel_envdd"); -	if (r) { -		printk(KERN_ERR "failed to get lcd_panel_envdd\n"); -		goto err_5; -	} -	gpio_direction_output(OMAP3EVM_LCD_PANEL_ENVDD, 0); - -	return; - -err_5: -	gpio_free(OMAP3EVM_LCD_PANEL_UD); -err_4: -	gpio_free(OMAP3EVM_LCD_PANEL_LR); -err_3: -	gpio_free(OMAP3EVM_LCD_PANEL_QVGA); -err_2: -	gpio_free(OMAP3EVM_LCD_PANEL_INI); -err_1: -	gpio_free(OMAP3EVM_LCD_PANEL_RESB); - +	r = gpio_request_array(omap3_evm_dss_gpios, +			       ARRAY_SIZE(omap3_evm_dss_gpios)); +	if (r) +		printk(KERN_ERR "failed to get lcd_panel_* gpios\n");  }  static int omap3_evm_enable_lcd(struct omap_dss_device *dssdev) @@ -400,7 +358,7 @@ static struct platform_device leds_gpio = {  static int omap3evm_twl_gpio_setup(struct device *dev,  		unsigned gpio, unsigned ngpio)  { -	int r; +	int r, lcd_bl_en;  	/* gpio + 0 is "mmc0_cd" (input/IRQ) */  	omap_mux_init_gpio(63, OMAP_PIN_INPUT); @@ -417,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev,  	 */  	/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ -	r = gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL"); -	if (!r) -		r = gpio_direction_output(gpio + TWL4030_GPIO_MAX, -			(get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) ? 1 : 0); +	lcd_bl_en = get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2 ? +		GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; +	r = gpio_request_one(gpio + TWL4030_GPIO_MAX, lcd_bl_en, "EN_LCD_BKL");  	if (r)  		printk(KERN_ERR "failed to get/set lcd_bkl gpio\n");  	/* gpio + 7 == DVI Enable */ -	gpio_request(gpio + 7, "EN_DVI"); -	gpio_direction_output(gpio + 7, 0); +	gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");  	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */  	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; @@ -717,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = {  	.power			= 100,  }; +static struct gpio omap3_evm_ehci_gpios[] __initdata = { +	{ OMAP3_EVM_EHCI_VBUS,	 GPIOF_OUT_INIT_HIGH,  "enable EHCI VBUS" }, +	{ OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW,   "select EHCI port" }, +}; +  static void __init omap3_evm_init(void)  {  	omap3_evm_get_revision(); @@ -740,16 +701,12 @@ static void __init omap3_evm_init(void)  	if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) {  		/* enable EHCI VBUS using GPIO22 */ -		omap_mux_init_gpio(22, OMAP_PIN_INPUT_PULLUP); -		gpio_request(OMAP3_EVM_EHCI_VBUS, "enable EHCI VBUS"); -		gpio_direction_output(OMAP3_EVM_EHCI_VBUS, 0); -		gpio_set_value(OMAP3_EVM_EHCI_VBUS, 1); - +		omap_mux_init_gpio(OMAP3_EVM_EHCI_VBUS, OMAP_PIN_INPUT_PULLUP);  		/* Select EHCI port on main board */ -		omap_mux_init_gpio(61, OMAP_PIN_INPUT_PULLUP); -		gpio_request(OMAP3_EVM_EHCI_SELECT, "select EHCI port"); -		gpio_direction_output(OMAP3_EVM_EHCI_SELECT, 0); -		gpio_set_value(OMAP3_EVM_EHCI_SELECT, 0); +		omap_mux_init_gpio(OMAP3_EVM_EHCI_SELECT, +				   OMAP_PIN_INPUT_PULLUP); +		gpio_request_array(omap3_evm_ehci_gpios, +				   ARRAY_SIZE(omap3_evm_ehci_gpios));  		/* setup EHCI phy reset config */  		omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP); diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 6c22d3f238e..78dd2a7fe6e 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c @@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,  	/* gpio + 13 drives 32kHz buffer for wifi module */  	gpio_32khz = gpio + 13; -	ret = gpio_request(gpio_32khz, "wifi 32kHz"); +	ret = gpio_request_one(gpio_32khz, GPIOF_OUT_INIT_HIGH, "wifi 32kHz");  	if (ret < 0) {  		pr_err("Cannot get GPIO line %d, ret=%d\n", gpio_32khz, ret); -		goto fail; -	} - -	ret = gpio_direction_output(gpio_32khz, 1); -	if (ret < 0) { -		pr_err("Cannot set GPIO line %d, ret=%d\n", gpio_32khz, ret); -		goto fail_direction; +		return -ENODEV;  	}  	return 0; - -fail_direction: -	gpio_free(gpio_32khz); -fail: -	return -ENODEV;  }  static struct twl4030_gpio_platform_data omap3pandora_gpio_data = { @@ -584,14 +573,10 @@ static void __init pandora_wl1251_init(void)  	memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); -	ret = gpio_request(PANDORA_WIFI_IRQ_GPIO, "wl1251 irq"); +	ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq");  	if (ret < 0)  		goto fail; -	ret = gpio_direction_input(PANDORA_WIFI_IRQ_GPIO); -	if (ret < 0) -		goto fail_irq; -  	pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO);  	if (pandora_wl1251_pdata.irq < 0)  		goto fail_irq; diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 9981d06b726..085c60a7c47 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c @@ -331,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev,  	 */  	/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ -	gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL"); -	gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); +	gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW, +			 "EN_LCD_BKL");  	/* gpio + 7 == DVI Enable */ -	gpio_request(gpio + 7, "EN_DVI"); -	gpio_direction_output(gpio + 7, 0); +	gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");  	/* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */  	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 392278d9a88..82872d7d313 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c @@ -146,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev,  	/* REVISIT: need ehci-omap hooks for external VBUS  	 * power switch and overcurrent detect  	 */ - -	gpio_request(gpio + 1, "EHCI_nOC"); -	gpio_direction_input(gpio + 1); +	gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC");  	/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */ -	gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); -	gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); +	gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW, +			 "nEN_USB_PWR");  	/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */  	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; @@ -401,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {  static void omap3_touchbook_poweroff(void)  { -	int r; +	int pwr_off = TB_KILL_POWER_GPIO; -	r = gpio_request(TB_KILL_POWER_GPIO, "DVI reset"); -	if (r < 0) { +	if (gpio_request_one(pwr_off, GPIOF_OUT_INIT_LOW, "DVI reset") < 0)  		printk(KERN_ERR "Unable to get kill power GPIO\n"); -		return; -	} - -	gpio_direction_output(TB_KILL_POWER_GPIO, 0);  }  static int __init early_touchbook_revision(char *p) @@ -435,9 +428,8 @@ static void __init omap3_touchbook_init(void)  	omap_serial_init();  	omap_mux_init_gpio(170, OMAP_PIN_INPUT); -	gpio_request(176, "DVI_nPD");  	/* REVISIT leave DVI powered down until it's needed ... */ -	gpio_direction_output(176, true); +	gpio_request_one(176, GPIOF_OUT_INIT_HIGH, "DVI_nPD");  	/* Touchscreen and accelerometer */  	omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata); diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 7eaad629c4c..5d7c0a313dc 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -112,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {  	.reset_gpio_port[2]  = -EINVAL  }; +static struct gpio panda_ehci_gpios[] __initdata = { +	{ GPIO_HUB_POWER,	GPIOF_OUT_INIT_LOW,  "hub_power"  }, +	{ GPIO_HUB_NRESET,	GPIOF_OUT_INIT_LOW,  "hub_nreset" }, +}; +  static void __init omap4_ehci_init(void)  {  	int ret; @@ -121,44 +126,27 @@ static void __init omap4_ehci_init(void)  	phy_ref_clk = clk_get(NULL, "auxclk3_ck");  	if (IS_ERR(phy_ref_clk)) {  		pr_err("Cannot request auxclk3\n"); -		goto error1; +		return;  	}  	clk_set_rate(phy_ref_clk, 19200000);  	clk_enable(phy_ref_clk); -	/* disable the power to the usb hub prior to init */ -	ret = gpio_request(GPIO_HUB_POWER, "hub_power"); +	/* disable the power to the usb hub prior to init and reset phy+hub */ +	ret = gpio_request_array(panda_ehci_gpios, +				 ARRAY_SIZE(panda_ehci_gpios));  	if (ret) { -		pr_err("Cannot request GPIO %d\n", GPIO_HUB_POWER); -		goto error1; +		pr_err("Unable to initialize EHCI power/reset\n"); +		return;  	} -	gpio_export(GPIO_HUB_POWER, 0); -	gpio_direction_output(GPIO_HUB_POWER, 0); -	gpio_set_value(GPIO_HUB_POWER, 0); -	/* reset phy+hub */ -	ret = gpio_request(GPIO_HUB_NRESET, "hub_nreset"); -	if (ret) { -		pr_err("Cannot request GPIO %d\n", GPIO_HUB_NRESET); -		goto error2; -	} +	gpio_export(GPIO_HUB_POWER, 0);  	gpio_export(GPIO_HUB_NRESET, 0); -	gpio_direction_output(GPIO_HUB_NRESET, 0); -	gpio_set_value(GPIO_HUB_NRESET, 0);  	gpio_set_value(GPIO_HUB_NRESET, 1);  	usbhs_init(&usbhs_bdata);  	/* enable power to hub */  	gpio_set_value(GPIO_HUB_POWER, 1); -	return; - -error2: -	gpio_free(GPIO_HUB_POWER); -error1: -	pr_err("Unable to initialize EHCI power/reset\n"); -	return; -  }  static struct omap_musb_board_data musb_board_data = { @@ -638,27 +626,19 @@ static void omap4_panda_hdmi_mux_init(void)  			OMAP_PIN_INPUT_PULLUP);  } +static struct gpio panda_hdmi_gpios[] = { +	{ HDMI_GPIO_HPD,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd"   }, +	{ HDMI_GPIO_LS_OE,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, +}; +  static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)  {  	int status; -	status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, -							"hdmi_gpio_hpd"); -	if (status) { -		pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); -		return status; -	} -	status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, -							"hdmi_gpio_ls_oe"); -	if (status) { -		pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE); -		goto error1; -	} - -	return 0; - -error1: -	gpio_free(HDMI_GPIO_HPD); +	status = gpio_request_array(panda_hdmi_gpios, +				    ARRAY_SIZE(panda_hdmi_gpios)); +	if (status) +		pr_err("Cannot request HDMI GPIOs\n");  	return status;  } diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index e152c13ded7..c03f92b14f9 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c @@ -151,21 +151,20 @@ static int dvi_enabled;  #define OVERO_GPIO_LCD_EN 144  #define OVERO_GPIO_LCD_BL 145 +static struct gpio overo_dss_gpios[] __initdata = { +	{ OVERO_GPIO_LCD_EN, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_EN" }, +	{ OVERO_GPIO_LCD_BL, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_BL" }, +}; +  static void __init overo_display_init(void)  { -	if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) && -	    (gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0)) -		gpio_export(OVERO_GPIO_LCD_EN, 0); -	else -		printk(KERN_ERR "could not obtain gpio for " -					"OVERO_GPIO_LCD_EN\n"); +	if (gpio_request_array(overo_dss_gpios, ARRAY_SIZE(overo_dss_gpios))) { +		printk(KERN_ERR "could not obtain DSS control GPIOs\n"); +		return; +	} -	if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) && -	    (gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0)) -		gpio_export(OVERO_GPIO_LCD_BL, 0); -	else -		printk(KERN_ERR "could not obtain gpio for " -					"OVERO_GPIO_LCD_BL\n"); +	gpio_export(OVERO_GPIO_LCD_EN, 0); +	gpio_export(OVERO_GPIO_LCD_BL, 0);  }  static int overo_panel_enable_dvi(struct omap_dss_device *dssdev) @@ -553,8 +552,15 @@ static struct omap_board_mux board_mux[] __initdata = {  };  #endif +static struct gpio overo_bt_gpios[] __initdata = { +	{ OVERO_GPIO_BT_XGATE,	GPIOF_OUT_INIT_LOW,	"lcd enable"    }, +	{ OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH,	"lcd bl enable" }, +}; +  static void __init overo_init(void)  { +	int ret; +  	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);  	overo_i2c_init();  	omap_display_init(&overo_dss_data); @@ -574,9 +580,9 @@ static void __init overo_init(void)  	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);  	omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); -	if ((gpio_request(OVERO_GPIO_W2W_NRESET, -			  "OVERO_GPIO_W2W_NRESET") == 0) && -	    (gpio_direction_output(OVERO_GPIO_W2W_NRESET, 1) == 0)) { +	ret = gpio_request_one(OVERO_GPIO_W2W_NRESET, GPIOF_OUT_INIT_HIGH, +			       "OVERO_GPIO_W2W_NRESET"); +	if (ret == 0) {  		gpio_export(OVERO_GPIO_W2W_NRESET, 0);  		gpio_set_value(OVERO_GPIO_W2W_NRESET, 0);  		udelay(10); @@ -586,25 +592,20 @@ static void __init overo_init(void)  					"OVERO_GPIO_W2W_NRESET\n");  	} -	if ((gpio_request(OVERO_GPIO_BT_XGATE, "OVERO_GPIO_BT_XGATE") == 0) && -	    (gpio_direction_output(OVERO_GPIO_BT_XGATE, 0) == 0)) +	ret = gpio_request_array(overo_bt_gpios, ARRAY_SIZE(overo_bt_gpios)); +	if (ret) { +		pr_err("%s: could not obtain BT gpios\n", __func__); +	} else {  		gpio_export(OVERO_GPIO_BT_XGATE, 0); -	else -		printk(KERN_ERR "could not obtain gpio for OVERO_GPIO_BT_XGATE\n"); - -	if ((gpio_request(OVERO_GPIO_BT_NRESET, "OVERO_GPIO_BT_NRESET") == 0) && -	    (gpio_direction_output(OVERO_GPIO_BT_NRESET, 1) == 0)) {  		gpio_export(OVERO_GPIO_BT_NRESET, 0);  		gpio_set_value(OVERO_GPIO_BT_NRESET, 0);  		mdelay(6);  		gpio_set_value(OVERO_GPIO_BT_NRESET, 1); -	} else { -		printk(KERN_ERR "could not obtain gpio for " -					"OVERO_GPIO_BT_NRESET\n");  	} -	if ((gpio_request(OVERO_GPIO_USBH_CPEN, "OVERO_GPIO_USBH_CPEN") == 0) && -	    (gpio_direction_output(OVERO_GPIO_USBH_CPEN, 1) == 0)) +	ret = gpio_request_one(OVERO_GPIO_USBH_CPEN, GPIOF_OUT_INIT_HIGH, +			       "OVERO_GPIO_USBH_CPEN"); +	if (ret == 0)  		gpio_export(OVERO_GPIO_USBH_CPEN, 0);  	else  		printk(KERN_ERR "could not obtain gpio for " diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index a5bf5e92eae..2e509f9149e 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c @@ -558,10 +558,8 @@ static __init void rx51_init_si4713(void)  static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n)  {  	/* FIXME this gpio setup is just a placeholder for now */ -	gpio_request(gpio + 6, "backlight_pwm"); -	gpio_direction_output(gpio + 6, 0); -	gpio_request(gpio + 7, "speaker_en"); -	gpio_direction_output(gpio + 7, 1); +	gpio_request_one(gpio + 6, GPIOF_OUT_INIT_LOW, "backlight_pwm"); +	gpio_request_one(gpio + 7, GPIOF_OUT_INIT_HIGH, "speaker_en");  	return 0;  } @@ -912,26 +910,20 @@ static void rx51_wl1251_set_power(bool enable)  	gpio_set_value(RX51_WL1251_POWER_GPIO, enable);  } +static struct gpio rx51_wl1251_gpios[] __initdata = { +	{ RX51_WL1251_POWER_GPIO, GPIOF_OUT_INIT_LOW,	"wl1251 power"	}, +	{ RX51_WL1251_IRQ_GPIO,	  GPIOF_IN,		"wl1251 irq"	}, +}; +  static void __init rx51_init_wl1251(void)  {  	int irq, ret; -	ret = gpio_request(RX51_WL1251_POWER_GPIO, "wl1251 power"); +	ret = gpio_request_array(rx51_wl1251_gpios, +				 ARRAY_SIZE(rx51_wl1251_gpios));  	if (ret < 0)  		goto error; -	ret = gpio_direction_output(RX51_WL1251_POWER_GPIO, 0); -	if (ret < 0) -		goto err_power; - -	ret = gpio_request(RX51_WL1251_IRQ_GPIO, "wl1251 irq"); -	if (ret < 0) -		goto err_power; - -	ret = gpio_direction_input(RX51_WL1251_IRQ_GPIO); -	if (ret < 0) -		goto err_irq; -  	irq = gpio_to_irq(RX51_WL1251_IRQ_GPIO);  	if (irq < 0)  		goto err_irq; @@ -943,10 +935,7 @@ static void __init rx51_init_wl1251(void)  err_irq:  	gpio_free(RX51_WL1251_IRQ_GPIO); - -err_power:  	gpio_free(RX51_WL1251_POWER_GPIO); -  error:  	printk(KERN_ERR "wl1251 board initialisation failed\n");  	wl1251_pdata.set_power = NULL; diff --git a/arch/arm/mach-omap2/board-rx51-video.c b/arch/arm/mach-omap2/board-rx51-video.c index 89a66db8b77..19777333aef 100644 --- a/arch/arm/mach-omap2/board-rx51-video.c +++ b/arch/arm/mach-omap2/board-rx51-video.c @@ -76,13 +76,12 @@ static int __init rx51_video_init(void)  		return 0;  	} -	if (gpio_request(RX51_LCD_RESET_GPIO, "LCD ACX565AKM reset")) { +	if (gpio_request_one(RX51_LCD_RESET_GPIO, GPIOF_OUT_INIT_HIGH, +			     "LCD ACX565AKM reset")) {  		pr_err("%s failed to get LCD Reset GPIO\n", __func__);  		return 0;  	} -	gpio_direction_output(RX51_LCD_RESET_GPIO, 1); -  	omap_display_init(&rx51_dss_board_info);  	return 0;  } diff --git a/arch/arm/mach-omap2/board-zoom-debugboard.c b/arch/arm/mach-omap2/board-zoom-debugboard.c index 2ee9ab92e0c..6402e781c45 100644 --- a/arch/arm/mach-omap2/board-zoom-debugboard.c +++ b/arch/arm/mach-omap2/board-zoom-debugboard.c @@ -77,12 +77,9 @@ static inline void __init zoom_init_quaduart(void)  	quart_gpio = ZOOM_QUADUART_GPIO; -	if (gpio_request(quart_gpio, "TL16CP754C GPIO") < 0) { +	if (gpio_request_one(quart_gpio, GPIOF_IN, "TL16CP754C GPIO") < 0)  		printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n",  								quart_gpio); -		return; -	} -	gpio_direction_input(quart_gpio);  }  static inline int omap_zoom_debugboard_detect(void) @@ -92,12 +89,12 @@ static inline int omap_zoom_debugboard_detect(void)  	debug_board_detect = ZOOM_SMSC911X_GPIO; -	if (gpio_request(debug_board_detect, "Zoom debug board detect") < 0) { +	if (gpio_request_one(debug_board_detect, GPIOF_IN, +			     "Zoom debug board detect") < 0) {  		printk(KERN_ERR "Failed to request GPIO%d for Zoom debug"  		"board detect\n", debug_board_detect);  		return 0;  	} -	gpio_direction_input(debug_board_detect);  	if (!gpio_get_value(debug_board_detect)) {  		ret = 0; diff --git a/arch/arm/mach-omap2/board-zoom-display.c b/arch/arm/mach-omap2/board-zoom-display.c index 37b84c2b850..ce53e82ba13 100644 --- a/arch/arm/mach-omap2/board-zoom-display.c +++ b/arch/arm/mach-omap2/board-zoom-display.c @@ -21,34 +21,19 @@  #define LCD_PANEL_RESET_GPIO_PILOT	55  #define LCD_PANEL_QVGA_GPIO		56 +static struct gpio zoom_lcd_gpios[] __initdata = { +	{ -EINVAL,		GPIOF_OUT_INIT_HIGH, "lcd reset" }, +	{ LCD_PANEL_QVGA_GPIO,	GPIOF_OUT_INIT_HIGH, "lcd qvga"	 }, +}; +  static void zoom_lcd_panel_init(void)  { -	int ret; -	unsigned char lcd_panel_reset_gpio; - -	lcd_panel_reset_gpio = (omap_rev() > OMAP3430_REV_ES3_0) ? +	zoom_lcd_gpios[0].gpio = (omap_rev() > OMAP3430_REV_ES3_0) ?  			LCD_PANEL_RESET_GPIO_PROD :  			LCD_PANEL_RESET_GPIO_PILOT; -	ret = gpio_request(lcd_panel_reset_gpio, "lcd reset"); -	if (ret) { -		pr_err("Failed to get LCD reset GPIO (gpio%d).\n", -			lcd_panel_reset_gpio); -		return; -	} -	gpio_direction_output(lcd_panel_reset_gpio, 1); - -	ret = gpio_request(LCD_PANEL_QVGA_GPIO, "lcd qvga"); -	if (ret) { -		pr_err("Failed to get LCD_PANEL_QVGA_GPIO (gpio%d).\n", -			LCD_PANEL_QVGA_GPIO); -		goto err0; -	} -	gpio_direction_output(LCD_PANEL_QVGA_GPIO, 1); - -	return; -err0: -	gpio_free(lcd_panel_reset_gpio); +	if (gpio_request_array(zoom_lcd_gpios, ARRAY_SIZE(zoom_lcd_gpios))) +		pr_err("%s: Failed to get LCD GPIOs.\n", __func__);  }  static int zoom_panel_enable_lcd(struct omap_dss_device *dssdev) diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 489294a715c..118c6f53c5e 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c @@ -277,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev,  	zoom_vsim_supply.dev = mmc[0].dev;  	zoom_vmmc2_supply.dev = mmc[1].dev; -	ret = gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd enable"); -	if (ret) { +	ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, +			       "lcd enable"); +	if (ret)  		pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n",  				LCD_PANEL_ENABLE_GPIO); -		return ret; -	} -	gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0);  	return ret;  } diff --git a/arch/arm/mach-omap2/gpmc-smc91x.c b/arch/arm/mach-omap2/gpmc-smc91x.c index 877c6f5807b..ba10c24f3d8 100644 --- a/arch/arm/mach-omap2/gpmc-smc91x.c +++ b/arch/arm/mach-omap2/gpmc-smc91x.c @@ -147,25 +147,24 @@ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data)  			goto free1;  	} -	if (gpio_request(gpmc_cfg->gpio_irq, "SMC91X irq") < 0) +	if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "SMC91X irq") < 0)  		goto free1; -	gpio_direction_input(gpmc_cfg->gpio_irq);  	gpmc_smc91x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq);  	if (gpmc_cfg->gpio_pwrdwn) { -		ret = gpio_request(gpmc_cfg->gpio_pwrdwn, "SMC91X powerdown"); +		ret = gpio_request_one(gpmc_cfg->gpio_pwrdwn, +				       GPIOF_OUT_INIT_LOW, "SMC91X powerdown");  		if (ret)  			goto free2; -		gpio_direction_output(gpmc_cfg->gpio_pwrdwn, 0);  	}  	if (gpmc_cfg->gpio_reset) { -		ret = gpio_request(gpmc_cfg->gpio_reset, "SMC91X reset"); +		ret = gpio_request_one(gpmc_cfg->gpio_reset, +				       GPIOF_OUT_INIT_LOW, "SMC91X reset");  		if (ret)  			goto free3; -		gpio_direction_output(gpmc_cfg->gpio_reset, 0);  		gpio_set_value(gpmc_cfg->gpio_reset, 1);  		msleep(100);  		gpio_set_value(gpmc_cfg->gpio_reset, 0); diff --git a/arch/arm/mach-omap2/gpmc-smsc911x.c b/arch/arm/mach-omap2/gpmc-smsc911x.c index e09374a48dd..997033129d2 100644 --- a/arch/arm/mach-omap2/gpmc-smsc911x.c +++ b/arch/arm/mach-omap2/gpmc-smsc911x.c @@ -63,23 +63,22 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)  	gpmc_smsc911x_resources[0].start = cs_mem_base + 0x0;  	gpmc_smsc911x_resources[0].end = cs_mem_base + 0xff; -	if (gpio_request(gpmc_cfg->gpio_irq, "smsc911x irq") < 0) { +	if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "smsc911x irq")) {  		pr_err("Failed to request IRQ GPIO%d\n", gpmc_cfg->gpio_irq);  		goto free1;  	} -	gpio_direction_input(gpmc_cfg->gpio_irq);  	gpmc_smsc911x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq);  	if (gpio_is_valid(gpmc_cfg->gpio_reset)) { -		ret = gpio_request(gpmc_cfg->gpio_reset, "smsc911x reset"); +		ret = gpio_request_one(gpmc_cfg->gpio_reset, +				       GPIOF_OUT_INIT_HIGH, "smsc911x reset");  		if (ret) {  			pr_err("Failed to request reset GPIO%d\n",  			       gpmc_cfg->gpio_reset);  			goto free2;  		} -		gpio_direction_output(gpmc_cfg->gpio_reset, 1);  		gpio_set_value(gpmc_cfg->gpio_reset, 0);  		msleep(100);  		gpio_set_value(gpmc_cfg->gpio_reset, 1); diff --git a/arch/arm/mach-omap2/usb-tusb6010.c b/arch/arm/mach-omap2/usb-tusb6010.c index 8a3c05f3c1d..8dd26b765b7 100644 --- a/arch/arm/mach-omap2/usb-tusb6010.c +++ b/arch/arm/mach-omap2/usb-tusb6010.c @@ -293,12 +293,11 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data,  			);  	/* IRQ */ -	status = gpio_request(irq, "TUSB6010 irq"); +	status = gpio_request_one(irq, GPIOF_IN, "TUSB6010 irq");  	if (status < 0) {  		printk(error, 3, status);  		return status;  	} -	gpio_direction_input(irq);  	tusb_resources[2].start = irq + IH_GPIO_BASE;  	/* set up memory timings ... can speed them up later */  |