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

---
 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