* [PATCH] gpio: omap: be more aggressive with pm_runtime
@ 2012-02-08 13:26 Felipe Balbi
2012-02-08 13:53 ` Felipe Balbi
2012-02-09 0:01 ` Kevin Hilman
0 siblings, 2 replies; 9+ messages in thread
From: Felipe Balbi @ 2012-02-08 13:26 UTC (permalink / raw)
To: linux-arm-kernel
try to keep gpio block suspended as much as possible.
Tested with pandaboard and a sysfs exported gpio.
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
I couldn't see any issues with this patch. I managed to export
a gpio and change the direction with a while true loop with
no issues whatsoever.
Any chance someone tells me how to reproduce the original
wakeup problem we had ?
I wrote a simple script to dump gpio states while I had:
while true; do echo in > /sys/class/gpio/gpio2/direction; \
echo out > /sys/class/gpio/gpio2/direction; done &
running. Here's the ouput:
./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 11945
runtime_suspended_time 1214578
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1226468
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1226562
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1226578
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1226593
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 12234
runtime_suspended_time 1215257
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1227437
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1227531
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1227546
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1227562
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 12460
runtime_suspended_time 1215882
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1228289
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1228382
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1228398
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1228414
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 12734
runtime_suspended_time 1216453
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1229132
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1229226
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1229242
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1229257
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status active
runtime_active_time 13007
runtime_suspended_time 1216960
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1229914
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1230007
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1230023
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1230039
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 13234
runtime_suspended_time 1217492
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1230671
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1230765
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1230781
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1230796
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 13453
runtime_suspended_time 1218023
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1231421
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1231515
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1231531
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1231546
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 13703
runtime_suspended_time 1218539
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1232187
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1232281
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1232296
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1232312
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status active
runtime_active_time 13890
runtime_suspended_time 1219125
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1232960
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1233054
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1233070
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1233085
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 14109
runtime_suspended_time 1219601
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1233656
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1233750
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1233765
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1233781
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 14367
runtime_suspended_time 1220109
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1234421
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1234515
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1234531
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1234546
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 14531
runtime_suspended_time 1220648
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 78
runtime_suspended_time 1235125
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1235218
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1235234
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 1235250
see that the active time changes for omap_gpio.0 (first gpio bank)
because I'm constantly changing direction of the exported gpio2, but
the other banks are kept in suspend state. I even managed to catch
the gpio bank while it was still in active state. Before suspending
again.
drivers/gpio/gpio-omap.c | 61 +++++++++++++++++++++++++++++++++-------------
1 files changed, 44 insertions(+), 17 deletions(-)
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 4273401..2dd9ced 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -537,12 +537,7 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
unsigned long flags;
- /*
- * If this is the first gpio_request for the bank,
- * enable the bank module.
- */
- if (!bank->mod_usage)
- pm_runtime_get_sync(bank->dev);
+ pm_runtime_get_sync(bank->dev);
spin_lock_irqsave(&bank->lock, flags);
/* Set trigger to none. You need to enable the desired trigger with
@@ -572,6 +567,8 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
+
return 0;
}
@@ -581,6 +578,8 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
void __iomem *base = bank->base;
unsigned long flags;
+ pm_runtime_get_sync(bank->dev);
+
spin_lock_irqsave(&bank->lock, flags);
if (bank->regs->wkup_en) {
@@ -606,12 +605,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
_reset_gpio(bank, bank->chip.base + offset);
spin_unlock_irqrestore(&bank->lock, flags);
- /*
- * If this is the last gpio to be freed in the bank,
- * disable the bank module.
- */
- if (!bank->mod_usage)
- pm_runtime_put(bank->dev);
+ pm_runtime_put(bank->dev);
}
/*
@@ -707,9 +701,11 @@ static void gpio_irq_shutdown(struct irq_data *d)
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
unsigned long flags;
+ pm_runtime_get_sync(bank->dev);
spin_lock_irqsave(&bank->lock, flags);
_reset_gpio(bank, gpio);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
}
static void gpio_ack_irq(struct irq_data *d)
@@ -717,7 +713,9 @@ static void gpio_ack_irq(struct irq_data *d)
unsigned int gpio = d->irq - IH_GPIO_BASE;
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
+ pm_runtime_get_sync(bank->dev);
_clear_gpio_irqstatus(bank, gpio);
+ pm_runtime_put(bank->dev);
}
static void gpio_mask_irq(struct irq_data *d)
@@ -726,10 +724,12 @@ static void gpio_mask_irq(struct irq_data *d)
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
unsigned long flags;
+ pm_runtime_get_sync(bank->dev);
spin_lock_irqsave(&bank->lock, flags);
_set_gpio_irqenable(bank, gpio, 0);
_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
}
static void gpio_unmask_irq(struct irq_data *d)
@@ -740,6 +740,7 @@ static void gpio_unmask_irq(struct irq_data *d)
u32 trigger = irqd_get_trigger_type(d);
unsigned long flags;
+ pm_runtime_get_sync(bank->dev);
spin_lock_irqsave(&bank->lock, flags);
if (trigger)
_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger);
@@ -753,6 +754,7 @@ static void gpio_unmask_irq(struct irq_data *d)
_set_gpio_irqenable(bank, gpio, 1);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
}
static struct irq_chip gpio_irq_chip = {
@@ -836,17 +838,26 @@ static int gpio_input(struct gpio_chip *chip, unsigned offset)
unsigned long flags;
bank = container_of(chip, struct gpio_bank, chip);
+ pm_runtime_get_sync(bank->dev);
+
spin_lock_irqsave(&bank->lock, flags);
_set_gpio_direction(bank, offset, 1);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
+
return 0;
}
static int gpio_is_input(struct gpio_bank *bank, int mask)
{
void __iomem *reg = bank->base + bank->regs->direction;
+ u32 val;
- return __raw_readl(reg) & mask;
+ pm_runtime_get_sync(bank->dev);
+ val = __raw_readl(reg) & mask;
+ pm_runtime_put(bank->dev);
+
+ return val;
}
static int gpio_get(struct gpio_chip *chip, unsigned offset)
@@ -856,15 +867,20 @@ static int gpio_get(struct gpio_chip *chip, unsigned offset)
int gpio;
u32 mask;
+ int val;
gpio = chip->base + offset;
bank = container_of(chip, struct gpio_bank, chip);
reg = bank->base;
mask = GPIO_BIT(bank, gpio);
+ pm_runtime_get_sync(bank->dev);
if (gpio_is_input(bank, mask))
- return _get_gpio_datain(bank, gpio);
+ val = _get_gpio_datain(bank, gpio);
else
- return _get_gpio_dataout(bank, gpio);
+ val = _get_gpio_dataout(bank, gpio);
+ pm_runtime_put(bank->dev);
+
+ return val;
}
static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
@@ -873,10 +889,14 @@ static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
unsigned long flags;
bank = container_of(chip, struct gpio_bank, chip);
+
+ pm_runtime_get_sync(bank->dev);
spin_lock_irqsave(&bank->lock, flags);
bank->set_dataout(bank, offset, value);
_set_gpio_direction(bank, offset, 0);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
+
return 0;
}
@@ -894,9 +914,11 @@ static int gpio_debounce(struct gpio_chip *chip, unsigned offset,
dev_err(bank->dev, "Could not get gpio dbck\n");
}
+ pm_runtime_get_sync(bank->dev);
spin_lock_irqsave(&bank->lock, flags);
_set_gpio_debounce(bank, offset, debounce);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
return 0;
}
@@ -907,9 +929,12 @@ static void gpio_set(struct gpio_chip *chip, unsigned offset, int value)
unsigned long flags;
bank = container_of(chip, struct gpio_bank, chip);
+
+ pm_runtime_get_sync(bank->dev);
spin_lock_irqsave(&bank->lock, flags);
bank->set_dataout(bank, offset, value);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put(bank->dev);
}
static int gpio_2irq(struct gpio_chip *chip, unsigned offset)
@@ -1330,7 +1355,8 @@ void omap2_gpio_prepare_for_idle(int pwr_mode)
bank->power_mode = pwr_mode;
- pm_runtime_put_sync_suspend(bank->dev);
+ if (!pm_runtime_suspended(bank->dev))
+ pm_runtime_suspend(bank->dev);
}
}
@@ -1342,7 +1368,8 @@ void omap2_gpio_resume_after_idle(void)
if (!bank->mod_usage || !bank->loses_context)
continue;
- pm_runtime_get_sync(bank->dev);
+ if (pm_runtime_suspended(bank->dev))
+ pm_runtime_resume(bank->dev);
}
}
--
1.7.9
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-08 13:26 [PATCH] gpio: omap: be more aggressive with pm_runtime Felipe Balbi
@ 2012-02-08 13:53 ` Felipe Balbi
2012-02-09 0:03 ` Kevin Hilman
2012-02-09 0:01 ` Kevin Hilman
1 sibling, 1 reply; 9+ messages in thread
From: Felipe Balbi @ 2012-02-08 13:53 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Feb 08, 2012 at 03:26:54PM +0200, Felipe Balbi wrote:
> try to keep gpio block suspended as much as possible.
>
> Tested with pandaboard and a sysfs exported gpio.
>
> Signed-off-by: Felipe Balbi <balbi@ti.com>
> ---
>
> I couldn't see any issues with this patch. I managed to export
> a gpio and change the direction with a while true loop with
> no issues whatsoever.
btw, I also played with gpios 7 and 8 because they have LEDs on them on
pandaboard and everything seems to be fine.
I just want to be sure I can still go to OFF mode and wakeup, but on
vanilla 3.3-rc2 after echo mem > /sys/power/state the systems freezes on
panda, so I can't go any further.
> Any chance someone tells me how to reproduce the original
> wakeup problem we had ?
>
> I wrote a simple script to dump gpio states while I had:
>
> while true; do echo in > /sys/class/gpio/gpio2/direction; \
> echo out > /sys/class/gpio/gpio2/direction; done &
>
> running. Here's the ouput:
>
> ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 11945
> runtime_suspended_time 1214578
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1226468
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1226562
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1226578
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1226593
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 12234
> runtime_suspended_time 1215257
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1227437
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1227531
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1227546
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1227562
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 12460
> runtime_suspended_time 1215882
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1228289
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1228382
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1228398
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1228414
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 12734
> runtime_suspended_time 1216453
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1229132
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1229226
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1229242
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1229257
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status active
> runtime_active_time 13007
> runtime_suspended_time 1216960
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1229914
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1230007
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1230023
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1230039
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 13234
> runtime_suspended_time 1217492
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1230671
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1230765
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1230781
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1230796
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 13453
> runtime_suspended_time 1218023
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1231421
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1231515
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1231531
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1231546
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 13703
> runtime_suspended_time 1218539
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1232187
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1232281
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1232296
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1232312
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status active
> runtime_active_time 13890
> runtime_suspended_time 1219125
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1232960
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1233054
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1233070
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1233085
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 14109
> runtime_suspended_time 1219601
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1233656
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1233750
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1233765
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1233781
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 14367
> runtime_suspended_time 1220109
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1234421
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1234515
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1234531
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1234546
>
> root at legolas:~# ./show_gpios.sh
> omap_gpio.0
> control auto
> runtime_status suspended
> runtime_active_time 14531
> runtime_suspended_time 1220648
>
> omap_gpio.1
> control auto
> runtime_status suspended
> runtime_active_time 78
> runtime_suspended_time 1235125
>
> omap_gpio.2
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1235218
>
> omap_gpio.3
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1235234
>
> omap_gpio.4
> control auto
> runtime_status suspended
> runtime_active_time 0
> runtime_suspended_time 1235250
>
> see that the active time changes for omap_gpio.0 (first gpio bank)
> because I'm constantly changing direction of the exported gpio2, but
> the other banks are kept in suspend state. I even managed to catch
> the gpio bank while it was still in active state. Before suspending
> again.
>
> drivers/gpio/gpio-omap.c | 61 +++++++++++++++++++++++++++++++++-------------
> 1 files changed, 44 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index 4273401..2dd9ced 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -537,12 +537,7 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
> struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
> unsigned long flags;
>
> - /*
> - * If this is the first gpio_request for the bank,
> - * enable the bank module.
> - */
> - if (!bank->mod_usage)
> - pm_runtime_get_sync(bank->dev);
> + pm_runtime_get_sync(bank->dev);
>
> spin_lock_irqsave(&bank->lock, flags);
> /* Set trigger to none. You need to enable the desired trigger with
> @@ -572,6 +567,8 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
>
> spin_unlock_irqrestore(&bank->lock, flags);
>
> + pm_runtime_put(bank->dev);
> +
> return 0;
> }
>
> @@ -581,6 +578,8 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
> void __iomem *base = bank->base;
> unsigned long flags;
>
> + pm_runtime_get_sync(bank->dev);
> +
> spin_lock_irqsave(&bank->lock, flags);
>
> if (bank->regs->wkup_en) {
> @@ -606,12 +605,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
> _reset_gpio(bank, bank->chip.base + offset);
> spin_unlock_irqrestore(&bank->lock, flags);
>
> - /*
> - * If this is the last gpio to be freed in the bank,
> - * disable the bank module.
> - */
> - if (!bank->mod_usage)
> - pm_runtime_put(bank->dev);
> + pm_runtime_put(bank->dev);
> }
>
> /*
> @@ -707,9 +701,11 @@ static void gpio_irq_shutdown(struct irq_data *d)
> struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
> unsigned long flags;
>
> + pm_runtime_get_sync(bank->dev);
> spin_lock_irqsave(&bank->lock, flags);
> _reset_gpio(bank, gpio);
> spin_unlock_irqrestore(&bank->lock, flags);
> + pm_runtime_put(bank->dev);
> }
>
> static void gpio_ack_irq(struct irq_data *d)
> @@ -717,7 +713,9 @@ static void gpio_ack_irq(struct irq_data *d)
> unsigned int gpio = d->irq - IH_GPIO_BASE;
> struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
>
> + pm_runtime_get_sync(bank->dev);
> _clear_gpio_irqstatus(bank, gpio);
> + pm_runtime_put(bank->dev);
> }
>
> static void gpio_mask_irq(struct irq_data *d)
> @@ -726,10 +724,12 @@ static void gpio_mask_irq(struct irq_data *d)
> struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
> unsigned long flags;
>
> + pm_runtime_get_sync(bank->dev);
> spin_lock_irqsave(&bank->lock, flags);
> _set_gpio_irqenable(bank, gpio, 0);
> _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
> spin_unlock_irqrestore(&bank->lock, flags);
> + pm_runtime_put(bank->dev);
> }
>
> static void gpio_unmask_irq(struct irq_data *d)
> @@ -740,6 +740,7 @@ static void gpio_unmask_irq(struct irq_data *d)
> u32 trigger = irqd_get_trigger_type(d);
> unsigned long flags;
>
> + pm_runtime_get_sync(bank->dev);
> spin_lock_irqsave(&bank->lock, flags);
> if (trigger)
> _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger);
> @@ -753,6 +754,7 @@ static void gpio_unmask_irq(struct irq_data *d)
>
> _set_gpio_irqenable(bank, gpio, 1);
> spin_unlock_irqrestore(&bank->lock, flags);
> + pm_runtime_put(bank->dev);
> }
>
> static struct irq_chip gpio_irq_chip = {
> @@ -836,17 +838,26 @@ static int gpio_input(struct gpio_chip *chip, unsigned offset)
> unsigned long flags;
>
> bank = container_of(chip, struct gpio_bank, chip);
> + pm_runtime_get_sync(bank->dev);
> +
> spin_lock_irqsave(&bank->lock, flags);
> _set_gpio_direction(bank, offset, 1);
> spin_unlock_irqrestore(&bank->lock, flags);
> + pm_runtime_put(bank->dev);
> +
> return 0;
> }
>
> static int gpio_is_input(struct gpio_bank *bank, int mask)
> {
> void __iomem *reg = bank->base + bank->regs->direction;
> + u32 val;
>
> - return __raw_readl(reg) & mask;
> + pm_runtime_get_sync(bank->dev);
> + val = __raw_readl(reg) & mask;
> + pm_runtime_put(bank->dev);
> +
> + return val;
> }
>
> static int gpio_get(struct gpio_chip *chip, unsigned offset)
> @@ -856,15 +867,20 @@ static int gpio_get(struct gpio_chip *chip, unsigned offset)
> int gpio;
> u32 mask;
>
> + int val;
> gpio = chip->base + offset;
> bank = container_of(chip, struct gpio_bank, chip);
> reg = bank->base;
> mask = GPIO_BIT(bank, gpio);
>
> + pm_runtime_get_sync(bank->dev);
> if (gpio_is_input(bank, mask))
> - return _get_gpio_datain(bank, gpio);
> + val = _get_gpio_datain(bank, gpio);
> else
> - return _get_gpio_dataout(bank, gpio);
> + val = _get_gpio_dataout(bank, gpio);
> + pm_runtime_put(bank->dev);
> +
> + return val;
> }
>
> static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
> @@ -873,10 +889,14 @@ static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
> unsigned long flags;
>
> bank = container_of(chip, struct gpio_bank, chip);
> +
> + pm_runtime_get_sync(bank->dev);
> spin_lock_irqsave(&bank->lock, flags);
> bank->set_dataout(bank, offset, value);
> _set_gpio_direction(bank, offset, 0);
> spin_unlock_irqrestore(&bank->lock, flags);
> + pm_runtime_put(bank->dev);
> +
> return 0;
> }
>
> @@ -894,9 +914,11 @@ static int gpio_debounce(struct gpio_chip *chip, unsigned offset,
> dev_err(bank->dev, "Could not get gpio dbck\n");
> }
>
> + pm_runtime_get_sync(bank->dev);
> spin_lock_irqsave(&bank->lock, flags);
> _set_gpio_debounce(bank, offset, debounce);
> spin_unlock_irqrestore(&bank->lock, flags);
> + pm_runtime_put(bank->dev);
>
> return 0;
> }
> @@ -907,9 +929,12 @@ static void gpio_set(struct gpio_chip *chip, unsigned offset, int value)
> unsigned long flags;
>
> bank = container_of(chip, struct gpio_bank, chip);
> +
> + pm_runtime_get_sync(bank->dev);
> spin_lock_irqsave(&bank->lock, flags);
> bank->set_dataout(bank, offset, value);
> spin_unlock_irqrestore(&bank->lock, flags);
> + pm_runtime_put(bank->dev);
> }
>
> static int gpio_2irq(struct gpio_chip *chip, unsigned offset)
> @@ -1330,7 +1355,8 @@ void omap2_gpio_prepare_for_idle(int pwr_mode)
>
> bank->power_mode = pwr_mode;
>
> - pm_runtime_put_sync_suspend(bank->dev);
> + if (!pm_runtime_suspended(bank->dev))
> + pm_runtime_suspend(bank->dev);
> }
> }
>
> @@ -1342,7 +1368,8 @@ void omap2_gpio_resume_after_idle(void)
> if (!bank->mod_usage || !bank->loses_context)
> continue;
>
> - pm_runtime_get_sync(bank->dev);
> + if (pm_runtime_suspended(bank->dev))
> + pm_runtime_resume(bank->dev);
> }
> }
>
> --
> 1.7.9
>
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120208/322a03b0/attachment-0001.sig>
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-08 13:53 ` Felipe Balbi
@ 2012-02-09 0:03 ` Kevin Hilman
2012-02-09 6:08 ` Felipe Balbi
0 siblings, 1 reply; 9+ messages in thread
From: Kevin Hilman @ 2012-02-09 0:03 UTC (permalink / raw)
To: linux-arm-kernel
Felipe Balbi <balbi@ti.com> writes:
> Hi,
>
> On Wed, Feb 08, 2012 at 03:26:54PM +0200, Felipe Balbi wrote:
>> try to keep gpio block suspended as much as possible.
>>
>> Tested with pandaboard and a sysfs exported gpio.
>>
>> Signed-off-by: Felipe Balbi <balbi@ti.com>
>> ---
>>
>> I couldn't see any issues with this patch. I managed to export
>> a gpio and change the direction with a while true loop with
>> no issues whatsoever.
>
> btw, I also played with gpios 7 and 8 because they have LEDs on them on
> pandaboard and everything seems to be fine.
>
> I just want to be sure I can still go to OFF mode and wakeup, but on
> vanilla 3.3-rc2 after echo mem > /sys/power/state the systems freezes on
> panda, so I can't go any further.
I don't think it's frozen. I suspected it's suspended without any
wakeups enabled. You probably haven't enabled UART wakeups. Try
enabling them like this:
echo enabled > /sys/devices/platform/omap/omap_uart.2/tty/ttyO2/power/wakeup
before going into suspend.
Kevin
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-09 0:03 ` Kevin Hilman
@ 2012-02-09 6:08 ` Felipe Balbi
0 siblings, 0 replies; 9+ messages in thread
From: Felipe Balbi @ 2012-02-09 6:08 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Feb 08, 2012 at 04:03:24PM -0800, Kevin Hilman wrote:
> Felipe Balbi <balbi@ti.com> writes:
>
> > Hi,
> >
> > On Wed, Feb 08, 2012 at 03:26:54PM +0200, Felipe Balbi wrote:
> >> try to keep gpio block suspended as much as possible.
> >>
> >> Tested with pandaboard and a sysfs exported gpio.
> >>
> >> Signed-off-by: Felipe Balbi <balbi@ti.com>
> >> ---
> >>
> >> I couldn't see any issues with this patch. I managed to export
> >> a gpio and change the direction with a while true loop with
> >> no issues whatsoever.
> >
> > btw, I also played with gpios 7 and 8 because they have LEDs on them on
> > pandaboard and everything seems to be fine.
> >
> > I just want to be sure I can still go to OFF mode and wakeup, but on
> > vanilla 3.3-rc2 after echo mem > /sys/power/state the systems freezes on
> > panda, so I can't go any further.
>
> I don't think it's frozen. I suspected it's suspended without any
> wakeups enabled. You probably haven't enabled UART wakeups. Try
> enabling them like this:
>
> echo enabled > /sys/devices/platform/omap/omap_uart.2/tty/ttyO2/power/wakeup
>
> before going into suspend.
that did the trick. But not having UART with wakeup enabled by default
prevents us from doing suspend/resume tests during bootup, because the
system won't wakeup through console.
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120209/b0ab2319/attachment.sig>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-08 13:26 [PATCH] gpio: omap: be more aggressive with pm_runtime Felipe Balbi
2012-02-08 13:53 ` Felipe Balbi
@ 2012-02-09 0:01 ` Kevin Hilman
2012-02-09 6:09 ` Felipe Balbi
1 sibling, 1 reply; 9+ messages in thread
From: Kevin Hilman @ 2012-02-09 0:01 UTC (permalink / raw)
To: linux-arm-kernel
Felipe Balbi <balbi@ti.com> writes:
> try to keep gpio block suspended as much as possible.
>
> Tested with pandaboard and a sysfs exported gpio.
>
> Signed-off-by: Felipe Balbi <balbi@ti.com>
> ---
Looks like you need a few more get/puts around other places where
registers are accessed. It currently causes a boot crash on OMAP3 in
_set_gpio_triggering().
Did you test GPIO wakeups? both IO ring wakeups and GPIO module-level
wakeups?
Kevin
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-09 0:01 ` Kevin Hilman
@ 2012-02-09 6:09 ` Felipe Balbi
2012-02-09 11:11 ` Felipe Balbi
0 siblings, 1 reply; 9+ messages in thread
From: Felipe Balbi @ 2012-02-09 6:09 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Feb 08, 2012 at 04:01:42PM -0800, Kevin Hilman wrote:
> Felipe Balbi <balbi@ti.com> writes:
>
> > try to keep gpio block suspended as much as possible.
> >
> > Tested with pandaboard and a sysfs exported gpio.
> >
> > Signed-off-by: Felipe Balbi <balbi@ti.com>
> > ---
>
> Looks like you need a few more get/puts around other places where
> registers are accessed. It currently causes a boot crash on OMAP3 in
> _set_gpio_triggering().
it was a missing get/put on gpio_irq_set_type(). Fixed.
> Did you test GPIO wakeups? both IO ring wakeups and GPIO module-level
> wakeups?
how can I test that easily with panda ?
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120209/fcca7d4e/attachment-0001.sig>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-09 6:09 ` Felipe Balbi
@ 2012-02-09 11:11 ` Felipe Balbi
2012-02-09 11:29 ` Felipe Balbi
2012-02-09 12:03 ` Grazvydas Ignotas
0 siblings, 2 replies; 9+ messages in thread
From: Felipe Balbi @ 2012-02-09 11:11 UTC (permalink / raw)
To: linux-arm-kernel
Hi again,
On Thu, Feb 09, 2012 at 08:09:40AM +0200, Felipe Balbi wrote:
> On Wed, Feb 08, 2012 at 04:01:42PM -0800, Kevin Hilman wrote:
> > Felipe Balbi <balbi@ti.com> writes:
> >
> > > try to keep gpio block suspended as much as possible.
> > >
> > > Tested with pandaboard and a sysfs exported gpio.
> > >
> > > Signed-off-by: Felipe Balbi <balbi@ti.com>
> > > ---
> >
> > Looks like you need a few more get/puts around other places where
> > registers are accessed. It currently causes a boot crash on OMAP3 in
> > _set_gpio_triggering().
>
> it was a missing get/put on gpio_irq_set_type(). Fixed.
>
> > Did you test GPIO wakeups? both IO ring wakeups and GPIO module-level
> > wakeups?
>
> how can I test that easily with panda ?
Ok, I have added gpio-keys to panda's boardfile:
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
index 30ad40d..0a38282 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -23,6 +23,7 @@
#include <linux/io.h>
#include <linux/leds.h>
#include <linux/gpio.h>
+#include <linux/gpio_keys.h>
#include <linux/usb/otg.h>
#include <linux/i2c/twl.h>
#include <linux/regulator/machine.h>
@@ -90,7 +91,30 @@ static struct platform_device leds_gpio = {
},
};
+static struct gpio_keys_button gpio_buttons[] = {
+ {
+ .code = BTN_EXTRA,
+ .gpio = 121,
+ .desc = "user",
+ .wakeup = 1,
+ },
+};
+
+static struct gpio_keys_platform_data gpio_key_info = {
+ .buttons = gpio_buttons,
+ .nbuttons = ARRAY_SIZE(gpio_buttons),
+};
+
+static struct platform_device keys_gpio = {
+ .name = "gpio-keys",
+ .id = -1,
+ .dev = {
+ .platform_data = &gpio_key_info,
+ },
+};
+
static struct platform_device *panda_devices[] __initdata = {
+ &keys_gpio,
&leds_gpio,
&wl1271_device,
};
Then I enabled IRQ wake on gpio-keys driver:
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index ed1ed46..e6a0c37a 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -410,6 +410,8 @@ static int __devinit gpio_keys_setup_key(struct platform_device *pdev,
goto fail3;
}
+ enable_irq_wake(irq);
+
irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
/*
* If platform has specified that the button can be disabled,
and enabled wakeup on the gpio-keys:
# echo enabled > /sys/devices/platform/gpio-keys/power/wakeup
suspended the device, and woke it up by pressing S2 (user button). It
almost works, hehe. I can suspend and wake pandaboard up with the user
button. But after that, GPIO module is dead. BTW, I had to prevent
gpio's suspend/resume functions from being called. For some reason,
pm-core is still calling them:
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index db5dcca..d6c1fef 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1170,6 +1170,9 @@ static int omap_gpio_suspend(struct device *dev)
void __iomem *wakeup_enable;
unsigned long flags;
+ if (pm_runtime_suspended(dev))
+ return 0;
+
if (!bank->mod_usage || !bank->loses_context)
return 0;
@@ -1194,6 +1197,9 @@ static int omap_gpio_resume(struct device *dev)
void __iomem *base = bank->base;
unsigned long flags;
+ if (pm_runtime_suspended(dev))
+ return 0;
+
if (!bank->mod_usage || !bank->loses_context)
return 0;
I will continue debugging this, I think it's just something stupid that
I did. Here's entire log:
root at legalas:~# echo enabled > /sys/devices/platform/gpio-keys/power/wakeup
root at legolas:~# echo enabled > /sys/devices/platform/omap/omap_uart.2/power/wakeup
root at legolas:~# grep user /proc/interrupts
281: 0 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 2 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 5 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 7 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 8 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 9 0 GPIO user
root at legolas:~#
root at legolas:~#
root at legolas:~# echo mem > /sys/power/state
[ 62.593200] PM: Syncing filesystems ... done.
[ 62.605743] Freezing user space processes ... (elapsed 0.03 seconds) done.
[ 62.636230] Freezing remaining freezable tasks ... (elapsed 0.04 seconds) done.
[ 62.692993] Suspending console(s) (use no_console_suspend to debug)
[ 62.709960] PM: suspend of devices complete after 8.270 msecs
[ 62.711853] PM: late suspend of devices complete after 1.770 msecs
[ 62.711853] Disabling non-boot CPUs ...
[ 62.715118] CPU1: shutdown
[ 65.369873] Successfully put all powerdomains to target state
[ 65.369995] Enabling non-boot CPUs ...
[ 65.371612] CPU1: Booted secondary processor
[ 65.372161] Calibrating delay loop (skipped) already calibrated this CPU
[ 65.372741] CPU1 is up
[ 65.373962] PM: early resume of devices complete after 1.220 msecs
[ 65.373962] ------------[ cut here ]------------
[ 65.374114] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:113 l3_interrupt_handler+0x184/0x1c4()
[ 65.374114] L3 custom error: MASTER:MPU TARGET:L4 PER2
[ 65.374114] Modules linked in:
[ 65.374114] [<c001b824>] (unwind_backtrace+0x0/0xf0) from [<c0042a60>] (warn_slowpath_common+0x4c/0x64)
[ 65.374206] [<c0042a60>] (warn_slowpath_common+0x4c/0x64) from [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40)
[ 65.374206] [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40) from [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4)
[ 65.374267] [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4) from [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c)
[ 65.374267] [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c) from [<c00a2104>] (handle_irq_event+0x3c/0x5c)
[ 65.374298] [<c00a2104>] (handle_irq_event+0x3c/0x5c) from [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140)
[ 65.374328] [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140) from [<c00a170c>] (generic_handle_irq+0x30/0x48)
[ 65.374328] [<c00a170c>] (generic_handle_irq+0x30/0x48) from [<c0014bd8>] (handle_IRQ+0x4c/0xac)
[ 65.374389] [<c0014bd8>] (handle_IRQ+0x4c/0xac) from [<c000848c>] (gic_handle_irq+0x28/0xac)
[ 65.374389] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] (__irq_svc+0x44/0x60)
[ 65.374389] Exception stack(0xee147e60 to 0xee147ea8)
[ 65.374450] 7e60: 00011de7 00000003 00000000 ee0f7580 60000113 c068c194 00000000 c068c194
[ 65.374450] 7e80: 60000113 ee04d780 c068c140 000d7518 00001584 ee147ea8 00011de8 c04807a4
[ 65.374450] 7ea0: 20000113 ffffffff
[ 65.374481] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44)
[ 65.374481] [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44) from [<c00a717c>] (resume_irqs+0x9c/0xbc)
[ 65.374511] [<c00a717c>] (resume_irqs+0x9c/0xbc) from [<c0080998>] (suspend_enter+0xa4/0x168)
[ 65.374542] [<c0080998>] (suspend_enter+0xa4/0x168) from [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c)
[ 65.374542] [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c) from [<c0080d24>] (enter_state+0x13c/0x17c)
[ 65.374572] [<c0080d24>] (enter_state+0x13c/0x17c) from [<c007fa1c>] (state_store+0xd0/0x178)
[ 65.374603] [<c007fa1c>] (state_store+0xd0/0x178) from [<c0258f48>] (kobj_attr_store+0x14/0x20)
[ 65.374603] [<c0258f48>] (kobj_attr_store+0x14/0x20) from [<c0169958>] (sysfs_write_file+0x100/0x184)
[ 65.374633] [<c0169958>] (sysfs_write_file+0x100/0x184) from [<c0109d10>] (vfs_write+0xb4/0x148)
[ 65.374664] [<c0109d10>] (vfs_write+0xb4/0x148) from [<c0109f98>] (sys_write+0x40/0x70)
[ 65.374664] [<c0109f98>] (sys_write+0x40/0x70) from [<c0013cc0>] (ret_fast_syscall+0x0/0x3c)
[ 65.374694] ---[ end trace 4898b0d1d1bc4fab ]---
[ 65.374694] ------------[ cut here ]------------
[ 65.374694] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:113 l3_interrupt_handler+0x184/0x1c4()
[ 65.374694] L3 custom error: MASTER:MPU TARGET:L4 PER2
[ 65.375305] Modules linked in:
[ 65.375305] [<c001b824>] (unwind_backtrace+0x0/0xf0) from [<c0042a60>] (warn_slowpath_common+0x4c/0x64)
[ 65.375335] [<c0042a60>] (warn_slowpath_common+0x4c/0x64) from [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40)
[ 65.375335] [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40) from [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4)
[ 65.375366] [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4) from [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c)
[ 65.375396] [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c) from [<c00a2104>] (handle_irq_event+0x3c/0x5c)
[ 65.375396] [<c00a2104>] (handle_irq_event+0x3c/0x5c) from [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140)
[ 65.375427] [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140) from [<c00a170c>] (generic_handle_irq+0x30/0x48)
[ 65.375427] [<c00a170c>] (generic_handle_irq+0x30/0x48) from [<c0014bd8>] (handle_IRQ+0x4c/0xac)
[ 65.375457] [<c0014bd8>] (handle_IRQ+0x4c/0xac) from [<c000848c>] (gic_handle_irq+0x28/0xac)
[ 65.375457] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] (__irq_svc+0x44/0x60)
[ 65.375488] Exception stack(0xee147e60 to 0xee147ea8)
[ 65.375488] 7e60: 00011fc7 00000003 00000000 ee0f7580 60000113 c06974d4 00000000 c06974d4
[ 65.375488] 7e80: 60000113 ee04d780 c0697480 000d7518 00001584 ee147ea8 00011fc8 c04807a4
[ 65.375518] 7ea0: 20000113 ffffffff
[ 65.375518] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44)
[ 65.375549] [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44) from [<c00a717c>] (resume_irqs+0x9c/0xbc)
[ 65.375549] [<c00a717c>] (resume_irqs+0x9c/0xbc) from [<c0080998>] (suspend_enter+0xa4/0x168)
[ 65.375579] [<c0080998>] (suspend_enter+0xa4/0x168) from [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c)
[ 65.375579] [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c) from [<c0080d24>] (enter_state+0x13c/0x17c)
[ 65.375610] [<c0080d24>] (enter_state+0x13c/0x17c) from [<c007fa1c>] (state_store+0xd0/0x178)
[ 65.375610] [<c007fa1c>] (state_store+0xd0/0x178) from [<c0258f48>] (kobj_attr_store+0x14/0x20)
[ 65.375640] [<c0258f48>] (kobj_attr_store+0x14/0x20) from [<c0169958>] (sysfs_write_file+0x100/0x184)
[ 65.375640] [<c0169958>] (sysfs_write_file+0x100/0x184) from [<c0109d10>] (vfs_write+0xb4/0x148)
[ 65.375671] [<c0109d10>] (vfs_write+0xb4/0x148) from [<c0109f98>] (sys_write+0x40/0x70)
[ 65.375671] [<c0109f98>] (sys_write+0x40/0x70) from [<c0013cc0>] (ret_fast_syscall+0x0/0x3c)
[ 65.375671] ---[ end trace 4898b0d1d1bc4fac ]---
[ 65.375701] ------------[ cut here ]------------
[ 65.375762] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:113 l3_interrupt_handler+0x184/0x1c4()
[ 65.375762] L3 custom error: MASTER:MPU TARGET:L4 PER2
[ 65.375762] Modules linked in:
[ 65.375793] [<c001b824>] (unwind_backtrace+0x0/0xf0) from [<c0042a60>] (warn_slowpath_common+0x4c/0x64)
[ 65.375793] [<c0042a60>] (warn_slowpath_common+0x4c/0x64) from [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40)
[ 65.375823] [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40) from [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4)
[ 65.375854] [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4) from [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c)
[ 65.375854] [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c) from [<c00a2104>] (handle_irq_event+0x3c/0x5c)
[ 65.375885] [<c00a2104>] (handle_irq_event+0x3c/0x5c) from [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140)
[ 65.375885] [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140) from [<c00a170c>] (generic_handle_irq+0x30/0x48)
[ 65.375915] [<c00a170c>] (generic_handle_irq+0x30/0x48) from [<c0014bd8>] (handle_IRQ+0x4c/0xac)
[ 65.375915] [<c0014bd8>] (handle_IRQ+0x4c/0xac) from [<c000848c>] (gic_handle_irq+0x28/0xac)
[ 65.375946] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] (__irq_svc+0x44/0x60)
[ 65.375946] Exception stack(0xee147d60 to 0xee147da8)
[ 65.375946] 7d60: 00011fce 00000003 00000000 ee0f7580 c0697480 00000119 c06e669c c06e669c
[ 65.375976] 7d80: 00000000 c06854a8 c069f108 c0723300 00000000 ee147da8 00011fcf c00a4224
[ 65.375976] 7da0: 60000113 ffffffff
[ 65.375976] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c00a4224>] (resend_irqs+0x50/0x74)
[ 65.376007] [<c00a4224>] (resend_irqs+0x50/0x74) from [<c0049990>] (tasklet_action+0x80/0x180)
[ 65.376037] [<c0049990>] (tasklet_action+0x80/0x180) from [<c0049f04>] (__do_softirq+0xd0/0x200)
[ 65.376037] [<c0049f04>] (__do_softirq+0xd0/0x200) from [<c004a4c0>] (irq_exit+0x94/0x9c)
[ 65.376068] [<c004a4c0>] (irq_exit+0x94/0x9c) from [<c0014bdc>] (handle_IRQ+0x50/0xac)
[ 65.376068] [<c0014bdc>] (handle_IRQ+0x50/0xac) from [<c000848c>] (gic_handle_irq+0x28/0xac)
[ 65.376098] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] (__irq_svc+0x44/0x60)
[ 65.376098] Exception stack(0xee147e60 to 0xee147ea8)
[ 65.376098] 7e60: 00011fc7 00000003 00000000 ee0f7580 60000113 c06974d4 00000000 c06974d4
[ 65.376129] 7e80: 60000113 ee04d780 c0697480 000d7518 00001584 ee147ea8 00011fc8 c04807a4
[ 65.376129] 7ea0: 20000113 ffffffff
[ 65.376159] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44)
[ 65.376159] [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44) from [<c00a717c>] (resume_irqs+0x9c/0xbc)
[ 65.376190] [<c00a717c>] (resume_irqs+0x9c/0xbc) from [<c0080998>] (suspend_enter+0xa4/0x168)
[ 65.376190] [<c0080998>] (suspend_enter+0xa4/0x168) from [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c)
[ 65.376220] [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c) from [<c0080d24>] (enter_state+0x13c/0x17c)
[ 65.376220] [<c0080d24>] (enter_state+0x13c/0x17c) from [<c007fa1c>] (state_store+0xd0/0x178)
[ 65.376220] [<c007fa1c>] (state_store+0xd0/0x178) from [<c0258f48>] (kobj_attr_store+0x14/0x20)
[ 65.376251] [<c0258f48>] (kobj_attr_store+0x14/0x20) from [<c0169958>] (sysfs_write_file+0x100/0x184)
[ 65.376281] [<c0169958>] (sysfs_write_file+0x100/0x184) from [<c0109d10>] (vfs_write+0xb4/0x148)
[ 65.376281] [<c0109d10>] (vfs_write+0xb4/0x148) from [<c0109f98>] (sys_write+0x40/0x70)
[ 65.376312] [<c0109f98>] (sys_write+0x40/0x70) from [<c0013cc0>] (ret_fast_syscall+0x0/0x3c)
[ 65.376312] ---[ end trace 4898b0d1d1bc4fad ]---
[ 66.479217] PM: resume of devices complete after 1102.905 msecs
[ 67.393280] Restarting tasks ... done.
root at legolas:~# [ 71.719665] mmcblk0: error -110 transferring data, sector 3557217, nr 72, cmd response 0x900, card status 0xc00
[ 71.730468] end_request: I/O error, dev mmcblk0, sector 3557280
[ 71.730651] end_request: I/O error, dev mmcblk0, sector 3557281
[ 71.743591] Aborting journal on device mmcblk0p2.
[ 71.753845] EXT3-fs (mmcblk0p2): error: ext3_journal_start_sb: Detected aborted journal
[ 71.753845] EXT3-fs (mmcblk0p2): error: remounting filesystem read-only
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 10 0 GPIO user
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120209/1f0bec5b/attachment-0001.sig>
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-09 11:11 ` Felipe Balbi
@ 2012-02-09 11:29 ` Felipe Balbi
2012-02-09 12:03 ` Grazvydas Ignotas
1 sibling, 0 replies; 9+ messages in thread
From: Felipe Balbi @ 2012-02-09 11:29 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Thu, Feb 09, 2012 at 01:11:45PM +0200, Felipe Balbi wrote:
> I will continue debugging this, I think it's just something stupid that
> I did. Here's entire log:
Indeed some stupidity of mine. I know the following is wrong, but I just
wanted to test it out. I have added the following to gpio-omap.c:
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index db5dcca..8dc82ee 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1178,11 +1178,13 @@ static int omap_gpio_suspend(struct device *dev)
wakeup_enable = bank->base + bank->regs->wkup_en;
+ pm_runtime_get_sync(dev);
spin_lock_irqsave(&bank->lock, flags);
bank->saved_wakeup = __raw_readl(wakeup_enable);
_gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
_gpio_rmw(base, bank->regs->wkup_en, bank->suspend_wakeup, 1);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put_sync(dev);
return 0;
}
@@ -1200,10 +1202,12 @@ static int omap_gpio_resume(struct device *dev)
if (!bank->regs->wkup_en || !bank->saved_wakeup)
return 0;
+ pm_runtime_get_sync(dev);
spin_lock_irqsave(&bank->lock, flags);
_gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
_gpio_rmw(base, bank->regs->wkup_en, bank->saved_wakeup, 1);
spin_unlock_irqrestore(&bank->lock, flags);
+ pm_runtime_put_sync(dev);
return 0;
}
so, the main problem is that when we try to resume, our clocks aren't on
(off course). I wonder what should really be done here. Should I go
ahead and use the clock API to fix this issue or should I believe
omap PM layer will be able to enable the hwmod so I can resume
properly ?
Bellow, you can see entire log. Note that I can only reach suspend once.
>From that point on, MPU never reaches low power anymore; and there is
this L3 debug IRQ happening:
echo enabled > /sys/devices/platform/gpio-keys/power/wakeup
root at legolas:~# grep user /proc/interrupts
281: 0 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 2 0 GPIO user
root at legolas:~#
root at legolas:~# echo mem > /sys/power/state
[ 36.300933] PM: Syncing filesystems ... done.
[ 36.312561] Freezing user space processes ... (elapsed 0.02 seconds) done.
[ 36.347015] Freezing remaining freezable tasks ... (elapsed 0.03 seconds) done.
[ 36.381072] Suspending console(s) (use no_console_suspend to debug)
[ 36.397827] PM: suspend of devices complete after 14.768 msecs
[ 36.399780] PM: late suspend of devices complete after 1.952 msecs
[ 36.399780] Disabling non-boot CPUs ...
[ 36.402984] CPU1: shutdown
[ 37.953826] Successfully put all powerdomains to target state
[ 37.953948] Enabling non-boot CPUs ...
[ 37.955566] CPU1: Booted secondary processor
[ 37.956115] Calibrating delay loop (skipped) already calibrated this CPU
[ 37.956695] CPU1 is up
[ 37.957946] PM: early resume of devices complete after 1.251 msecs
[ 37.957946] ------------[ cut here ]------------
[ 37.958068] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:113 l3_interrupt_handler+0x184/0x1c4()
[ 37.958068] L3 custom error: MASTER:MPU TARGET:L4 PER2
[ 37.958068] Modules linked in:
[ 37.958068] [<c001b824>] (unwind_backtrace+0x0/0xf0) from [<c0042a60>] (warn_slowpath_common+0x4c/0x64)
[ 37.958190] [<c0042a60>] (warn_slowpath_common+0x4c/0x64) from [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40)
[ 37.958190] [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40) from [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4)
[ 37.958221] [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4) from [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c)
[ 37.958221] [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c) from [<c00a2104>] (handle_irq_event+0x3c/0x5c)
[ 37.958282] [<c00a2104>] (handle_irq_event+0x3c/0x5c) from [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140)
[ 37.958312] [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140) from [<c00a170c>] (generic_handle_irq+0x30/0x48)
[ 37.958312] [<c00a170c>] (generic_handle_irq+0x30/0x48) from [<c0014bd8>] (handle_IRQ+0x4c/0xac)
[ 37.958374] [<c0014bd8>] (handle_IRQ+0x4c/0xac) from [<c000848c>] (gic_handle_irq+0x28/0xac)
[ 37.958374] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] (__irq_svc+0x44/0x60)
[ 37.958374] Exception stack(0xee2dbe60 to 0xee2dbea8)
[ 37.958435] be60: 0000c439 00000003 00000000 ee1e4040 60000113 c068c194 00000000 c068c194
[ 37.958435] be80: 60000113 ee04d780 c068c140 000d7238 00001584 ee2dbea8 0000c43a c04807a4
[ 37.958435] bea0: 20000113 ffffffff
[ 37.958465] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44)
[ 37.958465] [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44) from [<c00a717c>] (resume_irqs+0x9c/0xbc)
[ 37.958465] [<c00a717c>] (resume_irqs+0x9c/0xbc) from [<c0080998>] (suspend_enter+0xa4/0x168)
[ 37.958526] [<c0080998>] (suspend_enter+0xa4/0x168) from [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c)
[ 37.958526] [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c) from [<c0080d24>] (enter_state+0x13c/0x17c)
[ 37.958557] [<c0080d24>] (enter_state+0x13c/0x17c) from [<c007fa1c>] (state_store+0xd0/0x178)
[ 37.958587] [<c007fa1c>] (state_store+0xd0/0x178) from [<c0258f48>] (kobj_attr_store+0x14/0x20)
[ 37.958587] [<c0258f48>] (kobj_attr_store+0x14/0x20) from [<c0169958>] (sysfs_write_file+0x100/0x184)
[ 37.958587] [<c0169958>] (sysfs_write_file+0x100/0x184) from [<c0109d10>] (vfs_write+0xb4/0x148)
[ 37.958587] [<c0109d10>] (vfs_write+0xb4/0x148) from [<c0109f98>] (sys_write+0x40/0x70)
[ 37.958587] [<c0109f98>] (sys_write+0x40/0x70) from [<c0013cc0>] (ret_fast_syscall+0x0/0x3c)
[ 37.958679] ---[ end trace 09fd5633fca7e7bc ]---
[ 39.104858] PM: resume of devices complete after 1146.177 msecs
[ 39.418762] Restarting tasks ... done.
root at legolas:~# echo mem > /sys/power/state root at legolas:~# grep user /proc/interrupts
281: 4 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 7 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 9 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 11 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 13 0 GPIO user
root at legolas:~# grep user /proc/interrupts
281: 15 0 GPIO user
root at legolas:~# grep user /proc/interrupts root at legolas:~# echo mem > /sys/power/state
[ 55.532073] PM: Syncing filesystems ... done.
[ 57.044281] Freezing user space processes ... (elapsed 0.02 seconds) done.
[ 57.066711] Freezing remaining freezable tasks ... (elapsed 0.02 seconds) done.
[ 57.100799] Suspending console(s) (use no_console_suspend to debug)
[ 57.116302] PM: suspend of devices complete after 6.959 msecs
[ 57.117980] PM: late suspend of devices complete after 1.678 msecs
[ 57.118041] Disabling non-boot CPUs ...
[ 57.119628] CPU1: shutdown
[ 57.121124] Powerdomain (mpu_pwrdm) didn't enter target state 1
[ 57.121154] Could not enter target state in pm_suspend
[ 57.121185] Enabling non-boot CPUs ...
[ 57.122680] CPU1: Booted secondary processor
[ 57.123352] Calibrating delay loop (skipped) already calibrated this CPU
[ 57.123382] CPU1: Unknown IPI message 0x1
[ 57.123779] CPU1 is up
[ 57.124938] PM: early resume of devices complete after 1.159 msecs
[ 58.112426] PM: resume of devices complete after 987.488 msecs
[ 58.179656] Restarting tasks ... done.
root at legolas:~# echo mem > /sys/power/state
[ 60.363983] PM: Syncing filesystems ... done.
[ 61.850616] Freezing user space processes ... (elapsed 0.03 seconds) done.
[ 61.889984] Freezing remaining freezable tasks ... (elapsed 0.03 seconds) done.
[ 61.928985] Suspending console(s) (use no_console_suspend to debug)
[ 61.944213] PM: suspend of devices complete after 6.744 msecs
[ 61.945892] PM: late suspend of devices complete after 1.678 msecs
[ 61.945953] Disabling non-boot CPUs ...
[ 61.947296] CPU1: shutdown
[ 61.948608] Powerdomain (mpu_pwrdm) didn't enter target state 1
[ 61.948638] Could not enter target state in pm_suspend
[ 61.948669] Enabling non-boot CPUs ...
[ 61.950744] CPU1: Booted secondary processor
[ 61.950775] Calibrating delay loop (skipped) already calibrated this CPU
[ 61.950805] CPU1: Unknown IPI message 0x1
[ 61.951232] CPU1 is up
[ 61.952362] PM: early resume of devices complete after 0.305 msecs
[ 62.871063] PM: resume of devices complete after 918.396 msecs
[ 62.938262] Restarting tasks ... done.
root at legolas:~# ./show_gpios.sh
omap_gpio.0
control auto
runtime_status suspended
runtime_active_time 7
runtime_suspended_time 97625
omap_gpio.1
control auto
runtime_status suspended
runtime_active_time 296
runtime_suspended_time 97351
omap_gpio.2
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 97671
omap_gpio.3
control auto
runtime_status suspended
runtime_active_time 6906
runtime_suspended_time 90773
omap_gpio.4
control auto
runtime_status suspended
runtime_active_time 0
runtime_suspended_time 97695
root at legolas:~# echo mem > /sys/power/state
[ 118.066925] PM: Syncing filesystems ... done.
[ 118.313720] Freezing user space processes ... (elapsed 0.04 seconds) done.
[ 118.359130] Freezing remaining freezable tasks ... (elapsed 0.02 seconds) done.
[ 118.390228] Suspending console(s) (use no_console_suspend to debug)
[ 118.405578] PM: suspend of devices complete after 15.075 msecs
[ 118.407379] PM: late suspend of devices complete after 1.708 msecs
[ 118.407379] Disabling non-boot CPUs ...
[ 118.408752] CPU1: shutdown
[ 118.410186] Powerdomain (mpu_pwrdm) didn't enter target state 1
[ 118.410186] Could not enter target state in pm_suspend
[ 118.410217] Enabling non-boot CPUs ...
[ 118.411865] CPU1: Booted secondary processor
[ 118.411865] Calibrating delay loop (skipped) already calibrated this CPU
[ 118.412445] CPU1: Unknown IPI message 0x1
[ 118.412872] CPU1 is up
[ 118.414031] PM: early resume of devices complete after 0.335 msecs
[ 119.316711] PM: resume of devices complete after 902.374 msecs
[ 119.384063] Restarting tasks ... done.
root at legolas:~#
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120209/59f57792/attachment.sig>
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH] gpio: omap: be more aggressive with pm_runtime
2012-02-09 11:11 ` Felipe Balbi
2012-02-09 11:29 ` Felipe Balbi
@ 2012-02-09 12:03 ` Grazvydas Ignotas
1 sibling, 0 replies; 9+ messages in thread
From: Grazvydas Ignotas @ 2012-02-09 12:03 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Feb 9, 2012 at 1:11 PM, Felipe Balbi <balbi@ti.com> wrote:
> Hi again,
>
> On Thu, Feb 09, 2012 at 08:09:40AM +0200, Felipe Balbi wrote:
>> On Wed, Feb 08, 2012 at 04:01:42PM -0800, Kevin Hilman wrote:
>> > Felipe Balbi <balbi@ti.com> writes:
>> >
>> > > try to keep gpio block suspended as much as possible.
>> > >
>> > > Tested with pandaboard and a sysfs exported gpio.
>> > >
>> > > Signed-off-by: Felipe Balbi <balbi@ti.com>
>> > > ---
>> >
>> > Looks like you need a few more get/puts around other places where
>> > registers are accessed. ?It currently causes a boot crash on OMAP3 in
>> > _set_gpio_triggering().
>>
>> it was a missing get/put on gpio_irq_set_type(). Fixed.
>>
>> > Did you test GPIO wakeups? ?both IO ring wakeups and GPIO module-level
>> > wakeups?
>>
>> how can I test that easily with panda ?
>
> Ok, I have added gpio-keys to panda's boardfile:
>
> diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
> index 30ad40d..0a38282 100644
> --- a/arch/arm/mach-omap2/board-omap4panda.c
> +++ b/arch/arm/mach-omap2/board-omap4panda.c
> @@ -23,6 +23,7 @@
> ?#include <linux/io.h>
> ?#include <linux/leds.h>
> ?#include <linux/gpio.h>
> +#include <linux/gpio_keys.h>
> ?#include <linux/usb/otg.h>
> ?#include <linux/i2c/twl.h>
> ?#include <linux/regulator/machine.h>
> @@ -90,7 +91,30 @@ static struct platform_device leds_gpio = {
> ? ? ? ?},
> ?};
>
> +static struct gpio_keys_button gpio_buttons[] = {
> + ? ? ? {
> + ? ? ? ? ? ? ? .code ? ? ? ? ? = BTN_EXTRA,
> + ? ? ? ? ? ? ? .gpio ? ? ? ? ? = 121,
> + ? ? ? ? ? ? ? .desc ? ? ? ? ? = "user",
> + ? ? ? ? ? ? ? .wakeup ? ? ? ? = 1,
While at it, could you also test GPIO module wakeups with debounce
feature enabled? Kevin says it should work but it doesn't for me. Just
add:
.debounce_interval = 10,
--
Gra?vydas
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-02-09 12:03 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-08 13:26 [PATCH] gpio: omap: be more aggressive with pm_runtime Felipe Balbi
2012-02-08 13:53 ` Felipe Balbi
2012-02-09 0:03 ` Kevin Hilman
2012-02-09 6:08 ` Felipe Balbi
2012-02-09 0:01 ` Kevin Hilman
2012-02-09 6:09 ` Felipe Balbi
2012-02-09 11:11 ` Felipe Balbi
2012-02-09 11:29 ` Felipe Balbi
2012-02-09 12:03 ` Grazvydas Ignotas
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).