[PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock

Xuewen Yan posted 1 patch 1 week, 5 days ago
drivers/gpio/gpio-sprd.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
[PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Posted by Xuewen Yan 1 week, 5 days ago
There was a lockdep warning in sprd_gpio:

[    6.258269][T329@C6] [ BUG: Invalid wait context ]
[    6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G        W  OE
[    6.258272][T329@C6] -----------------------------
[    6.258273][T329@C6] modprobe/329 is trying to lock:
[    6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
[    6.258282][T329@C6] other info that might help us debug this:
[    6.258283][T329@C6] context-{5:5}
[    6.258285][T329@C6] 3 locks held by modprobe/329:
[    6.258286][T329@C6]  #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
[    6.258295][T329@C6]  #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
[    6.258304][T329@C6]  #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
[    6.258313][T329@C6] stack backtrace:
[    6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G        W  OE       6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT  3ad5b0f45741a16e5838da790706e16ceb6717df
[    6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
[    6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
[    6.258318][T329@C6] Call trace:
[    6.258318][T329@C6]  show_stack+0x20/0x30 (C)
[    6.258321][T329@C6]  __dump_stack+0x28/0x3c
[    6.258324][T329@C6]  dump_stack_lvl+0xac/0xf0
[    6.258326][T329@C6]  dump_stack+0x18/0x3c
[    6.258329][T329@C6]  __lock_acquire+0x824/0x2c28
[    6.258331][T329@C6]  lock_acquire+0x148/0x2cc
[    6.258333][T329@C6]  _raw_spin_lock_irqsave+0x6c/0xb4
[    6.258334][T329@C6]  sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
[    6.258337][T329@C6]  irq_startup+0x238/0x350
[    6.258340][T329@C6]  __setup_irq+0x504/0x82c
[    6.258342][T329@C6]  request_threaded_irq+0x118/0x184
[    6.258344][T329@C6]  devm_request_threaded_irq+0x94/0x120
[    6.258347][T329@C6]  sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
[    6.258352][T329@C6]  sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
[    6.258358][T329@C6]  i2c_device_probe+0x2c8/0x350
[    6.258361][T329@C6]  really_probe+0x1a8/0x46c
[    6.258363][T329@C6]  __driver_probe_device+0xa4/0x10c
[    6.258366][T329@C6]  driver_probe_device+0x44/0x1b4
[    6.258369][T329@C6]  __driver_attach+0xd0/0x204
[    6.258371][T329@C6]  bus_for_each_dev+0x10c/0x168
[    6.258373][T329@C6]  driver_attach+0x2c/0x3c
[    6.258376][T329@C6]  bus_add_driver+0x154/0x29c
[    6.258378][T329@C6]  driver_register+0x70/0x10c
[    6.258381][T329@C6]  i2c_register_driver+0x48/0xc8
[    6.258384][T329@C6]  init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
[    6.258389][T329@C6]  do_one_initcall+0x128/0x42c
[    6.258392][T329@C6]  do_init_module+0x60/0x254
[    6.258395][T329@C6]  load_module+0x1054/0x1220
[    6.258397][T329@C6]  __arm64_sys_finit_module+0x240/0x35c
[    6.258400][T329@C6]  invoke_syscall+0x60/0xec
[    6.258402][T329@C6]  el0_svc_common+0xb0/0xe4
[    6.258405][T329@C6]  do_el0_svc+0x24/0x30
[    6.258407][T329@C6]  el0_svc+0x54/0x1c4
[    6.258409][T329@C6]  el0t_64_sync_handler+0x68/0xdc
[    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8

This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
however the sprd_gpio->lock would use in hard-irq, this is unsafe.

So change the spin_lock to raw_spin_lock to use the spinlock
in hard-irq.

Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
---
 drivers/gpio/gpio-sprd.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpio/gpio-sprd.c b/drivers/gpio/gpio-sprd.c
index 413bcd0a4240..2cc8abe705cd 100644
--- a/drivers/gpio/gpio-sprd.c
+++ b/drivers/gpio/gpio-sprd.c
@@ -35,7 +35,7 @@
 struct sprd_gpio {
 	struct gpio_chip chip;
 	void __iomem *base;
-	spinlock_t lock;
+	raw_spinlock_t lock;
 	int irq;
 };
 
@@ -54,7 +54,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
 	unsigned long flags;
 	u32 tmp;
 
-	spin_lock_irqsave(&sprd_gpio->lock, flags);
+	raw_spin_lock_irqsave(&sprd_gpio->lock, flags);
 	tmp = readl_relaxed(base + reg);
 
 	if (val)
@@ -63,7 +63,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
 		tmp &= ~BIT(SPRD_GPIO_BIT(offset));
 
 	writel_relaxed(tmp, base + reg);
-	spin_unlock_irqrestore(&sprd_gpio->lock, flags);
+	raw_spin_unlock_irqrestore(&sprd_gpio->lock, flags);
 }
 
 static int sprd_gpio_read(struct gpio_chip *chip, unsigned int offset, u16 reg)
@@ -236,7 +236,7 @@ static int sprd_gpio_probe(struct platform_device *pdev)
 	if (IS_ERR(sprd_gpio->base))
 		return PTR_ERR(sprd_gpio->base);
 
-	spin_lock_init(&sprd_gpio->lock);
+	raw_spin_lock_init(&sprd_gpio->lock);
 
 	sprd_gpio->chip.label = dev_name(&pdev->dev);
 	sprd_gpio->chip.ngpio = SPRD_GPIO_NR;
-- 
2.25.1
Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Posted by Bartosz Golaszewski 1 week, 4 days ago
On Mon, 26 Jan 2026 17:42:09 +0800, Xuewen Yan wrote:
> There was a lockdep warning in sprd_gpio:
> 
> [    6.258269][T329@C6] [ BUG: Invalid wait context ]
> [    6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G        W  OE
> [    6.258272][T329@C6] -----------------------------
> [    6.258273][T329@C6] modprobe/329 is trying to lock:
> [    6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> [    6.258282][T329@C6] other info that might help us debug this:
> [    6.258283][T329@C6] context-{5:5}
> [    6.258285][T329@C6] 3 locks held by modprobe/329:
> [    6.258286][T329@C6]  #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> [    6.258295][T329@C6]  #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> [    6.258304][T329@C6]  #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> [    6.258313][T329@C6] stack backtrace:
> [    6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G        W  OE       6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT  3ad5b0f45741a16e5838da790706e16ceb6717df
> [    6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [    6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> [    6.258318][T329@C6] Call trace:
> [    6.258318][T329@C6]  show_stack+0x20/0x30 (C)
> [    6.258321][T329@C6]  __dump_stack+0x28/0x3c
> [    6.258324][T329@C6]  dump_stack_lvl+0xac/0xf0
> [    6.258326][T329@C6]  dump_stack+0x18/0x3c
> [    6.258329][T329@C6]  __lock_acquire+0x824/0x2c28
> [    6.258331][T329@C6]  lock_acquire+0x148/0x2cc
> [    6.258333][T329@C6]  _raw_spin_lock_irqsave+0x6c/0xb4
> [    6.258334][T329@C6]  sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> [    6.258337][T329@C6]  irq_startup+0x238/0x350
> [    6.258340][T329@C6]  __setup_irq+0x504/0x82c
> [    6.258342][T329@C6]  request_threaded_irq+0x118/0x184
> [    6.258344][T329@C6]  devm_request_threaded_irq+0x94/0x120
> [    6.258347][T329@C6]  sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258352][T329@C6]  sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258358][T329@C6]  i2c_device_probe+0x2c8/0x350
> [    6.258361][T329@C6]  really_probe+0x1a8/0x46c
> [    6.258363][T329@C6]  __driver_probe_device+0xa4/0x10c
> [    6.258366][T329@C6]  driver_probe_device+0x44/0x1b4
> [    6.258369][T329@C6]  __driver_attach+0xd0/0x204
> [    6.258371][T329@C6]  bus_for_each_dev+0x10c/0x168
> [    6.258373][T329@C6]  driver_attach+0x2c/0x3c
> [    6.258376][T329@C6]  bus_add_driver+0x154/0x29c
> [    6.258378][T329@C6]  driver_register+0x70/0x10c
> [    6.258381][T329@C6]  i2c_register_driver+0x48/0xc8
> [    6.258384][T329@C6]  init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258389][T329@C6]  do_one_initcall+0x128/0x42c
> [    6.258392][T329@C6]  do_init_module+0x60/0x254
> [    6.258395][T329@C6]  load_module+0x1054/0x1220
> [    6.258397][T329@C6]  __arm64_sys_finit_module+0x240/0x35c
> [    6.258400][T329@C6]  invoke_syscall+0x60/0xec
> [    6.258402][T329@C6]  el0_svc_common+0xb0/0xe4
> [    6.258405][T329@C6]  do_el0_svc+0x24/0x30
> [    6.258407][T329@C6]  el0_svc+0x54/0x1c4
> [    6.258409][T329@C6]  el0t_64_sync_handler+0x68/0xdc
> [    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8
> 
> [...]

Applied, thanks!

[1/1] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
      commit: 62c7b1d6aa8b287c7554dd9abd3503fe4883e50e

Best regards,
-- 
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Posted by Baolin Wang 1 week, 5 days ago

On 1/26/26 5:42 PM, Xuewen Yan wrote:
> There was a lockdep warning in sprd_gpio:
> 
> [    6.258269][T329@C6] [ BUG: Invalid wait context ]
> [    6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G        W  OE
> [    6.258272][T329@C6] -----------------------------
> [    6.258273][T329@C6] modprobe/329 is trying to lock:
> [    6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> [    6.258282][T329@C6] other info that might help us debug this:
> [    6.258283][T329@C6] context-{5:5}
> [    6.258285][T329@C6] 3 locks held by modprobe/329:
> [    6.258286][T329@C6]  #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> [    6.258295][T329@C6]  #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> [    6.258304][T329@C6]  #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> [    6.258313][T329@C6] stack backtrace:
> [    6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G        W  OE       6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT  3ad5b0f45741a16e5838da790706e16ceb6717df
> [    6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [    6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> [    6.258318][T329@C6] Call trace:
> [    6.258318][T329@C6]  show_stack+0x20/0x30 (C)
> [    6.258321][T329@C6]  __dump_stack+0x28/0x3c
> [    6.258324][T329@C6]  dump_stack_lvl+0xac/0xf0
> [    6.258326][T329@C6]  dump_stack+0x18/0x3c
> [    6.258329][T329@C6]  __lock_acquire+0x824/0x2c28
> [    6.258331][T329@C6]  lock_acquire+0x148/0x2cc
> [    6.258333][T329@C6]  _raw_spin_lock_irqsave+0x6c/0xb4
> [    6.258334][T329@C6]  sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> [    6.258337][T329@C6]  irq_startup+0x238/0x350
> [    6.258340][T329@C6]  __setup_irq+0x504/0x82c
> [    6.258342][T329@C6]  request_threaded_irq+0x118/0x184
> [    6.258344][T329@C6]  devm_request_threaded_irq+0x94/0x120
> [    6.258347][T329@C6]  sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258352][T329@C6]  sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258358][T329@C6]  i2c_device_probe+0x2c8/0x350
> [    6.258361][T329@C6]  really_probe+0x1a8/0x46c
> [    6.258363][T329@C6]  __driver_probe_device+0xa4/0x10c
> [    6.258366][T329@C6]  driver_probe_device+0x44/0x1b4
> [    6.258369][T329@C6]  __driver_attach+0xd0/0x204
> [    6.258371][T329@C6]  bus_for_each_dev+0x10c/0x168
> [    6.258373][T329@C6]  driver_attach+0x2c/0x3c
> [    6.258376][T329@C6]  bus_add_driver+0x154/0x29c
> [    6.258378][T329@C6]  driver_register+0x70/0x10c
> [    6.258381][T329@C6]  i2c_register_driver+0x48/0xc8
> [    6.258384][T329@C6]  init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258389][T329@C6]  do_one_initcall+0x128/0x42c
> [    6.258392][T329@C6]  do_init_module+0x60/0x254
> [    6.258395][T329@C6]  load_module+0x1054/0x1220
> [    6.258397][T329@C6]  __arm64_sys_finit_module+0x240/0x35c
> [    6.258400][T329@C6]  invoke_syscall+0x60/0xec
> [    6.258402][T329@C6]  el0_svc_common+0xb0/0xe4
> [    6.258405][T329@C6]  do_el0_svc+0x24/0x30
> [    6.258407][T329@C6]  el0_svc+0x54/0x1c4
> [    6.258409][T329@C6]  el0t_64_sync_handler+0x68/0xdc
> [    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8
> 
> This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> however the sprd_gpio->lock would use in hard-irq, this is unsafe.
> 
> So change the spin_lock to raw_spin_lock to use the spinlock
> in hard-irq.
> 
> Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>

LGTM. Thanks.
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>

> ---
>   drivers/gpio/gpio-sprd.c | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpio/gpio-sprd.c b/drivers/gpio/gpio-sprd.c
> index 413bcd0a4240..2cc8abe705cd 100644
> --- a/drivers/gpio/gpio-sprd.c
> +++ b/drivers/gpio/gpio-sprd.c
> @@ -35,7 +35,7 @@
>   struct sprd_gpio {
>   	struct gpio_chip chip;
>   	void __iomem *base;
> -	spinlock_t lock;
> +	raw_spinlock_t lock;
>   	int irq;
>   };
>   
> @@ -54,7 +54,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
>   	unsigned long flags;
>   	u32 tmp;
>   
> -	spin_lock_irqsave(&sprd_gpio->lock, flags);
> +	raw_spin_lock_irqsave(&sprd_gpio->lock, flags);
>   	tmp = readl_relaxed(base + reg);
>   
>   	if (val)
> @@ -63,7 +63,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
>   		tmp &= ~BIT(SPRD_GPIO_BIT(offset));
>   
>   	writel_relaxed(tmp, base + reg);
> -	spin_unlock_irqrestore(&sprd_gpio->lock, flags);
> +	raw_spin_unlock_irqrestore(&sprd_gpio->lock, flags);
>   }
>   
>   static int sprd_gpio_read(struct gpio_chip *chip, unsigned int offset, u16 reg)
> @@ -236,7 +236,7 @@ static int sprd_gpio_probe(struct platform_device *pdev)
>   	if (IS_ERR(sprd_gpio->base))
>   		return PTR_ERR(sprd_gpio->base);
>   
> -	spin_lock_init(&sprd_gpio->lock);
> +	raw_spin_lock_init(&sprd_gpio->lock);
>   
>   	sprd_gpio->chip.label = dev_name(&pdev->dev);
>   	sprd_gpio->chip.ngpio = SPRD_GPIO_NR;
Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Posted by Sebastian Andrzej Siewior 1 week, 5 days ago
On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:
> There was a lockdep warning in sprd_gpio:
> 
> [    6.258269][T329@C6] [ BUG: Invalid wait context ]
> [    6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G        W  OE
> [    6.258272][T329@C6] -----------------------------
> [    6.258273][T329@C6] modprobe/329 is trying to lock:
> [    6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> [    6.258282][T329@C6] other info that might help us debug this:
> [    6.258283][T329@C6] context-{5:5}
> [    6.258285][T329@C6] 3 locks held by modprobe/329:
> [    6.258286][T329@C6]  #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> [    6.258295][T329@C6]  #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> [    6.258304][T329@C6]  #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> [    6.258313][T329@C6] stack backtrace:
> [    6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G        W  OE       6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT  3ad5b0f45741a16e5838da790706e16ceb6717df
> [    6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [    6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> [    6.258318][T329@C6] Call trace:
> [    6.258318][T329@C6]  show_stack+0x20/0x30 (C)
> [    6.258321][T329@C6]  __dump_stack+0x28/0x3c
> [    6.258324][T329@C6]  dump_stack_lvl+0xac/0xf0
> [    6.258326][T329@C6]  dump_stack+0x18/0x3c
> [    6.258329][T329@C6]  __lock_acquire+0x824/0x2c28
> [    6.258331][T329@C6]  lock_acquire+0x148/0x2cc
> [    6.258333][T329@C6]  _raw_spin_lock_irqsave+0x6c/0xb4
> [    6.258334][T329@C6]  sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> [    6.258337][T329@C6]  irq_startup+0x238/0x350
> [    6.258340][T329@C6]  __setup_irq+0x504/0x82c
> [    6.258342][T329@C6]  request_threaded_irq+0x118/0x184
> [    6.258344][T329@C6]  devm_request_threaded_irq+0x94/0x120
> [    6.258347][T329@C6]  sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258352][T329@C6]  sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258358][T329@C6]  i2c_device_probe+0x2c8/0x350
> [    6.258361][T329@C6]  really_probe+0x1a8/0x46c
> [    6.258363][T329@C6]  __driver_probe_device+0xa4/0x10c
> [    6.258366][T329@C6]  driver_probe_device+0x44/0x1b4
> [    6.258369][T329@C6]  __driver_attach+0xd0/0x204
> [    6.258371][T329@C6]  bus_for_each_dev+0x10c/0x168
> [    6.258373][T329@C6]  driver_attach+0x2c/0x3c
> [    6.258376][T329@C6]  bus_add_driver+0x154/0x29c
> [    6.258378][T329@C6]  driver_register+0x70/0x10c
> [    6.258381][T329@C6]  i2c_register_driver+0x48/0xc8
> [    6.258384][T329@C6]  init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [    6.258389][T329@C6]  do_one_initcall+0x128/0x42c
> [    6.258392][T329@C6]  do_init_module+0x60/0x254
> [    6.258395][T329@C6]  load_module+0x1054/0x1220
> [    6.258397][T329@C6]  __arm64_sys_finit_module+0x240/0x35c
> [    6.258400][T329@C6]  invoke_syscall+0x60/0xec
> [    6.258402][T329@C6]  el0_svc_common+0xb0/0xe4
> [    6.258405][T329@C6]  do_el0_svc+0x24/0x30
> [    6.258407][T329@C6]  el0_svc+0x54/0x1c4
> [    6.258409][T329@C6]  el0t_64_sync_handler+0x68/0xdc
> [    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8

This could be reduced to "BUG: Invalid wait context". The other bits
provide to added value.

> This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> however the sprd_gpio->lock would use in hard-irq, this is unsafe.
> 
> So change the spin_lock to raw_spin_lock to use the spinlock

spinlock_t to raw_spinlock_t

> in hard-irq.
> 
> Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>

Other than that
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

Sebastian
Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Posted by Bartosz Golaszewski 1 week, 4 days ago
On Mon, Jan 26, 2026 at 10:50 AM Sebastian Andrzej Siewior
<bigeasy@linutronix.de> wrote:
>
> On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:
> > There was a lockdep warning in sprd_gpio:
> >
> > [    6.258269][T329@C6] [ BUG: Invalid wait context ]
> > [    6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G        W  OE
> > [    6.258272][T329@C6] -----------------------------
> > [    6.258273][T329@C6] modprobe/329 is trying to lock:
> > [    6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> > [    6.258282][T329@C6] other info that might help us debug this:
> > [    6.258283][T329@C6] context-{5:5}
> > [    6.258285][T329@C6] 3 locks held by modprobe/329:
> > [    6.258286][T329@C6]  #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> > [    6.258295][T329@C6]  #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> > [    6.258304][T329@C6]  #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> > [    6.258313][T329@C6] stack backtrace:
> > [    6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G        W  OE       6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT  3ad5b0f45741a16e5838da790706e16ceb6717df
> > [    6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> > [    6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> > [    6.258318][T329@C6] Call trace:
> > [    6.258318][T329@C6]  show_stack+0x20/0x30 (C)
> > [    6.258321][T329@C6]  __dump_stack+0x28/0x3c
> > [    6.258324][T329@C6]  dump_stack_lvl+0xac/0xf0
> > [    6.258326][T329@C6]  dump_stack+0x18/0x3c
> > [    6.258329][T329@C6]  __lock_acquire+0x824/0x2c28
> > [    6.258331][T329@C6]  lock_acquire+0x148/0x2cc
> > [    6.258333][T329@C6]  _raw_spin_lock_irqsave+0x6c/0xb4
> > [    6.258334][T329@C6]  sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> > [    6.258337][T329@C6]  irq_startup+0x238/0x350
> > [    6.258340][T329@C6]  __setup_irq+0x504/0x82c
> > [    6.258342][T329@C6]  request_threaded_irq+0x118/0x184
> > [    6.258344][T329@C6]  devm_request_threaded_irq+0x94/0x120
> > [    6.258347][T329@C6]  sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> > [    6.258352][T329@C6]  sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> > [    6.258358][T329@C6]  i2c_device_probe+0x2c8/0x350
> > [    6.258361][T329@C6]  really_probe+0x1a8/0x46c
> > [    6.258363][T329@C6]  __driver_probe_device+0xa4/0x10c
> > [    6.258366][T329@C6]  driver_probe_device+0x44/0x1b4
> > [    6.258369][T329@C6]  __driver_attach+0xd0/0x204
> > [    6.258371][T329@C6]  bus_for_each_dev+0x10c/0x168
> > [    6.258373][T329@C6]  driver_attach+0x2c/0x3c
> > [    6.258376][T329@C6]  bus_add_driver+0x154/0x29c
> > [    6.258378][T329@C6]  driver_register+0x70/0x10c
> > [    6.258381][T329@C6]  i2c_register_driver+0x48/0xc8
> > [    6.258384][T329@C6]  init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> > [    6.258389][T329@C6]  do_one_initcall+0x128/0x42c
> > [    6.258392][T329@C6]  do_init_module+0x60/0x254
> > [    6.258395][T329@C6]  load_module+0x1054/0x1220
> > [    6.258397][T329@C6]  __arm64_sys_finit_module+0x240/0x35c
> > [    6.258400][T329@C6]  invoke_syscall+0x60/0xec
> > [    6.258402][T329@C6]  el0_svc_common+0xb0/0xe4
> > [    6.258405][T329@C6]  do_el0_svc+0x24/0x30
> > [    6.258407][T329@C6]  el0_svc+0x54/0x1c4
> > [    6.258409][T329@C6]  el0t_64_sync_handler+0x68/0xdc
> > [    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8
>
> This could be reduced to "BUG: Invalid wait context". The other bits
> provide to added value.
>
> > This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> > however the sprd_gpio->lock would use in hard-irq, this is unsafe.
> >
> > So change the spin_lock to raw_spin_lock to use the spinlock
>
> spinlock_t to raw_spinlock_t
>

I fixed this in git.

Bart

> > in hard-irq.
> >
> > Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
>
> Other than that
> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
>
> Sebastian
Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Posted by Andy Shevchenko 1 week, 3 days ago
On Tue, Jan 27, 2026 at 10:07:01AM +0100, Bartosz Golaszewski wrote:
> On Mon, Jan 26, 2026 at 10:50 AM Sebastian Andrzej Siewior
> <bigeasy@linutronix.de> wrote:
> > On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:

...

> > > There was a lockdep warning in sprd_gpio:

> > > [    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8
> >
> > This could be reduced to "BUG: Invalid wait context". The other bits
> > provide to added value.
> >
> > > This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> > > however the sprd_gpio->lock would use in hard-irq, this is unsafe.
> > >
> > > So change the spin_lock to raw_spin_lock to use the spinlock
> >
> > spinlock_t to raw_spinlock_t
> 
> I fixed this in git.

Not sure if you noticed the above comment by Sebastian and it's actually
documented in Submitting Patches that backtraces should only carry the
necessary information, so usually ~3-5 lines is enough and not two full pages
like in the commit as I see in the repository.

> Bart
> 
> > > in hard-irq.

-- 
With Best Regards,
Andy Shevchenko


Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Posted by Bartosz Golaszewski 1 week, 3 days ago
On Tue, 27 Jan 2026 20:36:16 +0100, Andy Shevchenko
<andriy.shevchenko@intel.com> said:
> On Tue, Jan 27, 2026 at 10:07:01AM +0100, Bartosz Golaszewski wrote:
>> On Mon, Jan 26, 2026 at 10:50 AM Sebastian Andrzej Siewior
>> <bigeasy@linutronix.de> wrote:
>> > On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:
>
> ...
>
>> > > There was a lockdep warning in sprd_gpio:
>
>> > > [    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8
>> >
>> > This could be reduced to "BUG: Invalid wait context". The other bits
>> > provide to added value.
>> >
>> > > This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
>> > > however the sprd_gpio->lock would use in hard-irq, this is unsafe.
>> > >
>> > > So change the spin_lock to raw_spin_lock to use the spinlock
>> >
>> > spinlock_t to raw_spinlock_t
>>
>> I fixed this in git.
>
> Not sure if you noticed the above comment by Sebastian and it's actually
> documented in Submitting Patches that backtraces should only carry the
> necessary information, so usually ~3-5 lines is enough and not two full pages
> like in the commit as I see in the repository.
>

Noted for the future, thanks.

Bartosz