• Michael Wu's avatar
    gpiolib: fix incorrect IRQ requesting of an active-low lineevent · 223ecaf1
    Michael Wu authored
    When a pin is active-low, logical trigger edge should be inverted to match
    the same interrupt opportunity.
    
    For example, a button pushed triggers falling edge in ACTIVE_HIGH case; in
    ACTIVE_LOW case, the button pushed triggers rising edge. For user space the
    IRQ requesting doesn't need to do any modification except to configuring
    GPIOHANDLE_REQUEST_ACTIVE_LOW.
    
    For example, we want to catch the event when the button is pushed. The
    button on the original board drives level to be low when it is pushed, and
    drives level to be high when it is released.
    
    In user space we can do:
    
    	req.handleflags = GPIOHANDLE_REQUEST_INPUT;
    	req.eventflags = GPIOEVENT_REQUEST_FALLING_EDGE;
    
    	while (1) {
    		read(fd, &dat, sizeof(dat));
    		if (dat.id == GPIOEVENT_EVENT_FALLING_EDGE)
    			printf("button pushed\n");
    	}
    
    Run the same logic on another board which the polarity of the button is
    inverted; it drives level to be high when pushed, and level to be low when
    released. For this inversion we add flag GPIOHANDLE_REQUEST_ACTIVE_LOW:
    
    	req.handleflags = GPIOHANDLE_REQUEST_INPUT |
    		GPIOHANDLE_REQUEST_ACTIVE_LOW;
    	req.eventflags = GPIOEVENT_REQUEST_FALLING_EDGE;
    
    At the result, there are no any events caught when the button is pushed.
    By the way, button releasing will emit a "falling" event. The timing of
    "falling" catching is not expected.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarMichael Wu <michael.wu@vatics.com>
    Tested-by: default avatarBartosz Golaszewski <bgolaszewski@baylibre.com>
    Signed-off-by: default avatarBartosz Golaszewski <bgolaszewski@baylibre.com>
    223ecaf1
gpiolib.c 129 KB