Lines Matching full:inta
92 * they are converted to Global event within INTA to be
93 * received by the same INTA to generate an interrupt.
95 * generating Unmapped Event, we must use the INTA's TI-SCI
118 static u16 ti_sci_inta_get_dev_id(struct ti_sci_inta_irq_domain *inta, u32 hwirq) in ti_sci_inta_get_dev_id() argument
123 if (inta->unmapped_cnt == 0) in ti_sci_inta_get_dev_id()
127 * For devices sending Unmapped Events we must use the INTA's TI-SCI in ti_sci_inta_get_dev_id()
131 for (i = 0; i < inta->unmapped_cnt; i++) { in ti_sci_inta_get_dev_id()
132 if (dev_id == inta->unmapped_dev_ids[i]) { in ti_sci_inta_get_dev_id()
133 dev_id = inta->ti_sci_id; in ti_sci_inta_get_dev_id()
148 struct ti_sci_inta_irq_domain *inta; in ti_sci_inta_irq_handler() local
155 inta = domain->host_data; in ti_sci_inta_irq_handler()
159 val = readq_relaxed(inta->base + vint_desc->vint_id * 0x1000 + in ti_sci_inta_irq_handler()
170 * @inta: IRQ domain corresponding to Interrupt Aggregator
175 static int ti_sci_inta_xlate_irq(struct ti_sci_inta_irq_domain *inta, in ti_sci_inta_xlate_irq() argument
178 struct device_node *np = dev_of_node(&inta->pdev->dev); in ti_sci_inta_xlate_irq()
207 struct ti_sci_inta_irq_domain *inta = domain->host_data; in ti_sci_inta_alloc_parent_irq() local
215 vint_id = ti_sci_get_free_resource(inta->vint); in ti_sci_inta_alloc_parent_irq()
219 p_hwirq = ti_sci_inta_xlate_irq(inta, vint_id); in ti_sci_inta_alloc_parent_irq()
235 parent_node = of_irq_find_parent(dev_of_node(&inta->pdev->dev)); in ti_sci_inta_alloc_parent_irq()
252 dev_err(&inta->pdev->dev, "Parent IRQ allocation failed\n"); in ti_sci_inta_alloc_parent_irq()
259 list_add_tail(&vint_desc->list, &inta->vint_list); in ti_sci_inta_alloc_parent_irq()
267 ti_sci_release_resource(inta->vint, vint_id); in ti_sci_inta_alloc_parent_irq()
283 struct ti_sci_inta_irq_domain *inta = vint_desc->domain->host_data; in ti_sci_inta_alloc_event() local
288 dev_id = ti_sci_inta_get_dev_id(inta, hwirq); in ti_sci_inta_alloc_event()
294 event_desc->global_event = ti_sci_get_free_resource(inta->global_event); in ti_sci_inta_alloc_event()
298 err = inta->sci->ops.rm_irq_ops.set_event_map(inta->sci, in ti_sci_inta_alloc_event()
300 inta->ti_sci_id, in ti_sci_inta_alloc_event()
309 ti_sci_release_resource(inta->global_event, event_desc->global_event); in ti_sci_inta_alloc_event()
314 * ti_sci_inta_alloc_irq() - Allocate an irq within INTA domain
315 * @domain: irq_domain pointer corresponding to INTA
327 struct ti_sci_inta_irq_domain *inta = domain->host_data; in ti_sci_inta_alloc_irq() local
332 mutex_lock(&inta->vint_mutex); in ti_sci_inta_alloc_irq()
333 list_for_each_entry(vint_desc, &inta->vint_list, list) { in ti_sci_inta_alloc_irq()
359 mutex_unlock(&inta->vint_mutex); in ti_sci_inta_alloc_irq()
364 * ti_sci_inta_free_parent_irq() - Free a parent irq to INTA
365 * @inta: Pointer to inta domain.
368 static void ti_sci_inta_free_parent_irq(struct ti_sci_inta_irq_domain *inta, in ti_sci_inta_free_parent_irq() argument
373 ti_sci_release_resource(inta->vint, vint_desc->vint_id); in ti_sci_inta_free_parent_irq()
380 * ti_sci_inta_free_irq() - Free an IRQ within INTA domain
382 * @hwirq: Hwirq number within INTA domain that needs to be freed
388 struct ti_sci_inta_irq_domain *inta; in ti_sci_inta_free_irq() local
392 inta = vint_desc->domain->host_data; in ti_sci_inta_free_irq()
393 dev_id = ti_sci_inta_get_dev_id(inta, hwirq); in ti_sci_inta_free_irq()
395 mutex_lock(&inta->vint_mutex); in ti_sci_inta_free_irq()
396 inta->sci->ops.rm_irq_ops.free_event_map(inta->sci, in ti_sci_inta_free_irq()
398 inta->ti_sci_id, in ti_sci_inta_free_irq()
404 ti_sci_release_resource(inta->global_event, event_desc->global_event); in ti_sci_inta_free_irq()
408 ti_sci_inta_free_parent_irq(inta, vint_desc); in ti_sci_inta_free_irq()
409 mutex_unlock(&inta->vint_mutex); in ti_sci_inta_free_irq()
460 struct ti_sci_inta_irq_domain *inta; in ti_sci_inta_manage_event() local
464 inta = data->domain->host_data; in ti_sci_inta_manage_event()
467 inta->base + vint_desc->vint_id * 0x1000 + offset); in ti_sci_inta_manage_event()
535 .name = "INTA",
588 .name = "MSI-INTA",
612 static int ti_sci_inta_get_unmapped_sources(struct ti_sci_inta_irq_domain *inta) in ti_sci_inta_get_unmapped_sources() argument
614 struct device *dev = &inta->pdev->dev; in ti_sci_inta_get_unmapped_sources()
623 inta->unmapped_dev_ids = devm_kcalloc(dev, count, in ti_sci_inta_get_unmapped_sources()
624 sizeof(*inta->unmapped_dev_ids), in ti_sci_inta_get_unmapped_sources()
626 if (!inta->unmapped_dev_ids) in ti_sci_inta_get_unmapped_sources()
639 inta->unmapped_dev_ids[i++] = dev_id; in ti_sci_inta_get_unmapped_sources()
642 inta->unmapped_cnt = count; in ti_sci_inta_get_unmapped_sources()
651 struct ti_sci_inta_irq_domain *inta; in ti_sci_inta_irq_domain_probe() local
666 inta = devm_kzalloc(dev, sizeof(*inta), GFP_KERNEL); in ti_sci_inta_irq_domain_probe()
667 if (!inta) in ti_sci_inta_irq_domain_probe()
670 inta->pdev = pdev; in ti_sci_inta_irq_domain_probe()
671 inta->sci = devm_ti_sci_get_by_phandle(dev, "ti,sci"); in ti_sci_inta_irq_domain_probe()
672 if (IS_ERR(inta->sci)) in ti_sci_inta_irq_domain_probe()
673 return dev_err_probe(dev, PTR_ERR(inta->sci), in ti_sci_inta_irq_domain_probe()
676 ret = of_property_read_u32(dev->of_node, "ti,sci-dev-id", &inta->ti_sci_id); in ti_sci_inta_irq_domain_probe()
682 inta->vint = devm_ti_sci_get_resource(inta->sci, dev, inta->ti_sci_id, in ti_sci_inta_irq_domain_probe()
684 if (IS_ERR(inta->vint)) { in ti_sci_inta_irq_domain_probe()
686 return PTR_ERR(inta->vint); in ti_sci_inta_irq_domain_probe()
689 inta->global_event = devm_ti_sci_get_resource(inta->sci, dev, inta->ti_sci_id, in ti_sci_inta_irq_domain_probe()
691 if (IS_ERR(inta->global_event)) { in ti_sci_inta_irq_domain_probe()
693 return PTR_ERR(inta->global_event); in ti_sci_inta_irq_domain_probe()
696 inta->base = devm_platform_ioremap_resource(pdev, 0); in ti_sci_inta_irq_domain_probe()
697 if (IS_ERR(inta->base)) in ti_sci_inta_irq_domain_probe()
698 return PTR_ERR(inta->base); in ti_sci_inta_irq_domain_probe()
700 ret = ti_sci_inta_get_unmapped_sources(inta); in ti_sci_inta_irq_domain_probe()
705 ti_sci_get_num_resources(inta->vint), in ti_sci_inta_irq_domain_probe()
706 &ti_sci_inta_irq_domain_ops, inta); in ti_sci_inta_irq_domain_probe()
721 INIT_LIST_HEAD(&inta->vint_list); in ti_sci_inta_irq_domain_probe()
722 mutex_init(&inta->vint_mutex); in ti_sci_inta_irq_domain_probe()
724 dev_info(dev, "Interrupt Aggregator domain %d created\n", inta->ti_sci_id); in ti_sci_inta_irq_domain_probe()
730 { .compatible = "ti,sci-inta", },
738 .name = "ti-sci-inta",