232
232
* struct samsung_aes_variant - platform specific SSS driver data
233
233
* @aes_offset: AES register offset from SSS module's base.
234
234
* @hash_offset: HASH register offset from SSS module's base.
235
+ * @clk_names: names of clocks needed to run SSS IP
235
236
*
236
237
* Specifies platform specific configuration of SSS module.
237
238
* Note: A structure for driver specific platform data is used for future
240
241
struct samsung_aes_variant {
241
242
unsigned int aes_offset ;
242
243
unsigned int hash_offset ;
244
+ const char * clk_names [];
243
245
};
244
246
245
247
struct s5p_aes_reqctx {
@@ -296,6 +298,7 @@ struct s5p_aes_ctx {
296
298
struct s5p_aes_dev {
297
299
struct device * dev ;
298
300
struct clk * clk ;
301
+ struct clk * pclk ;
299
302
void __iomem * ioaddr ;
300
303
void __iomem * aes_ioaddr ;
301
304
int irq_fc ;
@@ -384,11 +387,19 @@ struct s5p_hash_ctx {
384
387
static const struct samsung_aes_variant s5p_aes_data = {
385
388
.aes_offset = 0x4000 ,
386
389
.hash_offset = 0x6000 ,
390
+ .clk_names = { "secss" , },
387
391
};
388
392
389
393
static const struct samsung_aes_variant exynos_aes_data = {
390
394
.aes_offset = 0x200 ,
391
395
.hash_offset = 0x400 ,
396
+ .clk_names = { "secss" , },
397
+ };
398
+
399
+ static const struct samsung_aes_variant exynos5433_slim_aes_data = {
400
+ .aes_offset = 0x400 ,
401
+ .hash_offset = 0x800 ,
402
+ .clk_names = { "pclk" , "aclk" , },
392
403
};
393
404
394
405
static const struct of_device_id s5p_sss_dt_match [] = {
@@ -400,6 +411,10 @@ static const struct of_device_id s5p_sss_dt_match[] = {
400
411
.compatible = "samsung,exynos4210-secss" ,
401
412
.data = & exynos_aes_data ,
402
413
},
414
+ {
415
+ .compatible = "samsung,exynos5433-slim-sss" ,
416
+ .data = & exynos5433_slim_aes_data ,
417
+ },
403
418
{ },
404
419
};
405
420
MODULE_DEVICE_TABLE (of , s5p_sss_dt_match );
@@ -2218,18 +2233,39 @@ static int s5p_aes_probe(struct platform_device *pdev)
2218
2233
return PTR_ERR (pdata -> ioaddr );
2219
2234
}
2220
2235
2221
- pdata -> clk = devm_clk_get (dev , "secss" );
2236
+ pdata -> clk = devm_clk_get (dev , variant -> clk_names [ 0 ] );
2222
2237
if (IS_ERR (pdata -> clk )) {
2223
- dev_err (dev , "failed to find secss clock source\n" );
2238
+ dev_err (dev , "failed to find secss clock %s\n" ,
2239
+ variant -> clk_names [0 ]);
2224
2240
return - ENOENT ;
2225
2241
}
2226
2242
2227
2243
err = clk_prepare_enable (pdata -> clk );
2228
2244
if (err < 0 ) {
2229
- dev_err (dev , "Enabling SSS clk failed, err %d\n" , err );
2245
+ dev_err (dev , "Enabling clock %s failed, err %d\n" ,
2246
+ variant -> clk_names [0 ], err );
2230
2247
return err ;
2231
2248
}
2232
2249
2250
+ if (variant -> clk_names [1 ]) {
2251
+ pdata -> pclk = devm_clk_get (dev , variant -> clk_names [1 ]);
2252
+ if (IS_ERR (pdata -> pclk )) {
2253
+ dev_err (dev , "failed to find clock %s\n" ,
2254
+ variant -> clk_names [1 ]);
2255
+ err = - ENOENT ;
2256
+ goto err_clk ;
2257
+ }
2258
+
2259
+ err = clk_prepare_enable (pdata -> pclk );
2260
+ if (err < 0 ) {
2261
+ dev_err (dev , "Enabling clock %s failed, err %d\n" ,
2262
+ variant -> clk_names [0 ], err );
2263
+ goto err_clk ;
2264
+ }
2265
+ } else {
2266
+ pdata -> pclk = NULL ;
2267
+ }
2268
+
2233
2269
spin_lock_init (& pdata -> lock );
2234
2270
spin_lock_init (& pdata -> hash_lock );
2235
2271
@@ -2305,8 +2341,11 @@ static int s5p_aes_probe(struct platform_device *pdev)
2305
2341
tasklet_kill (& pdata -> tasklet );
2306
2342
2307
2343
err_irq :
2308
- clk_disable_unprepare (pdata -> clk );
2344
+ if (pdata -> pclk )
2345
+ clk_disable_unprepare (pdata -> pclk );
2309
2346
2347
+ err_clk :
2348
+ clk_disable_unprepare (pdata -> clk );
2310
2349
s5p_dev = NULL ;
2311
2350
2312
2351
return err ;
@@ -2333,6 +2372,9 @@ static int s5p_aes_remove(struct platform_device *pdev)
2333
2372
pdata -> use_hash = false;
2334
2373
}
2335
2374
2375
+ if (pdata -> pclk )
2376
+ clk_disable_unprepare (pdata -> pclk );
2377
+
2336
2378
clk_disable_unprepare (pdata -> clk );
2337
2379
s5p_dev = NULL ;
2338
2380
0 commit comments