From 3229c7d5d5fa3bf74e157e87d0ea2406b301408f Mon Sep 17 00:00:00 2001 From: Frank Wang Date: Fri, 12 Jan 2024 17:06:38 +0800 Subject: [PATCH] hwspinlock: rockchip: support to set hwlock user in dt With this commit, we can set hwlock user id in DT with "rockchip,hwlock-user-id" property, if it is not set, the driver use default value 0x01 instead. Change-Id: Ib7ecc3eaf23ba79d85dc82182a9db0760c6d830c Signed-off-by: Frank Wang --- drivers/hwspinlock/rockchip_hwspinlock.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/hwspinlock/rockchip_hwspinlock.c b/drivers/hwspinlock/rockchip_hwspinlock.c index 26ba8ec31f01..312376707687 100644 --- a/drivers/hwspinlock/rockchip_hwspinlock.c +++ b/drivers/hwspinlock/rockchip_hwspinlock.c @@ -22,21 +22,24 @@ struct rockchip_hwspinlock { /* Hardware spinlock register offsets */ #define HWSPINLOCK_OFFSET(x) (0x4 * (x)) +#define HWSPINLOCK_ID_MASK 0x0F -#define HWSPINLOCK_OWNER_ID 0x01 +#define HWLOCK_DEFAULT_USER 0x01 + +static u32 hwlock_user_id; static int rockchip_hwspinlock_trylock(struct hwspinlock *lock) { void __iomem *lock_addr = lock->priv; - writel(HWSPINLOCK_OWNER_ID, lock_addr); + writel(hwlock_user_id, lock_addr); /* * Get only first 4 bits and compare to HWSPINLOCK_OWNER_ID, * if equal, we attempt to acquire the lock, otherwise, * someone else has it. */ - return (HWSPINLOCK_OWNER_ID == (0x0F & readl(lock_addr))); + return (hwlock_user_id == (readl(lock_addr) & HWSPINLOCK_ID_MASK)); } static void rockchip_hwspinlock_unlock(struct hwspinlock *lock) @@ -56,7 +59,7 @@ static int rockchip_hwspinlock_probe(struct platform_device *pdev) { struct rockchip_hwspinlock *hwspin; struct hwspinlock *hwlock; - int idx; + int idx, ret; hwspin = devm_kzalloc(&pdev->dev, struct_size(hwspin, bank.lock, HWSPINLOCK_NUMBER), @@ -68,6 +71,12 @@ static int rockchip_hwspinlock_probe(struct platform_device *pdev) if (IS_ERR(hwspin->io_base)) return PTR_ERR(hwspin->io_base); + ret = device_property_read_u32(&pdev->dev, "rockchip,hwlock-user-id", + &hwlock_user_id); + if (ret || !hwlock_user_id || hwlock_user_id > HWSPINLOCK_ID_MASK) + hwlock_user_id = HWLOCK_DEFAULT_USER; + dev_info(&pdev->dev, "hwlock user id %u\n", hwlock_user_id); + for (idx = 0; idx < HWSPINLOCK_NUMBER; idx++) { hwlock = &hwspin->bank.lock[idx]; hwlock->priv = hwspin->io_base + HWSPINLOCK_OFFSET(idx);