Lines Matching +full:msi +full:- +full:base +full:- +full:spi

4  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
11 #define pr_fmt(fmt) "GIC-ODMI: " fmt
17 #include <linux/msi.h>
20 #include <dt-bindings/interrupt-controller/arm-gic.h>
35 #define NODMIS_MASK (NODMIS_PER_FRAME - 1)
39 void __iomem *base; member
56 if (WARN_ON(d->hwirq >= odmis_count * NODMIS_PER_FRAME)) in odmi_compose_msi_msg()
59 odmi = &odmis[d->hwirq >> NODMIS_SHIFT]; in odmi_compose_msi_msg()
60 odmin = d->hwirq & NODMIS_MASK; in odmi_compose_msi_msg()
62 addr = odmi->res.start + GICP_ODMIN_SET; in odmi_compose_msi_msg()
64 msg->address_hi = upper_32_bits(addr); in odmi_compose_msi_msg()
65 msg->address_lo = lower_32_bits(addr); in odmi_compose_msi_msg()
66 msg->data = odmin << GICP_ODMI_INT_NUM_SHIFT; in odmi_compose_msi_msg()
91 return -ENOSPC; in odmi_irq_domain_alloc()
100 fwspec.fwnode = domain->parent->fwnode; in odmi_irq_domain_alloc()
103 fwspec.param[1] = odmi->spi_base - 32 + odmin; in odmi_irq_domain_alloc()
116 d = irq_domain_get_irq_data(domain->parent, virq); in odmi_irq_domain_alloc()
117 d->chip->irq_set_type(d, IRQ_TYPE_EDGE_RISING); in odmi_irq_domain_alloc()
130 if (d->hwirq >= odmis_count * NODMIS_PER_FRAME) { in odmi_irq_domain_free()
131 pr_err("Failed to teardown msi. Invalid hwirq %lu\n", d->hwirq); in odmi_irq_domain_free()
137 /* Actually free the MSI */ in odmi_irq_domain_free()
139 __clear_bit(d->hwirq, odmis_bm); in odmi_irq_domain_free()
167 if (of_property_read_u32(node, "marvell,odmi-frames", &odmis_count)) in mvebu_odmi_init()
168 return -EINVAL; in mvebu_odmi_init()
172 return -ENOMEM; in mvebu_odmi_init()
177 ret = -ENOMEM; in mvebu_odmi_init()
184 ret = of_address_to_resource(node, i, &odmi->res); in mvebu_odmi_init()
188 odmi->base = of_io_request_and_map(node, i, "odmi"); in mvebu_odmi_init()
189 if (IS_ERR(odmi->base)) { in mvebu_odmi_init()
190 ret = PTR_ERR(odmi->base); in mvebu_odmi_init()
194 if (of_property_read_u32_index(node, "marvell,spi-base", in mvebu_odmi_init()
195 i, &odmi->spi_base)) { in mvebu_odmi_init()
196 ret = -EINVAL; in mvebu_odmi_init()
205 ret = -ENOMEM; in mvebu_odmi_init()
209 inner_domain->parent = irq_find_host(parent); in mvebu_odmi_init()
215 ret = -ENOMEM; in mvebu_odmi_init()
227 if (odmi->base && !IS_ERR(odmi->base)) in mvebu_odmi_init()
228 iounmap(odmis[i].base); in mvebu_odmi_init()
236 IRQCHIP_DECLARE(mvebu_odmi, "marvell,odmi-controller", mvebu_odmi_init);