Thread (19 messages) 19 messages, 2 authors, 2012-07-26
STALE5076d

[PATCH v4 04/12] gpio/omap: remove saved_wakeup field from struct gpio_bank

From: DebBarma, Tarun Kanti <hidden>
Date: 2012-07-09 12:30:46
Also in: linux-omap

On Mon, Jul 9, 2012 at 5:21 PM, Roger Quadros [off-list ref] wrote:
Tarun,

On 07/09/2012 02:16 PM, DebBarma, Tarun Kanti wrote:
quoted
Hi Roger,

On Mon, Jul 9, 2012 at 3:13 PM, Roger Quadros [off-list ref] wrote:
quoted
Hi,

Just bumped across this patch and have a query.

On 03/16/2012 04:05 PM, Tarun Kanti DebBarma wrote:
quoted
There is no more need to have saved_wakeup because bank->context.wake_en
already holds that value. So getting rid of read/write operation associated
with this field.

Signed-off-by: Tarun Kanti DebBarma <redacted>
Reviewed-by: Santosh Shilimkar <redacted>
Acked-by: Felipe Balbi <redacted>
---
 drivers/gpio/gpio-omap.c |   12 +++---------
 1 files changed, 3 insertions(+), 9 deletions(-)
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 3a4f151..3b91ade 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -57,7 +57,6 @@ struct gpio_bank {
      u16 irq;
      int irq_base;
      struct irq_domain *domain;
-     u32 saved_wakeup;
      u32 non_wakeup_gpios;
      u32 enabled_non_wakeup_gpios;
      struct gpio_regs context;
@@ -777,7 +776,6 @@ static int omap_mpuio_suspend_noirq(struct device *dev)
      unsigned long           flags;

      spin_lock_irqsave(&bank->lock, flags);
-     bank->saved_wakeup = __raw_readl(mask_reg);
      __raw_writel(0xffff & ~bank->context.wake_en, mask_reg);
OK, here you are overwriting the mask_reg with the wakeup bitmask
without saving the mask_reg's original content.
This is based upon understanding that set_gpio_trigger() is the common
function where update of wake_en register takes place. Unless, mask_reg
in this case refers to something else, effectively we would be saving the
same value to saved_wakeup what is already present in wake_en.
I will verify this specific to this function.
quoted
quoted
      spin_unlock_irqrestore(&bank->lock, flags);
@@ -793,7 +791,7 @@ static int omap_mpuio_resume_noirq(struct device *dev)
      unsigned long           flags;

      spin_lock_irqsave(&bank->lock, flags);
-     __raw_writel(bank->saved_wakeup, mask_reg);
+     __raw_writel(bank->context.wake_en, mask_reg);
Now you are restoring nothing but the same content that you stored
during suspend. This will cause the non-wakeup gpio interrupts to get
masked between a suspend/resume. So isn't this a bug?
That's right, the same value is restored back which was last updated in
set_gpio_trigger() that got stored in wake_en register. Let me know if
I am missing your points here.
If it is writing the same thing then isn't this write redundant?
Not, really. During suspend if the register has lost the context
we need to restore the value from wake_en.
--
Tarun
quoted
quoted
Proper solution would be to save the mask_reg context into another
register than context.wake_en during suspend.
As I said, this would make sense if mask_reg is referring to different
register than what is used in set_gpio_trigger(). I will have a look.
OK thanks.
quoted
BTW, did you observe anything unusual during some testing?
No, I haven't done any tests.

cheers,
-roger
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help