From: Lucas Stach <l.stach@pengutronix.de> To: Aisheng Dong <aisheng.dong@nxp.com>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org> Cc: "linux-arm-kernel@lists.infradead.org" <linux-arm-kernel@lists.infradead.org>, "shawnguo@kernel.org" <shawnguo@kernel.org>, dl-linux-imx <linux-imx@nxp.com>, "robh+dt@kernel.org" <robh+dt@kernel.org>, "devicetree@vger.kernel.org" <devicetree@vger.kernel.org>, "tglx@linutronix.de" <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com> Subject: Re: [PATCH 4/4] irq: imx: irqsteer: add multi output interrupts support Date: Fri, 18 Jan 2019 09:53:29 +0100 [thread overview] Message-ID: <1547801609.2626.5.camel@pengutronix.de> (raw) In-Reply-To: <1547797668-30342-5-git-send-email-aisheng.dong@nxp.com> Am Freitag, den 18.01.2019, 07:53 +0000 schrieb Aisheng Dong: > One irqsteer channel can support up to 8 output interrupts. This has been discussed when upstreaming the driver. The controller may support multiple output IRQs, but only one them is actually used depending on the CHANCTRL config. There is no use in hooking up all the output IRQs in DT, if only one of them is actually used. Some of the outputs may not even be visible to the Linux system, but may belong to a Cortex M4 subsystem. All of those configurations can be described in DT by changing the upstream interrupt and "fsl,channel" in a coherent way. Please correct me if my understanding is totally wrong. Regards, Lucas > Cc: Marc Zyngier <marc.zyngier@arm.com> > > Cc: Lucas Stach <l.stach@pengutronix.de> > > Cc: Shawn Guo <shawnguo@kernel.org> > > Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com> > --- > drivers/irqchip/irq-imx-irqsteer.c | 39 +++++++++++++++++++++++++++----------- > 1 file changed, 28 insertions(+), 11 deletions(-) > > diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c > index 1bebf0a..54802fa 100644 > --- a/drivers/irqchip/irq-imx-irqsteer.c > +++ b/drivers/irqchip/irq-imx-irqsteer.c > @@ -10,6 +10,7 @@ > #include <linux/irqchip/chained_irq.h> > #include <linux/irqdomain.h> > #include <linux/kernel.h> > +#include <linux/of_irq.h> > #include <linux/of_platform.h> > #include <linux/spinlock.h> > > @@ -21,10 +22,13 @@ > > #define CHAN_MINTDIS(t) (CTRL_STRIDE_OFF(t, 3) + 0x4) > > #define CHAN_MASTRSTAT(t) (CTRL_STRIDE_OFF(t, 3) + 0x8) > > > +#define CHAN_MAX_OUTPUT_INT 0x8 > + > struct irqsteer_data { > > > void __iomem *regs; > > > struct clk *ipg_clk; > > > - int irq; > > > + int irq[CHAN_MAX_OUTPUT_INT]; > > > + int irq_count; > > > raw_spinlock_t lock; > > > int reg_num; > > > int channel; > @@ -117,7 +121,7 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > > struct device_node *np = pdev->dev.of_node; > > struct irqsteer_data *data; > > struct resource *res; > > - int ret; > > + int i, ret; > > > data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); > > if (!data) > @@ -130,12 +134,6 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > > return PTR_ERR(data->regs); > > } > > > - data->irq = platform_get_irq(pdev, 0); > > - if (data->irq <= 0) { > > - dev_err(&pdev->dev, "failed to get irq\n"); > > - return -ENODEV; > > - } > - > > data->ipg_clk = devm_clk_get(&pdev->dev, "ipg"); > > if (IS_ERR(data->ipg_clk)) { > > ret = PTR_ERR(data->ipg_clk); > @@ -177,8 +175,23 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > > return -ENOMEM; > > } > > > - irq_set_chained_handler_and_data(data->irq, imx_irqsteer_irq_handler, > > - data); > > + data->irq_count = of_irq_count(np); > > + if (!data->irq_count || data->irq_count > CHAN_MAX_OUTPUT_INT) { > > + clk_disable_unprepare(data->ipg_clk); > > + return -EINVAL; > > + } > + > > + for (i = 0; i < data->irq_count; i++) { > > + data->irq[i] = irq_of_parse_and_map(np, i); > > + if (!data->irq[i]) { > > + clk_disable_unprepare(data->ipg_clk); > > + return -EINVAL; > > + } > + > > + irq_set_chained_handler_and_data(data->irq[i], > > + imx_irqsteer_irq_handler, > > + data); > > + } > > > platform_set_drvdata(pdev, data); > > @@ -188,8 +201,12 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > static int imx_irqsteer_remove(struct platform_device *pdev) > { > > struct irqsteer_data *irqsteer_data = platform_get_drvdata(pdev); > > + int i; > + > > + for (i = 0; i < irqsteer_data->irq_count; i++) > > + irq_set_chained_handler_and_data(irqsteer_data->irq[i], > > + NULL, NULL); > > > - irq_set_chained_handler_and_data(irqsteer_data->irq, NULL, NULL); > > irq_domain_remove(irqsteer_data->domain); > > > clk_disable_unprepare(irqsteer_data->ipg_clk);
WARNING: multiple messages have this Message-ID (diff)
From: Lucas Stach <l.stach@pengutronix.de> To: Aisheng Dong <aisheng.dong@nxp.com>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org> Cc: "devicetree@vger.kernel.org" <devicetree@vger.kernel.org>, Marc Zyngier <marc.zyngier@arm.com>, "robh+dt@kernel.org" <robh+dt@kernel.org>, dl-linux-imx <linux-imx@nxp.com>, "tglx@linutronix.de" <tglx@linutronix.de>, "shawnguo@kernel.org" <shawnguo@kernel.org>, "linux-arm-kernel@lists.infradead.org" <linux-arm-kernel@lists.infradead.org> Subject: Re: [PATCH 4/4] irq: imx: irqsteer: add multi output interrupts support Date: Fri, 18 Jan 2019 09:53:29 +0100 [thread overview] Message-ID: <1547801609.2626.5.camel@pengutronix.de> (raw) In-Reply-To: <1547797668-30342-5-git-send-email-aisheng.dong@nxp.com> Am Freitag, den 18.01.2019, 07:53 +0000 schrieb Aisheng Dong: > One irqsteer channel can support up to 8 output interrupts. This has been discussed when upstreaming the driver. The controller may support multiple output IRQs, but only one them is actually used depending on the CHANCTRL config. There is no use in hooking up all the output IRQs in DT, if only one of them is actually used. Some of the outputs may not even be visible to the Linux system, but may belong to a Cortex M4 subsystem. All of those configurations can be described in DT by changing the upstream interrupt and "fsl,channel" in a coherent way. Please correct me if my understanding is totally wrong. Regards, Lucas > Cc: Marc Zyngier <marc.zyngier@arm.com> > > Cc: Lucas Stach <l.stach@pengutronix.de> > > Cc: Shawn Guo <shawnguo@kernel.org> > > Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com> > --- > drivers/irqchip/irq-imx-irqsteer.c | 39 +++++++++++++++++++++++++++----------- > 1 file changed, 28 insertions(+), 11 deletions(-) > > diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c > index 1bebf0a..54802fa 100644 > --- a/drivers/irqchip/irq-imx-irqsteer.c > +++ b/drivers/irqchip/irq-imx-irqsteer.c > @@ -10,6 +10,7 @@ > #include <linux/irqchip/chained_irq.h> > #include <linux/irqdomain.h> > #include <linux/kernel.h> > +#include <linux/of_irq.h> > #include <linux/of_platform.h> > #include <linux/spinlock.h> > > @@ -21,10 +22,13 @@ > > #define CHAN_MINTDIS(t) (CTRL_STRIDE_OFF(t, 3) + 0x4) > > #define CHAN_MASTRSTAT(t) (CTRL_STRIDE_OFF(t, 3) + 0x8) > > > +#define CHAN_MAX_OUTPUT_INT 0x8 > + > struct irqsteer_data { > > > void __iomem *regs; > > > struct clk *ipg_clk; > > > - int irq; > > > + int irq[CHAN_MAX_OUTPUT_INT]; > > > + int irq_count; > > > raw_spinlock_t lock; > > > int reg_num; > > > int channel; > @@ -117,7 +121,7 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > > struct device_node *np = pdev->dev.of_node; > > struct irqsteer_data *data; > > struct resource *res; > > - int ret; > > + int i, ret; > > > data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); > > if (!data) > @@ -130,12 +134,6 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > > return PTR_ERR(data->regs); > > } > > > - data->irq = platform_get_irq(pdev, 0); > > - if (data->irq <= 0) { > > - dev_err(&pdev->dev, "failed to get irq\n"); > > - return -ENODEV; > > - } > - > > data->ipg_clk = devm_clk_get(&pdev->dev, "ipg"); > > if (IS_ERR(data->ipg_clk)) { > > ret = PTR_ERR(data->ipg_clk); > @@ -177,8 +175,23 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > > return -ENOMEM; > > } > > > - irq_set_chained_handler_and_data(data->irq, imx_irqsteer_irq_handler, > > - data); > > + data->irq_count = of_irq_count(np); > > + if (!data->irq_count || data->irq_count > CHAN_MAX_OUTPUT_INT) { > > + clk_disable_unprepare(data->ipg_clk); > > + return -EINVAL; > > + } > + > > + for (i = 0; i < data->irq_count; i++) { > > + data->irq[i] = irq_of_parse_and_map(np, i); > > + if (!data->irq[i]) { > > + clk_disable_unprepare(data->ipg_clk); > > + return -EINVAL; > > + } > + > > + irq_set_chained_handler_and_data(data->irq[i], > > + imx_irqsteer_irq_handler, > > + data); > > + } > > > platform_set_drvdata(pdev, data); > > @@ -188,8 +201,12 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > static int imx_irqsteer_remove(struct platform_device *pdev) > { > > struct irqsteer_data *irqsteer_data = platform_get_drvdata(pdev); > > + int i; > + > > + for (i = 0; i < irqsteer_data->irq_count; i++) > > + irq_set_chained_handler_and_data(irqsteer_data->irq[i], > > + NULL, NULL); > > > - irq_set_chained_handler_and_data(irqsteer_data->irq, NULL, NULL); > > irq_domain_remove(irqsteer_data->domain); > > > clk_disable_unprepare(irqsteer_data->ipg_clk); _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-01-18 8:53 UTC|newest] Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-01-18 7:53 [PATCH 0/4] irq: imx-irqsteer: add 32 interrupts chan and multi outputs support Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 7:53 ` [PATCH 1/4] dt-binding: irq: imx-irqsteer: use irq number per channel instead of group number Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 8:48 ` Lucas Stach 2019-01-18 8:48 ` Lucas Stach 2019-01-18 8:48 ` Lucas Stach 2019-01-18 9:39 ` Marc Zyngier 2019-01-18 9:39 ` Marc Zyngier 2019-01-18 9:39 ` Marc Zyngier 2019-01-18 9:46 ` Aisheng Dong 2019-01-18 9:46 ` Aisheng Dong 2019-01-18 9:46 ` Aisheng Dong 2019-01-18 10:12 ` Marc Zyngier 2019-01-18 10:12 ` Marc Zyngier 2019-01-18 10:12 ` Marc Zyngier 2019-01-22 10:56 ` Aisheng Dong 2019-01-22 10:56 ` Aisheng Dong 2019-01-22 10:56 ` Aisheng Dong 2019-01-22 11:05 ` Lucas Stach 2019-01-22 11:05 ` Lucas Stach 2019-01-22 11:05 ` Lucas Stach 2019-01-22 11:48 ` Marc Zyngier 2019-01-22 11:48 ` Marc Zyngier 2019-01-22 11:48 ` Marc Zyngier 2019-01-18 9:45 ` Aisheng Dong 2019-01-18 9:45 ` Aisheng Dong 2019-01-18 9:45 ` Aisheng Dong 2019-01-18 7:53 ` [PATCH 2/4] dt-bindings: irq: imx-irqsteer: add multi output interrupts support Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-25 10:46 ` Lucas Stach 2019-01-25 10:46 ` Lucas Stach 2019-01-25 10:46 ` Lucas Stach 2019-01-27 14:05 ` Dong Aisheng 2019-01-27 14:05 ` Dong Aisheng 2019-01-27 14:05 ` Dong Aisheng 2019-01-18 7:53 ` [PATCH 3/4] irq: imx-irqsteer: change to use reg_num instead of irq_group Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 7:53 ` [PATCH 4/4] irq: imx: irqsteer: add multi output interrupts support Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 7:53 ` Aisheng Dong 2019-01-18 8:53 ` Lucas Stach [this message] 2019-01-18 8:53 ` Lucas Stach 2019-01-18 8:53 ` Lucas Stach 2019-01-18 9:54 ` Aisheng Dong 2019-01-18 9:54 ` Aisheng Dong 2019-01-18 9:54 ` Aisheng Dong 2019-01-18 10:22 ` Lucas Stach 2019-01-18 10:22 ` Lucas Stach 2019-01-18 10:22 ` Lucas Stach 2019-01-22 10:39 ` Aisheng Dong 2019-01-22 10:39 ` Aisheng Dong 2019-01-22 10:39 ` Aisheng Dong 2019-01-22 10:59 ` Lucas Stach 2019-01-22 10:59 ` Lucas Stach 2019-01-22 10:59 ` Lucas Stach 2019-01-22 12:03 ` Aisheng Dong 2019-01-22 12:03 ` Aisheng Dong 2019-01-22 12:03 ` Aisheng Dong 2019-01-22 12:52 ` Lucas Stach 2019-01-22 12:52 ` Lucas Stach 2019-01-22 12:52 ` Lucas Stach 2019-01-22 13:17 ` Aisheng Dong 2019-01-22 13:17 ` Aisheng Dong 2019-01-22 13:17 ` Aisheng Dong 2019-01-25 10:42 ` Lucas Stach 2019-01-25 10:42 ` Lucas Stach 2019-01-25 10:42 ` Lucas Stach 2019-01-27 10:38 ` Dong Aisheng 2019-01-27 10:38 ` Dong Aisheng 2019-01-27 10:38 ` Dong Aisheng 2019-01-22 12:50 ` Aisheng Dong 2019-01-22 12:50 ` Aisheng Dong 2019-01-22 12:50 ` Aisheng Dong 2019-01-25 10:54 ` Lucas Stach 2019-01-25 10:54 ` Lucas Stach 2019-01-25 10:54 ` Lucas Stach 2019-01-27 14:02 ` Dong Aisheng 2019-01-27 14:02 ` Dong Aisheng 2019-01-27 14:02 ` Dong Aisheng
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1547801609.2626.5.camel@pengutronix.de \ --to=l.stach@pengutronix.de \ --cc=aisheng.dong@nxp.com \ --cc=devicetree@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-imx@nxp.com \ --cc=linux-kernel@vger.kernel.org \ --cc=marc.zyngier@arm.com \ --cc=robh+dt@kernel.org \ --cc=shawnguo@kernel.org \ --cc=tglx@linutronix.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.