diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-09 17:39:59 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-09 17:39:59 -0500 |
commit | b3c37522928b5452588fc202eaa0f11f6e339256 (patch) | |
tree | 37bfe21d9977b15271903d1a4b304289a232e364 /arch/arm/plat-mxc | |
parent | 2ac9d7aaccbd598b5bd19ac40761b723bb675442 (diff) | |
parent | 6d0a5636fba5a3f82ec80ab124dd4748344549c3 (diff) |
Merge tag 'pm' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
power management changes for omap and imx
A significant part of the changes for these two platforms went into
power management, so they are split out into a separate branch.
* tag 'pm' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (65 commits)
ARM: imx6: remove __CPUINIT annotation from v7_invalidate_l1
ARM: imx6: fix v7_invalidate_l1 by adding I-Cache invalidation
ARM: imx6q: resume PL310 only when CACHE_L2X0 defined
ARM: imx6q: build pm code only when CONFIG_PM selected
ARM: mx5: use generic irq chip pm interface for pm functions on
ARM: omap: pass minimal SoC/board data for UART from dt
arm/dts: Add minimal device tree support for omap2420 and omap2430
omap-serial: Add minimal device tree support
omap-serial: Use default clock speed (48Mhz) if not specified
omap-serial: Get rid of all pdev->id usage
ARM: OMAP2+: hwmod: Add a new flag to handle hwmods left enabled at init
ARM: OMAP4: PRM: use PRCM interrupt handler
ARM: OMAP3: pm: use prcm chain handler
ARM: OMAP: hwmod: add support for selecting mpu_irq for each wakeup pad
ARM: OMAP2+: mux: add support for PAD wakeup interrupts
ARM: OMAP: PRCM: add suspend prepare / finish support
ARM: OMAP: PRCM: add support for chain interrupt handler
ARM: OMAP3/4: PRM: add functions to read pending IRQs, PRM barrier
ARM: OMAP2+: hwmod: Add API to enable IO ring wakeup
ARM: OMAP2+: mux: add wakeup-capable hwmod mux entries to dynamic list
...
Diffstat (limited to 'arch/arm/plat-mxc')
-rw-r--r-- | arch/arm/plat-mxc/include/mach/common.h | 8 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/mxc.h | 2 | ||||
-rw-r--r-- | arch/arm/plat-mxc/tzic.c | 40 |
3 files changed, 37 insertions, 13 deletions
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 83cca9bcfc97..1bf0df81bdc6 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
@@ -131,6 +131,12 @@ extern void imx53_evk_common_init(void); | |||
131 | extern void imx53_qsb_common_init(void); | 131 | extern void imx53_qsb_common_init(void); |
132 | extern void imx53_smd_common_init(void); | 132 | extern void imx53_smd_common_init(void); |
133 | extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode); | 133 | extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode); |
134 | extern void imx6q_pm_init(void); | ||
135 | extern void imx6q_clock_map_io(void); | 134 | extern void imx6q_clock_map_io(void); |
135 | |||
136 | #ifdef CONFIG_PM | ||
137 | extern void imx6q_pm_init(void); | ||
138 | #else | ||
139 | static inline void imx6q_pm_init(void) {} | ||
140 | #endif | ||
141 | |||
136 | #endif | 142 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h index a4d36d601d55..d78298366a91 100644 --- a/arch/arm/plat-mxc/include/mach/mxc.h +++ b/arch/arm/plat-mxc/include/mach/mxc.h | |||
@@ -168,7 +168,7 @@ struct cpu_op { | |||
168 | u32 cpu_rate; | 168 | u32 cpu_rate; |
169 | }; | 169 | }; |
170 | 170 | ||
171 | int tzic_enable_wake(int is_idle); | 171 | int tzic_enable_wake(void); |
172 | 172 | ||
173 | extern struct cpu_op *(*get_cpu_op)(int *op); | 173 | extern struct cpu_op *(*get_cpu_op)(int *op); |
174 | #endif | 174 | #endif |
diff --git a/arch/arm/plat-mxc/tzic.c b/arch/arm/plat-mxc/tzic.c index a3c164c7ba82..98308ec1f321 100644 --- a/arch/arm/plat-mxc/tzic.c +++ b/arch/arm/plat-mxc/tzic.c | |||
@@ -73,7 +73,28 @@ static int tzic_set_irq_fiq(unsigned int irq, unsigned int type) | |||
73 | #define tzic_set_irq_fiq NULL | 73 | #define tzic_set_irq_fiq NULL |
74 | #endif | 74 | #endif |
75 | 75 | ||
76 | static unsigned int *wakeup_intr[4]; | 76 | #ifdef CONFIG_PM |
77 | static void tzic_irq_suspend(struct irq_data *d) | ||
78 | { | ||
79 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
80 | int idx = gc->irq_base >> 5; | ||
81 | |||
82 | __raw_writel(gc->wake_active, tzic_base + TZIC_WAKEUP0(idx)); | ||
83 | } | ||
84 | |||
85 | static void tzic_irq_resume(struct irq_data *d) | ||
86 | { | ||
87 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
88 | int idx = gc->irq_base >> 5; | ||
89 | |||
90 | __raw_writel(__raw_readl(tzic_base + TZIC_ENSET0(idx)), | ||
91 | tzic_base + TZIC_WAKEUP0(idx)); | ||
92 | } | ||
93 | |||
94 | #else | ||
95 | #define tzic_irq_suspend NULL | ||
96 | #define tzic_irq_resume NULL | ||
97 | #endif | ||
77 | 98 | ||
78 | static struct mxc_extra_irq tzic_extra_irq = { | 99 | static struct mxc_extra_irq tzic_extra_irq = { |
79 | #ifdef CONFIG_FIQ | 100 | #ifdef CONFIG_FIQ |
@@ -91,12 +112,13 @@ static __init void tzic_init_gc(unsigned int irq_start) | |||
91 | handle_level_irq); | 112 | handle_level_irq); |
92 | gc->private = &tzic_extra_irq; | 113 | gc->private = &tzic_extra_irq; |
93 | gc->wake_enabled = IRQ_MSK(32); | 114 | gc->wake_enabled = IRQ_MSK(32); |
94 | wakeup_intr[idx] = &gc->wake_active; | ||
95 | 115 | ||
96 | ct = gc->chip_types; | 116 | ct = gc->chip_types; |
97 | ct->chip.irq_mask = irq_gc_mask_disable_reg; | 117 | ct->chip.irq_mask = irq_gc_mask_disable_reg; |
98 | ct->chip.irq_unmask = irq_gc_unmask_enable_reg; | 118 | ct->chip.irq_unmask = irq_gc_unmask_enable_reg; |
99 | ct->chip.irq_set_wake = irq_gc_set_wake; | 119 | ct->chip.irq_set_wake = irq_gc_set_wake; |
120 | ct->chip.irq_suspend = tzic_irq_suspend; | ||
121 | ct->chip.irq_resume = tzic_irq_resume; | ||
100 | ct->regs.disable = TZIC_ENCLEAR0(idx); | 122 | ct->regs.disable = TZIC_ENCLEAR0(idx); |
101 | ct->regs.enable = TZIC_ENSET0(idx); | 123 | ct->regs.enable = TZIC_ENSET0(idx); |
102 | 124 | ||
@@ -167,23 +189,19 @@ void __init tzic_init_irq(void __iomem *irqbase) | |||
167 | /** | 189 | /** |
168 | * tzic_enable_wake() - enable wakeup interrupt | 190 | * tzic_enable_wake() - enable wakeup interrupt |
169 | * | 191 | * |
170 | * @param is_idle 1 if called in idle loop (ENSET0 register); | ||
171 | * 0 to be used when called from low power entry | ||
172 | * @return 0 if successful; non-zero otherwise | 192 | * @return 0 if successful; non-zero otherwise |
173 | */ | 193 | */ |
174 | int tzic_enable_wake(int is_idle) | 194 | int tzic_enable_wake(void) |
175 | { | 195 | { |
176 | unsigned int i, v; | 196 | unsigned int i; |
177 | 197 | ||
178 | __raw_writel(1, tzic_base + TZIC_DSMINT); | 198 | __raw_writel(1, tzic_base + TZIC_DSMINT); |
179 | if (unlikely(__raw_readl(tzic_base + TZIC_DSMINT) == 0)) | 199 | if (unlikely(__raw_readl(tzic_base + TZIC_DSMINT) == 0)) |
180 | return -EAGAIN; | 200 | return -EAGAIN; |
181 | 201 | ||
182 | for (i = 0; i < 4; i++) { | 202 | for (i = 0; i < 4; i++) |
183 | v = is_idle ? __raw_readl(tzic_base + TZIC_ENSET0(i)) : | 203 | __raw_writel(__raw_readl(tzic_base + TZIC_ENSET0(i)), |
184 | *wakeup_intr[i]; | 204 | tzic_base + TZIC_WAKEUP0(i)); |
185 | __raw_writel(v, tzic_base + TZIC_WAKEUP0(i)); | ||
186 | } | ||
187 | 205 | ||
188 | return 0; | 206 | return 0; |
189 | } | 207 | } |