Commit c54c4dec authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
  crypto: ixp4xx - Fix handling of chained sg buffers
  crypto: shash - Fix unaligned calculation with short length
  hwrng: timeriomem - Use phys address rather than virt
parents 5de1ccbe 0d44dc59
...@@ -77,6 +77,9 @@ static int shash_update_unaligned(struct shash_desc *desc, const u8 *data, ...@@ -77,6 +77,9 @@ static int shash_update_unaligned(struct shash_desc *desc, const u8 *data,
u8 buf[shash_align_buffer_size(unaligned_len, alignmask)] u8 buf[shash_align_buffer_size(unaligned_len, alignmask)]
__attribute__ ((aligned)); __attribute__ ((aligned));
if (unaligned_len > len)
unaligned_len = len;
memcpy(buf, data, unaligned_len); memcpy(buf, data, unaligned_len);
return shash->update(desc, buf, unaligned_len) ?: return shash->update(desc, buf, unaligned_len) ?:
......
...@@ -90,10 +90,30 @@ static struct hwrng timeriomem_rng_ops = { ...@@ -90,10 +90,30 @@ static struct hwrng timeriomem_rng_ops = {
static int __init timeriomem_rng_probe(struct platform_device *pdev) static int __init timeriomem_rng_probe(struct platform_device *pdev)
{ {
struct resource *res, *mem;
int ret; int ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENOENT;
mem = request_mem_region(res->start, res->end - res->start + 1,
pdev->name);
if (mem == NULL)
return -EBUSY;
dev_set_drvdata(&pdev->dev, mem);
timeriomem_rng_data = pdev->dev.platform_data; timeriomem_rng_data = pdev->dev.platform_data;
timeriomem_rng_data->address = ioremap(res->start,
res->end - res->start + 1);
if (!timeriomem_rng_data->address) {
ret = -ENOMEM;
goto err_ioremap;
}
if (timeriomem_rng_data->period != 0 if (timeriomem_rng_data->period != 0
&& usecs_to_jiffies(timeriomem_rng_data->period) > 0) { && usecs_to_jiffies(timeriomem_rng_data->period) > 0) {
timeriomem_rng_timer.expires = jiffies; timeriomem_rng_timer.expires = jiffies;
...@@ -104,23 +124,34 @@ static int __init timeriomem_rng_probe(struct platform_device *pdev) ...@@ -104,23 +124,34 @@ static int __init timeriomem_rng_probe(struct platform_device *pdev)
timeriomem_rng_data->present = 1; timeriomem_rng_data->present = 1;
ret = hwrng_register(&timeriomem_rng_ops); ret = hwrng_register(&timeriomem_rng_ops);
if (ret) { if (ret)
dev_err(&pdev->dev, "problem registering\n"); goto err_register;
return ret;
}
dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n", dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n",
timeriomem_rng_data->address, timeriomem_rng_data->address,
timeriomem_rng_data->period); timeriomem_rng_data->period);
return 0; return 0;
err_register:
dev_err(&pdev->dev, "problem registering\n");
iounmap(timeriomem_rng_data->address);
err_ioremap:
release_resource(mem);
return ret;
} }
static int __devexit timeriomem_rng_remove(struct platform_device *pdev) static int __devexit timeriomem_rng_remove(struct platform_device *pdev)
{ {
struct resource *mem = dev_get_drvdata(&pdev->dev);
del_timer_sync(&timeriomem_rng_timer); del_timer_sync(&timeriomem_rng_timer);
hwrng_unregister(&timeriomem_rng_ops); hwrng_unregister(&timeriomem_rng_ops);
iounmap(timeriomem_rng_data->address);
release_resource(mem);
return 0; return 0;
} }
......
This diff is collapsed.
...@@ -14,7 +14,7 @@ struct timeriomem_rng_data { ...@@ -14,7 +14,7 @@ struct timeriomem_rng_data {
struct completion completion; struct completion completion;
unsigned int present:1; unsigned int present:1;
u32 __iomem *address; void __iomem *address;
/* measures in usecs */ /* measures in usecs */
unsigned int period; unsigned int period;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment