diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 04:38:11 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 04:38:11 -0400 |
| commit | e5723e0eeb2dc16629e86d66785024ead9169000 (patch) | |
| tree | 7fe39cdaf3106cc726d3b84fdc998b382b6c5e22 /arch/sh/kernel/cpu/sh3 | |
| parent | ecd9561687a0952a96a0a705f618e59cb6f3189b (diff) | |
sh: Add support for SH7706/SH7710/SH7343 CPUs.
This adds support for the aforementioned CPU subtypes, and cleans
up some build issues encountered as a result.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/cpu/sh3')
| -rw-r--r-- | arch/sh/kernel/cpu/sh3/Makefile | 5 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh3/clock-sh7706.c | 84 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh3/ex.S | 54 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh3/probe.c | 6 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh3/setup-sh7710.c | 43 |
5 files changed, 188 insertions, 4 deletions
diff --git a/arch/sh/kernel/cpu/sh3/Makefile b/arch/sh/kernel/cpu/sh3/Makefile index 1b292ae16f..58d3815695 100644 --- a/arch/sh/kernel/cpu/sh3/Makefile +++ b/arch/sh/kernel/cpu/sh3/Makefile | |||
| @@ -6,16 +6,19 @@ obj-y := ex.o probe.o | |||
| 6 | 6 | ||
| 7 | # CPU subtype setup | 7 | # CPU subtype setup |
| 8 | obj-$(CONFIG_CPU_SUBTYPE_SH7705) += setup-sh7705.o | 8 | obj-$(CONFIG_CPU_SUBTYPE_SH7705) += setup-sh7705.o |
| 9 | obj-$(CONFIG_CPU_SUBTYPE_SH7706) += setup-sh7709.o | ||
| 9 | obj-$(CONFIG_CPU_SUBTYPE_SH7707) += setup-sh7709.o | 10 | obj-$(CONFIG_CPU_SUBTYPE_SH7707) += setup-sh7709.o |
| 10 | obj-$(CONFIG_CPU_SUBTYPE_SH7708) += setup-sh7708.o | 11 | obj-$(CONFIG_CPU_SUBTYPE_SH7708) += setup-sh7708.o |
| 11 | obj-$(CONFIG_CPU_SUBTYPE_SH7709) += setup-sh7709.o | 12 | obj-$(CONFIG_CPU_SUBTYPE_SH7709) += setup-sh7709.o |
| 12 | obj-$(CONFIG_CPU_SUBTYPE_SH7300) += setup-sh7300.o | 13 | obj-$(CONFIG_CPU_SUBTYPE_SH7300) += setup-sh7300.o |
| 14 | obj-$(CONFIG_CPU_SUBTYPE_SH7710) += setup-sh7710.o | ||
| 13 | 15 | ||
| 14 | # Primary on-chip clocks (common) | 16 | # Primary on-chip clocks (common) |
| 15 | clock-$(CONFIG_CPU_SH3) := clock-sh3.o | 17 | clock-$(CONFIG_CPU_SH3) := clock-sh3.o |
| 16 | clock-$(CONFIG_CPU_SUBTYPE_SH7300) := clock-sh7300.o | 18 | clock-$(CONFIG_CPU_SUBTYPE_SH7300) := clock-sh7300.o |
| 17 | clock-$(CONFIG_CPU_SUBTYPE_SH7705) := clock-sh7705.o | 19 | clock-$(CONFIG_CPU_SUBTYPE_SH7705) := clock-sh7705.o |
| 20 | clock-$(CONFIG_CPU_SUBTYPE_SH7706) := clock-sh7706.o | ||
| 18 | clock-$(CONFIG_CPU_SUBTYPE_SH7709) := clock-sh7709.o | 21 | clock-$(CONFIG_CPU_SUBTYPE_SH7709) := clock-sh7709.o |
| 22 | clock-$(CONFIG_CPU_SUBTYPE_SH7710) := clock-sh7300.o | ||
| 19 | 23 | ||
| 20 | obj-y += $(clock-y) | 24 | obj-y += $(clock-y) |
| 21 | |||
diff --git a/arch/sh/kernel/cpu/sh3/clock-sh7706.c b/arch/sh/kernel/cpu/sh3/clock-sh7706.c new file mode 100644 index 0000000000..0cf96f9833 --- /dev/null +++ b/arch/sh/kernel/cpu/sh3/clock-sh7706.c | |||
| @@ -0,0 +1,84 @@ | |||
| 1 | /* | ||
| 2 | * arch/sh/kernel/cpu/sh3/clock-sh7706.c | ||
| 3 | * | ||
| 4 | * SH7706 support for the clock framework | ||
| 5 | * | ||
| 6 | * Copyright (C) 2006 Takashi YOSHII | ||
| 7 | * | ||
| 8 | * Based on arch/sh/kernel/cpu/sh3/clock-sh7709.c | ||
| 9 | * Copyright (C) 2005 Andriy Skulysh | ||
| 10 | * | ||
| 11 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 12 | * License. See the file "COPYING" in the main directory of this archive | ||
| 13 | * for more details. | ||
| 14 | */ | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/kernel.h> | ||
| 17 | #include <asm/clock.h> | ||
| 18 | #include <asm/freq.h> | ||
| 19 | #include <asm/io.h> | ||
| 20 | |||
| 21 | static int stc_multipliers[] = { 1, 2, 4, 1, 3, 6, 1, 1 }; | ||
| 22 | static int ifc_divisors[] = { 1, 2, 4, 1, 3, 1, 1, 1 }; | ||
| 23 | static int pfc_divisors[] = { 1, 2, 4, 1, 3, 6, 1, 1 }; | ||
| 24 | |||
| 25 | static void master_clk_init(struct clk *clk) | ||
| 26 | { | ||
| 27 | int frqcr = ctrl_inw(FRQCR); | ||
| 28 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | ||
| 29 | |||
| 30 | clk->rate *= pfc_divisors[idx]; | ||
| 31 | } | ||
| 32 | |||
| 33 | static struct clk_ops sh7706_master_clk_ops = { | ||
| 34 | .init = master_clk_init, | ||
| 35 | }; | ||
| 36 | |||
| 37 | static void module_clk_recalc(struct clk *clk) | ||
| 38 | { | ||
| 39 | int frqcr = ctrl_inw(FRQCR); | ||
| 40 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | ||
| 41 | |||
| 42 | clk->rate = clk->parent->rate / pfc_divisors[idx]; | ||
| 43 | } | ||
| 44 | |||
| 45 | static struct clk_ops sh7706_module_clk_ops = { | ||
| 46 | .recalc = module_clk_recalc, | ||
| 47 | }; | ||
| 48 | |||
| 49 | static void bus_clk_recalc(struct clk *clk) | ||
| 50 | { | ||
| 51 | int frqcr = ctrl_inw(FRQCR); | ||
| 52 | int idx = ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4); | ||
| 53 | |||
| 54 | clk->rate = clk->parent->rate / stc_multipliers[idx]; | ||
| 55 | } | ||
| 56 | |||
| 57 | static struct clk_ops sh7706_bus_clk_ops = { | ||
| 58 | .recalc = bus_clk_recalc, | ||
| 59 | }; | ||
| 60 | |||
| 61 | static void cpu_clk_recalc(struct clk *clk) | ||
| 62 | { | ||
| 63 | int frqcr = ctrl_inw(FRQCR); | ||
| 64 | int idx = ((frqcr & 0x4000) >> 12) | ((frqcr & 0x000c) >> 2); | ||
| 65 | |||
| 66 | clk->rate = clk->parent->rate / ifc_divisors[idx]; | ||
| 67 | } | ||
| 68 | |||
| 69 | static struct clk_ops sh7706_cpu_clk_ops = { | ||
| 70 | .recalc = cpu_clk_recalc, | ||
| 71 | }; | ||
| 72 | |||
| 73 | static struct clk_ops *sh7706_clk_ops[] = { | ||
| 74 | &sh7706_master_clk_ops, | ||
| 75 | &sh7706_module_clk_ops, | ||
| 76 | &sh7706_bus_clk_ops, | ||
| 77 | &sh7706_cpu_clk_ops, | ||
| 78 | }; | ||
| 79 | |||
| 80 | void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | ||
| 81 | { | ||
| 82 | if (idx < ARRAY_SIZE(sh7706_clk_ops)) | ||
| 83 | *ops = sh7706_clk_ops[idx]; | ||
| 84 | } | ||
diff --git a/arch/sh/kernel/cpu/sh3/ex.S b/arch/sh/kernel/cpu/sh3/ex.S index cc04e9e239..44daf44833 100644 --- a/arch/sh/kernel/cpu/sh3/ex.S +++ b/arch/sh/kernel/cpu/sh3/ex.S | |||
| @@ -84,8 +84,12 @@ ENTRY(interrupt_table) | |||
| 84 | .long do_IRQ ! rovi | 84 | .long do_IRQ ! rovi |
| 85 | .long do_IRQ | 85 | .long do_IRQ |
| 86 | .long do_IRQ /* 5E0 */ | 86 | .long do_IRQ /* 5E0 */ |
| 87 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \ | 87 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \ |
| 88 | defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705) | 88 | defined(CONFIG_CPU_SUBTYPE_SH7709) || \ |
| 89 | defined(CONFIG_CPU_SUBTYPE_SH7706) || \ | ||
| 90 | defined(CONFIG_CPU_SUBTYPE_SH7300) || \ | ||
| 91 | defined(CONFIG_CPU_SUBTYPE_SH7705) || \ | ||
| 92 | defined(CONFIG_CPU_SUBTYPE_SH7710) | ||
| 89 | .long do_IRQ ! 32 IRQ irq0 /* 600 */ | 93 | .long do_IRQ ! 32 IRQ irq0 /* 600 */ |
| 90 | .long do_IRQ ! 33 irq1 | 94 | .long do_IRQ ! 33 irq1 |
| 91 | .long do_IRQ ! 34 irq2 | 95 | .long do_IRQ ! 34 irq2 |
| @@ -147,6 +151,51 @@ ENTRY(interrupt_table) | |||
| 147 | .long do_IRQ ! 62 PCC pcc0i | 151 | .long do_IRQ ! 62 PCC pcc0i |
| 148 | .long do_IRQ ! 63 pcc1i /* 9E0 */ | 152 | .long do_IRQ ! 63 pcc1i /* 9E0 */ |
| 149 | #endif | 153 | #endif |
| 154 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) | ||
| 155 | .long exception_none ! 61 /* 9A0 */ | ||
| 156 | .long exception_none ! 62 | ||
| 157 | .long exception_none ! 63 | ||
| 158 | .long exception_none ! 64 /* A00 */ | ||
| 159 | .long exception_none ! 65 | ||
| 160 | .long exception_none ! 66 | ||
| 161 | .long exception_none ! 67 | ||
| 162 | .long exception_none ! 68 | ||
| 163 | .long exception_none ! 69 | ||
| 164 | .long exception_none ! 70 | ||
| 165 | .long exception_none ! 71 | ||
| 166 | .long exception_none ! 72 /* B00 */ | ||
| 167 | .long exception_none ! 73 | ||
| 168 | .long exception_none ! 74 | ||
| 169 | .long exception_none ! 75 | ||
| 170 | .long do_IRQ ! 76 DMAC2 dei4 /* B80 */ | ||
| 171 | .long do_IRQ ! 77 DMAC2 dei5 | ||
| 172 | .long exception_none ! 78 | ||
| 173 | .long do_IRQ ! 79 IPSEC ipseci /* BE0 */ | ||
| 174 | .long do_IRQ ! 80 EDMAC eint0 /* C00 */ | ||
| 175 | .long do_IRQ ! 81 EDMAC eint1 | ||
| 176 | .long do_IRQ ! 82 EDMAC eint2 | ||
| 177 | .long exception_none ! 83 /* C60 */ | ||
| 178 | .long exception_none ! 84 | ||
| 179 | .long exception_none ! 85 | ||
| 180 | .long exception_none ! 86 | ||
| 181 | .long exception_none ! 87 | ||
| 182 | .long exception_none ! 88 /* D00 */ | ||
| 183 | .long exception_none ! 89 | ||
| 184 | .long exception_none ! 90 | ||
| 185 | .long exception_none ! 91 | ||
| 186 | .long exception_none ! 92 | ||
| 187 | .long exception_none ! 93 | ||
| 188 | .long exception_none ! 94 | ||
| 189 | .long exception_none ! 95 | ||
| 190 | .long do_IRQ ! 96 SIOF eri0 /* E00 */ | ||
| 191 | .long do_IRQ ! 97 txi0 | ||
| 192 | .long do_IRQ ! 98 rxi0 | ||
| 193 | .long do_IRQ ! 99 cci0 | ||
| 194 | .long do_IRQ ! 100 eri1 /* E80 */ | ||
| 195 | .long do_IRQ ! 101 txi1 | ||
| 196 | .long do_IRQ ! 102 rxi2 | ||
| 197 | .long do_IRQ ! 103 cci3 | ||
| 198 | #endif | ||
| 150 | #if defined(CONFIG_CPU_SUBTYPE_SH7300) | 199 | #if defined(CONFIG_CPU_SUBTYPE_SH7300) |
| 151 | .long do_IRQ ! 64 | 200 | .long do_IRQ ! 64 |
| 152 | .long do_IRQ ! 65 | 201 | .long do_IRQ ! 65 |
| @@ -195,4 +244,3 @@ ENTRY(interrupt_table) | |||
| 195 | .long do_IRQ ! 108 | 244 | .long do_IRQ ! 108 |
| 196 | #endif | 245 | #endif |
| 197 | #endif | 246 | #endif |
| 198 | |||
diff --git a/arch/sh/kernel/cpu/sh3/probe.c b/arch/sh/kernel/cpu/sh3/probe.c index 5cdc886386..e670988362 100644 --- a/arch/sh/kernel/cpu/sh3/probe.c +++ b/arch/sh/kernel/cpu/sh3/probe.c | |||
| @@ -72,6 +72,12 @@ int __init detect_cpu_and_cache_system(void) | |||
| 72 | cpu_data->dcache.sets = 256; | 72 | cpu_data->dcache.sets = 256; |
| 73 | cpu_data->type = CPU_SH7729; | 73 | cpu_data->type = CPU_SH7729; |
| 74 | 74 | ||
| 75 | #if defined(CONFIG_CPU_SUBTYPE_SH7706) | ||
| 76 | cpu_data->type = CPU_SH7706; | ||
| 77 | #endif | ||
| 78 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) | ||
| 79 | cpu_data->type = CPU_SH7710; | ||
| 80 | #endif | ||
| 75 | #if defined(CONFIG_CPU_SUBTYPE_SH7705) | 81 | #if defined(CONFIG_CPU_SUBTYPE_SH7705) |
| 76 | cpu_data->type = CPU_SH7705; | 82 | cpu_data->type = CPU_SH7705; |
| 77 | 83 | ||
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7710.c b/arch/sh/kernel/cpu/sh3/setup-sh7710.c new file mode 100644 index 0000000000..895f99ee6a --- /dev/null +++ b/arch/sh/kernel/cpu/sh3/setup-sh7710.c | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | /* | ||
| 2 | * SH7710 Setup | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006 Paul Mundt | ||
| 5 | * | ||
| 6 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 7 | * License. See the file "COPYING" in the main directory of this archive | ||
| 8 | * for more details. | ||
| 9 | */ | ||
| 10 | #include <linux/platform_device.h> | ||
| 11 | #include <linux/init.h> | ||
| 12 | #include <linux/serial.h> | ||
| 13 | #include <asm/sci.h> | ||
| 14 | |||
| 15 | static struct plat_sci_port sci_platform_data[] = { | ||
| 16 | { | ||
| 17 | .mapbase = 0xa4400000, | ||
| 18 | .flags = UPF_BOOT_AUTOCONF, | ||
| 19 | .type = PORT_SCIF, | ||
| 20 | .irqs = { 52, 53, 55, 54 }, | ||
| 21 | }, { | ||
| 22 | .flags = 0, | ||
| 23 | } | ||
| 24 | }; | ||
| 25 | |||
| 26 | static struct platform_device sci_device = { | ||
| 27 | .name = "sh-sci", | ||
| 28 | .id = -1, | ||
| 29 | .dev = { | ||
| 30 | .platform_data = sci_platform_data, | ||
| 31 | }, | ||
| 32 | }; | ||
| 33 | |||
| 34 | static struct platform_device *sh7710_devices[] __initdata = { | ||
| 35 | &sci_device, | ||
| 36 | }; | ||
| 37 | |||
| 38 | static int __init sh7710_devices_setup(void) | ||
| 39 | { | ||
| 40 | return platform_add_devices(sh7710_devices, | ||
| 41 | ARRAY_SIZE(sh7710_devices)); | ||
| 42 | } | ||
| 43 | __initcall(sh7710_devices_setup); | ||
