When reading from the related device using its driver I may get interrupts triggered by the following conditions:
* IRQ_TYPE_NONE - default, unspecified type
* IRQ_TYPE_EDGE_RISING - rising edge triggered
* IRQ_TYPE_EDGE_FALLING - falling edge triggered
* IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered
* IRQ_TYPE_LEVEL_HIGH - high level triggered
* IRQ_TYPE_LEVEL_LOW - low level triggered
* IRQ_TYPE_LEVEL_MASK - Mask to filter out the level bits
* IRQ_TYPE_SENSE_MASK - Mask for all the above bits
* IRQ_TYPE_PROBE - Special flag for probing in progress
But I need to wait for specific level, e.g. sometimes I need the read()
to block until line gets low, and sometimes until it gets high. Per documentation it seems these flags can not be changed on the fly, and opening gpio pin for level read is not possible because it is busy with interrupt. Maybe it is possible to request/release interrupt each poll request, but that must be ugly.
In general algorithm if I need low level looks like (set up as level triggered):
- check for pin low, if low – terminate, no interrupt wait needed
- enable interrupt, check for low level again to ensure it did not change during interrupt enable. if it is low – disable interrupt and exit
- wait for interrupt
- disable interrupt and exit
How would you implement it?