]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ARM: ixp4xx: Turn the QMGR into a platform device
authorLinus Walleij <linus.walleij@linaro.org>
Sun, 10 Feb 2019 16:14:10 +0000 (17:14 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 23 Apr 2019 14:02:15 +0000 (16:02 +0200)
Instead of registering everything related to the QMGR
unconditionally in the module_init() call (which will
never work with multiplatform) create a platform device
and probe the QMGR like any other device.

Put the device second in the list of devices added for
the platform so it is there when the dependent network
and crypto drivers probe later on.

This probe() path will not be taken unconditionally on
device tree boots, so remove the DT guard.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
arch/arm/mach-ixp4xx/common.c
drivers/soc/ixp4xx/ixp4xx-qmgr.c

index e7789d06c39b19207ed7abcc3ac0e7e85c7b718c..cdcd6d6b6d3db64ee88f80ec158ee6ae2897da59 100644 (file)
@@ -155,8 +155,14 @@ static struct platform_device ixp4xx_npe_device = {
        .id             = -1,
 };
 
+static struct platform_device ixp4xx_qmgr_device = {
+       .name           = "ixp4xx-qmgr",
+       .id             = -1,
+};
+
 static struct platform_device *ixp4xx_devices[] __initdata = {
        &ixp4xx_npe_device,
+       &ixp4xx_qmgr_device,
        &ixp4xx_gpio_device,
        &ixp4xx_udc_device,
 };
index 1bed048924bbb9103cf92a7cdc04838a6b202851..133914e99aeb9eda01b26fe1ccee904164c15a88 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/platform_device.h>
 #include <linux/soc/ixp4xx/qmgr.h>
 
 /* FIXME: get rid of these static assigments */
@@ -288,15 +289,11 @@ void qmgr_release_queue(unsigned int queue)
        module_put(THIS_MODULE);
 }
 
-static int qmgr_init(void)
+static int ixp4xx_qmgr_probe(struct platform_device *pdev)
 {
        int i, err;
        irq_handler_t handler1, handler2;
 
-       /* This driver does not work with device tree */
-       if (of_have_populated_dt())
-               return -ENODEV;
-
        mem_res = request_mem_region(IXP4XX_QMGR_BASE_PHYS,
                                     IXP4XX_QMGR_REGION_SIZE,
                                     "IXP4xx Queue Manager");
@@ -355,17 +352,25 @@ static int qmgr_init(void)
        return err;
 }
 
-static void qmgr_remove(void)
+static int ixp4xx_qmgr_remove(struct platform_device *pdev)
 {
        free_irq(IRQ_IXP4XX_QM1, NULL);
        free_irq(IRQ_IXP4XX_QM2, NULL);
        synchronize_irq(IRQ_IXP4XX_QM1);
        synchronize_irq(IRQ_IXP4XX_QM2);
        release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
+
+       return 0;
 }
 
-module_init(qmgr_init);
-module_exit(qmgr_remove);
+static struct platform_driver ixp4xx_qmgr_driver = {
+       .driver = {
+               .name           = "ixp4xx-qmgr",
+       },
+       .probe = ixp4xx_qmgr_probe,
+       .remove = ixp4xx_qmgr_remove,
+};
+module_platform_driver(ixp4xx_qmgr_driver);
 
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Krzysztof Halasa");