Re: [PATCH] pinctrl: cherryview: Use raw_spinlock for locking

2015-08-26 Thread Linus Walleij
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

2015-08-26 Thread Linus Walleij
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

2015-08-17 Thread Mika Westerberg
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

2015-08-17 Thread Mika Westerberg
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);
 
-