pinctrl: single: Clear pin interrupts enabled by bootloader
Since we set up device wake-up interrupts as pinctrl-single interrupts, we now must use the standard request_irq and related functions to manage them. If the pin interrupts are enabled for some pins at boot, the wake-up events can show up as constantly pending at least on omaps and will hang the system unless the related device driver clears the event at the device. To fix this, let's clear the interrupt flags during init, and print out a warning so the board maintainers can update their drivers to do proper request_irq for the driver specific wake-up events. Cc: Haojian Zhuang <haojian.zhuang@linaro.org> Cc: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
a73d2e30b4
commit
58968625c4
@ -810,6 +810,7 @@ static const struct pinconf_ops pcs_pinconf_ops = {
|
||||
static int pcs_add_pin(struct pcs_device *pcs, unsigned offset,
|
||||
unsigned pin_pos)
|
||||
{
|
||||
struct pcs_soc_data *pcs_soc = &pcs->socdata;
|
||||
struct pinctrl_pin_desc *pin;
|
||||
struct pcs_name *pn;
|
||||
int i;
|
||||
@ -821,6 +822,18 @@ static int pcs_add_pin(struct pcs_device *pcs, unsigned offset,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (pcs_soc->irq_enable_mask) {
|
||||
unsigned val;
|
||||
|
||||
val = pcs->read(pcs->base + offset);
|
||||
if (val & pcs_soc->irq_enable_mask) {
|
||||
dev_dbg(pcs->dev, "irq enabled at boot for pin at %lx (%x), clearing\n",
|
||||
(unsigned long)pcs->res->start + offset, val);
|
||||
val &= ~pcs_soc->irq_enable_mask;
|
||||
pcs->write(val, pcs->base + offset);
|
||||
}
|
||||
}
|
||||
|
||||
pin = &pcs->pins.pa[i];
|
||||
pn = &pcs->names[i];
|
||||
sprintf(pn->name, "%lx.%d",
|
||||
|
Loading…
Reference in New Issue
Block a user