From e4bdbb1b7bdeaf2c7f869759aa5822471e579d42 Mon Sep 17 00:00:00 2001
From: Kishon Vijay Abraham I <kishon@ti.com>
Date: Mon, 7 Feb 2022 13:18:54 +0530
Subject: [PATCH] net: ethernet: ti: icss_iep: Enable regmap fast_io for
 iep_regmap_config

icss_iep_perout_enable_hw() is invoked with spin_lock_irqsave() and
hence cannot use sleeping lock. Enable regmap fast_io for
iep_regmap_config so that it will use spinlock instead of mutex.

This fixes the following dump
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:947
in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 1103, name: sh
5 locks held by sh/1103:
 #0: ffff00002b814438 (sb_writers#5){.+.+}-{0:0}, at: ksys_write+0x6c/0xf8
 #1: ffff0000322ae888 (&of->mutex){+.+.}-{3:3}, at: kernfs_fop_write_iter+0xf0/0x1b8
 #2: ffff0000744837d0 (kn->active#158){++++}-{0:0}, at: kernfs_fop_write_iter+0xf8/0x1b8
 #3: ffff0000344401b8 (&iep->ptp_clk_mutex){+.+.}-{3:3}, at: icss_iep_ptp_enable+0x168/0x2f0 [icss_iep]
 #4: ffff0000344401f8 (&iep->irq_lock){....}-{2:2}, at: icss_iep_ptp_enable+0x19c/0x2f0 [icss_iep]
irq event stamp: 92858
hardirqs last  enabled at (92857): [<ffff800010cbefa0>] _raw_spin_unlock_irqrestore+0x80/0x98
hardirqs last disabled at (92858): [<ffff800010cbf660>] _raw_spin_lock_irqsave+0xb0/0x144
softirqs last  enabled at (92658): [<ffff80001001062c>] efi_header_end+0x62c/0x6b0
softirqs last disabled at (92645): [<ffff80001005993c>] irq_exit+0x1c4/0x1d8
Preemption disabled at:
[<ffff800009491484>] icss_iep_ptp_enable+0x19c/0x2f0 [icss_iep]
CPU: 1 PID: 1103 Comm: sh Not tainted 5.10.65-08510-g2bea885230fd-dirty #204
Hardware name: Texas Instruments AM642 EVM (DT)
Call trace:
 dump_backtrace+0x0/0x1d0
 show_stack+0x18/0x28
 dump_stack+0xec/0x154
 ___might_sleep+0x194/0x240
 __might_sleep+0x50/0x88
 __mutex_lock+0x5c/0x900
 mutex_lock_nested+0x34/0x50
 regmap_lock_mutex+0x14/0x20
 regmap_write+0x3c/0x78
 icss_iep_perout_enable_hw+0xd0/0x2c0 [icss_iep]
 icss_iep_ptp_enable+0x2b4/0x2f0 [icss_iep]
 pps_enable_store+0xc0/0xe0
 dev_attr_store+0x18/0x30
 sysfs_kf_write+0x4c/0x78
 kernfs_fop_write_iter+0x120/0x1b8
 new_sync_write+0xe8/0x188
 vfs_write+0x2ac/0x450
 ksys_write+0x6c/0xf8
 __arm64_sys_write+0x1c/0x28
 el0_svc_common.constprop.0+0x7c/0x1f0
 do_el0_svc+0x24/0x90
 el0_svc+0x20/0x30
 el0_sync_handler+0xb0/0xb8
 el0_sync+0x180/0x1c0

=============================
[ BUG: Invalid wait context ]
5.10.65-08510-g2bea885230fd-dirty #204 Tainted: G        W
-----------------------------
sh/1103 is trying to lock:
ffff000034440468 (icss_iep:959:(iep->plat_data->config)->lock){+.+.}-{3:3}, at: regmap_lock_mutex+0x14/0x20
other info that might help us debug this:
context-{4:4}
5 locks held by sh/1103:
 #0: ffff00002b814438 (sb_writers#5){.+.+}-{0:0}, at: ksys_write+0x6c/0xf8
 #1: ffff0000322ae888 (&of->mutex){+.+.}-{3:3}, at: kernfs_fop_write_iter+0xf0/0x1b8
 #2: ffff0000744837d0 (kn->active#158){++++}-{0:0}, at: kernfs_fop_write_iter+0xf8/0x1b8
 #3: ffff0000344401b8 (&iep->ptp_clk_mutex){+.+.}-{3:3}, at: icss_iep_ptp_enable+0x168/0x2f0 [icss_iep]
 #4: ffff0000344401f8 (&iep->irq_lock){....}-{2:2}, at: icss_iep_ptp_enable+0x19c/0x2f0 [icss_iep]
stack backtrace:
CPU: 1 PID: 1103 Comm: sh Tainted: G        W         5.10.65-08510-g2bea885230fd-dirty #204
Hardware name: Texas Instruments AM642 EVM (DT)
Call trace:
 dump_backtrace+0x0/0x1d0
 show_stack+0x18/0x28
 dump_stack+0xec/0x154
 __lock_acquire+0x1d38/0x1d60
 lock_acquire+0x154/0x410
 __mutex_lock+0x9c/0x900
 mutex_lock_nested+0x34/0x50
 regmap_lock_mutex+0x14/0x20
 regmap_write+0x3c/0x78
 icss_iep_perout_enable_hw+0xd0/0x2c0 [icss_iep]
 icss_iep_ptp_enable+0x2b4/0x2f0 [icss_iep]
 pps_enable_store+0xc0/0xe0
 dev_attr_store+0x18/0x30
 sysfs_kf_write+0x4c/0x78
 kernfs_fop_write_iter+0x120/0x1b8
 new_sync_write+0xe8/0x188
 vfs_write+0x2ac/0x450
 ksys_write+0x6c/0xf8
 __arm64_sys_write+0x1c/0x28
 el0_svc_common.constprop.0+0x7c/0x1f0
 do_el0_svc+0x24/0x90
 el0_svc+0x20/0x30
 el0_sync_handler+0xb0/0xb8
 el0_sync+0x180/0x1c0

Fixes: 5d58df8eb0bb ("net: ethernet: ti: icss_iep: fix pps irq race vs pps disable")
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
---
 drivers/net/ethernet/ti/icss_iep.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/ti/icss_iep.c b/drivers/net/ethernet/ti/icss_iep.c
index 48a2f76bcc1a..4552fc07553d 100644
--- a/drivers/net/ethernet/ti/icss_iep.c
+++ b/drivers/net/ethernet/ti/icss_iep.c
@@ -1002,6 +1002,7 @@ static struct regmap_config am654_icss_iep_regmap_config = {
 	.reg_read = icss_iep_regmap_read,
 	.writeable_reg = am654_icss_iep_valid_reg,
 	.readable_reg = am654_icss_iep_valid_reg,
+	.fast_io = 1,
 };
 
 static const struct icss_iep_plat_data am654_icss_iep_plat_data = {
