mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-14 12:37:32 +00:00
hw_random: ixp4xx: Turn into a module
Instead of just initializing always, which will invariably create problems on multiplatform builds, turn this driver into a module and pass a resource with the memory location. The device only exist on the IXP46x so we only register the device for the IXP46x SoC. Cc: Deepak Saxena <dsaxena@plexity.net> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
479dfb6d56
commit
854a004305
2 changed files with 40 additions and 21 deletions
|
@ -236,6 +236,27 @@ static struct resource ixp46x_i2c_resources[] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* A single 32-bit register on IXP46x */
|
||||||
|
#define IXP4XX_HWRANDOM_BASE_PHYS 0x70002100
|
||||||
|
|
||||||
|
static struct resource ixp46x_hwrandom_resource[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_HWRANDOM_BASE_PHYS,
|
||||||
|
.end = IXP4XX_HWRANDOM_BASE_PHYS + 0x3,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device ixp46x_hwrandom_device = {
|
||||||
|
.name = "ixp4xx-hwrandom",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
},
|
||||||
|
.resource = ixp46x_hwrandom_resource,
|
||||||
|
.num_resources = ARRAY_SIZE(ixp46x_hwrandom_resource),
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* I2C controller. The IXP46x uses the same block as the IOP3xx, so
|
* I2C controller. The IXP46x uses the same block as the IOP3xx, so
|
||||||
* we just use the same device name.
|
* we just use the same device name.
|
||||||
|
@ -248,7 +269,8 @@ static struct platform_device ixp46x_i2c_controller = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device *ixp46x_devices[] __initdata = {
|
static struct platform_device *ixp46x_devices[] __initdata = {
|
||||||
&ixp46x_i2c_controller
|
&ixp46x_hwrandom_device,
|
||||||
|
&ixp46x_i2c_controller,
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned long ixp4xx_exp_bus_size;
|
unsigned long ixp4xx_exp_bus_size;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/hw_random.h>
|
#include <linux/hw_random.h>
|
||||||
|
@ -36,35 +37,31 @@ static struct hwrng ixp4xx_rng_ops = {
|
||||||
.data_read = ixp4xx_rng_data_read,
|
.data_read = ixp4xx_rng_data_read,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init ixp4xx_rng_init(void)
|
static int ixp4xx_rng_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
void __iomem * rng_base;
|
void __iomem * rng_base;
|
||||||
int err;
|
struct device *dev = &pdev->dev;
|
||||||
|
struct resource *res;
|
||||||
|
|
||||||
if (!cpu_is_ixp46x()) /* includes IXP455 */
|
if (!cpu_is_ixp46x()) /* includes IXP455 */
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
rng_base = ioremap(0x70002100, 4);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (!rng_base)
|
rng_base = devm_ioremap_resource(dev, res);
|
||||||
return -ENOMEM;
|
if (IS_ERR(rng_base))
|
||||||
|
return PTR_ERR(rng_base);
|
||||||
|
|
||||||
ixp4xx_rng_ops.priv = (unsigned long)rng_base;
|
ixp4xx_rng_ops.priv = (unsigned long)rng_base;
|
||||||
err = hwrng_register(&ixp4xx_rng_ops);
|
return devm_hwrng_register(dev, &ixp4xx_rng_ops);
|
||||||
if (err)
|
|
||||||
iounmap(rng_base);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit ixp4xx_rng_exit(void)
|
static struct platform_driver ixp4xx_rng_driver = {
|
||||||
{
|
.driver = {
|
||||||
void __iomem * rng_base = (void __iomem *)ixp4xx_rng_ops.priv;
|
.name = "ixp4xx-hwrandom",
|
||||||
|
},
|
||||||
hwrng_unregister(&ixp4xx_rng_ops);
|
.probe = ixp4xx_rng_probe,
|
||||||
iounmap(rng_base);
|
};
|
||||||
}
|
module_platform_driver(ixp4xx_rng_driver);
|
||||||
|
|
||||||
module_init(ixp4xx_rng_init);
|
|
||||||
module_exit(ixp4xx_rng_exit);
|
|
||||||
|
|
||||||
MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>");
|
MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>");
|
||||||
MODULE_DESCRIPTION("H/W Pseudo-Random Number Generator (RNG) driver for IXP45x/46x");
|
MODULE_DESCRIPTION("H/W Pseudo-Random Number Generator (RNG) driver for IXP45x/46x");
|
||||||
|
|
Loading…
Reference in a new issue