Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp682880ybl; Thu, 12 Dec 2019 03:14:54 -0800 (PST) X-Google-Smtp-Source: APXvYqxxbg5CF3bDFR16sgBVdEtZSPwmZCUEaCT2s3vpvZDWawLlKVtACZRQw5YawFaIrqCvYDx/ X-Received: by 2002:a05:6830:1407:: with SMTP id v7mr7829070otp.58.1576149294862; Thu, 12 Dec 2019 03:14:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576149294; cv=none; d=google.com; s=arc-20160816; b=Cnm1NBYL/JceWl2ftxxcCxv/kGRk8QFzfjEKPJYevYX3VzTJMc0OqzW8EAbaSAMoPM ZgbIpBYeGZaJdW+aA/YsTWFqptQOnWDGapmm3YjPcV4vc49BMCpMOC9SisrOhsLU8pN9 thuSLnTQPX2tAptlKrV8WviFQE9MxcuXtkumHW1QRTqwdBA5rxdARXiXeXl+M7zB1K6c 8T44E1Xqs6E6KSg6GVFT8uQuFrYiWR4Kk+cLMGLFCeU/FoH7QL0ZJ4q+U1yd2bA1hYlv 3Zd8LxWGLapN2sLZAxiqsi6oKCh72nNW7XOFLHlNdfqo9ApTkfWbsXU0BKoRQicDjKQk F/BA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=zTrSY50Q1XV4UNfbwJKU4/Fq30MYrse/dvxK+vt7Bzc=; b=MtbWzSE42EGm6BYJRII8HNxcJH5/+cdXaeUU9VvdpyJE4neTtqmYkkPM1Tb1rMbZ9e HxwMP7A8LTTnEaTjAbQPb/R7HugFgcTpEwpkY6176tIfbRSThxr2wq767aaRa1mBZO2G svXob1ShC+Pdi3yExNYRfTtG4jrlCr+shHUNinKFuaC/EBUgKY8qSs3IQM/SEfzbPfV3 Y9zsJBHe0kMLN5HEkxypixiHHCXQaXcbQ1SoHtVeTyasBVrH2Qwl0xjcgBGcum6A9485 zf+d+UrILAlrDauxiBX5CBcqkbGczl0RGD3oPdDfWnfiLmSv9/P+ydSKhBGg8BHJ6Yf6 RmkQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w5si3109968otq.238.2019.12.12.03.14.41; Thu, 12 Dec 2019 03:14:54 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728923AbfLLLMr (ORCPT + 99 others); Thu, 12 Dec 2019 06:12:47 -0500 Received: from mail-sz.amlogic.com ([211.162.65.117]:11742 "EHLO mail-sz.amlogic.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728648AbfLLLMr (ORCPT ); Thu, 12 Dec 2019 06:12:47 -0500 Received: from [10.28.39.106] (10.28.39.106) by mail-sz.amlogic.com (10.28.11.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1591.10; Thu, 12 Dec 2019 19:13:16 +0800 Subject: Re: [PATCH 2/4] irqchip/meson-gpio: rework meson irqchip driver to support meson-A1 SoCs To: Marc Zyngier CC: Thomas Gleixner , Jason Cooper , Kevin Hilman , Neil Armstrong , Jerome Brunet , Jianxin Pan , Xingyu Chen , Hanjie Lin , , , References: <20191206121714.14579-1-qianggui.song@amlogic.com> <20191206121714.14579-3-qianggui.song@amlogic.com> <542e3e819e584d6e433d2c4276c3b379@www.loen.fr> <2551e382-d373-dad8-7294-80f2a15c0ad4@amlogic.com> <0cbbb895b50a838fd1dfa9e59528367d@www.loen.fr> From: Qianggui Song Message-ID: <4b892b12-4ffb-7fff-ba27-9e606c958257@amlogic.com> Date: Thu, 12 Dec 2019 19:13:16 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.1 MIME-Version: 1.0 In-Reply-To: <0cbbb895b50a838fd1dfa9e59528367d@www.loen.fr> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.28.39.106] X-ClientProxiedBy: mail-sz.amlogic.com (10.28.11.5) To mail-sz.amlogic.com (10.28.11.5) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2019/12/12 1:26, Marc Zyngier wrote: > On 2019-12-10 02:08, Qianggui Song wrote: >> Hi, Marc >> Thank you for your review >> >> On 2019/12/6 21:13, Marc Zyngier wrote: >>> On 2019-12-06 12:17, Qianggui Song wrote: >>>> Since Meson-A1 Socs register layout of gpio interrupt controller >>>> have >>>> difference with previous chips, registers to decide irq line and >>>> offset >>>> of trigger method are all changed, the current driver should be >>>> modified. >>>> >>>> Signed-off-by: Qianggui Song >>>> --- >>>> drivers/irqchip/irq-meson-gpio.c | 79 >>>> ++++++++++++++++++++++++-------- >>>> 1 file changed, 60 insertions(+), 19 deletions(-) >>>> >>>> diff --git a/drivers/irqchip/irq-meson-gpio.c >>>> b/drivers/irqchip/irq-meson-gpio.c >>>> index 829084b568fa..1824ffc30de2 100644 >>>> --- a/drivers/irqchip/irq-meson-gpio.c >>>> +++ b/drivers/irqchip/irq-meson-gpio.c >>>> @@ -30,44 +30,74 @@ >>>> * stuck at 0. Bits 8 to 15 are responsive and have the expected >>>> * effect. >>>> */ >>>> -#define REG_EDGE_POL_EDGE(x) BIT(x) >>>> -#define REG_EDGE_POL_LOW(x) BIT(16 + (x)) >>>> -#define REG_BOTH_EDGE(x) BIT(8 + (x)) >>>> -#define REG_EDGE_POL_MASK(x) ( \ >>>> - REG_EDGE_POL_EDGE(x) | \ >>>> - REG_EDGE_POL_LOW(x) | \ >>>> - REG_BOTH_EDGE(x)) >>>> +#define REG_EDGE_POL_EDGE(params, >>>> x) BIT((params)->edge_single_offset + (x)) >>>> +#define REG_EDGE_POL_LOW(params, x) BIT((params)->pol_low_offset + >>>> (x)) >>>> +#define REG_BOTH_EDGE(params, x) BIT((params)->edge_both_offset + >>>> (x)) >>>> +#define REG_EDGE_POL_MASK(params, x) ( \ >>>> + REG_EDGE_POL_EDGE(params, x) | \ >>>> + REG_EDGE_POL_LOW(params, x) | \ >>>> + REG_BOTH_EDGE(params, x)) >>>> #define REG_PIN_SEL_SHIFT(x) (((x) % 4) * 8) >>>> #define REG_FILTER_SEL_SHIFT(x) ((x) * 4) >>>> >>>> +#define INIT_MESON8_COMMON_DATA \ >>>> + .edge_single_offset = 0, \ >>>> + .pol_low_offset = 16, \ >>>> + .pin_sel_mask = 0xff, \ >>>> + .ops = { \ >>>> + .gpio_irq_sel_pin = meson8_gpio_irq_sel_pin, \ >>>> + }, >>> >>> Please place the #defines that operate on the various data >>> structures >>> *after* the definition of the structures. It would greatly help >>> reading the changes. >>> >> OK, will place it below the definition of struct >> meson_gpio_irq_params >> in the next patch. >>>> + >>>> +struct meson_gpio_irq_controller; >>>> +static void meson8_gpio_irq_sel_pin(struct >>>> meson_gpio_irq_controller >>>> *ctl, >>>> + unsigned int channel, unsigned long hwirq); >>>> +struct irq_ctl_ops { >>>> + void (*gpio_irq_sel_pin)(struct meson_gpio_irq_controller *ctl, >>>> + unsigned int channel, >>>> + unsigned long hwirq); >>>> + void (*gpio_irq_init)(struct meson_gpio_irq_controller *ctl); >>>> +}; >>>> + >>>> struct meson_gpio_irq_params { >>>> unsigned int nr_hwirq; >>>> bool support_edge_both; >>>> + unsigned int edge_both_offset; >>>> + unsigned int edge_single_offset; >>>> + unsigned int pol_low_offset; >>>> + unsigned int pin_sel_mask; >>>> + struct irq_ctl_ops ops; >>>> }; >>>> >>>> static const struct meson_gpio_irq_params meson8_params = { >>>> .nr_hwirq = 134, >>>> + INIT_MESON8_COMMON_DATA >>>> }; >>>> >>>> static const struct meson_gpio_irq_params meson8b_params = { >>>> .nr_hwirq = 119, >>>> + INIT_MESON8_COMMON_DATA >>>> }; >>>> >>>> static const struct meson_gpio_irq_params gxbb_params = { >>>> .nr_hwirq = 133, >>>> + INIT_MESON8_COMMON_DATA >>>> }; >>>> >>>> static const struct meson_gpio_irq_params gxl_params = { >>>> .nr_hwirq = 110, >>>> + INIT_MESON8_COMMON_DATA >>>> }; >>>> >>>> static const struct meson_gpio_irq_params axg_params = { >>>> .nr_hwirq = 100, >>>> + INIT_MESON8_COMMON_DATA >>>> }; >>>> >>>> static const struct meson_gpio_irq_params sm1_params = { >>>> .nr_hwirq = 100, >>>> .support_edge_both = true, >>>> + .edge_both_offset = 8, >>>> + INIT_MESON8_COMMON_DATA >>>> }; >>> >>> OK, this isn't great. The least you could do is to make >>> your initializer parametric, so that it takes the nr_hwirq as >>> a parameter. >>> >>> Then, any additional member that overrides common behaviour >>> should come after the main initializer. >>> >>> Also, do you need 'support_edge_both'? Isn't a non-zero >>> 'edge_both_offset' enough to detect the feature? >>> >> >> Sorry, but I am not very clear that "make your initializer >> parametric, >> so that it takes the nr_hwirq as a parameter". Is that >> initializer(initial function in .ops ? ) as a parameter of struct >> meson_gpio_irq_params ? If nr_hwirq as a parameter of init function >> of >> .ops then will make lot of init function for each platform. >> >> How about move .ops from macro like below: >> #define INIT_MESON8_COMMON_DATA \ >> .edge_single_offset = 0, \ >> .pol_low_offset = 16, \ >> .pin_sel_mask = 0xff, >> >> static const struct meson_gpio_irq_params sm1_params = { >> .nr_hwirq = 100,//main initializer >> .ops = { >> .gpio_irq_sel_pin = meson8_gpio_irq_sel_pin, >> /*in below to assign support_edge_both >> * edge_both_offset >> * call after main initializer to additional >> * member >> */ >> .gpio_irq_init = meson_sm1_irq_init, >> }, >> INIT_MESON8_COMMON_DATA// m8 to sm1 are the same. >> }; > > No, what I'm suggesting is something like this: > > diff --git a/drivers/irqchip/irq-meson-gpio.c > b/drivers/irqchip/irq-meson-gpio.c > index 8478100706a6..27a3207a944d 100644 > --- a/drivers/irqchip/irq-meson-gpio.c > +++ b/drivers/irqchip/irq-meson-gpio.c > @@ -43,24 +43,27 @@ > /* Below is used for Meson-A1 series like chips*/ > #define REG_PIN_A1_SEL 0x04 > > -#define INIT_MESON8_COMMON_DATA \ > - .edge_single_offset = 0, \ > - .pol_low_offset = 16, \ > - .pin_sel_mask = 0xff, \ > - .ops = { \ > - .gpio_irq_sel_pin = meson8_gpio_irq_sel_pin, \ > - }, > - > -#define INIT_MESON_A1_COMMON_DATA \ > - .support_edge_both = true, \ > - .edge_both_offset = 16, \ > - .edge_single_offset = 8, \ > - .pol_low_offset = 0, \ > - .pin_sel_mask = 0x7f, \ > - .ops = { \ > - .gpio_irq_sel_pin = meson_a1_gpio_irq_sel_pin, \ > - .gpio_irq_init = meson_a1_gpio_irq_init, \ > - }, > +#define INIT_MESON_COMMON(irqs, init, sel) \ > + .nr_hwirq = irqs, \ > + .ops = { \ > + .gpio_irq_sel_pin = sel, \ > + .gpio_irq_init = init, \ > + } > + > +#define INIT_MESON8_COMMON_DATA(irqs) \ > + INIT_MESON_COMMON(irqs, NULL, \ > + meson8_gpio_irq_sel_pin), \ > + .pol_low_offset = 16, \ > + .pin_sel_mask = 0xff, > + > +#define INIT_MESON_A1_COMMON_DATA(irqs) \ > + INIT_MESON_COMMON(irqs, meson_a1_gpio_irq_init, \ > + meson_a1_gpio_irq_sel_pin), \ > + .support_edge_both = true, \ > + .edge_both_offset = 16, \ > + .edge_single_offset = 8, \ > + .pol_low_offset = 0, \ > + .pin_sel_mask = 0x7f, > > struct meson_gpio_irq_controller; > static void meson8_gpio_irq_sel_pin(struct meson_gpio_irq_controller > *ctl, > @@ -89,40 +92,33 @@ struct meson_gpio_irq_params { > }; > > static const struct meson_gpio_irq_params meson8_params = { > - .nr_hwirq = 134, > - INIT_MESON8_COMMON_DATA > + INIT_MESON8_COMMON_DATA(134), > }; > > static const struct meson_gpio_irq_params meson8b_params = { > - .nr_hwirq = 119, > - INIT_MESON8_COMMON_DATA > + INIT_MESON8_COMMON_DATA(119), > }; > > static const struct meson_gpio_irq_params gxbb_params = { > - .nr_hwirq = 133, > - INIT_MESON8_COMMON_DATA > + INIT_MESON8_COMMON_DATA(133), > }; > > static const struct meson_gpio_irq_params gxl_params = { > - .nr_hwirq = 110, > - INIT_MESON8_COMMON_DATA > + INIT_MESON8_COMMON_DATA(110), > }; > > static const struct meson_gpio_irq_params axg_params = { > - .nr_hwirq = 100, > - INIT_MESON8_COMMON_DATA > + INIT_MESON8_COMMON_DATA(100), > }; > > static const struct meson_gpio_irq_params sm1_params = { > - .nr_hwirq = 100, > + INIT_MESON8_COMMON_DATA(100), > .support_edge_both = true, > .edge_both_offset = 8, > - INIT_MESON8_COMMON_DATA > }; > > static const struct meson_gpio_irq_params a1_params = { > - .nr_hwirq = 62, > - INIT_MESON_A1_COMMON_DATA > + INIT_MESON_A1_COMMON_DATA(62), > }; > Thanks, will try it in later patch > static const struct of_device_id meson_irq_gpio_matches[] = { > > > Thanks, > > M. >