From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91FF9C282C0 for ; Fri, 25 Jan 2019 10:54:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6A482218A6 for ; Fri, 25 Jan 2019 10:54:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726817AbfAYKyh (ORCPT ); Fri, 25 Jan 2019 05:54:37 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:35257 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725909AbfAYKyh (ORCPT ); Fri, 25 Jan 2019 05:54:37 -0500 Received: from kresse.hi.pengutronix.de ([2001:67c:670:100:1d::2a]) by metis.ext.pengutronix.de with esmtp (Exim 4.89) (envelope-from ) id 1gmz88-0003cp-Dj; Fri, 25 Jan 2019 11:54:36 +0100 Message-ID: <1548413675.28802.45.camel@pengutronix.de> Subject: Re: [PATCH 4/4] irq: imx: irqsteer: add multi output interrupts support From: Lucas Stach To: Aisheng Dong , "linux-kernel@vger.kernel.org" Cc: "linux-arm-kernel@lists.infradead.org" , "shawnguo@kernel.org" , dl-linux-imx , "robh+dt@kernel.org" , "devicetree@vger.kernel.org" , "tglx@linutronix.de" , Marc Zyngier Date: Fri, 25 Jan 2019 11:54:35 +0100 In-Reply-To: <1547797668-30342-5-git-send-email-aisheng.dong@nxp.com> References: <1547797668-30342-1-git-send-email-aisheng.dong@nxp.com> <1547797668-30342-5-git-send-email-aisheng.dong@nxp.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.22.6-1+deb9u1 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::2a X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am Freitag, den 18.01.2019, 07:53 +0000 schrieb Aisheng Dong: > One irqsteer channel can support up to 8 output interrupts. > > > Cc: Marc Zyngier > > Cc: Lucas Stach > > Cc: Shawn Guo > > Signed-off-by: Dong Aisheng > --- >  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 >  #include >  #include > +#include >  #include >  #include >   > @@ -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); We normally don't validate stuff that comes from the DT, but I guess it might be helpful to validate that the number of output irqs specified matches what the number of input irqs, i.e. there is one output irqs specified for each group of 64 inputs. > + 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); We really want some data about the output irq being passed here, so we can cut down the number of register reads in the irq handler to the maximum of 2 status registers per group. Regards, Lucas