diff options
Diffstat (limited to 'arch/mips/bcm47xx/gpio.c')
| -rw-r--r-- | arch/mips/bcm47xx/gpio.c | 85 | 
1 files changed, 34 insertions, 51 deletions
diff --git a/arch/mips/bcm47xx/gpio.c b/arch/mips/bcm47xx/gpio.c index f5a53acf995..9b798800258 100644 --- a/arch/mips/bcm47xx/gpio.c +++ b/arch/mips/bcm47xx/gpio.c @@ -12,68 +12,51 @@  #include <asm/mach-bcm47xx/bcm47xx.h>  #include <asm/mach-bcm47xx/gpio.h> -int bcm47xx_gpio_to_irq(unsigned gpio) +#if (BCM47XX_CHIPCO_GPIO_LINES > BCM47XX_EXTIF_GPIO_LINES) +static DECLARE_BITMAP(gpio_in_use, BCM47XX_CHIPCO_GPIO_LINES); +#else +static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES); +#endif + +int gpio_request(unsigned gpio, const char *tag)  { -	if (ssb_bcm47xx.chipco.dev) -		return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2; -	else if (ssb_bcm47xx.extif.dev) -		return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2; -	else +	if (ssb_chipco_available(&ssb_bcm47xx.chipco) && +	    ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))  		return -EINVAL; -} -EXPORT_SYMBOL_GPL(bcm47xx_gpio_to_irq); -int bcm47xx_gpio_get_value(unsigned gpio) -{ -	if (ssb_bcm47xx.chipco.dev) -		return ssb_chipco_gpio_in(&ssb_bcm47xx.chipco, 1 << gpio); -	else if (ssb_bcm47xx.extif.dev) -		return ssb_extif_gpio_in(&ssb_bcm47xx.extif, 1 << gpio); -	else -		return 0; -} -EXPORT_SYMBOL_GPL(bcm47xx_gpio_get_value); +	if (ssb_extif_available(&ssb_bcm47xx.extif) && +	    ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) +		return -EINVAL; -void bcm47xx_gpio_set_value(unsigned gpio, int value) -{ -	if (ssb_bcm47xx.chipco.dev) -		ssb_chipco_gpio_out(&ssb_bcm47xx.chipco, -				    1 << gpio, -				    value ? 1 << gpio : 0); -	else if (ssb_bcm47xx.extif.dev) -		ssb_extif_gpio_out(&ssb_bcm47xx.extif, -				   1 << gpio, -				   value ? 1 << gpio : 0); -} -EXPORT_SYMBOL_GPL(bcm47xx_gpio_set_value); +	if (test_and_set_bit(gpio, gpio_in_use)) +		return -EBUSY; -int bcm47xx_gpio_direction_input(unsigned gpio) -{ -	if (ssb_bcm47xx.chipco.dev && (gpio < BCM47XX_CHIPCO_GPIO_LINES)) -		ssb_chipco_gpio_outen(&ssb_bcm47xx.chipco, -				      1 << gpio, 0); -	else if (ssb_bcm47xx.extif.dev && (gpio < BCM47XX_EXTIF_GPIO_LINES)) -		ssb_extif_gpio_outen(&ssb_bcm47xx.extif, -				     1 << gpio, 0); -	else -		return -EINVAL;  	return 0;  } -EXPORT_SYMBOL_GPL(bcm47xx_gpio_direction_input); +EXPORT_SYMBOL(gpio_request); -int bcm47xx_gpio_direction_output(unsigned gpio, int value) +void gpio_free(unsigned gpio)  { -	bcm47xx_gpio_set_value(gpio, value); +	if (ssb_chipco_available(&ssb_bcm47xx.chipco) && +	    ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES)) +		return; + +	if (ssb_extif_available(&ssb_bcm47xx.extif) && +	    ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) +		return; + +	clear_bit(gpio, gpio_in_use); +} +EXPORT_SYMBOL(gpio_free); -	if (ssb_bcm47xx.chipco.dev && (gpio < BCM47XX_CHIPCO_GPIO_LINES)) -		ssb_chipco_gpio_outen(&ssb_bcm47xx.chipco, -				      1 << gpio, 1 << gpio); -	else if (ssb_bcm47xx.extif.dev && (gpio < BCM47XX_EXTIF_GPIO_LINES)) -		ssb_extif_gpio_outen(&ssb_bcm47xx.extif, -				     1 << gpio, 1 << gpio); +int gpio_to_irq(unsigned gpio) +{ +	if (ssb_chipco_available(&ssb_bcm47xx.chipco)) +		return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2; +	else if (ssb_extif_available(&ssb_bcm47xx.extif)) +		return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2;  	else  		return -EINVAL; -	return 0;  } -EXPORT_SYMBOL_GPL(bcm47xx_gpio_direction_output); +EXPORT_SYMBOL_GPL(gpio_to_irq);  | 
