From: Peter Barada <peter.barada@gmail.com>
To: Kevin Hilman <khilman@ti.com>
Cc: Linux OMAP list <linux-omap@vger.kernel.org>
Subject: Re: Question regarding suspend/resume
Date: Thu, 31 Mar 2011 16:17:12 -0400 [thread overview]
Message-ID: <4D94E148.8060905@gmail.com> (raw)
In-Reply-To: <87wrk0gn41.fsf@ti.com>
On 03/15/2011 04:11 PM, Kevin Hilman wrote:
> Peter Barada <peter.barada@gmail.com> writes:
>
>> Is there any reference how to decode the output of
>> /debug/pm_debug/count? I'm trying to figure out when I resume why it
>> says the core_pwrdm didn't enter the target state, and I'm assuming
>> because a clock used is not disabled in the suspend path, but as fars
>> as I can tell there's no output in the pm_debug code that tells which
>> clocks in a power domain are active at the time of a suspend.
> You're right.
>
> What you need the patch in my pm-wip/debug branch from my pm tree[1].
> With that patch, it takes a snapshot of the PRCM registers just before
> and after suspend.
>
> When you come back from suspend, view the register snapshot just before
> suspend:
>
> # cat /debug/pm_debug/register/1
>
> and the register snapshot just after
>
> # cat /debug/pm_debug/register/2
>
> the snapshot just before suspend is useful for debugging problems like
> yours, and the snapshot just after can be useful for debugging wakeups.
>
> Feel free to post the register dump if you want some help deciphering
> it. If you do, please post more details on what kernel you're using as
> well as the bootloader etc.
Kevin,
Thanks for helping me to understand things.
The kernel I'm using is TI's OMAPPSP_03.00.01.06 2.6.32 kernel [1] with their u-boot [2] and x-loader[3], modified to run on Logic's DM3730 board(s) (as we use the Micron mt29c4g48mazapakq-5 POP). I've added to this kernel a stripped board file (stripped from board-omap3evm.c) that supplies enough to bring up the mmc and serial ports - platform code registers other devices. Its built with omap3_evm_defconfig with the addition of my MACH_DM3730_SOM_LV/TORPEDO machine description (which causes my board-dm3730logic.c minimal board file to be compiled in):
/*
* linux/arch/arm/mach-omap2/board-dm3730logic.c
*
* Copyright (C) 2011 Logic Product Development
*
* Modified from mach-omap2/board-omap3evm.c
*
* Initial code: Syed Mohammed Khasim
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/gpio.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/i2c/twl.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h>
#include <linux/mmc/host.h>
#include <mach/hardware.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <plat/board.h>
#include <plat/usb.h>
#include <plat/common.h>
#include "mux.h"
#include "sdram-micron-mt29c4g48mazapakq-5.h"
#include "mmc-twl4030.h"
#include "pm.h"
#include "prm-regbits-34xx.h"
#include "omap3-opp.h"
static struct twl4030_hsmmc_info mmc[] = {
{
.mmc = 1,
.wires = 4,
.gpio_cd = -EINVAL,
.gpio_wp = -EINVAL,
},
{} /* Terminator */
};
static struct regulator_consumer_supply dm3730logic_vmmc1_supply = {
.supply = "vmmc",
};
static int dm3730logic_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio)
{
twl4030_mmc_init(mmc);
/* link regulator to MMC adapter */
dm3730logic_vmmc1_supply.dev = mmc[0].dev;
return 0;
}
static struct twl4030_gpio_platform_data dm3730logic_gpio_data = {
.gpio_base = OMAP_MAX_GPIO_LINES,
.irq_base = TWL4030_GPIO_IRQ_BASE,
.irq_end = TWL4030_GPIO_IRQ_END,
.use_leds = true,
.setup = dm3730logic_twl_gpio_setup,
};
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
static struct regulator_init_data dm3730logic_vmmc1 = {
.constraints = {
.min_uV = 1850000,
.max_uV = 3150000,
.valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY,
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
| REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS,
},
.num_consumer_supplies = 1,
.consumer_supplies = &dm3730logic_vmmc1_supply,
};
static struct twl4030_platform_data dm3730logic_twldata = {
.irq_base = TWL4030_IRQ_BASE,
.irq_end = TWL4030_IRQ_END,
.gpio = &dm3730logic_gpio_data,
/* platform_data for children goes here */
.vmmc1 = &dm3730logic_vmmc1,
};
static struct i2c_board_info __initdata dm3730logic_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &dm3730logic_twldata,
},
};
static int __init dm3730logic_i2c_init(void)
{
omap_register_i2c_bus(1, 2600, dm3730logic_i2c_boardinfo,
ARRAY_SIZE(dm3730logic_i2c_boardinfo));
return 0;
}
#ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux[] __initdata = {
{ .reg_offset = OMAP_MUX_TERMINATOR },
};
#endif
static struct omap_board_config_kernel dm3730logic_config[] __initdata = {
};
static struct omap_opp * _omap37x_mpu_rate_table = omap37x_mpu_rate_table;
static struct omap_opp * _omap37x_dsp_rate_table = omap37x_dsp_rate_table;
static struct omap_opp * _omap37x_l3_rate_table = omap37x_l3_rate_table;
static void __init dm3730logic_init_irq(void)
{
omap_board_config = dm3730logic_config;
omap_board_config_size = ARRAY_SIZE(dm3730logic_config);
omap2_init_common_hw(mt29c4g48mazapakq5_sdrc_params,
NULL,
_omap37x_mpu_rate_table,
_omap37x_dsp_rate_table,
_omap37x_l3_rate_table);
omap_init_irq();
omap_gpio_init();
}
static struct platform_device *dm3730logic_devices[] __initdata = {
};
static void __init dm3730logic_init(void)
{
omap3_mux_init(board_mux, OMAP_PACKAGE_CBP);
dm3730logic_i2c_init();
platform_add_devices(dm3730logic_devices,
ARRAY_SIZE(dm3730logic_devices));
omap_serial_init();
}
static void __init dm3730logic_map_io(void)
{
omap2_set_globals_343x();
omap2_map_common_io();
}
MACHINE_START(DM3730_SOM_LV, "DM3730 SOM LV")
/* Maintainer: Peter Barada - Logic Product Development */
.phys_io = 0x48000000,
.io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
.boot_params = 0x80000100,
.map_io = dm3730logic_map_io,
.init_irq = dm3730logic_init_irq,
.init_machine = dm3730logic_init,
.timer = &omap_timer,
MACHINE_END
MACHINE_START(DM3730_TORPEDO, "DM3730 Torpedo")
/* Maintainer: Peter Barada - Logic Product Development */
.phys_io = 0x48000000,
.io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
.boot_params = 0x80000100,
.map_io = dm3730logic_map_io,
.init_irq = dm3730logic_init_irq,
.init_machine = dm3730logic_init,
.timer = &omap_timer,
MACHINE_END
I've verified this kernel boots up (off an SD card) and goes fully into suspend on a DM3730EVM, but when booted on my board(s) shows the following (/debug/pm_debug/register output follow):
[root@arago /]# echo mem > /sys/power/state
PM: Syncing filesystems ... done.
Freezing user space processes ... (elapsed 0.01 seconds) done.
Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
Suspending console(s) (use no_console_suspend to debug)
mmc0: card 0007 removed
Powerdomain (core_pwrdm) didn't enter target state 1
Could not enter target state in pm_suspend
Restarting tasks ... done.
[root@arago /]# mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new high speed SD card at address 0007
mmcblk0: mmc0:0007 SD512 485 MiB
mmcblk0: p1
[root@arago /]# mkdir /debug
[root@arago /]# mount -t debugfs debug /debug
[root@arago /]# cat /debug/pm_debug/registers/1
MOD: CM_IVA2 (48014000)
04 => 00000017 20 => 00000001 34 => 00000001 40 => 00080a00
44 => 00000001 48 => 00000003
MOD: CM_OCP (48004800)
00 => 00000010 10 => 00000001
MOD: CM_MPU (48004900)
04 => 00000037 24 => 00000001 34 => 00000001 40 => 00112c0c
44 => 00000001 48 => 00000003 4c => 00000001
MOD: CM_CORE (48004a00)
10 => 00000042 20 => ffffffbd 24 => 0000001f 28 => 0000000d
30 => fffffed9 34 => 0000001f 38 => 0000000c 40 => 0000130a
48 => 0000003f 4c => 00000003
MOD: CM_SGX (48004b00)
20 => 00000001 40 => 00000005 48 => 00000003
MOD: CM_WKUP (48004c00)
00 => 00000001 10 => 0000000d 20 => 000002f2 30 => 0000003f
40 => 00000014
MOD: CM_CCR (48004d00)
00 => f8311007 04 => 00000011 20 => 00000001 30 => 00000009
34 => 00000001 40 => 08c80c00 44 => 0481b00c 48 => 00000009
4c => 00003c0c 50 => 00000001 70 => 00000003
MOD: CM_DSS (48004e00)
20 => 00000003 30 => 00000001 40 => 00001009 48 => 00000003
MOD: CM_CAM (48004f00)
20 => 00000001 30 => 00000001 40 => 00000004 48 => 00000003
MOD: CM_PER (48005000)
10 => 0003e000 20 => 00041fff 30 => 0003ffff 40 => 000000ff
44 => 00000006 48 => 00000003 4c => 00000001
MOD: CM_EMU (48005100)
40 => 03020a50 48 => 00000001
MOD: CM_NEON (48005300)
48 => 00000003
MOD: CM_USB (48005400)
20 => 00000003 30 => 00000001 48 => 00000003
MOD: PRM_IVA2 (48316000)
50 => 00000007 e0 => 00ff0f05 e4 => 00000555 e8 => 00000555
MOD: PRM_OCP (48306800)
04 => 00000010 14 => 00000001 1c => 00000201
MOD: PRM_MPU (48306900)
d4 => 00000012 e0 => 00030105 e4 => 000000c7 e8 => 000000c7
MOD: PRM_CORE (48306a00)
58 => 00000300 a0 => c33ffe18 a4 => c33ffe18 e0 => 000f0315
e4 => 000000f7 e8 => 000000f7 f0 => 00000004 f8 => 00000004
MOD: PRM_SGX (48306b00)
e0 => 00030104
MOD: PRM_WKUP (48306c00)
a0 => 0001010b a4 => 0000010b b0 => 00010000
MOD: PRM_CCR (48306d00)
40 => 00000003
MOD: PRM_DSS (48306e00)
a0 => 00000001 e0 => 00030105 e4 => 00000001 e8 => 00000001
MOD: PRM_CAM (48306f00)
58 => 00000001 e0 => 00030105 e4 => 00000001 e8 => 00000001
MOD: PRM_PER (48307000)
a0 => 0003e807 a4 => 0003e807 c8 => 00000007 e0 => 00030105
e4 => 00000007 e8 => 00000007
MOD: PRM_EMU (48307100)
e4 => 00000100
MOD: PRM_GLBL (48307200)
20 => 00120012 24 => 00010000 2c => 28201e00 30 => 2b201e00
34 => 00120000 38 => 00000008 54 => 00001006 58 => 00000001
60 => 00000002 64 => 00000050 70 => 00000048 90 => 0fff0fff
94 => 000000ff 98 => 000000ff 9c => 00000002 a0 => 000000ff
b0 => 00202808 b4 => 0001f401 b8 => 0001f404 bc => 4000ffff
c0 => 00000028 c4 => 00000001 d0 => 00202b08 d4 => 0001f401
d8 => 0001f404 dc => 2c00ffff e0 => 0000002b e4 => 00000001
MOD: PRM_NEON (48307300)
c8 => 00000002 e0 => 00000005 e4 => 00000003 e8 => 00000003
MOD: PRM_USB (48307400)
a0 => 00000001 a4 => 00000001 a8 => 00000001 e0 => 00030115
e4 => 00000001 e8 => 00000001
[root@arago /]# cat /debug/pm_debug/registers/2
MOD: CM_IVA2 (48014000)
04 => 00000017 20 => 00000001 34 => 00000001 40 => 00080a00
44 => 00000001 48 => 00000003
MOD: CM_OCP (48004800)
00 => 00000010 10 => 00000001
MOD: CM_MPU (48004900)
04 => 00000037 24 => 00000001 34 => 00000001 40 => 00112c0c
44 => 00000001 48 => 00000003 4c => 00000001
MOD: CM_CORE (48004a00)
10 => 00000042 20 => ffffffbd 24 => 0000001f 28 => 0000000d
30 => fffffed9 34 => 0000001f 38 => 0000000c 40 => 0000130a
48 => 0000003f 4c => 00000003
MOD: CM_SGX (48004b00)
20 => 00000001 40 => 00000005 48 => 00000003
MOD: CM_WKUP (48004c00)
00 => 00000001 10 => 0000000d 20 => 000002f2 30 => 0000003f
40 => 00000014
MOD: CM_CCR (48004d00)
00 => f8311007 04 => 00000011 20 => 00000001 30 => 00000009
34 => 00000001 40 => 08c80c00 44 => 0481b00c 48 => 00000009
4c => 00003c0c 50 => 00000001 70 => 00000003
MOD: CM_DSS (48004e00)
20 => 00000003 30 => 00000001 40 => 00001009 48 => 00000003
MOD: CM_CAM (48004f00)
20 => 00000001 30 => 00000001 40 => 00000004 48 => 00000003
MOD: CM_PER (48005000)
10 => 0003e000 20 => 00041fff 30 => 0003ffff 40 => 000000ff
44 => 00000006 48 => 00000003 4c => 00000001
MOD: CM_EMU (48005100)
40 => 03020a50 48 => 00000001
MOD: CM_NEON (48005300)
48 => 00000003
MOD: CM_USB (48005400)
20 => 00000003 30 => 00000001 48 => 00000003
MOD: PRM_IVA2 (48316000)
50 => 00000007 e0 => 00ff0f05 e4 => 00000555 e8 => 00000555
MOD: PRM_OCP (48306800)
04 => 00000010 14 => 00000001 18 => 00000201 1c => 00000201
MOD: PRM_MPU (48306900)
d4 => 00000012 e0 => 00030105 e4 => 000000c7 e8 => 00000045
MOD: PRM_CORE (48306a00)
58 => 00000300 a0 => c33ffe18 a4 => c33ffe18 b0 => 00002000
e0 => 000f0315 e4 => 000000f7 e8 => 000000f7 f0 => 00000004
f8 => 00000004
MOD: PRM_SGX (48306b00)
e0 => 00030104
MOD: PRM_WKUP (48306c00)
a0 => 0001010b a4 => 0000010b b0 => 00010100
MOD: PRM_CCR (48306d00)
40 => 00000003
MOD: PRM_DSS (48306e00)
a0 => 00000001 e0 => 00030105 e4 => 00000001 e8 => 00000001
MOD: PRM_CAM (48306f00)
58 => 00000001 e0 => 00030105 e4 => 00000001 e8 => 00000001
MOD: PRM_PER (48307000)
a0 => 0003e807 a4 => 0003e807 c8 => 00000007 e0 => 00030105
e4 => 00000007 e8 => 00000005
MOD: PRM_EMU (48307100)
e4 => 00000100
MOD: PRM_GLBL (48307200)
20 => 00120012 24 => 00010000 2c => 28201e00 30 => 2b201e00
34 => 00120000 38 => 00000008 54 => 00001006 58 => 00000001
60 => 00000002 64 => 00000050 70 => 00000048 90 => 0fff0fff
94 => 000000ff 98 => 000000ff 9c => 00000002 a0 => 000000ff
b0 => 00202808 b4 => 0001f401 b8 => 0001f404 bc => 4000ffff
c0 => 00000028 c4 => 00000001 d0 => 00202b08 d4 => 0001f401
d8 => 0001f404 dc => 2c00ffff e0 => 0000002b e4 => 00000001
MOD: PRM_NEON (48307300)
c8 => 00000002 e0 => 00000005 e4 => 00000003 e8 => 00000001
MOD: PRM_USB (48307400)
a0 => 00000001 a4 => 00000001 a8 => 00000001 e0 => 00030115
e4 => 00000001 e8 => 00000001
[root@arago /]#
Any help to better understand how to debug the output is appreciated!
[1] http://arago-project.org/git/projects/?p=linux-omap3.git;a=commit;h=89ba11fc993b57bfc33d794621788b5158431a7c
[2] http://arago-project.org/git/projects/?p=u-boot-omap3.git;a=commit;h=7683ca6af43c17cf8214e9a241cd63c0001a59b1
[3] http://arago-project.org/git/projects/?p=x-load-omap3.git;a=commit;h=1d3578a5c6cd5967e067bac63670e88d11b6fe4d
> One of the common root causes for a problem like yours is a bootloader
> that leaves a particular module in a state that it cannot properly
> idle. If the kernel is not using that particular device and/or has not
> reset that device, the result is the powerdomain for that device can not
> hit idle and you'll have a problem like yours.
>
> Kevin
>
> [1] git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm.git
--
Peter Barada
peter.barada@gmail.com
next prev parent reply other threads:[~2011-03-31 20:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-15 19:25 Question regarding suspend/resume Peter Barada
2011-03-15 20:11 ` Kevin Hilman
2011-03-31 20:17 ` Peter Barada [this message]
2011-03-31 20:48 ` Kevin Hilman
2011-04-01 5:05 ` Hiremath, Vaibhav
2011-04-04 14:31 ` Peter Barada
2011-04-04 15:26 ` Hiremath, Vaibhav
2011-04-04 14:40 ` Peter Barada
2011-04-04 15:12 ` Kevin Hilman
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=4D94E148.8060905@gmail.com \
--to=peter.barada@gmail.com \
--cc=khilman@ti.com \
--cc=linux-omap@vger.kernel.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 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).