Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57ffe9d5 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Dmitry Torokhov
Browse files

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: default avatarUwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 34a7c48c
Loading
Loading
Loading
Loading
+12 −23
Original line number Diff line number Diff line
@@ -56,30 +56,19 @@ static void gpio_check_button(unsigned long _data)

static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
{
	struct platform_device *pdev = dev_id;
	struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
	struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
	int i;

	for (i = 0; i < pdata->nbuttons; i++) {
		struct gpio_keys_button *button = &pdata->buttons[i];
	struct gpio_button_data *bdata = dev_id;
	struct gpio_keys_button *button = bdata->button;

		if (irq == gpio_to_irq(button->gpio)) {
			struct gpio_button_data *bdata = &ddata->data[i];
	BUG_ON(irq != gpio_to_irq(button->gpio));

	if (button->debounce_interval)
		mod_timer(&bdata->timer,
					  jiffies +
					  msecs_to_jiffies(button->debounce_interval));
			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)
{
@@ -151,7 +140,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
				    IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
					IRQF_TRIGGER_FALLING,
				    button->desc ? button->desc : "gpio_keys",
				    pdev);
				    bdata);
		if (error) {
			pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
				irq, error);
@@ -178,7 +167,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)

 fail2:
	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)
			del_timer_sync(&ddata->data[i].timer);
		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++) {
		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)
			del_timer_sync(&ddata->data[i].timer);
		gpio_free(pdata->buttons[i].gpio);