Lines Matching +full:hwspinlock +full:- +full:r3p0
1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) 2017 Spreadtrum - http://www.spreadtrum.com
10 #include <linux/hwspinlock.h>
20 /* hwspinlock registers definition */
30 /* hwspinlock number */
40 static int sprd_hwspinlock_trylock(struct hwspinlock *lock) in sprd_hwspinlock_trylock()
43 dev_get_drvdata(lock->bank->dev); in sprd_hwspinlock_trylock()
44 void __iomem *addr = lock->priv; in sprd_hwspinlock_trylock()
52 user_id = readl(sprd_hwlock->base + HWSPINLOCK_MASTERID(lock_id)); in sprd_hwspinlock_trylock()
53 dev_warn(sprd_hwlock->bank.dev, in sprd_hwspinlock_trylock()
54 "hwspinlock [%d] lock failed and master/user id = %d!\n", in sprd_hwspinlock_trylock()
60 static void sprd_hwspinlock_unlock(struct hwspinlock *lock) in sprd_hwspinlock_unlock()
62 void __iomem *lock_addr = lock->priv; in sprd_hwspinlock_unlock()
68 static void sprd_hwspinlock_relax(struct hwspinlock *lock) in sprd_hwspinlock_relax()
83 clk_disable_unprepare(sprd_hwlock->clk); in sprd_hwspinlock_disable()
89 struct hwspinlock *lock; in sprd_hwspinlock_probe()
92 if (!pdev->dev.of_node) in sprd_hwspinlock_probe()
93 return -ENODEV; in sprd_hwspinlock_probe()
95 sprd_hwlock = devm_kzalloc(&pdev->dev, in sprd_hwspinlock_probe()
99 return -ENOMEM; in sprd_hwspinlock_probe()
101 sprd_hwlock->base = devm_platform_ioremap_resource(pdev, 0); in sprd_hwspinlock_probe()
102 if (IS_ERR(sprd_hwlock->base)) in sprd_hwspinlock_probe()
103 return PTR_ERR(sprd_hwlock->base); in sprd_hwspinlock_probe()
105 sprd_hwlock->clk = devm_clk_get(&pdev->dev, "enable"); in sprd_hwspinlock_probe()
106 if (IS_ERR(sprd_hwlock->clk)) { in sprd_hwspinlock_probe()
107 dev_err(&pdev->dev, "get hwspinlock clock failed!\n"); in sprd_hwspinlock_probe()
108 return PTR_ERR(sprd_hwlock->clk); in sprd_hwspinlock_probe()
111 ret = clk_prepare_enable(sprd_hwlock->clk); in sprd_hwspinlock_probe()
115 ret = devm_add_action_or_reset(&pdev->dev, sprd_hwspinlock_disable, in sprd_hwspinlock_probe()
118 dev_err(&pdev->dev, in sprd_hwspinlock_probe()
119 "Failed to add hwspinlock disable action\n"); in sprd_hwspinlock_probe()
123 /* set the hwspinlock to record user id to identify subsystems */ in sprd_hwspinlock_probe()
124 writel(HWSPINLOCK_USER_BITS, sprd_hwlock->base + HWSPINLOCK_RECCTRL); in sprd_hwspinlock_probe()
127 lock = &sprd_hwlock->bank.lock[i]; in sprd_hwspinlock_probe()
128 lock->priv = sprd_hwlock->base + HWSPINLOCK_TOKEN(i); in sprd_hwspinlock_probe()
133 return devm_hwspin_lock_register(&pdev->dev, &sprd_hwlock->bank, in sprd_hwspinlock_probe()
139 { .compatible = "sprd,hwspinlock-r3p0", },