Skip to content

Commit 0918f18

Browse files
Kamil Koniecznyherbertx
authored andcommitted
crypto: s5p - add AES support for Exynos5433
Add AES crypto HW acceleration for Exynos5433, with the help of SlimSSS IP. Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org> Signed-off-by: Kamil Konieczny <k.konieczny@partner.samsung.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent d3ff9f8 commit 0918f18

File tree

1 file changed

+46
-4
lines changed

1 file changed

+46
-4
lines changed

drivers/crypto/s5p-sss.c

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@
232232
* struct samsung_aes_variant - platform specific SSS driver data
233233
* @aes_offset: AES register offset from SSS module's base.
234234
* @hash_offset: HASH register offset from SSS module's base.
235+
* @clk_names: names of clocks needed to run SSS IP
235236
*
236237
* Specifies platform specific configuration of SSS module.
237238
* Note: A structure for driver specific platform data is used for future
@@ -240,6 +241,7 @@
240241
struct samsung_aes_variant {
241242
unsigned int aes_offset;
242243
unsigned int hash_offset;
244+
const char *clk_names[];
243245
};
244246

245247
struct s5p_aes_reqctx {
@@ -296,6 +298,7 @@ struct s5p_aes_ctx {
296298
struct s5p_aes_dev {
297299
struct device *dev;
298300
struct clk *clk;
301+
struct clk *pclk;
299302
void __iomem *ioaddr;
300303
void __iomem *aes_ioaddr;
301304
int irq_fc;
@@ -384,11 +387,19 @@ struct s5p_hash_ctx {
384387
static const struct samsung_aes_variant s5p_aes_data = {
385388
.aes_offset = 0x4000,
386389
.hash_offset = 0x6000,
390+
.clk_names = { "secss", },
387391
};
388392

389393
static const struct samsung_aes_variant exynos_aes_data = {
390394
.aes_offset = 0x200,
391395
.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", },
392403
};
393404

394405
static const struct of_device_id s5p_sss_dt_match[] = {
@@ -400,6 +411,10 @@ static const struct of_device_id s5p_sss_dt_match[] = {
400411
.compatible = "samsung,exynos4210-secss",
401412
.data = &exynos_aes_data,
402413
},
414+
{
415+
.compatible = "samsung,exynos5433-slim-sss",
416+
.data = &exynos5433_slim_aes_data,
417+
},
403418
{ },
404419
};
405420
MODULE_DEVICE_TABLE(of, s5p_sss_dt_match);
@@ -2218,18 +2233,39 @@ static int s5p_aes_probe(struct platform_device *pdev)
22182233
return PTR_ERR(pdata->ioaddr);
22192234
}
22202235

2221-
pdata->clk = devm_clk_get(dev, "secss");
2236+
pdata->clk = devm_clk_get(dev, variant->clk_names[0]);
22222237
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]);
22242240
return -ENOENT;
22252241
}
22262242

22272243
err = clk_prepare_enable(pdata->clk);
22282244
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);
22302247
return err;
22312248
}
22322249

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+
22332269
spin_lock_init(&pdata->lock);
22342270
spin_lock_init(&pdata->hash_lock);
22352271

@@ -2305,8 +2341,11 @@ static int s5p_aes_probe(struct platform_device *pdev)
23052341
tasklet_kill(&pdata->tasklet);
23062342

23072343
err_irq:
2308-
clk_disable_unprepare(pdata->clk);
2344+
if (pdata->pclk)
2345+
clk_disable_unprepare(pdata->pclk);
23092346

2347+
err_clk:
2348+
clk_disable_unprepare(pdata->clk);
23102349
s5p_dev = NULL;
23112350

23122351
return err;
@@ -2333,6 +2372,9 @@ static int s5p_aes_remove(struct platform_device *pdev)
23332372
pdata->use_hash = false;
23342373
}
23352374

2375+
if (pdata->pclk)
2376+
clk_disable_unprepare(pdata->pclk);
2377+
23362378
clk_disable_unprepare(pdata->clk);
23372379
s5p_dev = NULL;
23382380

0 commit comments

Comments
 (0)