Lines Matching +full:subset +full:- +full:of
5 * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
7 * This file is licensed under the terms of the GNU General Public
9 * warranty of any kind, whether express or implied.
23 #include "irq-msi-lib.h"
25 #include <dt-bindings/interrupt-controller/mvebu-icu.h>
71 struct msi_domain_info *info = d->host_data; in mvebu_icu_translate()
72 struct mvebu_icu_msi_data *msi_data = info->chip_data; in mvebu_icu_translate()
73 struct mvebu_icu *icu = msi_data->icu; in mvebu_icu_translate()
75 /* Check the count of the parameters in dt */ in mvebu_icu_translate()
76 if (WARN_ON(fwspec->param_count != param_count)) { in mvebu_icu_translate()
77 dev_err(icu->dev, "wrong ICU parameter count %d\n", in mvebu_icu_translate()
78 fwspec->param_count); in mvebu_icu_translate()
79 return -EINVAL; in mvebu_icu_translate()
83 *hwirq = fwspec->param[1]; in mvebu_icu_translate()
84 *type = fwspec->param[2] & IRQ_TYPE_SENSE_MASK; in mvebu_icu_translate()
85 if (fwspec->param[0] != ICU_GRP_NSR) { in mvebu_icu_translate()
86 dev_err(icu->dev, "wrong ICU group type %x\n", in mvebu_icu_translate()
87 fwspec->param[0]); in mvebu_icu_translate()
88 return -EINVAL; in mvebu_icu_translate()
91 *hwirq = fwspec->param[0]; in mvebu_icu_translate()
92 *type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK; in mvebu_icu_translate()
100 if (msi_data->subset_data->icu_group == ICU_GRP_SEI) in mvebu_icu_translate()
105 dev_err(icu->dev, "invalid interrupt number %ld\n", *hwirq); in mvebu_icu_translate()
106 return -EINVAL; in mvebu_icu_translate()
116 const struct mvebu_icu_subset_data *subset = msi_data->subset_data; in mvebu_icu_init() local
118 if (atomic_cmpxchg(&msi_data->initialized, false, true)) in mvebu_icu_init()
122 writel_relaxed(msg[0].address_hi, icu->base + subset->offset_set_ah); in mvebu_icu_init()
123 writel_relaxed(msg[0].address_lo, icu->base + subset->offset_set_al); in mvebu_icu_init()
125 if (subset->icu_group != ICU_GRP_NSR) in mvebu_icu_init()
128 /* Set 'CLEAR' ICU SPI message address in AP (level-MSI only) */ in mvebu_icu_init()
129 writel_relaxed(msg[1].address_hi, icu->base + subset->offset_clr_ah); in mvebu_icu_init()
130 writel_relaxed(msg[1].address_lo, icu->base + subset->offset_clr_al); in mvebu_icu_init()
136 irq_domain_set_hwirq_and_chip(domain, virq, hwirq, info->chip, info->chip_data); in mvebu_icu_msi_init()
142 arg->desc = desc; in mvebu_icu_set_desc()
143 arg->hwirq = (u32)desc->data.icookie.value; in mvebu_icu_set_desc()
148 struct mvebu_icu_msi_data *msi_data = d->chip_data; in mvebu_icu_write_msi_msg()
149 unsigned int icu_group = msi_data->subset_data->icu_group; in mvebu_icu_write_msi_msg()
151 struct mvebu_icu *icu = msi_data->icu; in mvebu_icu_write_msi_msg()
155 if (msg->address_lo || msg->address_hi) { in mvebu_icu_write_msi_msg()
159 icu_int = msg->data | ICU_INT_ENABLE; in mvebu_icu_write_msi_msg()
160 type = (unsigned int)(desc->data.icookie.value >> 32); in mvebu_icu_write_msi_msg()
165 /* De-configure the ICU */ in mvebu_icu_write_msi_msg()
169 writel_relaxed(icu_int, icu->base + ICU_INT_CFG(d->hwirq)); in mvebu_icu_write_msi_msg()
178 * configured (regardless of which port is actually in use). in mvebu_icu_write_msi_msg()
180 if (d->hwirq == ICU_SATA0_ICU_ID || d->hwirq == ICU_SATA1_ICU_ID) { in mvebu_icu_write_msi_msg()
181 writel_relaxed(icu_int, icu->base + ICU_INT_CFG(ICU_SATA0_ICU_ID)); in mvebu_icu_write_msi_msg()
182 writel_relaxed(icu_int, icu->base + ICU_INT_CFG(ICU_SATA1_ICU_ID)); in mvebu_icu_write_msi_msg()
188 .name = "ICU-NSR",
212 .name = "ICU-SEI",
250 .compatible = "marvell,cp110-icu-nsr",
254 .compatible = "marvell,cp110-icu-sei",
264 struct device *dev = &pdev->dev; in mvebu_icu_subset_probe()
269 return -ENOMEM; in mvebu_icu_subset_probe()
272 msi_data->icu = dev_get_drvdata(dev); in mvebu_icu_subset_probe()
273 msi_data->subset_data = &mvebu_icu_nsr_subset_data; in mvebu_icu_subset_probe()
275 msi_data->icu = dev_get_drvdata(dev->parent); in mvebu_icu_subset_probe()
276 msi_data->subset_data = of_device_get_match_data(dev); in mvebu_icu_subset_probe()
279 dev->msi.domain = of_msi_get_domain(dev, dev->of_node, DOMAIN_BUS_PLATFORM_MSI); in mvebu_icu_subset_probe()
280 if (!dev->msi.domain) in mvebu_icu_subset_probe()
281 return -EPROBE_DEFER; in mvebu_icu_subset_probe()
283 if (!irq_domain_get_of_node(dev->msi.domain)) in mvebu_icu_subset_probe()
284 return -ENODEV; in mvebu_icu_subset_probe()
286 sei = msi_data->subset_data->icu_group == ICU_GRP_SEI; in mvebu_icu_subset_probe()
292 return -ENOMEM; in mvebu_icu_subset_probe()
301 .name = "mvebu-icu-subset",
312 icu = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_icu), in mvebu_icu_probe()
315 return -ENOMEM; in mvebu_icu_probe()
317 icu->dev = &pdev->dev; in mvebu_icu_probe()
319 icu->base = devm_platform_ioremap_resource(pdev, 0); in mvebu_icu_probe()
320 if (IS_ERR(icu->base)) in mvebu_icu_probe()
321 return PTR_ERR(icu->base); in mvebu_icu_probe()
325 * the probe of the NSR interrupts side. in mvebu_icu_probe()
330 if (!of_get_child_count(pdev->dev.of_node)) in mvebu_icu_probe()
334 * Clean all ICU interrupts of type NSR and SEI, required to in mvebu_icu_probe()
340 icu_int = readl_relaxed(icu->base + ICU_INT_CFG(i)); in mvebu_icu_probe()
346 writel_relaxed(0x0, icu->base + ICU_INT_CFG(i)); in mvebu_icu_probe()
354 return devm_of_platform_populate(&pdev->dev); in mvebu_icu_probe()
358 { .compatible = "marvell,cp110-icu", },
365 .name = "mvebu-icu",