diff options
Diffstat (limited to 'arch/sh/kernel/cpu/sh5')
-rw-r--r-- | arch/sh/kernel/cpu/sh5/clock-sh5.c | 8 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh5/entry.S | 8 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh5/fpu.c | 67 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh5/setup-sh5.c | 22 |
4 files changed, 24 insertions, 81 deletions
diff --git a/arch/sh/kernel/cpu/sh5/clock-sh5.c b/arch/sh/kernel/cpu/sh5/clock-sh5.c index 7f864ebc51d3..9cfc19b8dbe4 100644 --- a/arch/sh/kernel/cpu/sh5/clock-sh5.c +++ b/arch/sh/kernel/cpu/sh5/clock-sh5.c | |||
@@ -24,7 +24,7 @@ static unsigned long cprc_base; | |||
24 | 24 | ||
25 | static void master_clk_init(struct clk *clk) | 25 | static void master_clk_init(struct clk *clk) |
26 | { | 26 | { |
27 | int idx = (ctrl_inl(cprc_base + 0x00) >> 6) & 0x0007; | 27 | int idx = (__raw_readl(cprc_base + 0x00) >> 6) & 0x0007; |
28 | clk->rate *= ifc_table[idx]; | 28 | clk->rate *= ifc_table[idx]; |
29 | } | 29 | } |
30 | 30 | ||
@@ -34,7 +34,7 @@ static struct clk_ops sh5_master_clk_ops = { | |||
34 | 34 | ||
35 | static unsigned long module_clk_recalc(struct clk *clk) | 35 | static unsigned long module_clk_recalc(struct clk *clk) |
36 | { | 36 | { |
37 | int idx = (ctrl_inw(cprc_base) >> 12) & 0x0007; | 37 | int idx = (__raw_readw(cprc_base) >> 12) & 0x0007; |
38 | return clk->parent->rate / ifc_table[idx]; | 38 | return clk->parent->rate / ifc_table[idx]; |
39 | } | 39 | } |
40 | 40 | ||
@@ -44,7 +44,7 @@ static struct clk_ops sh5_module_clk_ops = { | |||
44 | 44 | ||
45 | static unsigned long bus_clk_recalc(struct clk *clk) | 45 | static unsigned long bus_clk_recalc(struct clk *clk) |
46 | { | 46 | { |
47 | int idx = (ctrl_inw(cprc_base) >> 3) & 0x0007; | 47 | int idx = (__raw_readw(cprc_base) >> 3) & 0x0007; |
48 | return clk->parent->rate / ifc_table[idx]; | 48 | return clk->parent->rate / ifc_table[idx]; |
49 | } | 49 | } |
50 | 50 | ||
@@ -54,7 +54,7 @@ static struct clk_ops sh5_bus_clk_ops = { | |||
54 | 54 | ||
55 | static unsigned long cpu_clk_recalc(struct clk *clk) | 55 | static unsigned long cpu_clk_recalc(struct clk *clk) |
56 | { | 56 | { |
57 | int idx = (ctrl_inw(cprc_base) & 0x0007); | 57 | int idx = (__raw_readw(cprc_base) & 0x0007); |
58 | return clk->parent->rate / ifc_table[idx]; | 58 | return clk->parent->rate / ifc_table[idx]; |
59 | } | 59 | } |
60 | 60 | ||
diff --git a/arch/sh/kernel/cpu/sh5/entry.S b/arch/sh/kernel/cpu/sh5/entry.S index b0aacf675258..6b80295dd7a4 100644 --- a/arch/sh/kernel/cpu/sh5/entry.S +++ b/arch/sh/kernel/cpu/sh5/entry.S | |||
@@ -187,7 +187,7 @@ trap_jtable: | |||
187 | .rept 6 | 187 | .rept 6 |
188 | .long do_exception_error /* 0x880 - 0x920 */ | 188 | .long do_exception_error /* 0x880 - 0x920 */ |
189 | .endr | 189 | .endr |
190 | .long do_software_break_point /* 0x940 */ | 190 | .long breakpoint_trap_handler /* 0x940 */ |
191 | .long do_exception_error /* 0x960 */ | 191 | .long do_exception_error /* 0x960 */ |
192 | .long do_single_step /* 0x980 */ | 192 | .long do_single_step /* 0x980 */ |
193 | 193 | ||
@@ -933,7 +933,7 @@ ret_with_reschedule: | |||
933 | 933 | ||
934 | pta restore_all, tr1 | 934 | pta restore_all, tr1 |
935 | 935 | ||
936 | movi (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), r8 | 936 | movi _TIF_SIGPENDING, r8 |
937 | and r8, r7, r8 | 937 | and r8, r7, r8 |
938 | pta work_notifysig, tr0 | 938 | pta work_notifysig, tr0 |
939 | bne r8, ZERO, tr0 | 939 | bne r8, ZERO, tr0 |
@@ -1124,7 +1124,7 @@ fpu_error_or_IRQA: | |||
1124 | pta its_IRQ, tr0 | 1124 | pta its_IRQ, tr0 |
1125 | beqi/l r4, EVENT_INTERRUPT, tr0 | 1125 | beqi/l r4, EVENT_INTERRUPT, tr0 |
1126 | #ifdef CONFIG_SH_FPU | 1126 | #ifdef CONFIG_SH_FPU |
1127 | movi do_fpu_state_restore, r6 | 1127 | movi fpu_state_restore_trap_handler, r6 |
1128 | #else | 1128 | #else |
1129 | movi do_exception_error, r6 | 1129 | movi do_exception_error, r6 |
1130 | #endif | 1130 | #endif |
@@ -1135,7 +1135,7 @@ fpu_error_or_IRQB: | |||
1135 | pta its_IRQ, tr0 | 1135 | pta its_IRQ, tr0 |
1136 | beqi/l r4, EVENT_INTERRUPT, tr0 | 1136 | beqi/l r4, EVENT_INTERRUPT, tr0 |
1137 | #ifdef CONFIG_SH_FPU | 1137 | #ifdef CONFIG_SH_FPU |
1138 | movi do_fpu_state_restore, r6 | 1138 | movi fpu_state_restore_trap_handler, r6 |
1139 | #else | 1139 | #else |
1140 | movi do_exception_error, r6 | 1140 | movi do_exception_error, r6 |
1141 | #endif | 1141 | #endif |
diff --git a/arch/sh/kernel/cpu/sh5/fpu.c b/arch/sh/kernel/cpu/sh5/fpu.c index dd4f51ffb50e..4b3bb35e99f3 100644 --- a/arch/sh/kernel/cpu/sh5/fpu.c +++ b/arch/sh/kernel/cpu/sh5/fpu.c | |||
@@ -15,26 +15,8 @@ | |||
15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
16 | #include <linux/signal.h> | 16 | #include <linux/signal.h> |
17 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
18 | #include <asm/user.h> | ||
19 | #include <asm/io.h> | ||
20 | #include <asm/fpu.h> | ||
21 | 18 | ||
22 | /* | 19 | void save_fpu(struct task_struct *tsk) |
23 | * Initially load the FPU with signalling NANS. This bit pattern | ||
24 | * has the property that no matter whether considered as single or as | ||
25 | * double precision, it still represents a signalling NAN. | ||
26 | */ | ||
27 | #define sNAN64 0xFFFFFFFFFFFFFFFFULL | ||
28 | #define sNAN32 0xFFFFFFFFUL | ||
29 | |||
30 | static union sh_fpu_union init_fpuregs = { | ||
31 | .hard = { | ||
32 | .fp_regs = { [0 ... 63] = sNAN32 }, | ||
33 | .fpscr = FPSCR_INIT | ||
34 | } | ||
35 | }; | ||
36 | |||
37 | void save_fpu(struct task_struct *tsk, struct pt_regs *regs) | ||
38 | { | 20 | { |
39 | asm volatile("fst.p %0, (0*8), fp0\n\t" | 21 | asm volatile("fst.p %0, (0*8), fp0\n\t" |
40 | "fst.p %0, (1*8), fp2\n\t" | 22 | "fst.p %0, (1*8), fp2\n\t" |
@@ -72,12 +54,11 @@ void save_fpu(struct task_struct *tsk, struct pt_regs *regs) | |||
72 | "fgetscr fr63\n\t" | 54 | "fgetscr fr63\n\t" |
73 | "fst.s %0, (32*8), fr63\n\t" | 55 | "fst.s %0, (32*8), fr63\n\t" |
74 | : /* no output */ | 56 | : /* no output */ |
75 | : "r" (&tsk->thread.fpu.hard) | 57 | : "r" (&tsk->thread.xstate->hardfpu) |
76 | : "memory"); | 58 | : "memory"); |
77 | } | 59 | } |
78 | 60 | ||
79 | static inline void | 61 | void restore_fpu(struct task_struct *tsk) |
80 | fpload(struct sh_fpu_hard_struct *fpregs) | ||
81 | { | 62 | { |
82 | asm volatile("fld.p %0, (0*8), fp0\n\t" | 63 | asm volatile("fld.p %0, (0*8), fp0\n\t" |
83 | "fld.p %0, (1*8), fp2\n\t" | 64 | "fld.p %0, (1*8), fp2\n\t" |
@@ -116,16 +97,11 @@ fpload(struct sh_fpu_hard_struct *fpregs) | |||
116 | 97 | ||
117 | "fld.p %0, (31*8), fp62\n\t" | 98 | "fld.p %0, (31*8), fp62\n\t" |
118 | : /* no output */ | 99 | : /* no output */ |
119 | : "r" (fpregs) ); | 100 | : "r" (&tsk->thread.xstate->hardfpu) |
120 | } | 101 | : "memory"); |
121 | |||
122 | void fpinit(struct sh_fpu_hard_struct *fpregs) | ||
123 | { | ||
124 | *fpregs = init_fpuregs.hard; | ||
125 | } | 102 | } |
126 | 103 | ||
127 | asmlinkage void | 104 | asmlinkage void do_fpu_error(unsigned long ex, struct pt_regs *regs) |
128 | do_fpu_error(unsigned long ex, struct pt_regs *regs) | ||
129 | { | 105 | { |
130 | struct task_struct *tsk = current; | 106 | struct task_struct *tsk = current; |
131 | 107 | ||
@@ -133,35 +109,6 @@ do_fpu_error(unsigned long ex, struct pt_regs *regs) | |||
133 | 109 | ||
134 | tsk->thread.trap_no = 11; | 110 | tsk->thread.trap_no = 11; |
135 | tsk->thread.error_code = 0; | 111 | tsk->thread.error_code = 0; |
136 | force_sig(SIGFPE, tsk); | ||
137 | } | ||
138 | |||
139 | |||
140 | asmlinkage void | ||
141 | do_fpu_state_restore(unsigned long ex, struct pt_regs *regs) | ||
142 | { | ||
143 | void die(const char *str, struct pt_regs *regs, long err); | ||
144 | |||
145 | if (! user_mode(regs)) | ||
146 | die("FPU used in kernel", regs, ex); | ||
147 | 112 | ||
148 | regs->sr &= ~SR_FD; | 113 | force_sig(SIGFPE, tsk); |
149 | |||
150 | if (last_task_used_math == current) | ||
151 | return; | ||
152 | |||
153 | enable_fpu(); | ||
154 | if (last_task_used_math != NULL) | ||
155 | /* Other processes fpu state, save away */ | ||
156 | save_fpu(last_task_used_math, regs); | ||
157 | |||
158 | last_task_used_math = current; | ||
159 | if (used_math()) { | ||
160 | fpload(¤t->thread.fpu.hard); | ||
161 | } else { | ||
162 | /* First time FPU user. */ | ||
163 | fpload(&init_fpuregs.hard); | ||
164 | set_used_math(); | ||
165 | } | ||
166 | disable_fpu(); | ||
167 | } | 114 | } |
diff --git a/arch/sh/kernel/cpu/sh5/setup-sh5.c b/arch/sh/kernel/cpu/sh5/setup-sh5.c index 6a0f82f70032..e7a3c1e4b604 100644 --- a/arch/sh/kernel/cpu/sh5/setup-sh5.c +++ b/arch/sh/kernel/cpu/sh5/setup-sh5.c | |||
@@ -16,22 +16,18 @@ | |||
16 | #include <linux/sh_timer.h> | 16 | #include <linux/sh_timer.h> |
17 | #include <asm/addrspace.h> | 17 | #include <asm/addrspace.h> |
18 | 18 | ||
19 | static struct plat_sci_port sci_platform_data[] = { | 19 | static struct plat_sci_port scif0_platform_data = { |
20 | { | 20 | .mapbase = PHYS_PERIPHERAL_BLOCK + 0x01030000, |
21 | .mapbase = PHYS_PERIPHERAL_BLOCK + 0x01030000, | 21 | .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP, |
22 | .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP, | 22 | .type = PORT_SCIF, |
23 | .type = PORT_SCIF, | 23 | .irqs = { 39, 40, 42, 0 }, |
24 | .irqs = { 39, 40, 42, 0 }, | ||
25 | }, { | ||
26 | .flags = 0, | ||
27 | } | ||
28 | }; | 24 | }; |
29 | 25 | ||
30 | static struct platform_device sci_device = { | 26 | static struct platform_device scif0_device = { |
31 | .name = "sh-sci", | 27 | .name = "sh-sci", |
32 | .id = -1, | 28 | .id = 0, |
33 | .dev = { | 29 | .dev = { |
34 | .platform_data = sci_platform_data, | 30 | .platform_data = &scif0_platform_data, |
35 | }, | 31 | }, |
36 | }; | 32 | }; |
37 | 33 | ||
@@ -164,13 +160,13 @@ static struct platform_device tmu2_device = { | |||
164 | }; | 160 | }; |
165 | 161 | ||
166 | static struct platform_device *sh5_early_devices[] __initdata = { | 162 | static struct platform_device *sh5_early_devices[] __initdata = { |
163 | &scif0_device, | ||
167 | &tmu0_device, | 164 | &tmu0_device, |
168 | &tmu1_device, | 165 | &tmu1_device, |
169 | &tmu2_device, | 166 | &tmu2_device, |
170 | }; | 167 | }; |
171 | 168 | ||
172 | static struct platform_device *sh5_devices[] __initdata = { | 169 | static struct platform_device *sh5_devices[] __initdata = { |
173 | &sci_device, | ||
174 | &rtc_device, | 170 | &rtc_device, |
175 | }; | 171 | }; |
176 | 172 | ||