diff options
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 c75f254abd85..f4ebdb817abf 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 | } |