> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of Jouni Hogander
> Sent: Wednesday, June 25, 2008 2:44 PM
> To: [email protected]
> Subject: [PATCH 6/7] 34XX: PM: Workaround for taking care of
> gpio clocks
>
> In omap3 gpios 2-6 are in per domain. Clocks for these should be
> disabled. This patch is needed until gpio driver disables gpio clocks.
>
> Signed-off-by: Jouni Hogander <[EMAIL PROTECTED]>
> ---
> arch/arm/mach-omap2/pm34xx.c | 15 +++++++-
> arch/arm/mach-omap2/sleep34xx.S | 74
> +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 87 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/pm34xx.c
> b/arch/arm/mach-omap2/pm34xx.c
> index edde254..9c7b7be 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -47,12 +47,19 @@ struct power_state {
>
> static LIST_HEAD(pwrst_list);
>
> -void (*_omap_sram_idle)(u32 *addr, int save_state);
> +void (*_omap_sram_idle)(u32 *addr, int save_state, int
> disable_clocks);
>
> static void (*saved_idle)(void);
>
> static struct powerdomain *mpu_pwrdm;
>
> +/* XXX This is for gpio fclk hack. Will be removed as gpio driver
> + * handles fcks correctly */
> +static void gpio_fclk_mask(u32 *fclk)
> +{
> + *fclk &= ~(0x1f << 13);
> +}
> +
> /* PRCM Interrupt Handler for wakeups */
> static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id)
> {
> @@ -169,7 +176,7 @@ static void omap_sram_idle(void)
>
> omap2_gpio_prepare_for_retention();
>
> - _omap_sram_idle(NULL, save_state);
> + _omap_sram_idle(NULL, save_state, clocks_off_while_idle);
>
> omap2_gpio_resume_after_retention();
> }
> @@ -197,6 +204,10 @@ static int omap3_fclks_active(void)
> CM_FCLKEN);
> fck_per = cm_read_mod_reg(OMAP3430_PER_MOD,
> CM_FCLKEN);
> +
> + if (clocks_off_while_idle)
> + gpio_fclk_mask(&fck_per);
> +
> if (fck_core1 | fck_core3 | fck_sgx | fck_dss |
> fck_cam | fck_per | fck_usbhost)
> return 1;
> diff --git a/arch/arm/mach-omap2/sleep34xx.S
> b/arch/arm/mach-omap2/sleep34xx.S
> index ebc7eb3..1f7009a 100644
> --- a/arch/arm/mach-omap2/sleep34xx.S
> +++ b/arch/arm/mach-omap2/sleep34xx.S
> @@ -32,6 +32,8 @@
>
> #include "prm.h"
> #include "sdrc.h"
> +#include "cm.h"
> +#include "cm-regbits-34xx.h"
>
> #define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \
> OMAP3430_PM_PREPWSTST)
> @@ -45,6 +47,15 @@
> SCRATCHPAD_MEM_OFFS)
> #define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER)
>
> +/* XXX gpio fclk workaround */
> +#define CM_FCLKEN_PER_V
> OMAP34XX_CM_REGADDR(OMAP3430_PER_MOD, \
> + CM_FCLKEN)
> +#define CM_FCLKEN_PER_P io_v2p(CM_FCLKEN_PER_V)
> +
> +#define GPIO_FCLK_MASK OMAP3430_EN_GPIO6 |
> OMAP3430_EN_GPIO5 | \
> + OMAP3430_EN_GPIO4 |
> OMAP3430_EN_GPIO3 | \
> + OMAP3430_EN_GPIO2
> +
> .text
> /* Function call to get the restore pointer for resume from OFF */
> ENTRY(get_restore_pointer)
> @@ -68,14 +79,41 @@ loop:
> /*b loop*/ @Enable to debug by stepping through code
> /* r0 contains restore pointer in sdram */
> /* r1 contains information about saving context */
> + /* r2 contains information whether clocks should be disabled */
> ldr r4, sdrc_power @ read the SDRC_POWER register
> ldr r5, [r4] @ read the contents of
> SDRC_POWER
> orr r5, r5, #0x40 @ enable self refresh
> on idle req
> str r5, [r4] @ write back to
> SDRC_POWER register
>
> + /* XXX gpio fclk workaround */
> + /* Check if per fclken needs to be saved */
> + cmp r2, #0x0
> + beq skip_per_fclken_save
> +
> + /* XXX gpio fclk workaround */
> + /* Save current value of per fclken reg */
> + ldr r4, cm_fclken_per_v
> + ldr r5, [r4]
> + str r5, cm_fclken_per_val
> +skip_per_fclken_save:
> +
Any reason why this is now done in SRAM?
> cmp r1, #0x0
> /* If context save is required, do that and execute wfi */
> bne save_context_wfi
In case of OFF mode, clocks would never be disabled.
> +
> + /* XXX gpio fclk workaround */
> + /* Check if gpio clocks needs to be disabled */
> + ldr r5, cm_fclken_per_val
> + cmp r5, #0x0
> + beq skip_gpio_clk_disable
> +
> + /* XXX gpio fclk workaround */
> + /* Disable gpio clocks */
> + ldr r4, cm_fclken_per_v
> + bic r5, r5, #GPIO_FCLK_MASK
> + str r5, [r4]
> +skip_gpio_clk_disable:
Even with clocks_off_while_idle set to 1, should'nt gpio clocks be cut and
restored only
when a PER RET/OFF is attemted and not every time omap_sram_idle is called?
> +
> /* Data memory barrier and Data sync barrier */
> mov r1, #0
> mcr p15, 0, r1, c7, c10, 4
> @@ -93,6 +131,14 @@ loop:
> nop
> nop
> nop
> +
> + /* XXX gpio fclk workaround */
> + ldr r5, cm_fclken_per_val
> + cmp r5, #0x0
> + beq skip_per_fclken_restore
> + str r5, [r4]
> +skip_per_fclken_restore:
> +
> bl i_dll_wait
>
> ldmfd sp!, {r0-r12, pc} @ restore regs
> and return
> @@ -483,6 +529,20 @@ finished:
> mcr p15, 2, r10, c0, c0, 0
> isb
> skip_l2_inval:
> +
> + /* XXX gpio fclk workaround */
> + /* Check if gpio clocks needs to be disabled */
> + ldr r5, cm_fclken_per_val
> + cmp r5, #0x0
> + beq skip_gpio_clk_disable_2
> +
> + /* XXX gpio fclk workaround */
> + /* Disable gpio clocks */
> + ldr r4, cm_fclken_per_p
> + bic r5, r5, #GPIO_FCLK_MASK
> + str r5, [r4]
> +skip_gpio_clk_disable_2:
> +
> /* Data memory barrier and Data sync barrier */
> mov r1, #0
> mcr p15, 0, r1, c7, c10, 4
> @@ -499,6 +559,14 @@ skip_l2_inval:
> nop
> nop
> nop
> +
> + /* XXX gpio fclk workaround */
> + ldr r5, cm_fclken_per_val
> + cmp r5, #0x0
> + beq skip_per_fclken_restore_2
> + str r5, [r4]
> +skip_per_fclken_restore_2:
> +
> bl i_dll_wait
> /* restore regs and return */
> ldmfd sp!, {r0-r12, pc}
> @@ -540,5 +608,11 @@ table_entry:
> .word 0x00000C02
> cache_pred_disable_mask:
> .word 0xFFFFE7FB
> +cm_fclken_per_v:
> + .word CM_FCLKEN_PER_V
> +cm_fclken_per_p:
> + .word CM_FCLKEN_PER_P
> +cm_fclken_per_val:
> + .word 0
> ENTRY(omap34xx_cpu_suspend_sz)
> .word . - omap34xx_cpu_suspend
> --
> 1.5.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-omap" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html