devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tomasz Figa <tomasz.figa@gmail.com>
To: Abhilash Kesavan <kesavan.abhilash@gmail.com>
Cc: linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
	linux-samsung-soc <linux-samsung-soc@vger.kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	"robh@kernel.org" <robh@kernel.org>,
	devicetree <devicetree@vger.kernel.org>,
	linus.walleij@linaro.org,
	Thomas P Abraham <thomas.ab@samsung.com>
Subject: Re: [PATCH 2/4] pinctrl: exynos: Add irq_chip instance for Exynos7 wakeup interrupts
Date: Mon, 22 Sep 2014 09:55:59 +0200	[thread overview]
Message-ID: <541FD60F.8060008@gmail.com> (raw)
In-Reply-To: <CAM4voamF8aydh7-2aC+vLrO1rmPm5GL3Pn6i6rZ3XnzCDHzgJg@mail.gmail.com>

On 22.09.2014 08:17, Abhilash Kesavan wrote:
> Hi Tomasz,
> 
> On Sat, Sep 13, 2014 at 4:57 PM, Tomasz Figa <tomasz.figa@gmail.com> wrote:
>> Hi Abhilash,
>>
>> Please see my comments inline.
>>
>> On 13.09.2014 10:50, Abhilash Kesavan wrote:
>>> Exynos7 uses different offsets for wakeup interrupt configuration registers.
>>> So a new irq_chip instance for Exynos7 wakeup interrupts is added. The irq_chip
>>> selection is now based on the wakeup interrupt controller compatible string.
>>
>> [snip]
>>
>>> @@ -328,9 +322,11 @@ static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
>>>  /*
>>>   * irq_chip for wakeup interrupts
>>>   */
>>> -static struct exynos_irq_chip exynos_wkup_irq_chip = {
>>> +static struct exynos_irq_chip exynos_wkup_irq_chip;
>>> +
>>
>> Why do you still need this, if you have both variants below?
> 
> After adding __initdata to the two variants, I will require to have a
> copy of one of them.
> 
>>
>>> +static struct exynos_irq_chip exynos4210_wkup_irq_chip = {
>>>       .chip = {
>>> -             .name = "exynos_wkup_irq_chip",
>>> +             .name = "exynos4210_wkup_irq_chip",
>>>               .irq_unmask = exynos_irq_unmask,
>>>               .irq_mask = exynos_irq_mask,
>>>               .irq_ack = exynos_irq_ack,
>>> @@ -342,6 +338,29 @@ static struct exynos_irq_chip exynos_wkup_irq_chip = {
>>>       .eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
>>>  };
>>>
>>> +static struct exynos_irq_chip exynos7_wkup_irq_chip = {
>>> +     .chip = {
>>> +             .name = "exynos7_wkup_irq_chip",
>>> +             .irq_unmask = exynos_irq_unmask,
>>> +             .irq_mask = exynos_irq_mask,
>>> +             .irq_ack = exynos_irq_ack,
>>> +             .irq_set_type = exynos_irq_set_type,
>>> +             .irq_set_wake = exynos_wkup_irq_set_wake,
>>> +     },
>>> +     .eint_con = EXYNOS7_WKUP_ECON_OFFSET,
>>> +     .eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
>>> +     .eint_pend = EXYNOS7_WKUP_EPEND_OFFSET,
>>> +};
>>> +
>>> +/* list of external wakeup controllers supported */
>>> +static const struct of_device_id exynos_wkup_irq_ids[] = {
>>> +     { .compatible = "samsung,exynos4210-wakeup-eint",
>>> +                     .data = &exynos4210_wkup_irq_chip },
>>> +     { .compatible = "samsung,exynos7-wakeup-eint",
>>> +                     .data = &exynos7_wkup_irq_chip },
>>> +     { }
>>> +};
>>> +
>>>  /* interrupt handler for wakeup interrupts 0..15 */
>>>  static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
>>>  {
>>> @@ -434,7 +453,12 @@ static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
>>>       int idx, irq;
>>>
>>>       for_each_child_of_node(dev->of_node, np) {
>>> -             if (of_match_node(exynos_wkup_irq_ids, np)) {
>>> +             const struct of_device_id *match;
>>> +
>>> +             match = of_match_node(exynos_wkup_irq_ids, np);
>>> +             if (match) {
>>> +                     memcpy(&exynos_wkup_irq_chip, match->data,
>>> +                             sizeof(struct exynos_irq_chip));
>>
>> Hmm, this doesn't look correct to me. You are modifying a static struct
>> here. Why couldn't you simply use the exynos irq chip pointed by
>> match->data in further registration code?
> 
> That will not be available later once I use __initdata.
> 

Then either __initdata shouldn't be necessary or kmemdup() should be
used to allocate a copy.

>>
>>>                       wkup_np = np;
>>>                       break;
>>>               }
>>> diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h
>>> index e060722..0db1e52 100644
>>> --- a/drivers/pinctrl/samsung/pinctrl-exynos.h
>>> +++ b/drivers/pinctrl/samsung/pinctrl-exynos.h
>>> @@ -25,6 +25,9 @@
>>>  #define EXYNOS_WKUP_ECON_OFFSET              0xE00
>>>  #define EXYNOS_WKUP_EMASK_OFFSET     0xF00
>>>  #define EXYNOS_WKUP_EPEND_OFFSET     0xF40
>>> +#define EXYNOS7_WKUP_ECON_OFFSET     0x700
>>> +#define EXYNOS7_WKUP_EMASK_OFFSET    0x900
>>> +#define EXYNOS7_WKUP_EPEND_OFFSET    0xA00
>>
>> Interestingly enough, the offsets look just like the normal GPIO
>> interrupt controller of previous Exynos SoCs. Are you sure those are
>> correct? Also if somehow the controller now resembles the normal one,
>> doesn't it have the SVC register making it possible to reuse the non
>> wake-up code instead?
> 
> The wakeup interrupt register offsets are the same as the GPIO
> interrupt offsets in earlier Exynos SoCs. There is no SVC register for
> the wakeup interrupt block.

OK, your code is fine then.

Best regards,
Tomasz

  reply	other threads:[~2014-09-22  7:55 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-13  8:50 [PATCH 0/4] Add initial support for pinctrl on Exynos7 Abhilash Kesavan
2014-09-13  8:50 ` Abhilash Kesavan
2014-09-13  8:50 ` [PATCH 1/4] pinctrl: exynos: Generalize the eint16_31 demux code Abhilash Kesavan
2014-09-13  8:50 ` [PATCH 2/4] pinctrl: exynos: Add irq_chip instance for Exynos7 wakeup interrupts Abhilash Kesavan
2014-09-13 10:03   ` Thomas Abraham
     [not found]   ` <1410598252-30931-4-git-send-email-a.kesavan-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-09-13 11:27     ` Tomasz Figa
2014-09-22  6:17       ` Abhilash Kesavan
2014-09-22  7:55         ` Tomasz Figa [this message]
2014-09-23  7:04           ` Abhilash Kesavan
2014-09-13  8:50 ` [PATCH 3/4] pinctrl: exynos: Add initial driver data for Exynos7 Abhilash Kesavan
2014-09-13  8:50 ` [PATCH 4/4] arm64: dts: Add initial pinctrl support to EXYNOS7 Abhilash Kesavan
2014-09-13 10:54   ` Thomas Abraham
2014-09-20 12:08   ` Alim Akhtar
2014-09-13 11:08 ` [PATCH 0/4] Add initial support for pinctrl on Exynos7 Thomas Abraham
2014-09-13 11:34 ` Tomasz Figa
2014-09-20 12:13 ` Alim Akhtar

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=541FD60F.8060008@gmail.com \
    --to=tomasz.figa@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=devicetree@vger.kernel.org \
    --cc=kesavan.abhilash@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=thomas.ab@samsung.com \
    /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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).