diff options
Diffstat (limited to 'arch/arm/mach-omap2')
| -rw-r--r-- | arch/arm/mach-omap2/board-zoom-peripherals.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/dpll3xxx.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/include/mach/entry-macro.S | 93 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/include/mach/omap4-common.h | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/include/mach/vmalloc.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/io.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap-hotplug.c | 14 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap-smp.c | 68 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap4-common.c | 11 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pm-debug.c | 34 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pm24xx.c | 35 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 27 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/prcm-common.h | 11 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/serial.c | 7 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/timer-gp.c | 5 |
15 files changed, 149 insertions, 165 deletions
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 86c9b2102952..9db9203667df 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
| @@ -216,7 +216,7 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | |||
| 216 | { | 216 | { |
| 217 | .name = "wl1271", | 217 | .name = "wl1271", |
| 218 | .mmc = 3, | 218 | .mmc = 3, |
| 219 | .caps = MMC_CAP_4_BIT_DATA, | 219 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, |
| 220 | .gpio_wp = -EINVAL, | 220 | .gpio_wp = -EINVAL, |
| 221 | .gpio_cd = -EINVAL, | 221 | .gpio_cd = -EINVAL, |
| 222 | .nonremovable = true, | 222 | .nonremovable = true, |
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index ed8d330522f1..ebb888f59365 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c | |||
| @@ -26,10 +26,10 @@ | |||
| 26 | #include <linux/clk.h> | 26 | #include <linux/clk.h> |
| 27 | #include <linux/io.h> | 27 | #include <linux/io.h> |
| 28 | #include <linux/bitops.h> | 28 | #include <linux/bitops.h> |
| 29 | #include <linux/clkdev.h> | ||
| 29 | 30 | ||
| 30 | #include <plat/cpu.h> | 31 | #include <plat/cpu.h> |
| 31 | #include <plat/clock.h> | 32 | #include <plat/clock.h> |
| 32 | #include <asm/clkdev.h> | ||
| 33 | 33 | ||
| 34 | #include "clock.h" | 34 | #include "clock.h" |
| 35 | #include "prm.h" | 35 | #include "prm.h" |
diff --git a/arch/arm/mach-omap2/include/mach/entry-macro.S b/arch/arm/mach-omap2/include/mach/entry-macro.S index 06e64e1fc28a..d54c4f89a8bd 100644 --- a/arch/arm/mach-omap2/include/mach/entry-macro.S +++ b/arch/arm/mach-omap2/include/mach/entry-macro.S | |||
| @@ -105,6 +105,35 @@ omap_irq_base: .word 0 | |||
| 105 | 9999: | 105 | 9999: |
| 106 | .endm | 106 | .endm |
| 107 | 107 | ||
| 108 | #ifdef CONFIG_SMP | ||
| 109 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
| 110 | * register) is preserved from the macro above. | ||
| 111 | * If there is an IPI, we immediately signal end of interrupt | ||
| 112 | * on the controller, since this requires the original irqstat | ||
| 113 | * value which we won't easily be able to recreate later. | ||
| 114 | */ | ||
| 115 | |||
| 116 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
| 117 | bic \irqnr, \irqstat, #0x1c00 | ||
| 118 | cmp \irqnr, #16 | ||
| 119 | it cc | ||
| 120 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
| 121 | it cs | ||
| 122 | cmpcs \irqnr, \irqnr | ||
| 123 | .endm | ||
| 124 | |||
| 125 | /* As above, this assumes that irqstat and base are preserved */ | ||
| 126 | |||
| 127 | .macro test_for_ltirq, irqnr, irqstat, base, tmp | ||
| 128 | bic \irqnr, \irqstat, #0x1c00 | ||
| 129 | mov \tmp, #0 | ||
| 130 | cmp \irqnr, #29 | ||
| 131 | itt eq | ||
| 132 | moveq \tmp, #1 | ||
| 133 | streq \irqstat, [\base, #GIC_CPU_EOI] | ||
| 134 | cmp \tmp, #0 | ||
| 135 | .endm | ||
| 136 | #endif /* CONFIG_SMP */ | ||
| 108 | 137 | ||
| 109 | #else /* MULTI_OMAP2 */ | 138 | #else /* MULTI_OMAP2 */ |
| 110 | 139 | ||
| @@ -141,74 +170,16 @@ omap_irq_base: .word 0 | |||
| 141 | 170 | ||
| 142 | 171 | ||
| 143 | #ifdef CONFIG_ARCH_OMAP4 | 172 | #ifdef CONFIG_ARCH_OMAP4 |
| 173 | #define HAVE_GET_IRQNR_PREAMBLE | ||
| 174 | #include <asm/hardware/entry-macro-gic.S> | ||
| 144 | 175 | ||
| 145 | .macro get_irqnr_preamble, base, tmp | 176 | .macro get_irqnr_preamble, base, tmp |
| 146 | ldr \base, =OMAP4_IRQ_BASE | 177 | ldr \base, =OMAP4_IRQ_BASE |
| 147 | .endm | 178 | .endm |
| 148 | 179 | ||
| 149 | /* | ||
| 150 | * The interrupt numbering scheme is defined in the | ||
| 151 | * interrupt controller spec. To wit: | ||
| 152 | * | ||
| 153 | * Interrupts 0-15 are IPI | ||
| 154 | * 16-28 are reserved | ||
| 155 | * 29-31 are local. We allow 30 to be used for the watchdog. | ||
| 156 | * 32-1020 are global | ||
| 157 | * 1021-1022 are reserved | ||
| 158 | * 1023 is "spurious" (no interrupt) | ||
| 159 | * | ||
| 160 | * For now, we ignore all local interrupts so only return an | ||
| 161 | * interrupt if it's between 30 and 1020. The test_for_ipi | ||
| 162 | * routine below will pick up on IPIs. | ||
| 163 | * A simple read from the controller will tell us the number | ||
| 164 | * of the highest priority enabled interrupt. | ||
| 165 | * We then just need to check whether it is in the | ||
| 166 | * valid range for an IRQ (30-1020 inclusive). | ||
| 167 | */ | ||
| 168 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
| 169 | ldr \irqstat, [\base, #GIC_CPU_INTACK] | ||
| 170 | |||
| 171 | ldr \tmp, =1021 | ||
| 172 | |||
| 173 | bic \irqnr, \irqstat, #0x1c00 | ||
| 174 | |||
| 175 | cmp \irqnr, #29 | ||
| 176 | cmpcc \irqnr, \irqnr | ||
| 177 | cmpne \irqnr, \tmp | ||
| 178 | cmpcs \irqnr, \irqnr | ||
| 179 | .endm | ||
| 180 | #endif | 180 | #endif |
| 181 | #endif /* MULTI_OMAP2 */ | ||
| 182 | |||
| 183 | #ifdef CONFIG_SMP | ||
| 184 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
| 185 | * register) is preserved from the macro above. | ||
| 186 | * If there is an IPI, we immediately signal end of interrupt | ||
| 187 | * on the controller, since this requires the original irqstat | ||
| 188 | * value which we won't easily be able to recreate later. | ||
| 189 | */ | ||
| 190 | 181 | ||
| 191 | .macro test_for_ipi, irqnr, irqstat, base, tmp | 182 | #endif /* MULTI_OMAP2 */ |
| 192 | bic \irqnr, \irqstat, #0x1c00 | ||
| 193 | cmp \irqnr, #16 | ||
| 194 | it cc | ||
| 195 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
| 196 | it cs | ||
| 197 | cmpcs \irqnr, \irqnr | ||
| 198 | .endm | ||
| 199 | |||
| 200 | /* As above, this assumes that irqstat and base are preserved */ | ||
| 201 | |||
| 202 | .macro test_for_ltirq, irqnr, irqstat, base, tmp | ||
| 203 | bic \irqnr, \irqstat, #0x1c00 | ||
| 204 | mov \tmp, #0 | ||
| 205 | cmp \irqnr, #29 | ||
| 206 | itt eq | ||
| 207 | moveq \tmp, #1 | ||
| 208 | streq \irqstat, [\base, #GIC_CPU_EOI] | ||
| 209 | cmp \tmp, #0 | ||
| 210 | .endm | ||
| 211 | #endif /* CONFIG_SMP */ | ||
| 212 | 183 | ||
| 213 | .macro irq_prio_table | 184 | .macro irq_prio_table |
| 214 | .endm | 185 | .endm |
diff --git a/arch/arm/mach-omap2/include/mach/omap4-common.h b/arch/arm/mach-omap2/include/mach/omap4-common.h index 2744dfee1ff4..5b0270b28934 100644 --- a/arch/arm/mach-omap2/include/mach/omap4-common.h +++ b/arch/arm/mach-omap2/include/mach/omap4-common.h | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | extern void __iomem *l2cache_base; | 24 | extern void __iomem *l2cache_base; |
| 25 | #endif | 25 | #endif |
| 26 | 26 | ||
| 27 | extern void __iomem *gic_cpu_base_addr; | ||
| 28 | extern void __iomem *gic_dist_base_addr; | 27 | extern void __iomem *gic_dist_base_addr; |
| 29 | 28 | ||
| 30 | extern void __init gic_init_irq(void); | 29 | extern void __init gic_init_irq(void); |
diff --git a/arch/arm/mach-omap2/include/mach/vmalloc.h b/arch/arm/mach-omap2/include/mach/vmalloc.h index 4da31e997efe..866319947760 100644 --- a/arch/arm/mach-omap2/include/mach/vmalloc.h +++ b/arch/arm/mach-omap2/include/mach/vmalloc.h | |||
| @@ -17,4 +17,4 @@ | |||
| 17 | * along with this program; if not, write to the Free Software | 17 | * along with this program; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | */ | 19 | */ |
| 20 | #define VMALLOC_END 0xf8000000 | 20 | #define VMALLOC_END 0xf8000000UL |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 40562ddd3ee4..a1939b1e6f82 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -297,7 +297,7 @@ static int __init _omap2_init_reprogram_sdrc(void) | |||
| 297 | return 0; | 297 | return 0; |
| 298 | 298 | ||
| 299 | dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck"); | 299 | dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck"); |
| 300 | if (!dpll3_m2_ck) | 300 | if (IS_ERR(dpll3_m2_ck)) |
| 301 | return -EINVAL; | 301 | return -EINVAL; |
| 302 | 302 | ||
| 303 | rate = clk_get_rate(dpll3_m2_ck); | 303 | rate = clk_get_rate(dpll3_m2_ck); |
diff --git a/arch/arm/mach-omap2/omap-hotplug.c b/arch/arm/mach-omap2/omap-hotplug.c index 6cee456ca542..4976b9393e49 100644 --- a/arch/arm/mach-omap2/omap-hotplug.c +++ b/arch/arm/mach-omap2/omap-hotplug.c | |||
| @@ -17,16 +17,13 @@ | |||
| 17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| 18 | #include <linux/errno.h> | 18 | #include <linux/errno.h> |
| 19 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
| 20 | #include <linux/completion.h> | ||
| 21 | 20 | ||
| 22 | #include <asm/cacheflush.h> | 21 | #include <asm/cacheflush.h> |
| 23 | #include <mach/omap4-common.h> | 22 | #include <mach/omap4-common.h> |
| 24 | 23 | ||
| 25 | static DECLARE_COMPLETION(cpu_killed); | ||
| 26 | |||
| 27 | int platform_cpu_kill(unsigned int cpu) | 24 | int platform_cpu_kill(unsigned int cpu) |
| 28 | { | 25 | { |
| 29 | return wait_for_completion_timeout(&cpu_killed, 5000); | 26 | return 1; |
| 30 | } | 27 | } |
| 31 | 28 | ||
| 32 | /* | 29 | /* |
| @@ -35,15 +32,6 @@ int platform_cpu_kill(unsigned int cpu) | |||
| 35 | */ | 32 | */ |
| 36 | void platform_cpu_die(unsigned int cpu) | 33 | void platform_cpu_die(unsigned int cpu) |
| 37 | { | 34 | { |
| 38 | unsigned int this_cpu = hard_smp_processor_id(); | ||
| 39 | |||
| 40 | if (cpu != this_cpu) { | ||
| 41 | pr_crit("platform_cpu_die running on %u, should be %u\n", | ||
| 42 | this_cpu, cpu); | ||
| 43 | BUG(); | ||
| 44 | } | ||
| 45 | pr_notice("CPU%u: shutdown\n", cpu); | ||
| 46 | complete(&cpu_killed); | ||
| 47 | flush_cache_all(); | 35 | flush_cache_all(); |
| 48 | dsb(); | 36 | dsb(); |
| 49 | 37 | ||
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index 9e9f70e18e3c..b66cfe8bc464 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
| 22 | 22 | ||
| 23 | #include <asm/cacheflush.h> | 23 | #include <asm/cacheflush.h> |
| 24 | #include <asm/localtimer.h> | ||
| 25 | #include <asm/smp_scu.h> | 24 | #include <asm/smp_scu.h> |
| 26 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
| 27 | #include <mach/omap4-common.h> | 26 | #include <mach/omap4-common.h> |
| @@ -29,28 +28,16 @@ | |||
| 29 | /* SCU base address */ | 28 | /* SCU base address */ |
| 30 | static void __iomem *scu_base; | 29 | static void __iomem *scu_base; |
| 31 | 30 | ||
| 32 | /* | ||
| 33 | * Use SCU config register to count number of cores | ||
| 34 | */ | ||
| 35 | static inline unsigned int get_core_count(void) | ||
| 36 | { | ||
| 37 | if (scu_base) | ||
| 38 | return scu_get_core_count(scu_base); | ||
| 39 | return 1; | ||
| 40 | } | ||
| 41 | |||
| 42 | static DEFINE_SPINLOCK(boot_lock); | 31 | static DEFINE_SPINLOCK(boot_lock); |
| 43 | 32 | ||
| 44 | void __cpuinit platform_secondary_init(unsigned int cpu) | 33 | void __cpuinit platform_secondary_init(unsigned int cpu) |
| 45 | { | 34 | { |
| 46 | trace_hardirqs_off(); | ||
| 47 | |||
| 48 | /* | 35 | /* |
| 49 | * If any interrupts are already enabled for the primary | 36 | * If any interrupts are already enabled for the primary |
| 50 | * core (e.g. timer irq), then they will not have been enabled | 37 | * core (e.g. timer irq), then they will not have been enabled |
| 51 | * for us: do so | 38 | * for us: do so |
| 52 | */ | 39 | */ |
| 53 | gic_cpu_init(0, gic_cpu_base_addr); | 40 | gic_secondary_init(0); |
| 54 | 41 | ||
| 55 | /* | 42 | /* |
| 56 | * Synchronise with the boot thread. | 43 | * Synchronise with the boot thread. |
| @@ -76,7 +63,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
| 76 | omap_modify_auxcoreboot0(0x200, 0xfffffdff); | 63 | omap_modify_auxcoreboot0(0x200, 0xfffffdff); |
| 77 | flush_cache_all(); | 64 | flush_cache_all(); |
| 78 | smp_wmb(); | 65 | smp_wmb(); |
| 79 | smp_cross_call(cpumask_of(cpu)); | 66 | smp_cross_call(cpumask_of(cpu), 1); |
| 80 | 67 | ||
| 81 | /* | 68 | /* |
| 82 | * Now the secondary core is starting up let it run its | 69 | * Now the secondary core is starting up let it run its |
| @@ -118,25 +105,9 @@ void __init smp_init_cpus(void) | |||
| 118 | scu_base = ioremap(OMAP44XX_SCU_BASE, SZ_256); | 105 | scu_base = ioremap(OMAP44XX_SCU_BASE, SZ_256); |
| 119 | BUG_ON(!scu_base); | 106 | BUG_ON(!scu_base); |
| 120 | 107 | ||
| 121 | ncores = get_core_count(); | 108 | ncores = scu_get_core_count(scu_base); |
| 122 | |||
| 123 | for (i = 0; i < ncores; i++) | ||
| 124 | set_cpu_possible(i, true); | ||
| 125 | } | ||
| 126 | |||
| 127 | void __init smp_prepare_cpus(unsigned int max_cpus) | ||
| 128 | { | ||
| 129 | unsigned int ncores = get_core_count(); | ||
| 130 | unsigned int cpu = smp_processor_id(); | ||
| 131 | int i; | ||
| 132 | 109 | ||
| 133 | /* sanity check */ | 110 | /* sanity check */ |
| 134 | if (ncores == 0) { | ||
| 135 | printk(KERN_ERR | ||
| 136 | "OMAP4: strange core count of 0? Default to 1\n"); | ||
| 137 | ncores = 1; | ||
| 138 | } | ||
| 139 | |||
| 140 | if (ncores > NR_CPUS) { | 111 | if (ncores > NR_CPUS) { |
| 141 | printk(KERN_WARNING | 112 | printk(KERN_WARNING |
| 142 | "OMAP4: no. of cores (%d) greater than configured " | 113 | "OMAP4: no. of cores (%d) greater than configured " |
| @@ -144,13 +115,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 144 | ncores, NR_CPUS); | 115 | ncores, NR_CPUS); |
| 145 | ncores = NR_CPUS; | 116 | ncores = NR_CPUS; |
| 146 | } | 117 | } |
| 147 | smp_store_cpu_info(cpu); | ||
| 148 | 118 | ||
| 149 | /* | 119 | for (i = 0; i < ncores; i++) |
| 150 | * are we trying to boot more cores than exist? | 120 | set_cpu_possible(i, true); |
| 151 | */ | 121 | } |
| 152 | if (max_cpus > ncores) | 122 | |
| 153 | max_cpus = ncores; | 123 | void __init platform_smp_prepare_cpus(unsigned int max_cpus) |
| 124 | { | ||
| 125 | int i; | ||
| 154 | 126 | ||
| 155 | /* | 127 | /* |
| 156 | * Initialise the present map, which describes the set of CPUs | 128 | * Initialise the present map, which describes the set of CPUs |
| @@ -159,18 +131,10 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 159 | for (i = 0; i < max_cpus; i++) | 131 | for (i = 0; i < max_cpus; i++) |
| 160 | set_cpu_present(i, true); | 132 | set_cpu_present(i, true); |
| 161 | 133 | ||
| 162 | if (max_cpus > 1) { | 134 | /* |
| 163 | /* | 135 | * Initialise the SCU and wake up the secondary core using |
| 164 | * Enable the local timer or broadcast device for the | 136 | * wakeup_secondary(). |
| 165 | * boot CPU, but only if we have more than one CPU. | 137 | */ |
| 166 | */ | 138 | scu_enable(scu_base); |
| 167 | percpu_timer_setup(); | 139 | wakeup_secondary(); |
| 168 | |||
| 169 | /* | ||
| 170 | * Initialise the SCU and wake up the secondary core using | ||
| 171 | * wakeup_secondary(). | ||
| 172 | */ | ||
| 173 | scu_enable(scu_base); | ||
| 174 | wakeup_secondary(); | ||
| 175 | } | ||
| 176 | } | 140 | } |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 2f895553e6a8..666e852988d5 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
| @@ -26,21 +26,22 @@ | |||
| 26 | void __iomem *l2cache_base; | 26 | void __iomem *l2cache_base; |
| 27 | #endif | 27 | #endif |
| 28 | 28 | ||
| 29 | void __iomem *gic_cpu_base_addr; | ||
| 30 | void __iomem *gic_dist_base_addr; | 29 | void __iomem *gic_dist_base_addr; |
| 31 | 30 | ||
| 32 | 31 | ||
| 33 | void __init gic_init_irq(void) | 32 | void __init gic_init_irq(void) |
| 34 | { | 33 | { |
| 34 | void __iomem *gic_cpu_base; | ||
| 35 | |||
| 35 | /* Static mapping, never released */ | 36 | /* Static mapping, never released */ |
| 36 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); | 37 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); |
| 37 | BUG_ON(!gic_dist_base_addr); | 38 | BUG_ON(!gic_dist_base_addr); |
| 38 | gic_dist_init(0, gic_dist_base_addr, 29); | ||
| 39 | 39 | ||
| 40 | /* Static mapping, never released */ | 40 | /* Static mapping, never released */ |
| 41 | gic_cpu_base_addr = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512); | 41 | gic_cpu_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512); |
| 42 | BUG_ON(!gic_cpu_base_addr); | 42 | BUG_ON(!gic_cpu_base); |
| 43 | gic_cpu_init(0, gic_cpu_base_addr); | 43 | |
| 44 | gic_init(0, 29, gic_dist_base_addr, gic_cpu_base); | ||
| 44 | } | 45 | } |
| 45 | 46 | ||
| 46 | #ifdef CONFIG_CACHE_L2X0 | 47 | #ifdef CONFIG_CACHE_L2X0 |
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index 5e81517a7af2..a8afb610c7d8 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c | |||
| @@ -161,6 +161,23 @@ void omap2_pm_dump(int mode, int resume, unsigned int us) | |||
| 161 | printk(KERN_INFO "%-20s: 0x%08x\n", regs[i].name, regs[i].val); | 161 | printk(KERN_INFO "%-20s: 0x%08x\n", regs[i].name, regs[i].val); |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds) | ||
| 165 | { | ||
| 166 | u32 tick_rate, cycles; | ||
| 167 | |||
| 168 | if (!seconds && !milliseconds) | ||
| 169 | return; | ||
| 170 | |||
| 171 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup)); | ||
| 172 | cycles = tick_rate * seconds + tick_rate * milliseconds / 1000; | ||
| 173 | omap_dm_timer_stop(gptimer_wakeup); | ||
| 174 | omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles); | ||
| 175 | |||
| 176 | pr_info("PM: Resume timer in %u.%03u secs" | ||
| 177 | " (%d ticks at %d ticks/sec.)\n", | ||
| 178 | seconds, milliseconds, cycles, tick_rate); | ||
| 179 | } | ||
| 180 | |||
| 164 | #ifdef CONFIG_DEBUG_FS | 181 | #ifdef CONFIG_DEBUG_FS |
| 165 | #include <linux/debugfs.h> | 182 | #include <linux/debugfs.h> |
| 166 | #include <linux/seq_file.h> | 183 | #include <linux/seq_file.h> |
| @@ -354,23 +371,6 @@ void pm_dbg_update_time(struct powerdomain *pwrdm, int prev) | |||
| 354 | pwrdm->timer = t; | 371 | pwrdm->timer = t; |
| 355 | } | 372 | } |
| 356 | 373 | ||
| 357 | void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds) | ||
| 358 | { | ||
| 359 | u32 tick_rate, cycles; | ||
| 360 | |||
| 361 | if (!seconds && !milliseconds) | ||
| 362 | return; | ||
| 363 | |||
| 364 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup)); | ||
| 365 | cycles = tick_rate * seconds + tick_rate * milliseconds / 1000; | ||
| 366 | omap_dm_timer_stop(gptimer_wakeup); | ||
| 367 | omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles); | ||
| 368 | |||
| 369 | pr_info("PM: Resume timer in %u.%03u secs" | ||
| 370 | " (%d ticks at %d ticks/sec.)\n", | ||
| 371 | seconds, milliseconds, cycles, tick_rate); | ||
| 372 | } | ||
| 373 | |||
| 374 | static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user) | 374 | static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user) |
| 375 | { | 375 | { |
| 376 | struct seq_file *s = (struct seq_file *)user; | 376 | struct seq_file *s = (struct seq_file *)user; |
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index a40457d81927..aaeea49b9bdd 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/irq.h> | 30 | #include <linux/irq.h> |
| 31 | #include <linux/time.h> | 31 | #include <linux/time.h> |
| 32 | #include <linux/gpio.h> | 32 | #include <linux/gpio.h> |
| 33 | #include <linux/console.h> | ||
| 33 | 34 | ||
| 34 | #include <asm/mach/time.h> | 35 | #include <asm/mach/time.h> |
| 35 | #include <asm/mach/irq.h> | 36 | #include <asm/mach/irq.h> |
| @@ -52,6 +53,19 @@ | |||
| 52 | #include <plat/powerdomain.h> | 53 | #include <plat/powerdomain.h> |
| 53 | #include <plat/clockdomain.h> | 54 | #include <plat/clockdomain.h> |
| 54 | 55 | ||
| 56 | #ifdef CONFIG_SUSPEND | ||
| 57 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | ||
| 58 | static inline bool is_suspending(void) | ||
| 59 | { | ||
| 60 | return (suspend_state != PM_SUSPEND_ON); | ||
| 61 | } | ||
| 62 | #else | ||
| 63 | static inline bool is_suspending(void) | ||
| 64 | { | ||
| 65 | return false; | ||
| 66 | } | ||
| 67 | #endif | ||
| 68 | |||
| 55 | static void (*omap2_sram_idle)(void); | 69 | static void (*omap2_sram_idle)(void); |
| 56 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, | 70 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, |
| 57 | void __iomem *sdrc_power); | 71 | void __iomem *sdrc_power); |
| @@ -118,6 +132,11 @@ static void omap2_enter_full_retention(void) | |||
| 118 | if (omap_irq_pending()) | 132 | if (omap_irq_pending()) |
| 119 | goto no_sleep; | 133 | goto no_sleep; |
| 120 | 134 | ||
| 135 | /* Block console output in case it is on one of the OMAP UARTs */ | ||
| 136 | if (!is_suspending()) | ||
| 137 | if (try_acquire_console_sem()) | ||
| 138 | goto no_sleep; | ||
| 139 | |||
| 121 | omap_uart_prepare_idle(0); | 140 | omap_uart_prepare_idle(0); |
| 122 | omap_uart_prepare_idle(1); | 141 | omap_uart_prepare_idle(1); |
| 123 | omap_uart_prepare_idle(2); | 142 | omap_uart_prepare_idle(2); |
| @@ -131,6 +150,9 @@ static void omap2_enter_full_retention(void) | |||
| 131 | omap_uart_resume_idle(1); | 150 | omap_uart_resume_idle(1); |
| 132 | omap_uart_resume_idle(0); | 151 | omap_uart_resume_idle(0); |
| 133 | 152 | ||
| 153 | if (!is_suspending()) | ||
| 154 | release_console_sem(); | ||
| 155 | |||
| 134 | no_sleep: | 156 | no_sleep: |
| 135 | if (omap2_pm_debug) { | 157 | if (omap2_pm_debug) { |
| 136 | unsigned long long tmp; | 158 | unsigned long long tmp; |
| @@ -277,6 +299,12 @@ out: | |||
| 277 | local_irq_enable(); | 299 | local_irq_enable(); |
| 278 | } | 300 | } |
| 279 | 301 | ||
| 302 | static int omap2_pm_begin(suspend_state_t state) | ||
| 303 | { | ||
| 304 | suspend_state = state; | ||
| 305 | return 0; | ||
| 306 | } | ||
| 307 | |||
| 280 | static int omap2_pm_prepare(void) | 308 | static int omap2_pm_prepare(void) |
| 281 | { | 309 | { |
| 282 | /* We cannot sleep in idle until we have resumed */ | 310 | /* We cannot sleep in idle until we have resumed */ |
| @@ -326,10 +354,17 @@ static void omap2_pm_finish(void) | |||
| 326 | enable_hlt(); | 354 | enable_hlt(); |
| 327 | } | 355 | } |
| 328 | 356 | ||
| 357 | static void omap2_pm_end(void) | ||
| 358 | { | ||
| 359 | suspend_state = PM_SUSPEND_ON; | ||
| 360 | } | ||
| 361 | |||
| 329 | static struct platform_suspend_ops omap_pm_ops = { | 362 | static struct platform_suspend_ops omap_pm_ops = { |
| 363 | .begin = omap2_pm_begin, | ||
| 330 | .prepare = omap2_pm_prepare, | 364 | .prepare = omap2_pm_prepare, |
| 331 | .enter = omap2_pm_enter, | 365 | .enter = omap2_pm_enter, |
| 332 | .finish = omap2_pm_finish, | 366 | .finish = omap2_pm_finish, |
| 367 | .end = omap2_pm_end, | ||
| 333 | .valid = suspend_valid_only_mem, | 368 | .valid = suspend_valid_only_mem, |
| 334 | }; | 369 | }; |
| 335 | 370 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 75c0cd13ad8e..648b8c50d024 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/clk.h> | 28 | #include <linux/clk.h> |
| 29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
| 30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 31 | #include <linux/console.h> | ||
| 31 | 32 | ||
| 32 | #include <plat/sram.h> | 33 | #include <plat/sram.h> |
| 33 | #include <plat/clockdomain.h> | 34 | #include <plat/clockdomain.h> |
| @@ -49,6 +50,19 @@ | |||
| 49 | #include "sdrc.h" | 50 | #include "sdrc.h" |
| 50 | #include "control.h" | 51 | #include "control.h" |
| 51 | 52 | ||
| 53 | #ifdef CONFIG_SUSPEND | ||
| 54 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | ||
| 55 | static inline bool is_suspending(void) | ||
| 56 | { | ||
| 57 | return (suspend_state != PM_SUSPEND_ON); | ||
| 58 | } | ||
| 59 | #else | ||
| 60 | static inline bool is_suspending(void) | ||
| 61 | { | ||
| 62 | return false; | ||
| 63 | } | ||
| 64 | #endif | ||
| 65 | |||
| 52 | /* Scratchpad offsets */ | 66 | /* Scratchpad offsets */ |
| 53 | #define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4 | 67 | #define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4 |
| 54 | #define OMAP343X_TABLE_VALUE_OFFSET 0xc0 | 68 | #define OMAP343X_TABLE_VALUE_OFFSET 0xc0 |
| @@ -385,6 +399,13 @@ void omap_sram_idle(void) | |||
| 385 | omap3_enable_io_chain(); | 399 | omap3_enable_io_chain(); |
| 386 | } | 400 | } |
| 387 | 401 | ||
| 402 | /* Block console output in case it is on one of the OMAP UARTs */ | ||
| 403 | if (!is_suspending()) | ||
| 404 | if (per_next_state < PWRDM_POWER_ON || | ||
| 405 | core_next_state < PWRDM_POWER_ON) | ||
| 406 | if (try_acquire_console_sem()) | ||
| 407 | goto console_still_active; | ||
| 408 | |||
| 388 | /* PER */ | 409 | /* PER */ |
| 389 | if (per_next_state < PWRDM_POWER_ON) { | 410 | if (per_next_state < PWRDM_POWER_ON) { |
| 390 | omap_uart_prepare_idle(2); | 411 | omap_uart_prepare_idle(2); |
| @@ -463,6 +484,10 @@ void omap_sram_idle(void) | |||
| 463 | omap_uart_resume_idle(3); | 484 | omap_uart_resume_idle(3); |
| 464 | } | 485 | } |
| 465 | 486 | ||
| 487 | if (!is_suspending()) | ||
| 488 | release_console_sem(); | ||
| 489 | |||
| 490 | console_still_active: | ||
| 466 | /* Disable IO-PAD and IO-CHAIN wakeup */ | 491 | /* Disable IO-PAD and IO-CHAIN wakeup */ |
| 467 | if (omap3_has_io_wakeup() && | 492 | if (omap3_has_io_wakeup() && |
| 468 | (per_next_state < PWRDM_POWER_ON || | 493 | (per_next_state < PWRDM_POWER_ON || |
| @@ -504,8 +529,6 @@ out: | |||
| 504 | } | 529 | } |
| 505 | 530 | ||
| 506 | #ifdef CONFIG_SUSPEND | 531 | #ifdef CONFIG_SUSPEND |
| 507 | static suspend_state_t suspend_state; | ||
| 508 | |||
| 509 | static int omap3_pm_prepare(void) | 532 | static int omap3_pm_prepare(void) |
| 510 | { | 533 | { |
| 511 | disable_hlt(); | 534 | disable_hlt(); |
diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index 298a22a754e2..f81acee4738d 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h | |||
| @@ -243,13 +243,14 @@ | |||
| 243 | #define OMAP24XX_EN_GPT1_MASK (1 << 0) | 243 | #define OMAP24XX_EN_GPT1_MASK (1 << 0) |
| 244 | 244 | ||
| 245 | /* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */ | 245 | /* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */ |
| 246 | #define OMAP24XX_ST_GPIOS_SHIFT (1 << 2) | 246 | #define OMAP24XX_ST_GPIOS_SHIFT 2 |
| 247 | #define OMAP24XX_ST_GPIOS_MASK 2 | 247 | #define OMAP24XX_ST_GPIOS_MASK (1 << 2) |
| 248 | #define OMAP24XX_ST_GPT1_SHIFT (1 << 0) | 248 | #define OMAP24XX_ST_GPT1_SHIFT 0 |
| 249 | #define OMAP24XX_ST_GPT1_MASK 0 | 249 | #define OMAP24XX_ST_GPT1_MASK (1 << 0) |
| 250 | 250 | ||
| 251 | /* CM_IDLEST_MDM and PM_WKST_MDM shared bits */ | 251 | /* CM_IDLEST_MDM and PM_WKST_MDM shared bits */ |
| 252 | #define OMAP2430_ST_MDM_SHIFT (1 << 0) | 252 | #define OMAP2430_ST_MDM_SHIFT 0 |
| 253 | #define OMAP2430_ST_MDM_MASK (1 << 0) | ||
| 253 | 254 | ||
| 254 | 255 | ||
| 255 | /* 3430 register bits shared between CM & PRM registers */ | 256 | /* 3430 register bits shared between CM & PRM registers */ |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index becf0e38ef7e..d17960a1be25 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 28 | #include <linux/serial_8250.h> | 28 | #include <linux/serial_8250.h> |
| 29 | #include <linux/pm_runtime.h> | 29 | #include <linux/pm_runtime.h> |
| 30 | #include <linux/console.h> | ||
| 30 | 31 | ||
| 31 | #ifdef CONFIG_SERIAL_OMAP | 32 | #ifdef CONFIG_SERIAL_OMAP |
| 32 | #include <plat/omap-serial.h> | 33 | #include <plat/omap-serial.h> |
| @@ -406,7 +407,7 @@ void omap_uart_resume_idle(int num) | |||
| 406 | struct omap_uart_state *uart; | 407 | struct omap_uart_state *uart; |
| 407 | 408 | ||
| 408 | list_for_each_entry(uart, &uart_list, node) { | 409 | list_for_each_entry(uart, &uart_list, node) { |
| 409 | if (num == uart->num) { | 410 | if (num == uart->num && uart->can_sleep) { |
| 410 | omap_uart_enable_clocks(uart); | 411 | omap_uart_enable_clocks(uart); |
| 411 | 412 | ||
| 412 | /* Check for IO pad wakeup */ | 413 | /* Check for IO pad wakeup */ |
| @@ -807,6 +808,8 @@ void __init omap_serial_init_port(int port) | |||
| 807 | 808 | ||
| 808 | oh->dev_attr = uart; | 809 | oh->dev_attr = uart; |
| 809 | 810 | ||
| 811 | acquire_console_sem(); /* in case the earlycon is on the UART */ | ||
| 812 | |||
| 810 | /* | 813 | /* |
| 811 | * Because of early UART probing, UART did not get idled | 814 | * Because of early UART probing, UART did not get idled |
| 812 | * on init. Now that omap_device is ready, ensure full idle | 815 | * on init. Now that omap_device is ready, ensure full idle |
| @@ -831,6 +834,8 @@ void __init omap_serial_init_port(int port) | |||
| 831 | omap_uart_block_sleep(uart); | 834 | omap_uart_block_sleep(uart); |
| 832 | uart->timeout = DEFAULT_TIMEOUT; | 835 | uart->timeout = DEFAULT_TIMEOUT; |
| 833 | 836 | ||
| 837 | release_console_sem(); | ||
| 838 | |||
| 834 | if ((cpu_is_omap34xx() && uart->padconf) || | 839 | if ((cpu_is_omap34xx() && uart->padconf) || |
| 835 | (uart->wk_en && uart->wk_mask)) { | 840 | (uart->wk_en && uart->wk_mask)) { |
| 836 | device_init_wakeup(&od->pdev.dev, true); | 841 | device_init_wakeup(&od->pdev.dev, true); |
diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c index e13c29eecf2b..a7816dbdc6b1 100644 --- a/arch/arm/mach-omap2/timer-gp.c +++ b/arch/arm/mach-omap2/timer-gp.c | |||
| @@ -195,7 +195,6 @@ static struct clocksource clocksource_gpt = { | |||
| 195 | .rating = 300, | 195 | .rating = 300, |
| 196 | .read = clocksource_read_cycles, | 196 | .read = clocksource_read_cycles, |
| 197 | .mask = CLOCKSOURCE_MASK(32), | 197 | .mask = CLOCKSOURCE_MASK(32), |
| 198 | .shift = 24, | ||
| 199 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 198 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
| 200 | }; | 199 | }; |
| 201 | 200 | ||
| @@ -220,9 +219,7 @@ static void __init omap2_gp_clocksource_init(void) | |||
| 220 | 219 | ||
| 221 | omap_dm_timer_set_load_start(gpt, 1, 0); | 220 | omap_dm_timer_set_load_start(gpt, 1, 0); |
| 222 | 221 | ||
| 223 | clocksource_gpt.mult = | 222 | if (clocksource_register_hz(&clocksource_gpt, tick_rate)) |
| 224 | clocksource_khz2mult(tick_rate/1000, clocksource_gpt.shift); | ||
| 225 | if (clocksource_register(&clocksource_gpt)) | ||
| 226 | printk(err2, clocksource_gpt.name); | 223 | printk(err2, clocksource_gpt.name); |
| 227 | } | 224 | } |
| 228 | #endif | 225 | #endif |
