unsigned long ixp4xx_exp_bus_size;
 EXPORT_SYMBOL(ixp4xx_exp_bus_size);
 
+static struct platform_device_info ixp_dev_info __initdata = {
+       .name           = "ixp4xx_crypto",
+       .id             = 0,
+       .dma_mask       = DMA_BIT_MASK(32),
+};
+
+static int __init ixp_crypto_register(void)
+{
+       struct platform_device *pdev;
+
+       if (!(~(*IXP4XX_EXP_CFG2) & (IXP4XX_FEATURE_HASH |
+                               IXP4XX_FEATURE_AES | IXP4XX_FEATURE_DES))) {
+               printk(KERN_ERR "ixp_crypto: No HW crypto available\n");
+               return -ENODEV;
+       }
+
+       pdev = platform_device_register_full(&ixp_dev_info);
+       if (IS_ERR(pdev))
+               return PTR_ERR(pdev);
+
+       return 0;
+}
+
 void __init ixp4xx_sys_init(void)
 {
        ixp4xx_exp_bus_size = SZ_16M;
 
        platform_add_devices(ixp4xx_devices, ARRAY_SIZE(ixp4xx_devices));
 
+       if (IS_ENABLED(CONFIG_CRYPTO_DEV_IXP4XX))
+               ixp_crypto_register();
+
        if (cpu_is_ixp46x()) {
                int region;
 
 
 
 static int support_aes = 1;
 
-#define DRIVER_NAME "ixp4xx_crypto"
-
 static struct platform_device *pdev;
 
 static inline dma_addr_t crypt_virt2phys(struct crypt_ctl *virt)
        int ret = -ENODEV;
        u32 msg[2] = { 0, 0 };
 
-       if (! ( ~(*IXP4XX_EXP_CFG2) & (IXP4XX_FEATURE_HASH |
-                               IXP4XX_FEATURE_AES | IXP4XX_FEATURE_DES))) {
-               dev_err(dev, "ixp_crypto: No HW crypto available\n");
-               return ret;
-       }
        npe_c = npe_request(NPE_ID);
        if (!npe_c)
                return ret;
 
 #define IXP_POSTFIX "-ixp4xx"
 
-static const struct platform_device_info ixp_dev_info __initdata = {
-       .name           = DRIVER_NAME,
-       .id             = 0,
-       .dma_mask       = DMA_BIT_MASK(32),
-};
-
-static int __init ixp_module_init(void)
+static int ixp_crypto_probe(struct platform_device *_pdev)
 {
        int num = ARRAY_SIZE(ixp4xx_algos);
        int i, err;
 
-       pdev = platform_device_register_full(&ixp_dev_info);
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
+       pdev = _pdev;
 
        err = init_ixp_crypto(&pdev->dev);
-       if (err) {
-               platform_device_unregister(pdev);
+       if (err)
                return err;
-       }
+
        for (i = 0; i < num; i++) {
                struct skcipher_alg *cra = &ixp4xx_algos[i].crypto;
 
        return 0;
 }
 
-static void __exit ixp_module_exit(void)
+static int ixp_crypto_remove(struct platform_device *pdev)
 {
        int num = ARRAY_SIZE(ixp4xx_algos);
        int i;
                        crypto_unregister_skcipher(&ixp4xx_algos[i].crypto);
        }
        release_ixp_crypto(&pdev->dev);
-       platform_device_unregister(pdev);
+
+       return 0;
 }
 
-module_init(ixp_module_init);
-module_exit(ixp_module_exit);
+static struct platform_driver ixp_crypto_driver = {
+       .probe = ixp_crypto_probe,
+       .remove = ixp_crypto_remove,
+       .driver = { .name = "ixp4xx_crypto" },
+};
+module_platform_driver(ixp_crypto_driver);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Christian Hohnstaedt <chohnstaedt@innominate.com>");