@@ -91,16 +91,29 @@ static int stm32_crc_setkey(struct crypto_shash *tfm, const u8 *key,
91
91
return 0 ;
92
92
}
93
93
94
- static int stm32_crc_init ( struct shash_desc * desc )
94
+ static struct stm32_crc * stm32_crc_get_next_crc ( void )
95
95
{
96
- struct stm32_crc_desc_ctx * ctx = shash_desc_ctx (desc );
97
- struct stm32_crc_ctx * mctx = crypto_shash_ctx (desc -> tfm );
98
96
struct stm32_crc * crc ;
99
97
100
98
spin_lock_bh (& crc_list .lock );
101
99
crc = list_first_entry (& crc_list .dev_list , struct stm32_crc , list );
100
+ if (crc )
101
+ list_move_tail (& crc -> list , & crc_list .dev_list );
102
102
spin_unlock_bh (& crc_list .lock );
103
103
104
+ return crc ;
105
+ }
106
+
107
+ static int stm32_crc_init (struct shash_desc * desc )
108
+ {
109
+ struct stm32_crc_desc_ctx * ctx = shash_desc_ctx (desc );
110
+ struct stm32_crc_ctx * mctx = crypto_shash_ctx (desc -> tfm );
111
+ struct stm32_crc * crc ;
112
+
113
+ crc = stm32_crc_get_next_crc ();
114
+ if (!crc )
115
+ return - ENODEV ;
116
+
104
117
pm_runtime_get_sync (crc -> dev );
105
118
106
119
/* Reset, set key, poly and configure in bit reverse mode */
@@ -125,9 +138,9 @@ static int stm32_crc_update(struct shash_desc *desc, const u8 *d8,
125
138
struct stm32_crc_ctx * mctx = crypto_shash_ctx (desc -> tfm );
126
139
struct stm32_crc * crc ;
127
140
128
- spin_lock_bh ( & crc_list . lock );
129
- crc = list_first_entry ( & crc_list . dev_list , struct stm32_crc , list );
130
- spin_unlock_bh ( & crc_list . lock ) ;
141
+ crc = stm32_crc_get_next_crc ( );
142
+ if (! crc )
143
+ return - ENODEV ;
131
144
132
145
pm_runtime_get_sync (crc -> dev );
133
146
@@ -200,6 +213,8 @@ static int stm32_crc_digest(struct shash_desc *desc, const u8 *data,
200
213
return stm32_crc_init (desc ) ?: stm32_crc_finup (desc , data , length , out );
201
214
}
202
215
216
+ static unsigned int refcnt ;
217
+ static DEFINE_MUTEX (refcnt_lock );
203
218
static struct shash_alg algs [] = {
204
219
/* CRC-32 */
205
220
{
@@ -290,12 +305,18 @@ static int stm32_crc_probe(struct platform_device *pdev)
290
305
list_add (& crc -> list , & crc_list .dev_list );
291
306
spin_unlock (& crc_list .lock );
292
307
293
- ret = crypto_register_shashes (algs , ARRAY_SIZE (algs ));
294
- if (ret ) {
295
- dev_err (dev , "Failed to register\n" );
296
- clk_disable_unprepare (crc -> clk );
297
- return ret ;
308
+ mutex_lock (& refcnt_lock );
309
+ if (!refcnt ) {
310
+ ret = crypto_register_shashes (algs , ARRAY_SIZE (algs ));
311
+ if (ret ) {
312
+ mutex_unlock (& refcnt_lock );
313
+ dev_err (dev , "Failed to register\n" );
314
+ clk_disable_unprepare (crc -> clk );
315
+ return ret ;
316
+ }
298
317
}
318
+ refcnt ++ ;
319
+ mutex_unlock (& refcnt_lock );
299
320
300
321
dev_info (dev , "Initialized\n" );
301
322
@@ -316,7 +337,10 @@ static int stm32_crc_remove(struct platform_device *pdev)
316
337
list_del (& crc -> list );
317
338
spin_unlock (& crc_list .lock );
318
339
319
- crypto_unregister_shashes (algs , ARRAY_SIZE (algs ));
340
+ mutex_lock (& refcnt_lock );
341
+ if (!-- refcnt )
342
+ crypto_unregister_shashes (algs , ARRAY_SIZE (algs ));
343
+ mutex_unlock (& refcnt_lock );
320
344
321
345
pm_runtime_disable (crc -> dev );
322
346
pm_runtime_put_noidle (crc -> dev );
0 commit comments