* [PATCH 00/11] OMAP fixes from PM branch for .31-rc @ 2009-06-25 16:41 Kevin Hilman 2009-06-25 16:41 ` [PATCH 01/11] OMAP: SDRC: Add several new register definitions Kevin Hilman 2009-06-25 17:08 ` [PATCH 12/11] OMAP: PM: CPUfreq: obey min/max settings of policy Kevin Hilman 0 siblings, 2 replies; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:41 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap This series is a set of fixes/cleanups from the PM branch targeted for the .31-rc series. Applies on top of 'omap-fixes' branch of linux-omap. Kevin Hilman (9): OMAP2/3: PM: make PM __init calls static OMAP3: PM: CM_REGADDR macros using wrong name OMAP3: PM: Ensure PRCM interrupts are cleared at boot OMAP3: PM: Clear pending PRCM reset flags on init OMAP3: PM: prevent module wakeups from waking IVA2 OMAP3: PM: Do not build suspend code if SUSPEND is not enabled OMAP3: PM: reset USB OTG module on boot OMAP4: UART: cleanup special case IRQ handling OMAP2/3/4: UART: Allow per-UART disabling wakeup for serial ports Tero Kristo (2): OMAP: SDRC: Add several new register definitions OMAP3: Fixed crash bug with serial + suspend arch/arm/mach-omap2/cm.h | 6 +- arch/arm/mach-omap2/pm.h | 3 - arch/arm/mach-omap2/pm24xx.c | 2 +- arch/arm/mach-omap2/pm34xx.c | 49 +++++++- arch/arm/mach-omap2/serial.c | 195 ++++++++++++++++++++---------- arch/arm/mach-omap2/usb-musb.c | 22 +++- arch/arm/plat-omap/include/mach/sdrc.h | 13 ++ arch/arm/plat-omap/include/mach/serial.h | 1 + 8 files changed, 215 insertions(+), 76 deletions(-) ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 01/11] OMAP: SDRC: Add several new register definitions 2009-06-25 16:41 [PATCH 00/11] OMAP fixes from PM branch for .31-rc Kevin Hilman @ 2009-06-25 16:41 ` Kevin Hilman 2009-06-25 16:41 ` [PATCH 02/11] OMAP2/3: PM: make PM __init calls static Kevin Hilman 2009-06-25 17:08 ` [PATCH 12/11] OMAP: PM: CPUfreq: obey min/max settings of policy Kevin Hilman 1 sibling, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:41 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap, Tero Kristo From: Tero Kristo <tero.kristo@nokia.com> Signed-off-by: Tero Kristo <tero.kristo@nokia.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/plat-omap/include/mach/sdrc.h | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/arch/arm/plat-omap/include/mach/sdrc.h b/arch/arm/plat-omap/include/mach/sdrc.h index adc7352..7cc6568 100644 --- a/arch/arm/plat-omap/include/mach/sdrc.h +++ b/arch/arm/plat-omap/include/mach/sdrc.h @@ -21,15 +21,28 @@ /* SDRC register offsets - read/write with sdrc_{read,write}_reg() */ #define SDRC_SYSCONFIG 0x010 +#define SDRC_CS_CFG 0x040 +#define SDRC_SHARING 0x044 +#define SDRC_ERR_TYPE 0x04C #define SDRC_DLLA_CTRL 0x060 #define SDRC_DLLA_STATUS 0x064 #define SDRC_DLLB_CTRL 0x068 #define SDRC_DLLB_STATUS 0x06C #define SDRC_POWER 0x070 +#define SDRC_MCFG_0 0x080 #define SDRC_MR_0 0x084 +#define SDRC_EMR2_0 0x08c #define SDRC_ACTIM_CTRL_A_0 0x09c #define SDRC_ACTIM_CTRL_B_0 0x0a0 #define SDRC_RFR_CTRL_0 0x0a4 +#define SDRC_MANUAL_0 0x0a8 +#define SDRC_MCFG_1 0x0B0 +#define SDRC_MR_1 0x0B4 +#define SDRC_EMR2_1 0x0BC +#define SDRC_ACTIM_CTRL_A_1 0x0C4 +#define SDRC_ACTIM_CTRL_B_1 0x0C8 +#define SDRC_RFR_CTRL_1 0x0D4 +#define SDRC_MANUAL_1 0x0D8 /* * These values represent the number of memory clock cycles between -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 02/11] OMAP2/3: PM: make PM __init calls static 2009-06-25 16:41 ` [PATCH 01/11] OMAP: SDRC: Add several new register definitions Kevin Hilman @ 2009-06-25 16:41 ` Kevin Hilman 2009-06-25 16:41 ` [PATCH 03/11] OMAP3: PM: CM_REGADDR macros using wrong name Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:41 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/pm.h | 3 --- arch/arm/mach-omap2/pm24xx.c | 2 +- arch/arm/mach-omap2/pm34xx.c | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index f7b3baf..21201cd 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h @@ -11,9 +11,6 @@ #ifndef __ARCH_ARM_MACH_OMAP2_PM_H #define __ARCH_ARM_MACH_OMAP2_PM_H -extern int omap2_pm_init(void); -extern int omap3_pm_init(void); - #ifdef CONFIG_PM_DEBUG extern void omap2_pm_dump(int mode, int resume, unsigned int us); extern int omap2_pm_debug; diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index db10255..528dbdc 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -470,7 +470,7 @@ static void __init prcm_setup_regs(void) WKUP_MOD, PM_WKEN); } -int __init omap2_pm_init(void) +static int __init omap2_pm_init(void) { u32 l; diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 841d4c5..765cdc0 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -652,7 +652,7 @@ static int __init clkdms_setup(struct clockdomain *clkdm) return 0; } -int __init omap3_pm_init(void) +static int __init omap3_pm_init(void) { struct power_state *pwrst, *tmp; int ret; -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 03/11] OMAP3: PM: CM_REGADDR macros using wrong name 2009-06-25 16:41 ` [PATCH 02/11] OMAP2/3: PM: make PM __init calls static Kevin Hilman @ 2009-06-25 16:41 ` Kevin Hilman 2009-06-25 16:41 ` [PATCH 04/11] OMAP3: PM: Ensure PRCM interrupts are cleared at boot Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:41 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/cm.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index 1d3c93b..f3c91a1 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h @@ -29,9 +29,9 @@ * These registers appear once per CM module. */ -#define OMAP3430_CM_REVISION OMAP_CM_REGADDR(OCP_MOD, 0x0000) -#define OMAP3430_CM_SYSCONFIG OMAP_CM_REGADDR(OCP_MOD, 0x0010) -#define OMAP3430_CM_POLCTRL OMAP_CM_REGADDR(OCP_MOD, 0x009c) +#define OMAP3430_CM_REVISION OMAP34XX_CM_REGADDR(OCP_MOD, 0x0000) +#define OMAP3430_CM_SYSCONFIG OMAP34XX_CM_REGADDR(OCP_MOD, 0x0010) +#define OMAP3430_CM_POLCTRL OMAP34XX_CM_REGADDR(OCP_MOD, 0x009c) #define OMAP3_CM_CLKOUT_CTRL_OFFSET 0x0070 #define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070) -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 04/11] OMAP3: PM: Ensure PRCM interrupts are cleared at boot 2009-06-25 16:41 ` [PATCH 03/11] OMAP3: PM: CM_REGADDR macros using wrong name Kevin Hilman @ 2009-06-25 16:41 ` Kevin Hilman 2009-06-25 16:41 ` [PATCH 05/11] OMAP3: PM: Clear pending PRCM reset flags on init Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:41 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap Any pending PRCM interrupts can prevent retention. Ensure they are cleared during boot. Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/pm34xx.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 765cdc0..cc83dfc 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -613,6 +613,9 @@ static void __init prcm_setup_regs(void) /* Clear any pending PRCM interrupts */ prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); + /* Clear any pending PRCM interrupts */ + prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); + omap3_iva_idle(); omap3_d2d_idle(); } -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 05/11] OMAP3: PM: Clear pending PRCM reset flags on init 2009-06-25 16:41 ` [PATCH 04/11] OMAP3: PM: Ensure PRCM interrupts are cleared at boot Kevin Hilman @ 2009-06-25 16:41 ` Kevin Hilman 2009-06-25 16:41 ` [PATCH 06/11] OMAP3: PM: prevent module wakeups from waking IVA2 Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:41 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap Any pending reset flags can prevent retention. Ensure they are all cleared during boot. Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/pm34xx.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index cc83dfc..1422e93 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -613,6 +613,15 @@ static void __init prcm_setup_regs(void) /* Clear any pending PRCM interrupts */ prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); + /* Clear any pending 'reset' flags */ + prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST); + prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST); + prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST); + prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST); + prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST); + prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST); + prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST); + /* Clear any pending PRCM interrupts */ prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 06/11] OMAP3: PM: prevent module wakeups from waking IVA2 2009-06-25 16:41 ` [PATCH 05/11] OMAP3: PM: Clear pending PRCM reset flags on init Kevin Hilman @ 2009-06-25 16:41 ` Kevin Hilman 2009-06-25 16:42 ` [PATCH 07/11] OMAP3: PM: Do not build suspend code if SUSPEND is not enabled Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:41 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap By default, prevent functional wakeups from inside a module from waking up the IVA2. Let DSP Bridge code handle this when loaded. Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/pm34xx.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 1422e93..c813a08 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -613,6 +613,12 @@ static void __init prcm_setup_regs(void) /* Clear any pending PRCM interrupts */ prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); + /* Don't attach IVA interrupts */ + prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); + prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); + prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); + prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); + /* Clear any pending 'reset' flags */ prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST); prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST); -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 07/11] OMAP3: PM: Do not build suspend code if SUSPEND is not enabled 2009-06-25 16:41 ` [PATCH 06/11] OMAP3: PM: prevent module wakeups from waking IVA2 Kevin Hilman @ 2009-06-25 16:42 ` Kevin Hilman 2009-06-25 16:42 ` [PATCH 08/11] OMAP3: PM: reset USB OTG module on boot Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:42 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap, Jouni Hogander Signed-off-by: Jouni Hogander <jouni.hogander@nokia.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/pm34xx.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index c813a08..528f725 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -39,7 +39,9 @@ struct power_state { struct powerdomain *pwrdm; u32 next_state; +#ifdef CONFIG_SUSPEND u32 saved_state; +#endif struct list_head node; }; @@ -293,6 +295,7 @@ out: local_irq_enable(); } +#ifdef CONFIG_SUSPEND static int omap3_pm_prepare(void) { disable_hlt(); @@ -366,6 +369,7 @@ static struct platform_suspend_ops omap_pm_ops = { .finish = omap3_pm_finish, .valid = suspend_valid_only_mem, }; +#endif /* CONFIG_SUSPEND */ /** @@ -710,7 +714,9 @@ static int __init omap3_pm_init(void) _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend, omap34xx_cpu_suspend_sz); +#ifdef CONFIG_SUSPEND suspend_set_ops(&omap_pm_ops); +#endif /* CONFIG_SUSPEND */ pm_idle = omap3_pm_idle; -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 08/11] OMAP3: PM: reset USB OTG module on boot 2009-06-25 16:42 ` [PATCH 07/11] OMAP3: PM: Do not build suspend code if SUSPEND is not enabled Kevin Hilman @ 2009-06-25 16:42 ` Kevin Hilman 2009-06-25 16:42 ` [PATCH 09/11] OMAP4: UART: cleanup special case IRQ handling Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:42 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap Rather than simply setting force-idle mode on boot, do a reset of the OTG module. This really ensures that any bootloader/bootstrap code that leaves it active will not prevent future retention. After reset, OTG module will be in force-idle, force-standby mode. Problem reported by Mike Chan <mikechan@google.com> Tested-by: Mike Chan <mikechan@google.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/usb-musb.c | 22 ++++++++++++++++++---- 1 files changed, 18 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index d85296d..3efa19c 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c @@ -26,18 +26,32 @@ #include <linux/usb/musb.h> +#include <asm/sizes.h> + #include <mach/hardware.h> #include <mach/irqs.h> #include <mach/mux.h> #include <mach/usb.h> -#define OTG_SYSCONFIG (OMAP34XX_HSUSB_OTG_BASE + 0x404) +#define OTG_SYSCONFIG 0x404 +#define OTG_SYSC_SOFTRESET BIT(1) static void __init usb_musb_pm_init(void) { - /* Ensure force-idle mode for OTG controller */ - if (cpu_is_omap34xx()) - omap_writel(0, OTG_SYSCONFIG); + void __iomem *otg_base; + + if (!cpu_is_omap34xx()) + return; + + otg_base = ioremap(OMAP34XX_HSUSB_OTG_BASE, SZ_4K); + if (WARN_ON(!otg_base)) + return; + + /* Reset OTG controller. After reset, it will be in + * force-idle, force-standby mode. */ + __raw_writel(OTG_SYSC_SOFTRESET, otg_base + OTG_SYSCONFIG); + + iounmap(otg_base); } #ifdef CONFIG_USB_MUSB_SOC -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 09/11] OMAP4: UART: cleanup special case IRQ handling 2009-06-25 16:42 ` [PATCH 08/11] OMAP3: PM: reset USB OTG module on boot Kevin Hilman @ 2009-06-25 16:42 ` Kevin Hilman 2009-06-25 16:42 ` [PATCH 10/11] OMAP3: Fixed crash bug with serial + suspend Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:42 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/serial.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index b094c15..c82ec95 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -496,10 +496,6 @@ void __init omap_serial_init(void) if (info == NULL) return; - if (cpu_is_omap44xx()) { - for (i = 0; i < OMAP_MAX_NR_PORTS; i++) - serial_platform_data[i].irq += 32; - } for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { struct plat_serial8250_port *p = serial_platform_data + i; @@ -533,6 +529,9 @@ void __init omap_serial_init(void) uart->p = p; list_add(&uart->node, &uart_list); + if (cpu_is_omap44xx()) + p->irq += 32; + omap_uart_enable_clocks(uart); omap_uart_reset(uart); omap_uart_idle_init(uart); -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 10/11] OMAP3: Fixed crash bug with serial + suspend 2009-06-25 16:42 ` [PATCH 09/11] OMAP4: UART: cleanup special case IRQ handling Kevin Hilman @ 2009-06-25 16:42 ` Kevin Hilman 2009-06-25 16:42 ` [PATCH 11/11] OMAP2/3/4: UART: Allow per-UART disabling wakeup for serial ports Kevin Hilman 0 siblings, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:42 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap, Tero Kristo From: Tero Kristo <tero.kristo@nokia.com> It was possible for an unhandled interrupt to occur if there was incoming serial traffic during wakeup from suspend. This was caused by the code in arch-arm/mach-omap2/serial.c keeping interrupt enabled all the time, but not acking its interrupts. Applies on top of PM branch. Use the PM begin/end hooks to ensure that the "serial idle" interrupts are disabled during the suspend path. Also, since begin/end hooks are now used, use the suspend_state that is passed in the begin hook instead of the enter hook as per the platform_suspend_ops docs. Signed-off-by: Tero Kristo <tero.kristo@nokia.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/pm34xx.c | 23 +++++++++++++++++++++-- arch/arm/mach-omap2/serial.c | 14 ++++++++++++++ arch/arm/plat-omap/include/mach/serial.h | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 528f725..b07efb2 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -296,6 +296,8 @@ out: } #ifdef CONFIG_SUSPEND +static suspend_state_t suspend_state; + static int omap3_pm_prepare(void) { disable_hlt(); @@ -342,11 +344,11 @@ restore: return ret; } -static int omap3_pm_enter(suspend_state_t state) +static int omap3_pm_enter(suspend_state_t unused) { int ret = 0; - switch (state) { + switch (suspend_state) { case PM_SUSPEND_STANDBY: case PM_SUSPEND_MEM: ret = omap3_pm_suspend(); @@ -363,7 +365,24 @@ static void omap3_pm_finish(void) enable_hlt(); } +/* Hooks to enable / disable UART interrupts during suspend */ +static int omap3_pm_begin(suspend_state_t state) +{ + suspend_state = state; + omap_uart_enable_irqs(0); + return 0; +} + +static void omap3_pm_end(void) +{ + suspend_state = PM_SUSPEND_ON; + omap_uart_enable_irqs(1); + return; +} + static struct platform_suspend_ops omap_pm_ops = { + .begin = omap3_pm_begin, + .end = omap3_pm_end, .prepare = omap3_pm_prepare, .enter = omap3_pm_enter, .finish = omap3_pm_finish, diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index c82ec95..5352d05 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -435,6 +435,20 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) WARN_ON(ret); } +void omap_uart_enable_irqs(int enable) +{ + int ret; + struct omap_uart_state *uart; + + list_for_each_entry(uart, &uart_list, node) { + if (enable) + ret = request_irq(uart->p->irq, omap_uart_interrupt, + IRQF_SHARED, "serial idle", (void *)uart); + else + free_irq(uart->p->irq, (void *)uart); + } +} + static ssize_t sleep_timeout_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) diff --git a/arch/arm/plat-omap/include/mach/serial.h b/arch/arm/plat-omap/include/mach/serial.h index 13abd02..def0529 100644 --- a/arch/arm/plat-omap/include/mach/serial.h +++ b/arch/arm/plat-omap/include/mach/serial.h @@ -59,6 +59,7 @@ extern void omap_uart_check_wakeup(void); extern void omap_uart_prepare_suspend(void); extern void omap_uart_prepare_idle(int num); extern void omap_uart_resume_idle(int num); +extern void omap_uart_enable_irqs(int enable); #endif #endif -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 11/11] OMAP2/3/4: UART: Allow per-UART disabling wakeup for serial ports 2009-06-25 16:42 ` [PATCH 10/11] OMAP3: Fixed crash bug with serial + suspend Kevin Hilman @ 2009-06-25 16:42 ` Kevin Hilman 0 siblings, 0 replies; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 16:42 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap, Russ Dill This patch causes the OMAP uarts to honor the sysfs power/wakeup file for IOPAD wakeups. Before the OMAP was always woken up from off mode on a rs232 signal change. This patch also creates a different platform device for each serial port so that the wakeup properties can be control per port. By default, IOPAD wakeups are enabled for each UART. To disable, # echo disabled > /sys/devices/platform/serial8250.0/power/wakeup Where serial8250.0 can be replaced by .1, or .2 to control the other ports. Original idea and original patch from Russ Dill <russ.dill@gmail.com> Cc: Russ Dill <russ.dill@gmail.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/mach-omap2/serial.c | 174 ++++++++++++++++++++++++++++-------------- 1 files changed, 116 insertions(+), 58 deletions(-) diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 5352d05..6f35a7e 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -54,6 +54,7 @@ struct omap_uart_state { struct plat_serial8250_port *p; struct list_head node; + struct platform_device pdev; #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) int context_valid; @@ -68,10 +69,9 @@ struct omap_uart_state { #endif }; -static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS]; static LIST_HEAD(uart_list); -static struct plat_serial8250_port serial_platform_data[] = { +static struct plat_serial8250_port serial_platform_data0[] = { { .membase = IO_ADDRESS(OMAP_UART1_BASE), .mapbase = OMAP_UART1_BASE, @@ -81,6 +81,12 @@ static struct plat_serial8250_port serial_platform_data[] = { .regshift = 2, .uartclk = OMAP24XX_BASE_BAUD * 16, }, { + .flags = 0 + } +}; + +static struct plat_serial8250_port serial_platform_data1[] = { + { .membase = IO_ADDRESS(OMAP_UART2_BASE), .mapbase = OMAP_UART2_BASE, .irq = 73, @@ -89,6 +95,12 @@ static struct plat_serial8250_port serial_platform_data[] = { .regshift = 2, .uartclk = OMAP24XX_BASE_BAUD * 16, }, { + .flags = 0 + } +}; + +static struct plat_serial8250_port serial_platform_data2[] = { + { .membase = IO_ADDRESS(OMAP_UART3_BASE), .mapbase = OMAP_UART3_BASE, .irq = 74, @@ -217,6 +229,40 @@ static inline void omap_uart_disable_clocks(struct omap_uart_state *uart) clk_disable(uart->fck); } +static void omap_uart_enable_wakeup(struct omap_uart_state *uart) +{ + /* Set wake-enable bit */ + if (uart->wk_en && uart->wk_mask) { + u32 v = __raw_readl(uart->wk_en); + v |= uart->wk_mask; + __raw_writel(v, uart->wk_en); + } + + /* Ensure IOPAD wake-enables are set */ + if (cpu_is_omap34xx() && uart->padconf) { + u16 v = omap_ctrl_readw(uart->padconf); + v |= OMAP3_PADCONF_WAKEUPENABLE0; + omap_ctrl_writew(v, uart->padconf); + } +} + +static void omap_uart_disable_wakeup(struct omap_uart_state *uart) +{ + /* Clear wake-enable bit */ + if (uart->wk_en && uart->wk_mask) { + u32 v = __raw_readl(uart->wk_en); + v &= ~uart->wk_mask; + __raw_writel(v, uart->wk_en); + } + + /* Ensure IOPAD wake-enables are cleared */ + if (cpu_is_omap34xx() && uart->padconf) { + u16 v = omap_ctrl_readw(uart->padconf); + v &= ~OMAP3_PADCONF_WAKEUPENABLE0; + omap_ctrl_writew(v, uart->padconf); + } +} + static void omap_uart_smart_idle_enable(struct omap_uart_state *uart, int enable) { @@ -246,6 +292,11 @@ static void omap_uart_block_sleep(struct omap_uart_state *uart) static void omap_uart_allow_sleep(struct omap_uart_state *uart) { + if (device_may_wakeup(&uart->pdev.dev)) + omap_uart_enable_wakeup(uart); + else + omap_uart_disable_wakeup(uart); + if (!uart->clocked) return; @@ -292,7 +343,6 @@ void omap_uart_resume_idle(int num) /* Check for normal UART wakeup */ if (__raw_readl(uart->wk_st) & uart->wk_mask) omap_uart_block_sleep(uart); - return; } } @@ -346,16 +396,13 @@ static irqreturn_t omap_uart_interrupt(int irq, void *dev_id) return IRQ_NONE; } -static u32 sleep_timeout = DEFAULT_TIMEOUT; - static void omap_uart_idle_init(struct omap_uart_state *uart) { - u32 v; struct plat_serial8250_port *p = uart->p; int ret; uart->can_sleep = 0; - uart->timeout = sleep_timeout; + uart->timeout = DEFAULT_TIMEOUT; setup_timer(&uart->timer, omap_uart_idle_timer, (unsigned long) uart); mod_timer(&uart->timer, jiffies + uart->timeout); @@ -413,22 +460,6 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) uart->padconf = 0; } - /* Set wake-enable bit */ - if (uart->wk_en && uart->wk_mask) { - v = __raw_readl(uart->wk_en); - v |= uart->wk_mask; - __raw_writel(v, uart->wk_en); - } - - /* Ensure IOPAD wake-enables are set */ - if (cpu_is_omap34xx() && uart->padconf) { - u16 v; - - v = omap_ctrl_readw(uart->padconf); - v |= OMAP3_PADCONF_WAKEUPENABLE0; - omap_ctrl_writew(v, uart->padconf); - } - p->flags |= UPF_SHARE_IRQ; ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, "serial idle", (void *)uart); @@ -449,54 +480,81 @@ void omap_uart_enable_irqs(int enable) } } -static ssize_t sleep_timeout_show(struct kobject *kobj, - struct kobj_attribute *attr, +static ssize_t sleep_timeout_show(struct device *dev, + struct device_attribute *attr, char *buf) { - return sprintf(buf, "%u\n", sleep_timeout / HZ); + struct platform_device *pdev = container_of(dev, + struct platform_device, dev); + struct omap_uart_state *uart = container_of(pdev, + struct omap_uart_state, pdev); + + return sprintf(buf, "%u\n", uart->timeout / HZ); } -static ssize_t sleep_timeout_store(struct kobject *kobj, - struct kobj_attribute *attr, +static ssize_t sleep_timeout_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t n) { - struct omap_uart_state *uart; + struct platform_device *pdev = container_of(dev, + struct platform_device, dev); + struct omap_uart_state *uart = container_of(pdev, + struct omap_uart_state, pdev); unsigned int value; if (sscanf(buf, "%u", &value) != 1) { printk(KERN_ERR "sleep_timeout_store: Invalid value\n"); return -EINVAL; } - sleep_timeout = value * HZ; - list_for_each_entry(uart, &uart_list, node) { - uart->timeout = sleep_timeout; - if (uart->timeout) - mod_timer(&uart->timer, jiffies + uart->timeout); - else - /* A zero value means disable timeout feature */ - omap_uart_block_sleep(uart); - } + + uart->timeout = value * HZ; + if (uart->timeout) + mod_timer(&uart->timer, jiffies + uart->timeout); + else + /* A zero value means disable timeout feature */ + omap_uart_block_sleep(uart); + return n; } -static struct kobj_attribute sleep_timeout_attr = - __ATTR(sleep_timeout, 0644, sleep_timeout_show, sleep_timeout_store); - +DEVICE_ATTR(sleep_timeout, 0644, sleep_timeout_show, sleep_timeout_store); +#define DEV_CREATE_FILE(dev, attr) WARN_ON(device_create_file(dev, attr)) #else static inline void omap_uart_idle_init(struct omap_uart_state *uart) {} +#define DEV_CREATE_FILE(dev, attr) #endif /* CONFIG_PM */ -static struct platform_device serial_device = { - .name = "serial8250", - .id = PLAT8250_DEV_PLATFORM, - .dev = { - .platform_data = serial_platform_data, +static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { + { + .pdev = { + .name = "serial8250", + .id = PLAT8250_DEV_PLATFORM, + .dev = { + .platform_data = serial_platform_data0, + }, + }, + }, { + .pdev = { + .name = "serial8250", + .id = PLAT8250_DEV_PLATFORM1, + .dev = { + .platform_data = serial_platform_data1, + }, + }, + }, { + .pdev = { + .name = "serial8250", + .id = PLAT8250_DEV_PLATFORM2, + .dev = { + .platform_data = serial_platform_data2, + }, + }, }, }; void __init omap_serial_init(void) { - int i, err; + int i; const struct omap_uart_config *info; char name[16]; @@ -512,8 +570,10 @@ void __init omap_serial_init(void) return; for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { - struct plat_serial8250_port *p = serial_platform_data + i; struct omap_uart_state *uart = &omap_uart[i]; + struct platform_device *pdev = &uart->pdev; + struct device *dev = &pdev->dev; + struct plat_serial8250_port *p = dev->platform_data; if (!(info->enabled_uarts & (1 << i))) { p->membase = NULL; @@ -549,15 +609,13 @@ void __init omap_serial_init(void) omap_uart_enable_clocks(uart); omap_uart_reset(uart); omap_uart_idle_init(uart); - } - - err = platform_device_register(&serial_device); - -#ifdef CONFIG_PM - if (!err) - err = sysfs_create_file(&serial_device.dev.kobj, - &sleep_timeout_attr.attr); -#endif + if (WARN_ON(platform_device_register(pdev))) + continue; + if ((cpu_is_omap34xx() && uart->padconf) || + (uart->wk_en && uart->wk_mask)) { + device_init_wakeup(dev, true); + DEV_CREATE_FILE(dev, &dev_attr_sleep_timeout); + } + } } - -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 12/11] OMAP: PM: CPUfreq: obey min/max settings of policy 2009-06-25 16:41 [PATCH 00/11] OMAP fixes from PM branch for .31-rc Kevin Hilman 2009-06-25 16:41 ` [PATCH 01/11] OMAP: SDRC: Add several new register definitions Kevin Hilman @ 2009-06-25 17:08 ` Kevin Hilman 2009-06-25 17:17 ` Kevin Hilman 1 sibling, 1 reply; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 17:08 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap, Eero Nurkkala From: Eero Nurkkala <ext-eero.nurkkala@nokia.com> Use the min/max settings from CPUfreq policy rather than processor defined min/max settings. Without this patch, it's possible to scale frequency outside the current policy range. Signed-off-by: Eero Nurkkala <ext-eero.nurkkala@nokia.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> --- arch/arm/plat-omap/cpu-omap.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index 843e8af..1868c0d 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c @@ -78,10 +78,10 @@ static int omap_target(struct cpufreq_policy *policy, /* Ensure desired rate is within allowed range. Some govenors * (ondemand) will just pass target_freq=0 to get the minimum. */ - if (target_freq < policy->cpuinfo.min_freq) - target_freq = policy->cpuinfo.min_freq; - if (target_freq > policy->cpuinfo.max_freq) - target_freq = policy->cpuinfo.max_freq; + if (target_freq < policy->min) + target_freq = policy->min; + if (target_freq > policy->max) + target_freq = policy->max; freqs.old = omap_getspeed(0); freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; -- 1.6.3.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 12/11] OMAP: PM: CPUfreq: obey min/max settings of policy 2009-06-25 17:08 ` [PATCH 12/11] OMAP: PM: CPUfreq: obey min/max settings of policy Kevin Hilman @ 2009-06-25 17:17 ` Kevin Hilman 0 siblings, 0 replies; 14+ messages in thread From: Kevin Hilman @ 2009-06-25 17:17 UTC (permalink / raw) To: linux-arm-kernel; +Cc: linux-omap, Eero Nurkkala yes, this is patch 12 of 11. :) It's an extra patch that should've been included in the original series. Kevin Kevin Hilman <khilman@deeprootsystems.com> writes: > From: Eero Nurkkala <ext-eero.nurkkala@nokia.com> > > Use the min/max settings from CPUfreq policy rather than > processor defined min/max settings. > > Without this patch, it's possible to scale frequency outside > the current policy range. > > Signed-off-by: Eero Nurkkala <ext-eero.nurkkala@nokia.com> > Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> > --- > arch/arm/plat-omap/cpu-omap.c | 8 ++++---- > 1 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c > index 843e8af..1868c0d 100644 > --- a/arch/arm/plat-omap/cpu-omap.c > +++ b/arch/arm/plat-omap/cpu-omap.c > @@ -78,10 +78,10 @@ static int omap_target(struct cpufreq_policy *policy, > > /* Ensure desired rate is within allowed range. Some govenors > * (ondemand) will just pass target_freq=0 to get the minimum. */ > - if (target_freq < policy->cpuinfo.min_freq) > - target_freq = policy->cpuinfo.min_freq; > - if (target_freq > policy->cpuinfo.max_freq) > - target_freq = policy->cpuinfo.max_freq; > + if (target_freq < policy->min) > + target_freq = policy->min; > + if (target_freq > policy->max) > + target_freq = policy->max; > > freqs.old = omap_getspeed(0); > freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; > -- > 1.6.3.2 ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2009-06-25 17:17 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-06-25 16:41 [PATCH 00/11] OMAP fixes from PM branch for .31-rc Kevin Hilman 2009-06-25 16:41 ` [PATCH 01/11] OMAP: SDRC: Add several new register definitions Kevin Hilman 2009-06-25 16:41 ` [PATCH 02/11] OMAP2/3: PM: make PM __init calls static Kevin Hilman 2009-06-25 16:41 ` [PATCH 03/11] OMAP3: PM: CM_REGADDR macros using wrong name Kevin Hilman 2009-06-25 16:41 ` [PATCH 04/11] OMAP3: PM: Ensure PRCM interrupts are cleared at boot Kevin Hilman 2009-06-25 16:41 ` [PATCH 05/11] OMAP3: PM: Clear pending PRCM reset flags on init Kevin Hilman 2009-06-25 16:41 ` [PATCH 06/11] OMAP3: PM: prevent module wakeups from waking IVA2 Kevin Hilman 2009-06-25 16:42 ` [PATCH 07/11] OMAP3: PM: Do not build suspend code if SUSPEND is not enabled Kevin Hilman 2009-06-25 16:42 ` [PATCH 08/11] OMAP3: PM: reset USB OTG module on boot Kevin Hilman 2009-06-25 16:42 ` [PATCH 09/11] OMAP4: UART: cleanup special case IRQ handling Kevin Hilman 2009-06-25 16:42 ` [PATCH 10/11] OMAP3: Fixed crash bug with serial + suspend Kevin Hilman 2009-06-25 16:42 ` [PATCH 11/11] OMAP2/3/4: UART: Allow per-UART disabling wakeup for serial ports Kevin Hilman 2009-06-25 17:08 ` [PATCH 12/11] OMAP: PM: CPUfreq: obey min/max settings of policy Kevin Hilman 2009-06-25 17:17 ` Kevin Hilman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox