}
 };
 
+/* 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
  * we just use the same device name.
 };
 
 static struct platform_device *ixp46x_devices[] __initdata = {
-       &ixp46x_i2c_controller
+       &ixp46x_hwrandom_device,
+       &ixp46x_i2c_controller,
 };
 
 unsigned long ixp4xx_exp_bus_size;
 
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
+#include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/bitops.h>
 #include <linux/hw_random.h>
        .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;
-       int err;
+       struct device *dev = &pdev->dev;
+       struct resource *res;
 
        if (!cpu_is_ixp46x()) /* includes IXP455 */
                return -ENOSYS;
 
-       rng_base = ioremap(0x70002100, 4);
-       if (!rng_base)
-               return -ENOMEM;
-       ixp4xx_rng_ops.priv = (unsigned long)rng_base;
-       err = hwrng_register(&ixp4xx_rng_ops);
-       if (err)
-               iounmap(rng_base);
-
-       return err;
-}
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       rng_base = devm_ioremap_resource(dev, res);
+       if (IS_ERR(rng_base))
+               return PTR_ERR(rng_base);
 
-static void __exit ixp4xx_rng_exit(void)
-{
-       void __iomem * rng_base = (void __iomem *)ixp4xx_rng_ops.priv;
-
-       hwrng_unregister(&ixp4xx_rng_ops);
-       iounmap(rng_base);
+       ixp4xx_rng_ops.priv = (unsigned long)rng_base;
+       return devm_hwrng_register(dev, &ixp4xx_rng_ops);
 }
 
-module_init(ixp4xx_rng_init);
-module_exit(ixp4xx_rng_exit);
+static struct platform_driver ixp4xx_rng_driver = {
+       .driver = {
+               .name = "ixp4xx-hwrandom",
+       },
+       .probe = ixp4xx_rng_probe,
+};
+module_platform_driver(ixp4xx_rng_driver);
 
 MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>");
 MODULE_DESCRIPTION("H/W Pseudo-Random Number Generator (RNG) driver for IXP45x/46x");