Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3341323b authored by Alexander Clouter's avatar Alexander Clouter Committed by Herbert Xu
Browse files

hwrng: timeriomem - Use phys address rather than virt



There is no ioremap'ing or anything in timeriomem-rng.c as I foolishly
used already remapped virtual addresses instead of passing the physical
address to be polled.

This patch fixes this flaw and lets developers do the Right Thing(tm).

Signed-off-by: default avatarAlexander Clouter <alex@digriz.org.uk>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent be0ea696
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -90,10 +90,30 @@ static struct hwrng timeriomem_rng_ops = {

static int __init timeriomem_rng_probe(struct platform_device *pdev)
{
	struct resource *res, *mem;
	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->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
		&& usecs_to_jiffies(timeriomem_rng_data->period) > 0) {
		timeriomem_rng_timer.expires = jiffies;
@@ -104,23 +124,34 @@ static int __init timeriomem_rng_probe(struct platform_device *pdev)
	timeriomem_rng_data->present = 1;

	ret = hwrng_register(&timeriomem_rng_ops);
	if (ret) {
		dev_err(&pdev->dev, "problem registering\n");
		return ret;
	}
	if (ret)
		goto err_register;

	dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n",
			timeriomem_rng_data->address,
			timeriomem_rng_data->period);

	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)
{
	struct resource *mem = dev_get_drvdata(&pdev->dev);

	del_timer_sync(&timeriomem_rng_timer);
	hwrng_unregister(&timeriomem_rng_ops);

	iounmap(timeriomem_rng_data->address);
	release_resource(mem);

	return 0;
}

+1 −1
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ struct timeriomem_rng_data {
	struct completion	completion;
	unsigned int		present:1;

	u32 __iomem		*address;
	void __iomem		*address;

	/* measures in usecs */
	unsigned int		period;