OSDN Git Service

pinctrl: cherryview: Read triggering type from HW if not set when requested
authorMika Westerberg <mika.westerberg@linux.intel.com>
Tue, 12 May 2015 10:35:37 +0000 (13:35 +0300)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Wed, 13 Jan 2016 09:44:06 +0000 (17:44 +0800)
commit5dcf34ceb3ff95f4cc4fd63ad8e06945b7b8547d
tree475bb4a2cbf32e538df3b96055208d2fa489cea5
parent7c57c9a51f741d50ed8e6a2d6a2cd03d92d53595
pinctrl: cherryview: Read triggering type from HW if not set when requested

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: Jagadish Krishnamoorthy <jagadish.krishnamoorthy@intel.com>
Reported-by: Freddy Paul <freddy.paul@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/intel/pinctrl-cherryview.c