Lines Matching +full:imx +full:- +full:irqsteer

1 // SPDX-License-Identifier: GPL-2.0+
44 return (data->reg_num - irqnum / 32 - 1); in imx_irqsteer_get_reg_index()
49 struct irqsteer_data *data = d->chip_data; in imx_irqsteer_irq_unmask()
50 int idx = imx_irqsteer_get_reg_index(data, d->hwirq); in imx_irqsteer_irq_unmask()
54 raw_spin_lock_irqsave(&data->lock, flags); in imx_irqsteer_irq_unmask()
55 val = readl_relaxed(data->regs + CHANMASK(idx, data->reg_num)); in imx_irqsteer_irq_unmask()
56 val |= BIT(d->hwirq % 32); in imx_irqsteer_irq_unmask()
57 writel_relaxed(val, data->regs + CHANMASK(idx, data->reg_num)); in imx_irqsteer_irq_unmask()
58 raw_spin_unlock_irqrestore(&data->lock, flags); in imx_irqsteer_irq_unmask()
63 struct irqsteer_data *data = d->chip_data; in imx_irqsteer_irq_mask()
64 int idx = imx_irqsteer_get_reg_index(data, d->hwirq); in imx_irqsteer_irq_mask()
68 raw_spin_lock_irqsave(&data->lock, flags); in imx_irqsteer_irq_mask()
69 val = readl_relaxed(data->regs + CHANMASK(idx, data->reg_num)); in imx_irqsteer_irq_mask()
70 val &= ~BIT(d->hwirq % 32); in imx_irqsteer_irq_mask()
71 writel_relaxed(val, data->regs + CHANMASK(idx, data->reg_num)); in imx_irqsteer_irq_mask()
72 raw_spin_unlock_irqrestore(&data->lock, flags); in imx_irqsteer_irq_mask()
76 .name = "irqsteer",
85 irq_set_chip_data(irq, h->host_data); in imx_irqsteer_irq_map()
100 for (i = 0; i < data->irq_count; i++) { in imx_irqsteer_get_hwirq_base()
101 if (data->irq[i] == irq) in imx_irqsteer_get_hwirq_base()
105 return -EINVAL; in imx_irqsteer_get_hwirq_base()
129 if (hwirq >= data->reg_num * 32) in imx_irqsteer_irq_handler()
132 irqmap = readl_relaxed(data->regs + in imx_irqsteer_irq_handler()
133 CHANSTATUS(idx, data->reg_num)); in imx_irqsteer_irq_handler()
136 generic_handle_domain_irq(data->domain, pos + hwirq); in imx_irqsteer_irq_handler()
144 struct device_node *np = pdev->dev.of_node; in imx_irqsteer_probe()
149 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in imx_irqsteer_probe()
151 return -ENOMEM; in imx_irqsteer_probe()
153 data->regs = devm_platform_ioremap_resource(pdev, 0); in imx_irqsteer_probe()
154 if (IS_ERR(data->regs)) { in imx_irqsteer_probe()
155 dev_err(&pdev->dev, "failed to initialize reg\n"); in imx_irqsteer_probe()
156 return PTR_ERR(data->regs); in imx_irqsteer_probe()
159 data->ipg_clk = devm_clk_get(&pdev->dev, "ipg"); in imx_irqsteer_probe()
160 if (IS_ERR(data->ipg_clk)) in imx_irqsteer_probe()
161 return dev_err_probe(&pdev->dev, PTR_ERR(data->ipg_clk), in imx_irqsteer_probe()
164 raw_spin_lock_init(&data->lock); in imx_irqsteer_probe()
166 ret = of_property_read_u32(np, "fsl,num-irqs", &irqs_num); in imx_irqsteer_probe()
169 ret = of_property_read_u32(np, "fsl,channel", &data->channel); in imx_irqsteer_probe()
177 data->irq_count = DIV_ROUND_UP(irqs_num, 64); in imx_irqsteer_probe()
178 data->reg_num = irqs_num / 32; in imx_irqsteer_probe()
181 data->saved_reg = devm_kzalloc(&pdev->dev, in imx_irqsteer_probe()
182 sizeof(u32) * data->reg_num, in imx_irqsteer_probe()
184 if (!data->saved_reg) in imx_irqsteer_probe()
185 return -ENOMEM; in imx_irqsteer_probe()
188 ret = clk_prepare_enable(data->ipg_clk); in imx_irqsteer_probe()
190 dev_err(&pdev->dev, "failed to enable ipg clk: %d\n", ret); in imx_irqsteer_probe()
195 writel_relaxed(BIT(data->channel), data->regs + CHANCTRL); in imx_irqsteer_probe()
197 data->domain = irq_domain_add_linear(np, data->reg_num * 32, in imx_irqsteer_probe()
199 if (!data->domain) { in imx_irqsteer_probe()
200 dev_err(&pdev->dev, "failed to create IRQ domain\n"); in imx_irqsteer_probe()
201 ret = -ENOMEM; in imx_irqsteer_probe()
204 irq_domain_set_pm_device(data->domain, &pdev->dev); in imx_irqsteer_probe()
206 if (!data->irq_count || data->irq_count > CHAN_MAX_OUTPUT_INT) { in imx_irqsteer_probe()
207 ret = -EINVAL; in imx_irqsteer_probe()
211 for (i = 0; i < data->irq_count; i++) { in imx_irqsteer_probe()
212 data->irq[i] = irq_of_parse_and_map(np, i); in imx_irqsteer_probe()
213 if (!data->irq[i]) { in imx_irqsteer_probe()
214 ret = -EINVAL; in imx_irqsteer_probe()
218 irq_set_chained_handler_and_data(data->irq[i], in imx_irqsteer_probe()
225 pm_runtime_set_active(&pdev->dev); in imx_irqsteer_probe()
226 pm_runtime_enable(&pdev->dev); in imx_irqsteer_probe()
230 clk_disable_unprepare(data->ipg_clk); in imx_irqsteer_probe()
239 for (i = 0; i < irqsteer_data->irq_count; i++) in imx_irqsteer_remove()
240 irq_set_chained_handler_and_data(irqsteer_data->irq[i], in imx_irqsteer_remove()
243 irq_domain_remove(irqsteer_data->domain); in imx_irqsteer_remove()
245 clk_disable_unprepare(irqsteer_data->ipg_clk); in imx_irqsteer_remove()
255 for (i = 0; i < data->reg_num; i++) in imx_irqsteer_save_regs()
256 data->saved_reg[i] = readl_relaxed(data->regs + in imx_irqsteer_save_regs()
257 CHANMASK(i, data->reg_num)); in imx_irqsteer_save_regs()
264 writel_relaxed(BIT(data->channel), data->regs + CHANCTRL); in imx_irqsteer_restore_regs()
265 for (i = 0; i < data->reg_num; i++) in imx_irqsteer_restore_regs()
266 writel_relaxed(data->saved_reg[i], in imx_irqsteer_restore_regs()
267 data->regs + CHANMASK(i, data->reg_num)); in imx_irqsteer_restore_regs()
275 clk_disable_unprepare(irqsteer_data->ipg_clk); in imx_irqsteer_suspend()
285 ret = clk_prepare_enable(irqsteer_data->ipg_clk); in imx_irqsteer_resume()
304 { .compatible = "fsl,imx-irqsteer", },
310 .name = "imx-irqsteer",