diff options
author | Huacai Chen <chenhc@lemote.com> | 2014-06-25 23:41:27 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-07-30 15:46:00 -0400 |
commit | 140e39c1e3d29f50e161f55cca60f60b80408c2a (patch) | |
tree | cf4fc2a0a1896dd80667ead4382012c308ba73ca | |
parent | bda4584cd943d7bb6cf677a8d694700c1984cf3e (diff) |
MIPS: Loongson: Modify ChipConfig register definition
This patch is prepared for Multi-chip interconnection. Since each chip
has a ChipConfig register, LOONGSON_CHIPCFG should be an array.
Signed-off-by: Huacai Chen <chenhc@lemote.com>
Cc: John Crispin <john@phrozen.org>
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: linux-mips@linux-mips.org
Cc: Fuxin Zhang <zhangfx@lemote.com>
Cc: Zhangjin Wu <wuzhangjin@gmail.com>
Patchwork: https://patchwork.linux-mips.org/patch/7185/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r-- | arch/mips/include/asm/mach-loongson/loongson.h | 7 | ||||
-rw-r--r-- | arch/mips/loongson/common/env.c | 11 | ||||
-rw-r--r-- | arch/mips/loongson/common/pm.c | 8 | ||||
-rw-r--r-- | arch/mips/loongson/lemote-2f/clock.c | 4 | ||||
-rw-r--r-- | arch/mips/loongson/lemote-2f/reset.c | 2 | ||||
-rw-r--r-- | arch/mips/loongson/loongson-3/smp.c | 4 | ||||
-rw-r--r-- | drivers/cpufreq/loongson2_cpufreq.c | 6 |
7 files changed, 28 insertions, 14 deletions
diff --git a/arch/mips/include/asm/mach-loongson/loongson.h b/arch/mips/include/asm/mach-loongson/loongson.h index f3fd1eb8e3dd..a1c76caa7436 100644 --- a/arch/mips/include/asm/mach-loongson/loongson.h +++ b/arch/mips/include/asm/mach-loongson/loongson.h | |||
@@ -249,8 +249,11 @@ static inline void do_perfcnt_IRQ(void) | |||
249 | #define LOONGSON_PXARB_CFG LOONGSON_REG(LOONGSON_REGBASE + 0x68) | 249 | #define LOONGSON_PXARB_CFG LOONGSON_REG(LOONGSON_REGBASE + 0x68) |
250 | #define LOONGSON_PXARB_STATUS LOONGSON_REG(LOONGSON_REGBASE + 0x6c) | 250 | #define LOONGSON_PXARB_STATUS LOONGSON_REG(LOONGSON_REGBASE + 0x6c) |
251 | 251 | ||
252 | /* Chip Config */ | 252 | #define MAX_PACKAGES 4 |
253 | #define LOONGSON_CHIPCFG0 LOONGSON_REG(LOONGSON_REGBASE + 0x80) | 253 | |
254 | /* Chip Config registor of each physical cpu package, PRid >= Loongson-2F */ | ||
255 | extern u64 loongson_chipcfg[MAX_PACKAGES]; | ||
256 | #define LOONGSON_CHIPCFG(id) (*(volatile u32 *)(loongson_chipcfg[id])) | ||
254 | 257 | ||
255 | /* pcimap */ | 258 | /* pcimap */ |
256 | 259 | ||
diff --git a/arch/mips/loongson/common/env.c b/arch/mips/loongson/common/env.c index 0c543eae49bf..dc592412f764 100644 --- a/arch/mips/loongson/common/env.c +++ b/arch/mips/loongson/common/env.c | |||
@@ -27,6 +27,8 @@ EXPORT_SYMBOL(cpu_clock_freq); | |||
27 | struct efi_memory_map_loongson *loongson_memmap; | 27 | struct efi_memory_map_loongson *loongson_memmap; |
28 | struct loongson_system_configuration loongson_sysconf; | 28 | struct loongson_system_configuration loongson_sysconf; |
29 | 29 | ||
30 | u64 loongson_chipcfg[MAX_PACKAGES] = {0xffffffffbfc00180}; | ||
31 | |||
30 | #define parse_even_earlier(res, option, p) \ | 32 | #define parse_even_earlier(res, option, p) \ |
31 | do { \ | 33 | do { \ |
32 | unsigned int tmp __maybe_unused; \ | 34 | unsigned int tmp __maybe_unused; \ |
@@ -77,6 +79,15 @@ void __init prom_init_env(void) | |||
77 | 79 | ||
78 | cpu_clock_freq = ecpu->cpu_clock_freq; | 80 | cpu_clock_freq = ecpu->cpu_clock_freq; |
79 | loongson_sysconf.cputype = ecpu->cputype; | 81 | loongson_sysconf.cputype = ecpu->cputype; |
82 | if (ecpu->cputype == Loongson_3A) { | ||
83 | loongson_chipcfg[0] = 0x900000001fe00180; | ||
84 | loongson_chipcfg[1] = 0x900010001fe00180; | ||
85 | loongson_chipcfg[2] = 0x900020001fe00180; | ||
86 | loongson_chipcfg[3] = 0x900030001fe00180; | ||
87 | } else { | ||
88 | loongson_chipcfg[0] = 0x900000001fe00180; | ||
89 | } | ||
90 | |||
80 | loongson_sysconf.nr_cpus = ecpu->nr_cpus; | 91 | loongson_sysconf.nr_cpus = ecpu->nr_cpus; |
81 | if (ecpu->nr_cpus > NR_CPUS || ecpu->nr_cpus == 0) | 92 | if (ecpu->nr_cpus > NR_CPUS || ecpu->nr_cpus == 0) |
82 | loongson_sysconf.nr_cpus = NR_CPUS; | 93 | loongson_sysconf.nr_cpus = NR_CPUS; |
diff --git a/arch/mips/loongson/common/pm.c b/arch/mips/loongson/common/pm.c index f55e07aee071..a6b67ccfc811 100644 --- a/arch/mips/loongson/common/pm.c +++ b/arch/mips/loongson/common/pm.c | |||
@@ -79,7 +79,7 @@ int __weak wakeup_loongson(void) | |||
79 | static void wait_for_wakeup_events(void) | 79 | static void wait_for_wakeup_events(void) |
80 | { | 80 | { |
81 | while (!wakeup_loongson()) | 81 | while (!wakeup_loongson()) |
82 | LOONGSON_CHIPCFG0 &= ~0x7; | 82 | LOONGSON_CHIPCFG(0) &= ~0x7; |
83 | } | 83 | } |
84 | 84 | ||
85 | /* | 85 | /* |
@@ -102,15 +102,15 @@ static void loongson_suspend_enter(void) | |||
102 | 102 | ||
103 | stop_perf_counters(); | 103 | stop_perf_counters(); |
104 | 104 | ||
105 | cached_cpu_freq = LOONGSON_CHIPCFG0; | 105 | cached_cpu_freq = LOONGSON_CHIPCFG(0); |
106 | 106 | ||
107 | /* Put CPU into wait mode */ | 107 | /* Put CPU into wait mode */ |
108 | LOONGSON_CHIPCFG0 &= ~0x7; | 108 | LOONGSON_CHIPCFG(0) &= ~0x7; |
109 | 109 | ||
110 | /* wait for the given events to wakeup cpu from wait mode */ | 110 | /* wait for the given events to wakeup cpu from wait mode */ |
111 | wait_for_wakeup_events(); | 111 | wait_for_wakeup_events(); |
112 | 112 | ||
113 | LOONGSON_CHIPCFG0 = cached_cpu_freq; | 113 | LOONGSON_CHIPCFG(0) = cached_cpu_freq; |
114 | mmiowb(); | 114 | mmiowb(); |
115 | } | 115 | } |
116 | 116 | ||
diff --git a/arch/mips/loongson/lemote-2f/clock.c b/arch/mips/loongson/lemote-2f/clock.c index 1eed38e28b1e..a217061beee3 100644 --- a/arch/mips/loongson/lemote-2f/clock.c +++ b/arch/mips/loongson/lemote-2f/clock.c | |||
@@ -114,9 +114,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
114 | 114 | ||
115 | clk->rate = rate; | 115 | clk->rate = rate; |
116 | 116 | ||
117 | regval = LOONGSON_CHIPCFG0; | 117 | regval = LOONGSON_CHIPCFG(0); |
118 | regval = (regval & ~0x7) | (pos->driver_data - 1); | 118 | regval = (regval & ~0x7) | (pos->driver_data - 1); |
119 | LOONGSON_CHIPCFG0 = regval; | 119 | LOONGSON_CHIPCFG(0) = regval; |
120 | 120 | ||
121 | return ret; | 121 | return ret; |
122 | } | 122 | } |
diff --git a/arch/mips/loongson/lemote-2f/reset.c b/arch/mips/loongson/lemote-2f/reset.c index 90962a3a1731..79ac694fe744 100644 --- a/arch/mips/loongson/lemote-2f/reset.c +++ b/arch/mips/loongson/lemote-2f/reset.c | |||
@@ -28,7 +28,7 @@ static void reset_cpu(void) | |||
28 | * reset cpu to full speed, this is needed when enabling cpu frequency | 28 | * reset cpu to full speed, this is needed when enabling cpu frequency |
29 | * scalling | 29 | * scalling |
30 | */ | 30 | */ |
31 | LOONGSON_CHIPCFG0 |= 0x7; | 31 | LOONGSON_CHIPCFG(0) |= 0x7; |
32 | } | 32 | } |
33 | 33 | ||
34 | /* reset support for fuloong2f */ | 34 | /* reset support for fuloong2f */ |
diff --git a/arch/mips/loongson/loongson-3/smp.c b/arch/mips/loongson/loongson-3/smp.c index 1e8894020ea5..3c320e709e91 100644 --- a/arch/mips/loongson/loongson-3/smp.c +++ b/arch/mips/loongson/loongson-3/smp.c | |||
@@ -399,12 +399,12 @@ static int loongson3_cpu_callback(struct notifier_block *nfb, | |||
399 | case CPU_POST_DEAD: | 399 | case CPU_POST_DEAD: |
400 | case CPU_POST_DEAD_FROZEN: | 400 | case CPU_POST_DEAD_FROZEN: |
401 | pr_info("Disable clock for CPU#%d\n", cpu); | 401 | pr_info("Disable clock for CPU#%d\n", cpu); |
402 | LOONGSON_CHIPCFG0 &= ~(1 << (12 + cpu)); | 402 | LOONGSON_CHIPCFG(0) &= ~(1 << (12 + cpu)); |
403 | break; | 403 | break; |
404 | case CPU_UP_PREPARE: | 404 | case CPU_UP_PREPARE: |
405 | case CPU_UP_PREPARE_FROZEN: | 405 | case CPU_UP_PREPARE_FROZEN: |
406 | pr_info("Enable clock for CPU#%d\n", cpu); | 406 | pr_info("Enable clock for CPU#%d\n", cpu); |
407 | LOONGSON_CHIPCFG0 |= 1 << (12 + cpu); | 407 | LOONGSON_CHIPCFG(0) |= 1 << (12 + cpu); |
408 | break; | 408 | break; |
409 | } | 409 | } |
410 | 410 | ||
diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c index d4add8621944..9fa177206032 100644 --- a/drivers/cpufreq/loongson2_cpufreq.c +++ b/drivers/cpufreq/loongson2_cpufreq.c | |||
@@ -148,9 +148,9 @@ static void loongson2_cpu_wait(void) | |||
148 | u32 cpu_freq; | 148 | u32 cpu_freq; |
149 | 149 | ||
150 | spin_lock_irqsave(&loongson2_wait_lock, flags); | 150 | spin_lock_irqsave(&loongson2_wait_lock, flags); |
151 | cpu_freq = LOONGSON_CHIPCFG0; | 151 | cpu_freq = LOONGSON_CHIPCFG(0); |
152 | LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */ | 152 | LOONGSON_CHIPCFG(0) &= ~0x7; /* Put CPU into wait mode */ |
153 | LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */ | 153 | LOONGSON_CHIPCFG(0) = cpu_freq; /* Restore CPU state */ |
154 | spin_unlock_irqrestore(&loongson2_wait_lock, flags); | 154 | spin_unlock_irqrestore(&loongson2_wait_lock, flags); |
155 | local_irq_enable(); | 155 | local_irq_enable(); |
156 | } | 156 | } |