ARM: ixp4xx: Turn the QMGR into a platform device
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>
This commit is contained in:
parent
bc4d7eafb7
commit
81bca32fcc
@ -155,8 +155,14 @@ static struct platform_device ixp4xx_npe_device = {
|
|||||||
.id = -1,
|
.id = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct platform_device ixp4xx_qmgr_device = {
|
||||||
|
.name = "ixp4xx-qmgr",
|
||||||
|
.id = -1,
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *ixp4xx_devices[] __initdata = {
|
static struct platform_device *ixp4xx_devices[] __initdata = {
|
||||||
&ixp4xx_npe_device,
|
&ixp4xx_npe_device,
|
||||||
|
&ixp4xx_qmgr_device,
|
||||||
&ixp4xx_gpio_device,
|
&ixp4xx_gpio_device,
|
||||||
&ixp4xx_udc_device,
|
&ixp4xx_udc_device,
|
||||||
};
|
};
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
#include <linux/soc/ixp4xx/qmgr.h>
|
#include <linux/soc/ixp4xx/qmgr.h>
|
||||||
|
|
||||||
/* FIXME: get rid of these static assigments */
|
/* FIXME: get rid of these static assigments */
|
||||||
@ -288,15 +289,11 @@ void qmgr_release_queue(unsigned int queue)
|
|||||||
module_put(THIS_MODULE);
|
module_put(THIS_MODULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qmgr_init(void)
|
static int ixp4xx_qmgr_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int i, err;
|
int i, err;
|
||||||
irq_handler_t handler1, handler2;
|
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,
|
mem_res = request_mem_region(IXP4XX_QMGR_BASE_PHYS,
|
||||||
IXP4XX_QMGR_REGION_SIZE,
|
IXP4XX_QMGR_REGION_SIZE,
|
||||||
"IXP4xx Queue Manager");
|
"IXP4xx Queue Manager");
|
||||||
@ -355,17 +352,25 @@ error_irq:
|
|||||||
return err;
|
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_QM1, NULL);
|
||||||
free_irq(IRQ_IXP4XX_QM2, NULL);
|
free_irq(IRQ_IXP4XX_QM2, NULL);
|
||||||
synchronize_irq(IRQ_IXP4XX_QM1);
|
synchronize_irq(IRQ_IXP4XX_QM1);
|
||||||
synchronize_irq(IRQ_IXP4XX_QM2);
|
synchronize_irq(IRQ_IXP4XX_QM2);
|
||||||
release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
|
release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(qmgr_init);
|
static struct platform_driver ixp4xx_qmgr_driver = {
|
||||||
module_exit(qmgr_remove);
|
.driver = {
|
||||||
|
.name = "ixp4xx-qmgr",
|
||||||
|
},
|
||||||
|
.probe = ixp4xx_qmgr_probe,
|
||||||
|
.remove = ixp4xx_qmgr_remove,
|
||||||
|
};
|
||||||
|
module_platform_driver(ixp4xx_qmgr_driver);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_AUTHOR("Krzysztof Halasa");
|
MODULE_AUTHOR("Krzysztof Halasa");
|
||||||
|
Loading…
Reference in New Issue
Block a user