diff options
Diffstat (limited to 'drivers/input/misc/ixp4xx-beeper.c')
| -rw-r--r-- | drivers/input/misc/ixp4xx-beeper.c | 27 | 
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/input/misc/ixp4xx-beeper.c b/drivers/input/misc/ixp4xx-beeper.c index f34beb228d3..ed8e5e8449d 100644 --- a/drivers/input/misc/ixp4xx-beeper.c +++ b/drivers/input/misc/ixp4xx-beeper.c @@ -20,6 +20,7 @@  #include <linux/delay.h>  #include <linux/platform_device.h>  #include <linux/interrupt.h> +#include <linux/gpio.h>  #include <mach/hardware.h>  MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); @@ -35,15 +36,12 @@ static void ixp4xx_spkr_control(unsigned int pin, unsigned int count)  	spin_lock_irqsave(&beep_lock, flags); -	 if (count) { -		gpio_line_config(pin, IXP4XX_GPIO_OUT); -		gpio_line_set(pin, IXP4XX_GPIO_LOW); - +	if (count) { +		gpio_direction_output(pin, 0);  		*IXP4XX_OSRT2 = (count & ~IXP4XX_OST_RELOAD_MASK) | IXP4XX_OST_ENABLE;  	} else { -		gpio_line_config(pin, IXP4XX_GPIO_IN); -		gpio_line_set(pin, IXP4XX_GPIO_HIGH); - +		gpio_direction_output(pin, 1); +		gpio_direction_input(pin);  		*IXP4XX_OSRT2 = 0;  	} @@ -69,7 +67,7 @@ static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned  	}  	if (value > 20 && value < 32767) -		count = (IXP4XX_TIMER_FREQ / (value * 4)) - 1; +		count = (ixp4xx_timer_freq / (value * 4)) - 1;  	ixp4xx_spkr_control(pin, count); @@ -78,11 +76,13 @@ static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned  static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id)  { +	unsigned int pin = (unsigned int) dev_id; +  	/* clear interrupt */  	*IXP4XX_OSST = IXP4XX_OSST_TIMER_2_PEND;  	/* flip the beeper output */ -	*IXP4XX_GPIO_GPOUTR ^= (1 << (unsigned int) dev_id); +	gpio_set_value(pin, !gpio_get_value(pin));  	return IRQ_HANDLED;  } @@ -110,11 +110,15 @@ static int ixp4xx_spkr_probe(struct platform_device *dev)  	input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);  	input_dev->event = ixp4xx_spkr_event; +	err = gpio_request(dev->id, "ixp4-beeper"); +	if (err) +		goto err_free_device; +  	err = request_irq(IRQ_IXP4XX_TIMER2, &ixp4xx_spkr_interrupt,  			  IRQF_NO_SUSPEND, "ixp4xx-beeper",  			  (void *) dev->id);  	if (err) -		goto err_free_device; +		goto err_free_gpio;  	err = input_register_device(input_dev);  	if (err) @@ -126,6 +130,8 @@ static int ixp4xx_spkr_probe(struct platform_device *dev)   err_free_irq:  	free_irq(IRQ_IXP4XX_TIMER2, (void *)dev->id); + err_free_gpio: +	gpio_free(dev->id);   err_free_device:  	input_free_device(input_dev); @@ -144,6 +150,7 @@ static int ixp4xx_spkr_remove(struct platform_device *dev)  	ixp4xx_spkr_control(pin, 0);  	free_irq(IRQ_IXP4XX_TIMER2, (void *)dev->id); +	gpio_free(dev->id);  	return 0;  }  | 
