Re: [PATCH] pinctrl: cherryview: Use raw_spinlock for locking
On Mon, Aug 17, 2015 at 3:13 PM, Mika Westerberg wrote: > When running -rt kernel and an interrupt happens on a GPIO line controlled by > Intel Cherryview/Braswell pinctrl driver we get: > > BUG: sleeping function called from invalid context at > kernel/locking/rtmutex.c:917 > in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/0 > Preemption disabled at:[] cpu_startup_entry+0x17f/0x480 > > CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.1.5-rt5 #16 > ... > Call Trace: > [] dump_stack+0x4a/0x61 > [] ___might_sleep+0xe7/0x170 > [] rt_spin_lock+0x1f/0x50 > [] chv_gpio_irq_ack+0x3d/0xa0 > [] handle_edge_irq+0x75/0x180 > [] generic_handle_irq+0x27/0x40 > [] chv_gpio_irq_handler+0x7e/0x110 > [] handle_irq+0xaa/0x190 > ... > > This is because desc->lock is raw_spinlock and is held when chv_gpio_irq_ack() > is called by the genirq core. chv_gpio_irq_ack() in turn takes pctrl->lock > which in -rt is an rt-mutex causing might_sleep() rightfully to complain about > sleeping function called from invalid context. > > In order to keep -rt happy but at the same time make sure that register > accesses get serialized, convert the driver to use raw_spinlock instead. > > Suggested-by: Linus Walleij > Signed-off-by: Mika Westerberg Patch applied. Again splendid job here. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] pinctrl: cherryview: Use raw_spinlock for locking
On Mon, Aug 17, 2015 at 3:13 PM, Mika Westerberg mika.westerb...@linux.intel.com wrote: When running -rt kernel and an interrupt happens on a GPIO line controlled by Intel Cherryview/Braswell pinctrl driver we get: BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917 in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/0 Preemption disabled at:[81092e9f] cpu_startup_entry+0x17f/0x480 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.1.5-rt5 #16 ... Call Trace: IRQ [816283c6] dump_stack+0x4a/0x61 [81077e17] ___might_sleep+0xe7/0x170 [8162d6cf] rt_spin_lock+0x1f/0x50 [812e52ed] chv_gpio_irq_ack+0x3d/0xa0 [810a72f5] handle_edge_irq+0x75/0x180 [810a3457] generic_handle_irq+0x27/0x40 [812e57de] chv_gpio_irq_handler+0x7e/0x110 [810050aa] handle_irq+0xaa/0x190 ... This is because desc-lock is raw_spinlock and is held when chv_gpio_irq_ack() is called by the genirq core. chv_gpio_irq_ack() in turn takes pctrl-lock which in -rt is an rt-mutex causing might_sleep() rightfully to complain about sleeping function called from invalid context. In order to keep -rt happy but at the same time make sure that register accesses get serialized, convert the driver to use raw_spinlock instead. Suggested-by: Linus Walleij linus.wall...@linaro.org Signed-off-by: Mika Westerberg mika.westerb...@linux.intel.com Patch applied. Again splendid job here. Yours, Linus Walleij -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] pinctrl: cherryview: Use raw_spinlock for locking
When running -rt kernel and an interrupt happens on a GPIO line controlled by Intel Cherryview/Braswell pinctrl driver we get: BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917 in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/0 Preemption disabled at:[] cpu_startup_entry+0x17f/0x480 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.1.5-rt5 #16 ... Call Trace: [] dump_stack+0x4a/0x61 [] ___might_sleep+0xe7/0x170 [] rt_spin_lock+0x1f/0x50 [] chv_gpio_irq_ack+0x3d/0xa0 [] handle_edge_irq+0x75/0x180 [] generic_handle_irq+0x27/0x40 [] chv_gpio_irq_handler+0x7e/0x110 [] handle_irq+0xaa/0x190 ... This is because desc->lock is raw_spinlock and is held when chv_gpio_irq_ack() is called by the genirq core. chv_gpio_irq_ack() in turn takes pctrl->lock which in -rt is an rt-mutex causing might_sleep() rightfully to complain about sleeping function called from invalid context. In order to keep -rt happy but at the same time make sure that register accesses get serialized, convert the driver to use raw_spinlock instead. Suggested-by: Linus Walleij Signed-off-by: Mika Westerberg --- drivers/pinctrl/intel/pinctrl-cherryview.c | 70 +++--- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c index eaaede70d4de..70b7b41e40a9 100644 --- a/drivers/pinctrl/intel/pinctrl-cherryview.c +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c @@ -174,7 +174,7 @@ struct chv_pinctrl { struct pinctrl_dev *pctldev; struct gpio_chip chip; void __iomem *regs; - spinlock_t lock; + raw_spinlock_t lock; unsigned intr_lines[16]; const struct chv_community *community; u32 saved_intmask; @@ -720,13 +720,13 @@ static void chv_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, u32 ctrl0, ctrl1; bool locked; - spin_lock_irqsave(>lock, flags); + raw_spin_lock_irqsave(>lock, flags); ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); ctrl1 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL1)); locked = chv_pad_locked(pctrl, offset); - spin_unlock_irqrestore(>lock, flags); + raw_spin_unlock_irqrestore(>lock, flags); if (ctrl0 & CHV_PADCTRL0_GPIOEN) { seq_puts(s, "GPIO "); @@ -789,14 +789,14 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, grp = >community->groups[group]; - spin_lock_irqsave(>lock, flags); + raw_spin_lock_irqsave(>lock, flags); /* Check first that the pad is not locked */ for (i = 0; i < grp->npins; i++) { if (chv_pad_locked(pctrl, grp->pins[i])) { dev_warn(pctrl->dev, "unable to set mode for locked pin %u\n", grp->pins[i]); - spin_unlock_irqrestore(>lock, flags); + raw_spin_unlock_irqrestore(>lock, flags); return -EBUSY; } } @@ -839,7 +839,7 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, pin, altfunc->mode, altfunc->invert_oe ? "" : "not "); } - spin_unlock_irqrestore(>lock, flags); + raw_spin_unlock_irqrestore(>lock, flags); return 0; } @@ -853,13 +853,13 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, void __iomem *reg; u32 value; - spin_lock_irqsave(>lock, flags); + raw_spin_lock_irqsave(>lock, flags); if (chv_pad_locked(pctrl, offset)) { value = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); if (!(value & CHV_PADCTRL0_GPIOEN)) { /* Locked so cannot enable */ - spin_unlock_irqrestore(>lock, flags); + raw_spin_unlock_irqrestore(>lock, flags); return -EBUSY; } } else { @@ -899,7 +899,7 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, chv_writel(value, reg); } - spin_unlock_irqrestore(>lock, flags); + raw_spin_unlock_irqrestore(>lock, flags); return 0; } @@ -913,13 +913,13 @@ static void chv_gpio_disable_free(struct pinctrl_dev *pctldev, void __iomem *reg; u32 value; - spin_lock_irqsave(>lock, flags); + raw_spin_lock_irqsave(>lock, flags); reg = chv_padreg(pctrl, offset, CHV_PADCTRL0); value = readl(reg) & ~CHV_PADCTRL0_GPIOEN; chv_writel(value, reg); - spin_unlock_irqrestore(>lock, flags); + raw_spin_unlock_irqrestore(>lock, flags); } static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, @@ -931,7 +931,7 @@ static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, unsigned long flags;
[PATCH] pinctrl: cherryview: Use raw_spinlock for locking
When running -rt kernel and an interrupt happens on a GPIO line controlled by Intel Cherryview/Braswell pinctrl driver we get: BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917 in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/0 Preemption disabled at:[81092e9f] cpu_startup_entry+0x17f/0x480 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.1.5-rt5 #16 ... Call Trace: IRQ [816283c6] dump_stack+0x4a/0x61 [81077e17] ___might_sleep+0xe7/0x170 [8162d6cf] rt_spin_lock+0x1f/0x50 [812e52ed] chv_gpio_irq_ack+0x3d/0xa0 [810a72f5] handle_edge_irq+0x75/0x180 [810a3457] generic_handle_irq+0x27/0x40 [812e57de] chv_gpio_irq_handler+0x7e/0x110 [810050aa] handle_irq+0xaa/0x190 ... This is because desc-lock is raw_spinlock and is held when chv_gpio_irq_ack() is called by the genirq core. chv_gpio_irq_ack() in turn takes pctrl-lock which in -rt is an rt-mutex causing might_sleep() rightfully to complain about sleeping function called from invalid context. In order to keep -rt happy but at the same time make sure that register accesses get serialized, convert the driver to use raw_spinlock instead. Suggested-by: Linus Walleij linus.wall...@linaro.org Signed-off-by: Mika Westerberg mika.westerb...@linux.intel.com --- drivers/pinctrl/intel/pinctrl-cherryview.c | 70 +++--- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c index eaaede70d4de..70b7b41e40a9 100644 --- a/drivers/pinctrl/intel/pinctrl-cherryview.c +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c @@ -174,7 +174,7 @@ struct chv_pinctrl { struct pinctrl_dev *pctldev; struct gpio_chip chip; void __iomem *regs; - spinlock_t lock; + raw_spinlock_t lock; unsigned intr_lines[16]; const struct chv_community *community; u32 saved_intmask; @@ -720,13 +720,13 @@ static void chv_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, u32 ctrl0, ctrl1; bool locked; - spin_lock_irqsave(pctrl-lock, flags); + raw_spin_lock_irqsave(pctrl-lock, flags); ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); ctrl1 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL1)); locked = chv_pad_locked(pctrl, offset); - spin_unlock_irqrestore(pctrl-lock, flags); + raw_spin_unlock_irqrestore(pctrl-lock, flags); if (ctrl0 CHV_PADCTRL0_GPIOEN) { seq_puts(s, GPIO ); @@ -789,14 +789,14 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, grp = pctrl-community-groups[group]; - spin_lock_irqsave(pctrl-lock, flags); + raw_spin_lock_irqsave(pctrl-lock, flags); /* Check first that the pad is not locked */ for (i = 0; i grp-npins; i++) { if (chv_pad_locked(pctrl, grp-pins[i])) { dev_warn(pctrl-dev, unable to set mode for locked pin %u\n, grp-pins[i]); - spin_unlock_irqrestore(pctrl-lock, flags); + raw_spin_unlock_irqrestore(pctrl-lock, flags); return -EBUSY; } } @@ -839,7 +839,7 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, pin, altfunc-mode, altfunc-invert_oe ? : not ); } - spin_unlock_irqrestore(pctrl-lock, flags); + raw_spin_unlock_irqrestore(pctrl-lock, flags); return 0; } @@ -853,13 +853,13 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, void __iomem *reg; u32 value; - spin_lock_irqsave(pctrl-lock, flags); + raw_spin_lock_irqsave(pctrl-lock, flags); if (chv_pad_locked(pctrl, offset)) { value = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); if (!(value CHV_PADCTRL0_GPIOEN)) { /* Locked so cannot enable */ - spin_unlock_irqrestore(pctrl-lock, flags); + raw_spin_unlock_irqrestore(pctrl-lock, flags); return -EBUSY; } } else { @@ -899,7 +899,7 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, chv_writel(value, reg); } - spin_unlock_irqrestore(pctrl-lock, flags); + raw_spin_unlock_irqrestore(pctrl-lock, flags); return 0; } @@ -913,13 +913,13 @@ static void chv_gpio_disable_free(struct pinctrl_dev *pctldev, void __iomem *reg; u32 value; - spin_lock_irqsave(pctrl-lock, flags); + raw_spin_lock_irqsave(pctrl-lock, flags); reg = chv_padreg(pctrl, offset, CHV_PADCTRL0); value = readl(reg) ~CHV_PADCTRL0_GPIOEN; chv_writel(value, reg); -