@@ -54,8 +54,23 @@ static const struct hwspinlock_ops stm32_hwspinlock_ops = {
54
54
.relax = stm32_hwspinlock_relax ,
55
55
};
56
56
57
+ static void stm32_hwspinlock_disable_clk (void * data )
58
+ {
59
+ struct platform_device * pdev = data ;
60
+ struct stm32_hwspinlock * hw = platform_get_drvdata (pdev );
61
+ struct device * dev = & pdev -> dev ;
62
+
63
+ pm_runtime_get_sync (dev );
64
+ pm_runtime_disable (dev );
65
+ pm_runtime_set_suspended (dev );
66
+ pm_runtime_put_noidle (dev );
67
+
68
+ clk_disable_unprepare (hw -> clk );
69
+ }
70
+
57
71
static int stm32_hwspinlock_probe (struct platform_device * pdev )
58
72
{
73
+ struct device * dev = & pdev -> dev ;
59
74
struct stm32_hwspinlock * hw ;
60
75
void __iomem * io_base ;
61
76
size_t array_size ;
@@ -66,41 +81,43 @@ static int stm32_hwspinlock_probe(struct platform_device *pdev)
66
81
return PTR_ERR (io_base );
67
82
68
83
array_size = STM32_MUTEX_NUM_LOCKS * sizeof (struct hwspinlock );
69
- hw = devm_kzalloc (& pdev -> dev , sizeof (* hw ) + array_size , GFP_KERNEL );
84
+ hw = devm_kzalloc (dev , sizeof (* hw ) + array_size , GFP_KERNEL );
70
85
if (!hw )
71
86
return - ENOMEM ;
72
87
73
- hw -> clk = devm_clk_get (& pdev -> dev , "hsem" );
88
+ hw -> clk = devm_clk_get (dev , "hsem" );
74
89
if (IS_ERR (hw -> clk ))
75
90
return PTR_ERR (hw -> clk );
76
91
77
- for (i = 0 ; i < STM32_MUTEX_NUM_LOCKS ; i ++ )
78
- hw -> bank .lock [i ].priv = io_base + i * sizeof (u32 );
92
+ ret = clk_prepare_enable (hw -> clk );
93
+ if (ret ) {
94
+ dev_err (dev , "Failed to prepare_enable clock\n" );
95
+ return ret ;
96
+ }
79
97
80
98
platform_set_drvdata (pdev , hw );
81
- pm_runtime_enable (& pdev -> dev );
82
99
83
- ret = hwspin_lock_register (& hw -> bank , & pdev -> dev , & stm32_hwspinlock_ops ,
84
- 0 , STM32_MUTEX_NUM_LOCKS );
100
+ pm_runtime_get_noresume (dev );
101
+ pm_runtime_set_active (dev );
102
+ pm_runtime_enable (dev );
103
+ pm_runtime_put (dev );
85
104
86
- if (ret )
87
- pm_runtime_disable (& pdev -> dev );
105
+ ret = devm_add_action_or_reset (dev , stm32_hwspinlock_disable_clk , pdev );
106
+ if (ret ) {
107
+ dev_err (dev , "Failed to register action\n" );
108
+ return ret ;
109
+ }
88
110
89
- return ret ;
90
- }
111
+ for ( i = 0 ; i < STM32_MUTEX_NUM_LOCKS ; i ++ )
112
+ hw -> bank . lock [ i ]. priv = io_base + i * sizeof ( u32 );
91
113
92
- static int stm32_hwspinlock_remove (struct platform_device * pdev )
93
- {
94
- struct stm32_hwspinlock * hw = platform_get_drvdata (pdev );
95
- int ret ;
114
+ ret = devm_hwspin_lock_register (dev , & hw -> bank , & stm32_hwspinlock_ops ,
115
+ 0 , STM32_MUTEX_NUM_LOCKS );
96
116
97
- ret = hwspin_lock_unregister (& hw -> bank );
98
117
if (ret )
99
- dev_err (& pdev -> dev , "%s failed: %d\n" , __func__ , ret );
100
-
101
- pm_runtime_disable (& pdev -> dev );
118
+ dev_err (dev , "Failed to register hwspinlock\n" );
102
119
103
- return 0 ;
120
+ return ret ;
104
121
}
105
122
106
123
static int __maybe_unused stm32_hwspinlock_runtime_suspend (struct device * dev )
@@ -135,7 +152,6 @@ MODULE_DEVICE_TABLE(of, stm32_hwpinlock_ids);
135
152
136
153
static struct platform_driver stm32_hwspinlock_driver = {
137
154
.probe = stm32_hwspinlock_probe ,
138
- .remove = stm32_hwspinlock_remove ,
139
155
.driver = {
140
156
.name = "stm32_hwspinlock" ,
141
157
.of_match_table = stm32_hwpinlock_ids ,
0 commit comments