triggering an gpio-irq on both edges

Uwe Kleine-König u.kleine-koenig at
Thu Sep 13 04:19:20 EDT 2012


My motivation for this mail is that currently mxs_gpio_set_irq_type
doesn't support type=IRQ_TYPE_EDGE_RISING|IRQ_TYPE_EDGE_FALLING because
the hardware doesn't support it.

The gpio-keys driver on the other hand wants a trigger in both

The mxc-gpio driver implements the missing hardware functionallity in
software (gpio_set_irq_type):

		if (both edges requested)
			if (current value of gpio == 0)
				trigger on rising edge
				trigger on falling edge

		if (both edges requested)
			trigger on other edge

This is racy though: If there is an edge after reading out the gpio
value and completion of the edge direction programming, you miss
interrupts. Also just switching the direction in the irq handler is
also wrong for the same reason.

I guess there are more machines than mxc and mxs that have the same

In my opinion this calls for a wrapper, something like:

	int gpio_irq_emulate_both_edges_set_irq_type(struct irq_data *d,
		unsigned int type, int (*set_irq_type)(...),
		int (*get_value)(...), struct something *privdata)

	int gpio_irq_emulate_both_edges_handler(...)


Does this sound good and possible? I didn't find something like that
already implemented, but maybe I missed it?

Any thoughts (and be it only "The xyz driver is affected, too.") are

Best regards

Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 |  |

More information about the linux-arm-kernel mailing list