Skip to content

Commit be7ecbd

Browse files
fidomaxLi Yang
authored andcommitted
soc: fsl: qe: convert QE interrupt controller to platform_device
Since 5.13 QE's ucc nodes can't get interrupts from devicetree: ucc@2000 { cell-index = <1>; reg = <0x2000 0x200>; interrupts = <32>; interrupt-parent = <&qeic>; }; Now fw_devlink expects driver to create and probe a struct device for interrupt controller. So lets convert this driver to simple platform_device with probe(). Also use platform_get_ and devm_ family function to get/allocate resources and drop unused .compatible = "qeic". [1] - https://lore.kernel.org/lkml/CAGETcx9PiX==mLxB9PO8Myyk6u2vhPVwTMsA5NkD-ywH5xhusw@mail.gmail.com Fixes: e590474 ("driver core: Set fw_devlink=on by default") Fixes: ea718c6 ("Revert "Revert "driver core: Set fw_devlink=on by default""") Signed-off-by: Maxim Kochetkov <[email protected]> Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> Acked-by: Saravana Kannan <[email protected]> Signed-off-by: Li Yang <[email protected]>
1 parent e73f0f0 commit be7ecbd

File tree

1 file changed

+44
-31
lines changed

1 file changed

+44
-31
lines changed

drivers/soc/fsl/qe/qe_ic.c

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <linux/signal.h>
2424
#include <linux/device.h>
2525
#include <linux/spinlock.h>
26+
#include <linux/platform_device.h>
2627
#include <asm/irq.h>
2728
#include <asm/io.h>
2829
#include <soc/fsl/qe/qe.h>
@@ -404,41 +405,40 @@ static void qe_ic_cascade_muxed_mpic(struct irq_desc *desc)
404405
chip->irq_eoi(&desc->irq_data);
405406
}
406407

407-
static void __init qe_ic_init(struct device_node *node)
408+
static int qe_ic_init(struct platform_device *pdev)
408409
{
410+
struct device *dev = &pdev->dev;
409411
void (*low_handler)(struct irq_desc *desc);
410412
void (*high_handler)(struct irq_desc *desc);
411413
struct qe_ic *qe_ic;
412-
struct resource res;
413-
u32 ret;
414+
struct resource *res;
415+
struct device_node *node = pdev->dev.of_node;
414416

415-
ret = of_address_to_resource(node, 0, &res);
416-
if (ret)
417-
return;
417+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
418+
if (res == NULL) {
419+
dev_err(dev, "no memory resource defined\n");
420+
return -ENODEV;
421+
}
418422

419-
qe_ic = kzalloc(sizeof(*qe_ic), GFP_KERNEL);
423+
qe_ic = devm_kzalloc(dev, sizeof(*qe_ic), GFP_KERNEL);
420424
if (qe_ic == NULL)
421-
return;
425+
return -ENOMEM;
422426

423-
qe_ic->irqhost = irq_domain_add_linear(node, NR_QE_IC_INTS,
424-
&qe_ic_host_ops, qe_ic);
425-
if (qe_ic->irqhost == NULL) {
426-
kfree(qe_ic);
427-
return;
427+
qe_ic->regs = devm_ioremap(dev, res->start, resource_size(res));
428+
if (qe_ic->regs == NULL) {
429+
dev_err(dev, "failed to ioremap() registers\n");
430+
return -ENODEV;
428431
}
429432

430-
qe_ic->regs = ioremap(res.start, resource_size(&res));
431-
432433
qe_ic->hc_irq = qe_ic_irq_chip;
433434

434-
qe_ic->virq_high = irq_of_parse_and_map(node, 0);
435-
qe_ic->virq_low = irq_of_parse_and_map(node, 1);
435+
qe_ic->virq_high = platform_get_irq(pdev, 0);
436+
qe_ic->virq_low = platform_get_irq(pdev, 1);
436437

437-
if (!qe_ic->virq_low) {
438-
printk(KERN_ERR "Failed to map QE_IC low IRQ\n");
439-
kfree(qe_ic);
440-
return;
438+
if (qe_ic->virq_low < 0) {
439+
return -ENODEV;
441440
}
441+
442442
if (qe_ic->virq_high != qe_ic->virq_low) {
443443
low_handler = qe_ic_cascade_low;
444444
high_handler = qe_ic_cascade_high;
@@ -447,6 +447,13 @@ static void __init qe_ic_init(struct device_node *node)
447447
high_handler = NULL;
448448
}
449449

450+
qe_ic->irqhost = irq_domain_add_linear(node, NR_QE_IC_INTS,
451+
&qe_ic_host_ops, qe_ic);
452+
if (qe_ic->irqhost == NULL) {
453+
dev_err(dev, "failed to add irq domain\n");
454+
return -ENODEV;
455+
}
456+
450457
qe_ic_write(qe_ic->regs, QEIC_CICR, 0);
451458

452459
irq_set_handler_data(qe_ic->virq_low, qe_ic);
@@ -456,20 +463,26 @@ static void __init qe_ic_init(struct device_node *node)
456463
irq_set_handler_data(qe_ic->virq_high, qe_ic);
457464
irq_set_chained_handler(qe_ic->virq_high, high_handler);
458465
}
466+
return 0;
459467
}
468+
static const struct of_device_id qe_ic_ids[] = {
469+
{ .compatible = "fsl,qe-ic"},
470+
{ .type = "qeic"},
471+
{},
472+
};
460473

461-
static int __init qe_ic_of_init(void)
474+
static struct platform_driver qe_ic_driver =
462475
{
463-
struct device_node *np;
476+
.driver = {
477+
.name = "qe-ic",
478+
.of_match_table = qe_ic_ids,
479+
},
480+
.probe = qe_ic_init,
481+
};
464482

465-
np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
466-
if (!np) {
467-
np = of_find_node_by_type(NULL, "qeic");
468-
if (!np)
469-
return -ENODEV;
470-
}
471-
qe_ic_init(np);
472-
of_node_put(np);
483+
static int __init qe_ic_of_init(void)
484+
{
485+
platform_driver_register(&qe_ic_driver);
473486
return 0;
474487
}
475488
subsys_initcall(qe_ic_of_init);

0 commit comments

Comments
 (0)