Input: gpio-keys - optimize interrupt handler
By passing a gpio_button_data structure to the handler instead of the whole platform_device the search for the right button can go away. Signed-off-by: Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
34a7c48c22
commit
57ffe9d539
1 changed files with 12 additions and 23 deletions
|
@ -56,29 +56,18 @@ static void gpio_check_button(unsigned long _data)
|
||||||
|
|
||||||
static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
|
static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = dev_id;
|
struct gpio_button_data *bdata = dev_id;
|
||||||
struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
|
struct gpio_keys_button *button = bdata->button;
|
||||||
struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < pdata->nbuttons; i++) {
|
BUG_ON(irq != gpio_to_irq(button->gpio));
|
||||||
struct gpio_keys_button *button = &pdata->buttons[i];
|
|
||||||
|
|
||||||
if (irq == gpio_to_irq(button->gpio)) {
|
if (button->debounce_interval)
|
||||||
struct gpio_button_data *bdata = &ddata->data[i];
|
mod_timer(&bdata->timer,
|
||||||
|
jiffies + msecs_to_jiffies(button->debounce_interval));
|
||||||
|
else
|
||||||
|
gpio_keys_report_event(button, bdata->input);
|
||||||
|
|
||||||
if (button->debounce_interval)
|
return IRQ_HANDLED;
|
||||||
mod_timer(&bdata->timer,
|
|
||||||
jiffies +
|
|
||||||
msecs_to_jiffies(button->debounce_interval));
|
|
||||||
else
|
|
||||||
gpio_keys_report_event(button, bdata->input);
|
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return IRQ_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devinit gpio_keys_probe(struct platform_device *pdev)
|
static int __devinit gpio_keys_probe(struct platform_device *pdev)
|
||||||
|
@ -151,7 +140,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
|
||||||
IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
|
IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
|
||||||
IRQF_TRIGGER_FALLING,
|
IRQF_TRIGGER_FALLING,
|
||||||
button->desc ? button->desc : "gpio_keys",
|
button->desc ? button->desc : "gpio_keys",
|
||||||
pdev);
|
bdata);
|
||||||
if (error) {
|
if (error) {
|
||||||
pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
|
pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
|
||||||
irq, error);
|
irq, error);
|
||||||
|
@ -178,7 +167,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
fail2:
|
fail2:
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
|
free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]);
|
||||||
if (pdata->buttons[i].debounce_interval)
|
if (pdata->buttons[i].debounce_interval)
|
||||||
del_timer_sync(&ddata->data[i].timer);
|
del_timer_sync(&ddata->data[i].timer);
|
||||||
gpio_free(pdata->buttons[i].gpio);
|
gpio_free(pdata->buttons[i].gpio);
|
||||||
|
@ -203,7 +192,7 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
for (i = 0; i < pdata->nbuttons; i++) {
|
for (i = 0; i < pdata->nbuttons; i++) {
|
||||||
int irq = gpio_to_irq(pdata->buttons[i].gpio);
|
int irq = gpio_to_irq(pdata->buttons[i].gpio);
|
||||||
free_irq(irq, pdev);
|
free_irq(irq, &ddata->data[i]);
|
||||||
if (pdata->buttons[i].debounce_interval)
|
if (pdata->buttons[i].debounce_interval)
|
||||||
del_timer_sync(&ddata->data[i].timer);
|
del_timer_sync(&ddata->data[i].timer);
|
||||||
gpio_free(pdata->buttons[i].gpio);
|
gpio_free(pdata->buttons[i].gpio);
|
||||||
|
|
Loading…
Add table
Reference in a new issue