hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/hwspinlock/sprd_hwspinlock.c
....@@ -15,7 +15,6 @@
1515 #include <linux/of.h>
1616 #include <linux/of_device.h>
1717 #include <linux/platform_device.h>
18
-#include <linux/pm_runtime.h>
1918 #include <linux/slab.h>
2019
2120 #include "hwspinlock_internal.h"
....@@ -79,11 +78,17 @@
7978 .relax = sprd_hwspinlock_relax,
8079 };
8180
81
+static void sprd_hwspinlock_disable(void *data)
82
+{
83
+ struct sprd_hwspinlock_dev *sprd_hwlock = data;
84
+
85
+ clk_disable_unprepare(sprd_hwlock->clk);
86
+}
87
+
8288 static int sprd_hwspinlock_probe(struct platform_device *pdev)
8389 {
8490 struct sprd_hwspinlock_dev *sprd_hwlock;
8591 struct hwspinlock *lock;
86
- struct resource *res;
8792 int i, ret;
8893
8994 if (!pdev->dev.of_node)
....@@ -96,8 +101,7 @@
96101 if (!sprd_hwlock)
97102 return -ENOMEM;
98103
99
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
100
- sprd_hwlock->base = devm_ioremap_resource(&pdev->dev, res);
104
+ sprd_hwlock->base = devm_platform_ioremap_resource(pdev, 0);
101105 if (IS_ERR(sprd_hwlock->base))
102106 return PTR_ERR(sprd_hwlock->base);
103107
....@@ -107,7 +111,17 @@
107111 return PTR_ERR(sprd_hwlock->clk);
108112 }
109113
110
- clk_prepare_enable(sprd_hwlock->clk);
114
+ ret = clk_prepare_enable(sprd_hwlock->clk);
115
+ if (ret)
116
+ return ret;
117
+
118
+ ret = devm_add_action_or_reset(&pdev->dev, sprd_hwspinlock_disable,
119
+ sprd_hwlock);
120
+ if (ret) {
121
+ dev_err(&pdev->dev,
122
+ "Failed to add hwspinlock disable action\n");
123
+ return ret;
124
+ }
111125
112126 /* set the hwspinlock to record user id to identify subsystems */
113127 writel(HWSPINLOCK_USER_BITS, sprd_hwlock->base + HWSPINLOCK_RECCTRL);
....@@ -118,27 +132,10 @@
118132 }
119133
120134 platform_set_drvdata(pdev, sprd_hwlock);
121
- pm_runtime_enable(&pdev->dev);
122135
123
- ret = hwspin_lock_register(&sprd_hwlock->bank, &pdev->dev,
124
- &sprd_hwspinlock_ops, 0, SPRD_HWLOCKS_NUM);
125
- if (ret) {
126
- pm_runtime_disable(&pdev->dev);
127
- clk_disable_unprepare(sprd_hwlock->clk);
128
- return ret;
129
- }
130
-
131
- return 0;
132
-}
133
-
134
-static int sprd_hwspinlock_remove(struct platform_device *pdev)
135
-{
136
- struct sprd_hwspinlock_dev *sprd_hwlock = platform_get_drvdata(pdev);
137
-
138
- hwspin_lock_unregister(&sprd_hwlock->bank);
139
- pm_runtime_disable(&pdev->dev);
140
- clk_disable_unprepare(sprd_hwlock->clk);
141
- return 0;
136
+ return devm_hwspin_lock_register(&pdev->dev, &sprd_hwlock->bank,
137
+ &sprd_hwspinlock_ops, 0,
138
+ SPRD_HWLOCKS_NUM);
142139 }
143140
144141 static const struct of_device_id sprd_hwspinlock_of_match[] = {
....@@ -149,7 +146,6 @@
149146
150147 static struct platform_driver sprd_hwspinlock_driver = {
151148 .probe = sprd_hwspinlock_probe,
152
- .remove = sprd_hwspinlock_remove,
153149 .driver = {
154150 .name = "sprd_hwspinlock",
155151 .of_match_table = of_match_ptr(sprd_hwspinlock_of_match),