• Mika Westerberg's avatar
    pinctrl: cherryview: Read triggering type from HW if not set when requested · e6c906de
    Mika Westerberg authored
    If a driver does not set interrupt triggering type when it calls
    request_irq(), it means use the pin as the hardware/firmware has
    configured it. There are some drivers doing this. One example is
    drivers/input/serio/i8042.c that requests the interrupt like:
    
    	error = request_irq(I8042_KBD_IRQ, i8042_interrupt, IRQF_SHARED,
    			    "i8042", i8042_platform_device);
    
    It assumes the interrupt is already properly configured. This is true in
    case of interrupts connected to the IO-APIC. However, some Intel
    Braswell/Cherryview based machines use a GPIO here instead for the internal
    keyboard controller.
    
    This is a problem because even if the pin/interrupt is properly configured,
    the irqchip ->irq_set_type() will never be called as the triggering flags
    are 0. Because of that we do not have correct interrupt flow handler set
    for the interrupt.
    
    Fix this by adding a custom ->irq_startup() that checks if the interrupt
    has no triggering type set and in that case read the type directly from the
    hardware and install correct flow handler along with the mapping.
    Reported-by: default avatarJagadish Krishnamoorthy <jagadish.krishnamoorthy@intel.com>
    Reported-by: default avatarFreddy Paul <freddy.paul@intel.com>
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    e6c906de
pinctrl-cherryview.c 46.2 KB