Lines Matching +full:clk +full:- +full:source

1 // SPDX-License-Identifier: GPL-2.0
7 * interrupt source # 0 +---->| |
9 * interrupt source # 1 +++-->| |
10 * ... | | | channel # 0 |--------->interrupt out # 0
13 * interrupt source # X-1 +++-->|________________|
17 * +---->| |
19 * | +-->| |
20 * | | | | channel # 1 |--------->interrupt out # 1
30 * +---->| |
32 * +-->| |
33 * | | channel # N |--------->interrupt out # N
40 * X: Interrupt Source Number for each channel (X=32)
47 #include <linux/clk.h>
74 struct clk *ipg_clk;
81 struct intmux_irqchip_data *irqchip_data = d->chip_data; in imx_intmux_irq_mask()
82 int idx = irqchip_data->chanidx; in imx_intmux_irq_mask()
89 raw_spin_lock_irqsave(&data->lock, flags); in imx_intmux_irq_mask()
90 reg = data->regs + CHANIER(idx); in imx_intmux_irq_mask()
92 /* disable the interrupt source of this channel */ in imx_intmux_irq_mask()
93 val &= ~BIT(d->hwirq); in imx_intmux_irq_mask()
95 raw_spin_unlock_irqrestore(&data->lock, flags); in imx_intmux_irq_mask()
100 struct intmux_irqchip_data *irqchip_data = d->chip_data; in imx_intmux_irq_unmask()
101 int idx = irqchip_data->chanidx; in imx_intmux_irq_unmask()
108 raw_spin_lock_irqsave(&data->lock, flags); in imx_intmux_irq_unmask()
109 reg = data->regs + CHANIER(idx); in imx_intmux_irq_unmask()
111 /* enable the interrupt source of this channel */ in imx_intmux_irq_unmask()
112 val |= BIT(d->hwirq); in imx_intmux_irq_unmask()
114 raw_spin_unlock_irqrestore(&data->lock, flags); in imx_intmux_irq_unmask()
126 struct intmux_irqchip_data *data = h->host_data; in imx_intmux_irq_map()
129 irq_set_chip_and_handler(irq, &data->chip, handle_level_irq); in imx_intmux_irq_map()
138 struct intmux_irqchip_data *irqchip_data = d->host_data; in imx_intmux_irq_xlate()
139 int idx = irqchip_data->chanidx; in imx_intmux_irq_xlate()
149 return -EINVAL; in imx_intmux_irq_xlate()
151 if (WARN_ON(intspec[1] >= data->channum)) in imx_intmux_irq_xlate()
152 return -EINVAL; in imx_intmux_irq_xlate()
163 struct intmux_irqchip_data *irqchip_data = d->host_data; in imx_intmux_irq_select()
166 if (fwspec->fwnode != d->fwnode) in imx_intmux_irq_select()
169 return irqchip_data->chanidx == fwspec->param[1]; in imx_intmux_irq_select()
181 int idx = irqchip_data->chanidx; in imx_intmux_irq_handler()
189 /* read the interrupt source pending status of this channel */ in imx_intmux_irq_handler()
190 irqstat = readl_relaxed(data->regs + CHANIPR(idx)); in imx_intmux_irq_handler()
193 generic_handle_domain_irq(irqchip_data->domain, pos); in imx_intmux_irq_handler()
200 struct device_node *np = pdev->dev.of_node; in imx_intmux_probe()
207 if (channum == -EPROBE_DEFER) { in imx_intmux_probe()
208 return -EPROBE_DEFER; in imx_intmux_probe()
210 dev_err(&pdev->dev, "supports up to %d multiplex channels\n", in imx_intmux_probe()
212 return -EINVAL; in imx_intmux_probe()
215 data = devm_kzalloc(&pdev->dev, struct_size(data, irqchip_data, channum), GFP_KERNEL); in imx_intmux_probe()
217 return -ENOMEM; in imx_intmux_probe()
219 data->regs = devm_platform_ioremap_resource(pdev, 0); in imx_intmux_probe()
220 if (IS_ERR(data->regs)) { in imx_intmux_probe()
221 dev_err(&pdev->dev, "failed to initialize reg\n"); in imx_intmux_probe()
222 return PTR_ERR(data->regs); in imx_intmux_probe()
225 data->ipg_clk = devm_clk_get(&pdev->dev, "ipg"); in imx_intmux_probe()
226 if (IS_ERR(data->ipg_clk)) in imx_intmux_probe()
227 return dev_err_probe(&pdev->dev, PTR_ERR(data->ipg_clk), in imx_intmux_probe()
228 "failed to get ipg clk\n"); in imx_intmux_probe()
230 data->channum = channum; in imx_intmux_probe()
231 raw_spin_lock_init(&data->lock); in imx_intmux_probe()
233 pm_runtime_get_noresume(&pdev->dev); in imx_intmux_probe()
234 pm_runtime_set_active(&pdev->dev); in imx_intmux_probe()
235 pm_runtime_enable(&pdev->dev); in imx_intmux_probe()
237 ret = clk_prepare_enable(data->ipg_clk); in imx_intmux_probe()
239 dev_err(&pdev->dev, "failed to enable ipg clk: %d\n", ret); in imx_intmux_probe()
244 data->irqchip_data[i].chip = imx_intmux_irq_chip; in imx_intmux_probe()
245 data->irqchip_data[i].chip.parent_device = &pdev->dev; in imx_intmux_probe()
246 data->irqchip_data[i].chanidx = i; in imx_intmux_probe()
248 data->irqchip_data[i].irq = irq_of_parse_and_map(np, i); in imx_intmux_probe()
249 if (data->irqchip_data[i].irq <= 0) { in imx_intmux_probe()
250 ret = -EINVAL; in imx_intmux_probe()
251 dev_err(&pdev->dev, "failed to get irq\n"); in imx_intmux_probe()
256 &data->irqchip_data[i]); in imx_intmux_probe()
258 ret = -ENOMEM; in imx_intmux_probe()
259 dev_err(&pdev->dev, "failed to create IRQ domain\n"); in imx_intmux_probe()
262 data->irqchip_data[i].domain = domain; in imx_intmux_probe()
265 writel_relaxed(0, data->regs + CHANIER(i)); in imx_intmux_probe()
267 irq_set_chained_handler_and_data(data->irqchip_data[i].irq, in imx_intmux_probe()
269 &data->irqchip_data[i]); in imx_intmux_probe()
278 pm_runtime_put(&pdev->dev); in imx_intmux_probe()
282 clk_disable_unprepare(data->ipg_clk); in imx_intmux_probe()
291 for (i = 0; i < data->channum; i++) { in imx_intmux_remove()
293 writel_relaxed(0, data->regs + CHANIER(i)); in imx_intmux_remove()
295 irq_set_chained_handler_and_data(data->irqchip_data[i].irq, in imx_intmux_remove()
298 irq_domain_remove(data->irqchip_data[i].domain); in imx_intmux_remove()
301 pm_runtime_disable(&pdev->dev); in imx_intmux_remove()
313 for (i = 0; i < data->channum; i++) { in imx_intmux_runtime_suspend()
314 irqchip_data = &data->irqchip_data[i]; in imx_intmux_runtime_suspend()
315 irqchip_data->saved_reg = readl_relaxed(data->regs + CHANIER(i)); in imx_intmux_runtime_suspend()
318 clk_disable_unprepare(data->ipg_clk); in imx_intmux_runtime_suspend()
329 ret = clk_prepare_enable(data->ipg_clk); in imx_intmux_runtime_resume()
331 dev_err(dev, "failed to enable ipg clk: %d\n", ret); in imx_intmux_runtime_resume()
335 for (i = 0; i < data->channum; i++) { in imx_intmux_runtime_resume()
336 irqchip_data = &data->irqchip_data[i]; in imx_intmux_runtime_resume()
337 writel_relaxed(irqchip_data->saved_reg, data->regs + CHANIER(i)); in imx_intmux_runtime_resume()
352 { .compatible = "fsl,imx-intmux", },
358 .name = "imx-intmux",