All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tomasz Figa <tomasz.figa@gmail.com>
To: Doug Anderson <dianders@chromium.org>
Cc: "Tomasz Figa" <t.figa@samsung.com>,
	linux-samsung-soc <linux-samsung-soc@vger.kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"Kukjin Kim" <kgene.kim@samsung.com>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Olof Johansson" <olof@lixom.net>,
	"Heiko Stübner" <heiko@sntech.de>,
	"Stephen Warren" <swarren@wwwdotorg.org>,
	"Thomas Abraham" <thomas.abraham@linaro.org>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Prathyush K" <prathyush.k@samsung.com>,
	"Kyungmin Park" <kyungmin.park@samsung.com>
Subject: Re: [PATCH 6/6] pinctrl: exynos: Handle suspend/resume of GPIO EINT registers
Date: Fri, 17 May 2013 22:34:21 +0200	[thread overview]
Message-ID: <18754346.1REWN52J0K@flatron> (raw)
In-Reply-To: <CAD=FV=WKCeW=3BFnmnyXB70VCjXHGrzarXbj8cBfq4-ENA-Y2w@mail.gmail.com>

On Friday 17 of May 2013 12:25:02 Doug Anderson wrote:
> Tomasz,
> 
> On Fri, May 17, 2013 at 9:24 AM, Tomasz Figa <t.figa@samsung.com> wrote:
> > Some GPIO EINT control registers needs to be preserved across
> > suspend/resume cycle. This patch extends the driver to take care of
> > this.
> 
> I was confused why we didn't seem to need this on exynos5250-snow but
> figured it out.  We only use interrupts on GPX lines which don't need
> this code.  ...but on any exynos5250 boards that use one of the other
> banks for interrupts you'd need it.  I tested by setting one of the
> registers related to GPA0 and found that this code is indeed needed on
> exynos5250.  :)
> 
> Just nits / optional comments below, so on exynos5250-snow (pinmux
> backported to 3.8):
> 
> Tested-by: Doug Anderson <dianders@chromium.org>
> 
> Reviewed-by: Doug Anderson <dianders@chromium.org>
> 
> > @@ -229,6 +235,11 @@ static int exynos_eint_gpio_init(struct
> > samsung_pinctrl_drv_data *d)> 
> >                         dev_err(dev, "gpio irq domain add failed\n");
> >                         return -ENXIO;
> >                 
> >                 }
> > 
> > +
> > +               bank->soc_priv = devm_kzalloc(d->dev,
> > +                       sizeof(struct exynos_eint_gpio_save),
> > GFP_KERNEL); +               if (!bank->soc_priv)
> > +                       return -ENOMEM;
> 
> Slight nit to add this before the call to irq_domain_add_linear().
> demv() will handle freeing your memory but nothing will handle undoing
> the irq_domain_add_linear() if you return an error.

I'm a bit sceptical when it is about error handling in such cases. 
Basically if interrupt initialization fails, something is seriously wrong, 
either with your kernel config or with some code.

Since such case has been already unhandled in the driver (with nr_banks > 
1 = always), so I didn't bother to add any undoing here.

> >         }
> >         
> >         return 0;
> > 
> > @@ -528,6 +539,58 @@ static int exynos_eint_wkup_init(struct
> > samsung_pinctrl_drv_data *d)> 
> >         return 0;
> >  
> >  }
> > 
> > +static void exynos_pinctrl_suspend_bank(
> > +                               struct samsung_pinctrl_drv_data
> > *drvdata, +                               struct samsung_pin_bank
> > *bank) +{
> > +       struct exynos_eint_gpio_save *save = bank->soc_priv;
> > +       void __iomem *regs = drvdata->virt_base;
> > +
> > +       save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
> > +                                               + bank->eint_offset);
> > +       save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
> > +                                               + 2 *
> > bank->eint_offset); +       save->eint_fltcon1 = readl(regs +
> > EXYNOS_GPIO_EFLTCON_OFFSET +                                         
> >      + 2 * bank->eint_offset + 4);
> Optional: I wish there were debug statements to help debug, like:
> 
> pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con);
> pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
> pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
> 

Right, seems reasonable.

> > +}
> > +
> > +static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data
> > *drvdata) +{
> > +       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
> > +       struct samsung_pin_bank *bank = ctrl->pin_banks;
> > +       int i;
> > +
> > +       for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
> > +               if (bank->eint_type == EINT_TYPE_GPIO)
> > +                       exynos_pinctrl_suspend_bank(drvdata, bank);
> > +}
> > +
> > +static void exynos_pinctrl_resume_bank(
> > +                               struct samsung_pinctrl_drv_data
> > *drvdata, +                               struct samsung_pin_bank
> > *bank) +{
> > +       struct exynos_eint_gpio_save *save = bank->soc_priv;
> > +       void __iomem *regs = drvdata->virt_base;
> > +
> 
> Optional: debug statements:
> 
> pr_debug("%s:     con %#010x => %#010x\n", bank->name,
>   readl(regs + EXYNOS_GPIO_ECON_OFFSET + bank->eint_offset),
>   save->eint_con);
> pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
>   readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + 2 * bank->eint_offset),
>   save->eint_fltcon0);
> pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name,
>   readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + 2 * bank->eint_offset + 4),
>   save->eint_fltcon1);

OK. I wonder if this could be added in a separate patch or I should rather 
send v2 on Monday?

Best regards,
Tomasz

WARNING: multiple messages have this Message-ID (diff)
From: tomasz.figa@gmail.com (Tomasz Figa)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 6/6] pinctrl: exynos: Handle suspend/resume of GPIO EINT registers
Date: Fri, 17 May 2013 22:34:21 +0200	[thread overview]
Message-ID: <18754346.1REWN52J0K@flatron> (raw)
In-Reply-To: <CAD=FV=WKCeW=3BFnmnyXB70VCjXHGrzarXbj8cBfq4-ENA-Y2w@mail.gmail.com>

On Friday 17 of May 2013 12:25:02 Doug Anderson wrote:
> Tomasz,
> 
> On Fri, May 17, 2013 at 9:24 AM, Tomasz Figa <t.figa@samsung.com> wrote:
> > Some GPIO EINT control registers needs to be preserved across
> > suspend/resume cycle. This patch extends the driver to take care of
> > this.
> 
> I was confused why we didn't seem to need this on exynos5250-snow but
> figured it out.  We only use interrupts on GPX lines which don't need
> this code.  ...but on any exynos5250 boards that use one of the other
> banks for interrupts you'd need it.  I tested by setting one of the
> registers related to GPA0 and found that this code is indeed needed on
> exynos5250.  :)
> 
> Just nits / optional comments below, so on exynos5250-snow (pinmux
> backported to 3.8):
> 
> Tested-by: Doug Anderson <dianders@chromium.org>
> 
> Reviewed-by: Doug Anderson <dianders@chromium.org>
> 
> > @@ -229,6 +235,11 @@ static int exynos_eint_gpio_init(struct
> > samsung_pinctrl_drv_data *d)> 
> >                         dev_err(dev, "gpio irq domain add failed\n");
> >                         return -ENXIO;
> >                 
> >                 }
> > 
> > +
> > +               bank->soc_priv = devm_kzalloc(d->dev,
> > +                       sizeof(struct exynos_eint_gpio_save),
> > GFP_KERNEL); +               if (!bank->soc_priv)
> > +                       return -ENOMEM;
> 
> Slight nit to add this before the call to irq_domain_add_linear().
> demv() will handle freeing your memory but nothing will handle undoing
> the irq_domain_add_linear() if you return an error.

I'm a bit sceptical when it is about error handling in such cases. 
Basically if interrupt initialization fails, something is seriously wrong, 
either with your kernel config or with some code.

Since such case has been already unhandled in the driver (with nr_banks > 
1 = always), so I didn't bother to add any undoing here.

> >         }
> >         
> >         return 0;
> > 
> > @@ -528,6 +539,58 @@ static int exynos_eint_wkup_init(struct
> > samsung_pinctrl_drv_data *d)> 
> >         return 0;
> >  
> >  }
> > 
> > +static void exynos_pinctrl_suspend_bank(
> > +                               struct samsung_pinctrl_drv_data
> > *drvdata, +                               struct samsung_pin_bank
> > *bank) +{
> > +       struct exynos_eint_gpio_save *save = bank->soc_priv;
> > +       void __iomem *regs = drvdata->virt_base;
> > +
> > +       save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
> > +                                               + bank->eint_offset);
> > +       save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
> > +                                               + 2 *
> > bank->eint_offset); +       save->eint_fltcon1 = readl(regs +
> > EXYNOS_GPIO_EFLTCON_OFFSET +                                         
> >      + 2 * bank->eint_offset + 4);
> Optional: I wish there were debug statements to help debug, like:
> 
> pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con);
> pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
> pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
> 

Right, seems reasonable.

> > +}
> > +
> > +static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data
> > *drvdata) +{
> > +       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
> > +       struct samsung_pin_bank *bank = ctrl->pin_banks;
> > +       int i;
> > +
> > +       for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
> > +               if (bank->eint_type == EINT_TYPE_GPIO)
> > +                       exynos_pinctrl_suspend_bank(drvdata, bank);
> > +}
> > +
> > +static void exynos_pinctrl_resume_bank(
> > +                               struct samsung_pinctrl_drv_data
> > *drvdata, +                               struct samsung_pin_bank
> > *bank) +{
> > +       struct exynos_eint_gpio_save *save = bank->soc_priv;
> > +       void __iomem *regs = drvdata->virt_base;
> > +
> 
> Optional: debug statements:
> 
> pr_debug("%s:     con %#010x => %#010x\n", bank->name,
>   readl(regs + EXYNOS_GPIO_ECON_OFFSET + bank->eint_offset),
>   save->eint_con);
> pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
>   readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + 2 * bank->eint_offset),
>   save->eint_fltcon0);
> pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name,
>   readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + 2 * bank->eint_offset + 4),
>   save->eint_fltcon1);

OK. I wonder if this could be added in a separate patch or I should rather 
send v2 on Monday?

Best regards,
Tomasz

  reply	other threads:[~2013-05-17 20:34 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-17 16:24 [PATCH 0/6] Fix suspend/resume issues created by pinmux on exynos, part 2 Tomasz Figa
2013-05-17 16:24 ` Tomasz Figa
2013-05-17 16:24 ` [PATCH 1/6] pinctrl: exynos: Add support for set_irq_wake of wake-up EINTs Tomasz Figa
2013-05-17 16:24   ` Tomasz Figa
2013-05-17 19:17   ` Doug Anderson
2013-05-17 19:17     ` Doug Anderson
2013-05-21 11:25   ` Linus Walleij
2013-05-21 11:25     ` Linus Walleij
2013-05-17 16:24 ` [PATCH 2/6] ARM: EXYNOS: Fix EINT wake-up mask configuration when pinctrl is used Tomasz Figa
2013-05-17 16:24   ` Tomasz Figa
2013-05-17 19:22   ` Doug Anderson
2013-05-17 19:22     ` Doug Anderson
2013-05-17 19:49     ` Tomasz Figa
2013-05-17 19:49       ` Tomasz Figa
2013-05-21 11:27   ` Linus Walleij
2013-05-21 11:27     ` Linus Walleij
2013-05-17 16:24 ` [PATCH 3/6] ARM: SAMSUNG: pm: Adjust for pinctrl- and DT-enabled platforms Tomasz Figa
2013-05-17 16:24   ` Tomasz Figa
2013-05-17 19:24   ` Doug Anderson
2013-05-17 19:24     ` Doug Anderson
2013-05-17 20:23     ` Tomasz Figa
2013-05-17 20:23       ` Tomasz Figa
2013-05-17 20:56       ` Doug Anderson
2013-05-17 20:56         ` Doug Anderson
2013-05-17 21:07         ` Tomasz Figa
2013-05-17 21:07           ` Tomasz Figa
2013-05-21 11:29           ` Linus Walleij
2013-05-21 11:29             ` Linus Walleij
2013-05-21 13:15             ` Tomasz Figa
2013-05-21 13:15               ` Tomasz Figa
2013-05-21 17:06               ` Tomasz Figa
2013-05-21 17:06                 ` Tomasz Figa
2013-06-10 14:45   ` Tomasz Figa
2013-06-10 14:45     ` Tomasz Figa
2013-06-10 16:13     ` Linus Walleij
2013-06-10 16:13       ` Linus Walleij
2013-06-11  7:45       ` Olof Johansson
2013-06-11  7:45         ` Olof Johansson
2013-06-11  8:21         ` Olof Johansson
2013-06-11  8:21           ` Olof Johansson
2013-06-12  0:15           ` Tomasz Figa
2013-06-12  0:15             ` Tomasz Figa
2013-06-12  0:20             ` Olof Johansson
2013-06-12  0:20               ` Olof Johansson
2013-05-17 16:24 ` [PATCH 4/6] pinctrl: samsung: Add support for SoC-specific suspend/resume callbacks Tomasz Figa
2013-05-17 16:24   ` Tomasz Figa
2013-05-17 19:24   ` Doug Anderson
2013-05-17 19:24     ` Doug Anderson
2013-05-17 20:51     ` Tomasz Figa
2013-05-17 20:51       ` Tomasz Figa
2013-05-24  9:07   ` Linus Walleij
2013-05-24  9:07     ` Linus Walleij
2013-05-24  9:20     ` Tomasz Figa
2013-05-24  9:20       ` Tomasz Figa
2013-05-17 16:24 ` [PATCH 5/6] pinctrl: samsung: Allow per-bank SoC-specific private data Tomasz Figa
2013-05-17 16:24   ` Tomasz Figa
2013-05-17 19:24   ` Doug Anderson
2013-05-17 19:24     ` Doug Anderson
2013-05-24  9:09   ` Linus Walleij
2013-05-24  9:09     ` Linus Walleij
2013-05-17 16:24 ` [PATCH 6/6] pinctrl: exynos: Handle suspend/resume of GPIO EINT registers Tomasz Figa
2013-05-17 16:24   ` Tomasz Figa
2013-05-17 19:25   ` Doug Anderson
2013-05-17 19:25     ` Doug Anderson
2013-05-17 20:34     ` Tomasz Figa [this message]
2013-05-17 20:34       ` Tomasz Figa
2013-05-17 21:18       ` Doug Anderson
2013-05-17 21:18         ` Doug Anderson
2013-05-21 17:05         ` [PATCH v2 " Tomasz Figa
2013-05-21 17:05           ` Tomasz Figa
2013-05-22  4:46           ` Doug Anderson
2013-05-22  4:46             ` Doug Anderson
2013-05-22 13:32             ` Tomasz Figa
2013-05-22 13:32               ` Tomasz Figa
2013-05-22 14:03             ` [PATCH v3 " Tomasz Figa
2013-05-22 14:03               ` Tomasz Figa
2013-05-22 15:57               ` Doug Anderson
2013-05-22 15:57                 ` Doug Anderson
2013-05-24  9:12               ` Linus Walleij
2013-05-24  9:12                 ` Linus Walleij
2013-05-24  9:23                 ` Tomasz Figa
2013-05-24  9:23                   ` Tomasz Figa
2013-05-20  9:35 ` [PATCH 0/6] Fix suspend/resume issues created by pinmux on exynos, part 2 Tushar Behera
2013-05-20  9:35   ` Tushar Behera

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=18754346.1REWN52J0K@flatron \
    --to=tomasz.figa@gmail.com \
    --cc=arnd@arndb.de \
    --cc=dianders@chromium.org \
    --cc=heiko@sntech.de \
    --cc=kgene.kim@samsung.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=olof@lixom.net \
    --cc=prathyush.k@samsung.com \
    --cc=swarren@wwwdotorg.org \
    --cc=t.figa@samsung.com \
    --cc=thomas.abraham@linaro.org \
    /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 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.