* Jon Hunter <jon-hun...@ti.com> [130415 11:15]:
> 
> On 04/15/2013 11:57 AM, Jon Hunter wrote:
> > 
> > On 04/13/2013 11:50 AM, Tony Lindgren wrote:
> >> * Jon Hunter <jon-hun...@ti.com> [130412 19:22]:
> >>>
> >>> On 04/12/2013 07:06 PM, Tony Lindgren wrote:
> >>>> * Tony Lindgren <t...@atomide.com> [130410 15:32]:
> >>>>> * Jon Hunter <jon-hun...@ti.com> [130410 15:30]:
> >>>>>>
> >>>>>> Are you saying that you want to use the version with that is using the
> >>>>>> pre-processor definitions? I was thinking that may be we could do that
> >>>>>> as a clean-up for v3.11 and just use the original version I posted
> >>>>>> earlier. Seems cleaner to me.
> >>>>>
> >>>>> No let's do that the preprocessor conversion for v3.11.
> >>>>
> >>>> Hmm looks like there are few more 3430sdp dt nfsroot exposed
> >>>> issues in today's linux next.
> >>>
> >>> I don't even see any ethernet devices defined in the omap3430-sdp.dts
> >>> file. Is this something that you have added on top?
> >>
> >> Oops sorry I meant the ks8851 on SPI on 4430sdp, not 3430.
> > 
> > Ok makes sense.
> > 
> >>>> To get nfsroot to behave, I had to have your earlier fix
> >>>> from this thread and also revert a2797bea (gpio/omap: force
> >>>> restore if context loss is not detectable).
> >>>>
> >>>> Otherwise nfsroot fails, but not necessarily every time?
> >>>
> >>> Well this patch is going to force a gpio restore everytime we call
> >>> pm_runtime_get() when the use-count is 0. Yes this is not efficient,
> >>> however, without this patch you run the risk of context being lost and
> >>> you would never know. Per the changelog, long term a better solution is
> >>> needed.
> >>
> >> It seems that this patch kills the ks8851 GPIO interrupt somehow,
> >> at least most of the time.
> > 
> > Hmmm, let me go back and re-test this.
> 
> Ok I am seeing the problem. Looks like this patch exposed another
> bug in the gpio driver. Seems that we never initialise the gpio
> context during the probe and so on the first pm_runtime_get_sync()
> during the probe we are restoring crap. Can you try this? If this
> works, I will add a changelog and post as a fix.
> 
> Jon
> 
> From 56598ba51a75481b050433bb38b7ae31a5ed4ae8 Mon Sep 17 00:00:00 2001
> From: Jon Hunter <jon-hun...@ti.com>
> Date: Mon, 15 Apr 2013 13:06:54 -0500
> Subject: [PATCH] gpio/omap: ensure gpio context is initialised

Seems to work thanks:

Tested-by: Tony Lindgren <t...@atomide.com> 

>  drivers/gpio/gpio-omap.c |   42 +++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 41 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index 0557529..53bb8d5 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -70,6 +70,7 @@ struct gpio_bank {
>       bool is_mpuio;
>       bool dbck_flag;
>       bool loses_context;
> +     bool context_setup;
>       int stride;
>       u32 width;
>       int context_loss_count;
> @@ -1085,6 +1086,7 @@ static void omap_gpio_chip_init(struct gpio_bank *bank)
>  }
>  
>  static const struct of_device_id omap_gpio_match[];
> +static void omap_gpio_setup_context(struct gpio_bank *p);
>  
>  static int omap_gpio_probe(struct platform_device *pdev)
>  {
> @@ -1179,8 +1181,10 @@ static int omap_gpio_probe(struct platform_device 
> *pdev)
>       omap_gpio_chip_init(bank);
>       omap_gpio_show_rev(bank);
>  
> -     if (bank->loses_context)
> +     if (bank->loses_context) {
>               bank->get_context_loss_count = pdata->get_context_loss_count;
> +             omap_gpio_setup_context(bank);
> +     }
>  
>       pm_runtime_put(bank->dev);
>  
> @@ -1385,8 +1389,43 @@ void omap2_gpio_resume_after_idle(void)
>  }
>  
>  #if defined(CONFIG_PM_RUNTIME)
> +static void omap_gpio_setup_context(struct gpio_bank *p)
> +{
> +     struct omap_gpio_reg_offs *regs = p->regs;
> +     void __iomem *base = p->base;
> +
> +     p->context.wake_en = __raw_readl(base + regs->wkup_en);
> +     p->context.ctrl = __raw_readl(base + regs->ctrl);
> +     p->context.ctrl = __raw_readl(base + regs->ctrl);
> +     p->context.leveldetect0 = __raw_readl(base + regs->leveldetect0);
> +     p->context.leveldetect1 = __raw_readl(base + regs->leveldetect1);
> +     p->context.risingdetect = __raw_readl(base + regs->risingdetect);
> +     p->context.fallingdetect = __raw_readl(base + regs->fallingdetect);
> +
> +     if (regs->set_dataout && p->regs->clr_dataout)
> +             p->context.dataout = __raw_readl(base + regs->set_dataout);
> +     else
> +             p->context.dataout = __raw_readl(base + regs->dataout);
> +
> +     p->context.oe = __raw_readl(base + regs->direction);
> +
> +     if (p->dbck_enable_mask) {
> +             p->context.debounce = __raw_readl(base + regs->debounce);
> +             p->context.debounce_en = __raw_readl(base + regs->debounce_en);
> +     }
> +
> +     p->context.irqenable1 = __raw_readl(base + regs->irqenable);
> +     p->context.irqenable2 = __raw_readl(base + regs->irqenable2);
> +
> +     p->context_setup = true;
> +}
> +
>  static void omap_gpio_restore_context(struct gpio_bank *bank)
>  {
> +     /* If context has not been initialised yet, return */
> +     if (!bank->context_setup)
> +             return;
> +
>       __raw_writel(bank->context.wake_en,
>                               bank->base + bank->regs->wkup_en);
>       __raw_writel(bank->context.ctrl, bank->base + bank->regs->ctrl);
> @@ -1422,6 +1461,7 @@ static void omap_gpio_restore_context(struct gpio_bank 
> *bank)
>  #else
>  #define omap_gpio_runtime_suspend NULL
>  #define omap_gpio_runtime_resume NULL
> +#define omap_gpio_setup_context NULL
>  #endif
>  
>  static const struct dev_pm_ops gpio_pm_ops = {
> -- 
> 1.7.10.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to