diff options
Diffstat (limited to 'drivers/char/hw_random/pasemi-rng.c')
| -rw-r--r-- | drivers/char/hw_random/pasemi-rng.c | 54 |
1 files changed, 27 insertions, 27 deletions
diff --git a/drivers/char/hw_random/pasemi-rng.c b/drivers/char/hw_random/pasemi-rng.c index fa6040b6c8f..c66279bb6ef 100644 --- a/drivers/char/hw_random/pasemi-rng.c +++ b/drivers/char/hw_random/pasemi-rng.c @@ -23,7 +23,9 @@ #include <linux/kernel.h> #include <linux/platform_device.h> #include <linux/hw_random.h> -#include <asm/of_platform.h> +#include <linux/delay.h> +#include <linux/of_address.h> +#include <linux/of_platform.h> #include <asm/io.h> #define SDCRNG_CTL_REG 0x00 @@ -41,12 +43,19 @@ #define MODULE_NAME "pasemi_rng" -static int pasemi_rng_data_present(struct hwrng *rng) +static int pasemi_rng_data_present(struct hwrng *rng, int wait) { void __iomem *rng_regs = (void __iomem *)rng->priv; - - return (in_le32(rng_regs + SDCRNG_CTL_REG) - & SDCRNG_CTL_FVLD_M) ? 1 : 0; + int data, i; + + for (i = 0; i < 20; i++) { + data = (in_le32(rng_regs + SDCRNG_CTL_REG) + & SDCRNG_CTL_FVLD_M) ? 1 : 0; + if (data || !wait) + break; + udelay(10); + } + return data; } static int pasemi_rng_data_read(struct hwrng *rng, u32 *data) @@ -86,11 +95,10 @@ static struct hwrng pasemi_rng = { .data_read = pasemi_rng_data_read, }; -static int __devinit rng_probe(struct of_device *ofdev, - const struct of_device_id *match) +static int rng_probe(struct platform_device *ofdev) { void __iomem *rng_regs; - struct device_node *rng_np = ofdev->node; + struct device_node *rng_np = ofdev->dev.of_node; struct resource res; int err = 0; @@ -115,7 +123,7 @@ static int __devinit rng_probe(struct of_device *ofdev, return err; } -static int __devexit rng_remove(struct of_device *dev) +static int rng_remove(struct platform_device *dev) { void __iomem *rng_regs = (void __iomem *)pasemi_rng.priv; @@ -126,30 +134,22 @@ static int __devexit rng_remove(struct of_device *dev) } static struct of_device_id rng_match[] = { - { - .compatible = "1682m-rng", - }, - {}, + { .compatible = "1682m-rng", }, + { .compatible = "pasemi,pwrficient-rng", }, + { }, }; -static struct of_platform_driver rng_driver = { - .name = "pasemi-rng", - .match_table = rng_match, +static struct platform_driver rng_driver = { + .driver = { + .name = "pasemi-rng", + .owner = THIS_MODULE, + .of_match_table = rng_match, + }, .probe = rng_probe, .remove = rng_remove, }; -static int __init rng_init(void) -{ - return of_register_platform_driver(&rng_driver); -} -module_init(rng_init); - -static void __exit rng_exit(void) -{ - of_unregister_platform_driver(&rng_driver); -} -module_exit(rng_exit); +module_platform_driver(rng_driver); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>"); |
