diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 11:49:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 11:49:07 -0400 |
commit | b98adfccdf5f8dd34ae56a2d5adbe2c030bd4674 (patch) | |
tree | 1807a029520f550dd4f90c95ad0063bceb00d645 /arch | |
parent | ba21fe71725f94792330ebc3034ef2b35a36276f (diff) | |
parent | 33573c0e3243aaa38b6ad96942de85a1b713c2ff (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6: (108 commits)
sh: Fix occasional flush_cache_4096() stack corruption.
sh: Calculate shm alignment at runtime.
sh: dma-mapping compile fixes.
sh: Initial vsyscall page support.
sh: Clean up PAGE_SIZE definition for assembly use.
sh: Selective flush_cache_mm() flushing.
sh: More intelligent entry_mask/way_size calculation.
sh: Support for L2 cache on newer SH-4A CPUs.
sh: Update kexec support for API changes.
sh: Optimized readsl()/writesl() support.
sh: Report movli.l/movco.l capabilities.
sh: CPU flags in AT_HWCAP in ELF auxvt.
sh: Add support for 4K stacks.
sh: Enable /proc/kcore support.
sh: stack debugging support.
sh: select CONFIG_EMBEDDED.
sh: machvec rework.
sh: Solution Engine SH7343 board support.
sh: SH7710VoIPGW board support.
sh: Enable verbose BUG() support.
...
Diffstat (limited to 'arch')
237 files changed, 17228 insertions, 6583 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 1a0db1d4c952..1cc5c9b27bfd 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -8,6 +8,7 @@ mainmenu "Linux/SuperH Kernel Configuration" | |||
8 | config SUPERH | 8 | config SUPERH |
9 | bool | 9 | bool |
10 | default y | 10 | default y |
11 | select EMBEDDED | ||
11 | help | 12 | help |
12 | The SuperH is a RISC processor targeted for use in embedded systems | 13 | The SuperH is a RISC processor targeted for use in embedded systems |
13 | and consumer electronics; it was also used in the Sega Dreamcast | 14 | and consumer electronics; it was also used in the Sega Dreamcast |
@@ -51,18 +52,23 @@ source "init/Kconfig" | |||
51 | 52 | ||
52 | menu "System type" | 53 | menu "System type" |
53 | 54 | ||
55 | config SOLUTION_ENGINE | ||
56 | bool | ||
57 | |||
54 | choice | 58 | choice |
55 | prompt "SuperH system type" | 59 | prompt "SuperH system type" |
56 | default SH_UNKNOWN | 60 | default SH_UNKNOWN |
57 | 61 | ||
58 | config SH_SOLUTION_ENGINE | 62 | config SH_SOLUTION_ENGINE |
59 | bool "SolutionEngine" | 63 | bool "SolutionEngine" |
64 | select SOLUTION_ENGINE | ||
60 | help | 65 | help |
61 | Select SolutionEngine if configuring for a Hitachi SH7709 | 66 | Select SolutionEngine if configuring for a Hitachi SH7709 |
62 | or SH7750 evaluation board. | 67 | or SH7750 evaluation board. |
63 | 68 | ||
64 | config SH_7751_SOLUTION_ENGINE | 69 | config SH_7751_SOLUTION_ENGINE |
65 | bool "SolutionEngine7751" | 70 | bool "SolutionEngine7751" |
71 | select SOLUTION_ENGINE | ||
66 | select CPU_SUBTYPE_SH7751 | 72 | select CPU_SUBTYPE_SH7751 |
67 | help | 73 | help |
68 | Select 7751 SolutionEngine if configuring for a Hitachi SH7751 | 74 | Select 7751 SolutionEngine if configuring for a Hitachi SH7751 |
@@ -70,17 +76,27 @@ config SH_7751_SOLUTION_ENGINE | |||
70 | 76 | ||
71 | config SH_7300_SOLUTION_ENGINE | 77 | config SH_7300_SOLUTION_ENGINE |
72 | bool "SolutionEngine7300" | 78 | bool "SolutionEngine7300" |
79 | select SOLUTION_ENGINE | ||
73 | select CPU_SUBTYPE_SH7300 | 80 | select CPU_SUBTYPE_SH7300 |
74 | help | 81 | help |
75 | Select 7300 SolutionEngine if configuring for a Hitachi SH7300(SH-Mobile V) | 82 | Select 7300 SolutionEngine if configuring for a Hitachi |
76 | evaluation board. | 83 | SH7300(SH-Mobile V) evaluation board. |
84 | |||
85 | config SH_7343_SOLUTION_ENGINE | ||
86 | bool "SolutionEngine7343" | ||
87 | select SOLUTION_ENGINE | ||
88 | select CPU_SUBTYPE_SH7343 | ||
89 | help | ||
90 | Select 7343 SolutionEngine if configuring for a Hitachi | ||
91 | SH7343 (SH-Mobile 3AS) evaluation board. | ||
77 | 92 | ||
78 | config SH_73180_SOLUTION_ENGINE | 93 | config SH_73180_SOLUTION_ENGINE |
79 | bool "SolutionEngine73180" | 94 | bool "SolutionEngine73180" |
80 | select CPU_SUBTYPE_SH73180 | 95 | select SOLUTION_ENGINE |
81 | help | 96 | select CPU_SUBTYPE_SH73180 |
82 | Select 73180 SolutionEngine if configuring for a Hitachi SH73180(SH-Mobile 3) | 97 | help |
83 | evaluation board. | 98 | Select 73180 SolutionEngine if configuring for a Hitachi |
99 | SH73180(SH-Mobile 3) evaluation board. | ||
84 | 100 | ||
85 | config SH_7751_SYSTEMH | 101 | config SH_7751_SYSTEMH |
86 | bool "SystemH7751R" | 102 | bool "SystemH7751R" |
@@ -89,12 +105,6 @@ config SH_7751_SYSTEMH | |||
89 | Select SystemH if you are configuring for a Renesas SystemH | 105 | Select SystemH if you are configuring for a Renesas SystemH |
90 | 7751R evaluation board. | 106 | 7751R evaluation board. |
91 | 107 | ||
92 | config SH_STB1_HARP | ||
93 | bool "STB1_Harp" | ||
94 | |||
95 | config SH_STB1_OVERDRIVE | ||
96 | bool "STB1_Overdrive" | ||
97 | |||
98 | config SH_HP6XX | 108 | config SH_HP6XX |
99 | bool "HP6XX" | 109 | bool "HP6XX" |
100 | help | 110 | help |
@@ -102,19 +112,6 @@ config SH_HP6XX | |||
102 | More information (hardware only) at | 112 | More information (hardware only) at |
103 | <http://www.hp.com/jornada/>. | 113 | <http://www.hp.com/jornada/>. |
104 | 114 | ||
105 | config SH_CQREEK | ||
106 | bool "CqREEK" | ||
107 | help | ||
108 | Select CqREEK if configuring for a CqREEK SH7708 or SH7750. | ||
109 | More information at | ||
110 | <http://sources.redhat.com/ecos/hardware.html#SuperH>. | ||
111 | |||
112 | config SH_DMIDA | ||
113 | bool "DMIDA" | ||
114 | help | ||
115 | Select DMIDA if configuring for a DataMyte 4000 Industrial | ||
116 | Digital Assistant. More information at <http://www.dmida.com/>. | ||
117 | |||
118 | config SH_EC3104 | 115 | config SH_EC3104 |
119 | bool "EC3104" | 116 | bool "EC3104" |
120 | help | 117 | help |
@@ -136,25 +133,9 @@ config SH_DREAMCAST | |||
136 | <http://www.m17n.org/linux-sh/dreamcast/>. There is a | 133 | <http://www.m17n.org/linux-sh/dreamcast/>. There is a |
137 | Dreamcast project is at <http://linuxdc.sourceforge.net/>. | 134 | Dreamcast project is at <http://linuxdc.sourceforge.net/>. |
138 | 135 | ||
139 | config SH_CAT68701 | ||
140 | bool "CAT68701" | ||
141 | |||
142 | config SH_BIGSUR | 136 | config SH_BIGSUR |
143 | bool "BigSur" | 137 | bool "BigSur" |
144 | 138 | ||
145 | config SH_SH2000 | ||
146 | bool "SH2000" | ||
147 | select CPU_SUBTYPE_SH7709 | ||
148 | help | ||
149 | SH-2000 is a single-board computer based around SH7709A chip | ||
150 | intended for embedded applications. | ||
151 | It has an Ethernet interface (CS8900A), direct connected | ||
152 | Compact Flash socket, three serial ports and PC-104 bus. | ||
153 | More information at <http://sh2000.sh-linux.org>. | ||
154 | |||
155 | config SH_ADX | ||
156 | bool "ADX" | ||
157 | |||
158 | config SH_MPC1211 | 139 | config SH_MPC1211 |
159 | bool "Interface MPC1211" | 140 | bool "Interface MPC1211" |
160 | help | 141 | help |
@@ -184,6 +165,13 @@ config SH_HS7751RVOIP | |||
184 | Select HS7751RVOIP if configuring for a Renesas Technology | 165 | Select HS7751RVOIP if configuring for a Renesas Technology |
185 | Sales VoIP board. | 166 | Sales VoIP board. |
186 | 167 | ||
168 | config SH_7710VOIPGW | ||
169 | bool "SH7710-VOIP-GW" | ||
170 | select CPU_SUBTYPE_SH7710 | ||
171 | help | ||
172 | Select this option to build a kernel for the SH7710 based | ||
173 | VOIP GW. | ||
174 | |||
187 | config SH_RTS7751R2D | 175 | config SH_RTS7751R2D |
188 | bool "RTS7751R2D" | 176 | bool "RTS7751R2D" |
189 | select CPU_SUBTYPE_SH7751R | 177 | select CPU_SUBTYPE_SH7751R |
@@ -222,6 +210,12 @@ config SH_TITAN | |||
222 | Select Titan if you are configuring for a Nimble Microsystems | 210 | Select Titan if you are configuring for a Nimble Microsystems |
223 | NetEngine NP51R. | 211 | NetEngine NP51R. |
224 | 212 | ||
213 | config SH_SHMIN | ||
214 | bool "SHMIN" | ||
215 | select CPU_SUBTYPE_SH7706 | ||
216 | help | ||
217 | Select SHMIN if configureing for the SHMIN board | ||
218 | |||
225 | config SH_UNKNOWN | 219 | config SH_UNKNOWN |
226 | bool "BareCPU" | 220 | bool "BareCPU" |
227 | help | 221 | help |
@@ -238,35 +232,9 @@ endchoice | |||
238 | 232 | ||
239 | source "arch/sh/mm/Kconfig" | 233 | source "arch/sh/mm/Kconfig" |
240 | 234 | ||
241 | config MEMORY_START | ||
242 | hex "Physical memory start address" | ||
243 | default "0x08000000" | ||
244 | ---help--- | ||
245 | Computers built with Hitachi SuperH processors always | ||
246 | map the ROM starting at address zero. But the processor | ||
247 | does not specify the range that RAM takes. | ||
248 | |||
249 | The physical memory (RAM) start address will be automatically | ||
250 | set to 08000000. Other platforms, such as the Solution Engine | ||
251 | boards typically map RAM at 0C000000. | ||
252 | |||
253 | Tweak this only when porting to a new machine which does not | ||
254 | already have a defconfig. Changing it from the known correct | ||
255 | value on any of the known systems will only lead to disaster. | ||
256 | |||
257 | config MEMORY_SIZE | ||
258 | hex "Physical memory size" | ||
259 | default "0x00400000" | ||
260 | help | ||
261 | This sets the default memory size assumed by your SH kernel. It can | ||
262 | be overridden as normal by the 'mem=' argument on the kernel command | ||
263 | line. If unsure, consult your board specifications or just leave it | ||
264 | as 0x00400000 which was the default value before this became | ||
265 | configurable. | ||
266 | |||
267 | config CF_ENABLER | 235 | config CF_ENABLER |
268 | bool "Compact Flash Enabler support" | 236 | bool "Compact Flash Enabler support" |
269 | depends on SH_ADX || SH_SOLUTION_ENGINE || SH_UNKNOWN || SH_CAT68701 || SH_SH03 | 237 | depends on SH_SOLUTION_ENGINE || SH_UNKNOWN || SH_SH03 |
270 | ---help--- | 238 | ---help--- |
271 | Compact Flash is a small, removable mass storage device introduced | 239 | Compact Flash is a small, removable mass storage device introduced |
272 | in 1994 originally as a PCMCIA device. If you say `Y' here, you | 240 | in 1994 originally as a PCMCIA device. If you say `Y' here, you |
@@ -294,7 +262,7 @@ config CF_AREA5 | |||
294 | - "Area5" if CompactFlash is connected to Area 5 (0x14000000) | 262 | - "Area5" if CompactFlash is connected to Area 5 (0x14000000) |
295 | - "Area6" if it is connected to Area 6 (0x18000000) | 263 | - "Area6" if it is connected to Area 6 (0x18000000) |
296 | 264 | ||
297 | "Area6" will work for most boards. For ADX, select "Area5". | 265 | "Area6" will work for most boards. |
298 | 266 | ||
299 | config CF_AREA6 | 267 | config CF_AREA6 |
300 | bool "Area6" | 268 | bool "Area6" |
@@ -316,19 +284,6 @@ config CPU_LITTLE_ENDIAN | |||
316 | endian byte order. These modes require different kernels. Say Y if | 284 | endian byte order. These modes require different kernels. Say Y if |
317 | your machine is little endian, N if it's a big endian machine. | 285 | your machine is little endian, N if it's a big endian machine. |
318 | 286 | ||
319 | # The SH7750 RTC module is disabled in the Dreamcast | ||
320 | config SH_RTC | ||
321 | bool | ||
322 | depends on !SH_DREAMCAST && !SH_SATURN && !SH_7300_SOLUTION_ENGINE && \ | ||
323 | !SH_73180_SOLUTION_ENGINE && !SH_LANDISK && \ | ||
324 | !SH_R7780RP | ||
325 | default y | ||
326 | help | ||
327 | Selecting this option will allow the Linux kernel to emulate | ||
328 | PC's RTC. | ||
329 | |||
330 | If unsure, say N. | ||
331 | |||
332 | config SH_FPU | 287 | config SH_FPU |
333 | bool "FPU support" | 288 | bool "FPU support" |
334 | depends on !CPU_SH3 | 289 | depends on !CPU_SH3 |
@@ -339,14 +294,22 @@ config SH_FPU | |||
339 | 294 | ||
340 | This option must be set in order to enable the FPU. | 295 | This option must be set in order to enable the FPU. |
341 | 296 | ||
297 | config SH_FPU_EMU | ||
298 | bool "FPU emulation support" | ||
299 | depends on !SH_FPU && EXPERIMENTAL | ||
300 | default n | ||
301 | help | ||
302 | Selecting this option will enable support for software FPU emulation. | ||
303 | Most SH-3 users will want to say Y here, whereas most SH-4 users will | ||
304 | want to say N. | ||
305 | |||
342 | config SH_DSP | 306 | config SH_DSP |
343 | bool "DSP support" | 307 | bool "DSP support" |
344 | depends on !CPU_SH4 | 308 | default y if SH4AL_DSP || !CPU_SH4 |
345 | default y | 309 | default n |
346 | help | 310 | help |
347 | Selecting this option will enable support for SH processors that | 311 | Selecting this option will enable support for SH processors that |
348 | have DSP units (ie, SH2-DSP and SH3-DSP). It is safe to say Y here | 312 | have DSP units (ie, SH2-DSP, SH3-DSP, and SH4AL-DSP). |
349 | by default, as the existance of the DSP will be probed at runtime. | ||
350 | 313 | ||
351 | This option must be set in order to enable the DSP. | 314 | This option must be set in order to enable the DSP. |
352 | 315 | ||
@@ -373,6 +336,9 @@ config CPU_HAS_INTEVT | |||
373 | config CPU_HAS_PINT_IRQ | 336 | config CPU_HAS_PINT_IRQ |
374 | bool | 337 | bool |
375 | 338 | ||
339 | config CPU_HAS_MASKREG_IRQ | ||
340 | bool | ||
341 | |||
376 | config CPU_HAS_INTC2_IRQ | 342 | config CPU_HAS_INTC2_IRQ |
377 | bool | 343 | bool |
378 | 344 | ||
@@ -400,16 +366,19 @@ config SH_TMU | |||
400 | 366 | ||
401 | endmenu | 367 | endmenu |
402 | 368 | ||
403 | #source "arch/sh/boards/renesas/hs7751rvoip/Kconfig" | 369 | source "arch/sh/boards/renesas/hs7751rvoip/Kconfig" |
370 | |||
371 | source "arch/sh/boards/renesas/rts7751r2d/Kconfig" | ||
404 | 372 | ||
405 | #source "arch/sh/boards/renesas/rts7751r2d/Kconfig" | 373 | source "arch/sh/boards/renesas/r7780rp/Kconfig" |
406 | 374 | ||
407 | config SH_PCLK_FREQ | 375 | config SH_PCLK_FREQ |
408 | int "Peripheral clock frequency (in Hz)" | 376 | int "Peripheral clock frequency (in Hz)" |
409 | default "50000000" if CPU_SUBTYPE_SH7750 || CPU_SUBTYPE_SH7780 | 377 | default "50000000" if CPU_SUBTYPE_SH7750 || CPU_SUBTYPE_SH7780 |
410 | default "60000000" if CPU_SUBTYPE_SH7751 | 378 | default "60000000" if CPU_SUBTYPE_SH7751 |
411 | default "33333333" if CPU_SUBTYPE_SH7300 || CPU_SUBTYPE_SH7770 || CPU_SUBTYPE_SH7760 | 379 | default "33333333" if CPU_SUBTYPE_SH7300 || CPU_SUBTYPE_SH7770 || \ |
412 | default "27000000" if CPU_SUBTYPE_SH73180 | 380 | CPU_SUBTYPE_SH7760 |
381 | default "27000000" if CPU_SUBTYPE_SH73180 || CPU_SUBTYPE_SH7343 | ||
413 | default "66000000" if CPU_SUBTYPE_SH4_202 | 382 | default "66000000" if CPU_SUBTYPE_SH4_202 |
414 | help | 383 | help |
415 | This option is used to specify the peripheral clock frequency. | 384 | This option is used to specify the peripheral clock frequency. |
@@ -440,10 +409,8 @@ source "arch/sh/cchips/Kconfig" | |||
440 | 409 | ||
441 | config HEARTBEAT | 410 | config HEARTBEAT |
442 | bool "Heartbeat LED" | 411 | bool "Heartbeat LED" |
443 | depends on SH_MPC1211 || SH_SH03 || SH_CAT68701 || \ | 412 | depends on SH_MPC1211 || SH_SH03 || \ |
444 | SH_STB1_HARP || SH_STB1_OVERDRIVE || SH_BIGSUR || \ | 413 | SH_BIGSUR || SOLUTION_ENGINE || \ |
445 | SH_7751_SOLUTION_ENGINE || SH_7300_SOLUTION_ENGINE || \ | ||
446 | SH_73180_SOLUTION_ENGINE || SH_SOLUTION_ENGINE || \ | ||
447 | SH_RTS7751R2D || SH_SH4202_MICRODEV || SH_LANDISK | 414 | SH_RTS7751R2D || SH_SH4202_MICRODEV || SH_LANDISK |
448 | help | 415 | help |
449 | Use the power-on LED on your machine as a load meter. The exact | 416 | Use the power-on LED on your machine as a load meter. The exact |
@@ -459,6 +426,8 @@ config ISA_DMA_API | |||
459 | 426 | ||
460 | menu "Kernel features" | 427 | menu "Kernel features" |
461 | 428 | ||
429 | source kernel/Kconfig.hz | ||
430 | |||
462 | config KEXEC | 431 | config KEXEC |
463 | bool "kexec system call (EXPERIMENTAL)" | 432 | bool "kexec system call (EXPERIMENTAL)" |
464 | depends on EXPERIMENTAL | 433 | depends on EXPERIMENTAL |
@@ -476,10 +445,6 @@ config KEXEC | |||
476 | support. As of this writing the exact hardware interface is | 445 | support. As of this writing the exact hardware interface is |
477 | strongly in flux, so no good recommendation can be made. | 446 | strongly in flux, so no good recommendation can be made. |
478 | 447 | ||
479 | config PREEMPT | ||
480 | bool "Preemptible Kernel (EXPERIMENTAL)" | ||
481 | depends on EXPERIMENTAL | ||
482 | |||
483 | config SMP | 448 | config SMP |
484 | bool "Symmetric multi-processing support" | 449 | bool "Symmetric multi-processing support" |
485 | ---help--- | 450 | ---help--- |
@@ -515,6 +480,8 @@ config NR_CPUS | |||
515 | This is purely to save memory - each supported CPU adds | 480 | This is purely to save memory - each supported CPU adds |
516 | approximately eight kilobytes to the kernel image. | 481 | approximately eight kilobytes to the kernel image. |
517 | 482 | ||
483 | source "kernel/Kconfig.preempt" | ||
484 | |||
518 | config CPU_HAS_SR_RB | 485 | config CPU_HAS_SR_RB |
519 | bool "CPU has SR.RB" | 486 | bool "CPU has SR.RB" |
520 | depends on CPU_SH3 || CPU_SH4 | 487 | depends on CPU_SH3 || CPU_SH4 |
@@ -636,6 +603,16 @@ source "fs/Kconfig.binfmt" | |||
636 | 603 | ||
637 | endmenu | 604 | endmenu |
638 | 605 | ||
606 | menu "Power management options (EXPERIMENTAL)" | ||
607 | depends on EXPERIMENTAL | ||
608 | |||
609 | source kernel/power/Kconfig | ||
610 | |||
611 | config APM | ||
612 | bool "Advanced Power Management Emulation" | ||
613 | depends on PM | ||
614 | endmenu | ||
615 | |||
639 | source "net/Kconfig" | 616 | source "net/Kconfig" |
640 | 617 | ||
641 | source "drivers/Kconfig" | 618 | source "drivers/Kconfig" |
diff --git a/arch/sh/Kconfig.debug b/arch/sh/Kconfig.debug index 8fb31ab2c02c..48479e014dac 100644 --- a/arch/sh/Kconfig.debug +++ b/arch/sh/Kconfig.debug | |||
@@ -30,8 +30,35 @@ config EARLY_PRINTK | |||
30 | when the kernel may crash or hang before the serial console is | 30 | when the kernel may crash or hang before the serial console is |
31 | initialised. If unsure, say N. | 31 | initialised. If unsure, say N. |
32 | 32 | ||
33 | config DEBUG_STACKOVERFLOW | ||
34 | bool "Check for stack overflows" | ||
35 | depends on DEBUG_KERNEL | ||
36 | help | ||
37 | This option will cause messages to be printed if free stack space | ||
38 | drops below a certain limit. | ||
39 | |||
40 | config DEBUG_STACK_USAGE | ||
41 | bool "Stack utilization instrumentation" | ||
42 | depends on DEBUG_KERNEL | ||
43 | help | ||
44 | Enables the display of the minimum amount of free stack which each | ||
45 | task has ever had available in the sysrq-T and sysrq-P debug output. | ||
46 | |||
47 | This option will slow down process creation somewhat. | ||
48 | |||
49 | config 4KSTACKS | ||
50 | bool "Use 4Kb for kernel stacks instead of 8Kb" | ||
51 | depends on DEBUG_KERNEL | ||
52 | help | ||
53 | If you say Y here the kernel will use a 4Kb stacksize for the | ||
54 | kernel stack attached to each process/thread. This facilitates | ||
55 | running more threads on a system and also reduces the pressure | ||
56 | on the VM subsystem for higher order allocations. This option | ||
57 | will also use IRQ stacks to compensate for the reduced stackspace. | ||
58 | |||
33 | config KGDB | 59 | config KGDB |
34 | bool "Include KGDB kernel debugger" | 60 | bool "Include KGDB kernel debugger" |
61 | select FRAME_POINTER | ||
35 | help | 62 | help |
36 | Include in-kernel hooks for kgdb, the Linux kernel source level | 63 | Include in-kernel hooks for kgdb, the Linux kernel source level |
37 | debugger. See <http://kgdb.sourceforge.net/> for more information. | 64 | debugger. See <http://kgdb.sourceforge.net/> for more information. |
@@ -112,13 +139,4 @@ endchoice | |||
112 | 139 | ||
113 | endmenu | 140 | endmenu |
114 | 141 | ||
115 | config FRAME_POINTER | ||
116 | bool "Compile the kernel with frame pointers" | ||
117 | default y if KGDB | ||
118 | help | ||
119 | If you say Y here the resulting kernel image will be slightly larger | ||
120 | and slower, but it will give very useful debugging information. | ||
121 | If you don't debug the kernel, you can say N, but we may not be able | ||
122 | to solve problems without frame pointers. | ||
123 | |||
124 | endmenu | 142 | endmenu |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index e467a450662b..26d62ff51a64 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -18,11 +18,13 @@ cflags-y := -mb | |||
18 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) := -ml | 18 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) := -ml |
19 | 19 | ||
20 | isa-y := any | 20 | isa-y := any |
21 | isa-$(CONFIG_SH_DSP) := sh | ||
21 | isa-$(CONFIG_CPU_SH2) := sh2 | 22 | isa-$(CONFIG_CPU_SH2) := sh2 |
23 | isa-$(CONFIG_CPU_SH2A) := sh2a | ||
22 | isa-$(CONFIG_CPU_SH3) := sh3 | 24 | isa-$(CONFIG_CPU_SH3) := sh3 |
23 | isa-$(CONFIG_CPU_SH4) := sh4 | 25 | isa-$(CONFIG_CPU_SH4) := sh4 |
24 | isa-$(CONFIG_CPU_SH4A) := sh4a | 26 | isa-$(CONFIG_CPU_SH4A) := sh4a |
25 | isa-$(CONFIG_CPU_SH2A) := sh2a | 27 | isa-$(CONFIG_CPU_SH4AL_DSP) := sh4al |
26 | 28 | ||
27 | isa-$(CONFIG_SH_DSP) := $(isa-y)-dsp | 29 | isa-$(CONFIG_SH_DSP) := $(isa-y)-dsp |
28 | 30 | ||
@@ -30,9 +32,11 @@ ifndef CONFIG_MMU | |||
30 | isa-y := $(isa-y)-nommu | 32 | isa-y := $(isa-y)-nommu |
31 | endif | 33 | endif |
32 | 34 | ||
35 | ifndef CONFIG_SH_DSP | ||
33 | ifndef CONFIG_SH_FPU | 36 | ifndef CONFIG_SH_FPU |
34 | isa-y := $(isa-y)-nofpu | 37 | isa-y := $(isa-y)-nofpu |
35 | endif | 38 | endif |
39 | endif | ||
36 | 40 | ||
37 | cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),) | 41 | cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),) |
38 | 42 | ||
@@ -79,24 +83,19 @@ head-y := arch/sh/kernel/head.o arch/sh/kernel/init_task.o | |||
79 | LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) | 83 | LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) |
80 | 84 | ||
81 | core-y += arch/sh/kernel/ arch/sh/mm/ | 85 | core-y += arch/sh/kernel/ arch/sh/mm/ |
86 | core-$(CONFIG_SH_FPU_EMU) += arch/sh/math-emu/ | ||
82 | 87 | ||
83 | # Boards | 88 | # Boards |
84 | machdir-$(CONFIG_SH_SOLUTION_ENGINE) := se/770x | 89 | machdir-$(CONFIG_SH_SOLUTION_ENGINE) := se/770x |
85 | machdir-$(CONFIG_SH_7751_SOLUTION_ENGINE) := se/7751 | 90 | machdir-$(CONFIG_SH_7751_SOLUTION_ENGINE) := se/7751 |
86 | machdir-$(CONFIG_SH_7300_SOLUTION_ENGINE) := se/7300 | 91 | machdir-$(CONFIG_SH_7300_SOLUTION_ENGINE) := se/7300 |
92 | machdir-$(CONFIG_SH_7343_SOLUTION_ENGINE) := se/7343 | ||
87 | machdir-$(CONFIG_SH_73180_SOLUTION_ENGINE) := se/73180 | 93 | machdir-$(CONFIG_SH_73180_SOLUTION_ENGINE) := se/73180 |
88 | machdir-$(CONFIG_SH_STB1_HARP) := harp | ||
89 | machdir-$(CONFIG_SH_STB1_OVERDRIVE) := overdrive | ||
90 | machdir-$(CONFIG_SH_HP6XX) := hp6xx | 94 | machdir-$(CONFIG_SH_HP6XX) := hp6xx |
91 | machdir-$(CONFIG_SH_CQREEK) := cqreek | ||
92 | machdir-$(CONFIG_SH_DMIDA) := dmida | ||
93 | machdir-$(CONFIG_SH_EC3104) := ec3104 | 95 | machdir-$(CONFIG_SH_EC3104) := ec3104 |
94 | machdir-$(CONFIG_SH_SATURN) := saturn | 96 | machdir-$(CONFIG_SH_SATURN) := saturn |
95 | machdir-$(CONFIG_SH_DREAMCAST) := dreamcast | 97 | machdir-$(CONFIG_SH_DREAMCAST) := dreamcast |
96 | machdir-$(CONFIG_SH_CAT68701) := cat68701 | ||
97 | machdir-$(CONFIG_SH_BIGSUR) := bigsur | 98 | machdir-$(CONFIG_SH_BIGSUR) := bigsur |
98 | machdir-$(CONFIG_SH_SH2000) := sh2000 | ||
99 | machdir-$(CONFIG_SH_ADX) := adx | ||
100 | machdir-$(CONFIG_SH_MPC1211) := mpc1211 | 99 | machdir-$(CONFIG_SH_MPC1211) := mpc1211 |
101 | machdir-$(CONFIG_SH_SH03) := sh03 | 100 | machdir-$(CONFIG_SH_SH03) := sh03 |
102 | machdir-$(CONFIG_SH_SECUREEDGE5410) := snapgear | 101 | machdir-$(CONFIG_SH_SECUREEDGE5410) := snapgear |
@@ -104,16 +103,16 @@ machdir-$(CONFIG_SH_HS7751RVOIP) := renesas/hs7751rvoip | |||
104 | machdir-$(CONFIG_SH_RTS7751R2D) := renesas/rts7751r2d | 103 | machdir-$(CONFIG_SH_RTS7751R2D) := renesas/rts7751r2d |
105 | machdir-$(CONFIG_SH_7751_SYSTEMH) := renesas/systemh | 104 | machdir-$(CONFIG_SH_7751_SYSTEMH) := renesas/systemh |
106 | machdir-$(CONFIG_SH_EDOSK7705) := renesas/edosk7705 | 105 | machdir-$(CONFIG_SH_EDOSK7705) := renesas/edosk7705 |
106 | machdir-$(CONFIG_SH_R7780RP) := renesas/r7780rp | ||
107 | machdir-$(CONFIG_SH_7710VOIPGW) := renesas/sh7710voipgw | ||
107 | machdir-$(CONFIG_SH_SH4202_MICRODEV) := superh/microdev | 108 | machdir-$(CONFIG_SH_SH4202_MICRODEV) := superh/microdev |
109 | machdir-$(CONFIG_SH_LANDISK) := landisk | ||
110 | machdir-$(CONFIG_SH_TITAN) := titan | ||
111 | machdir-$(CONFIG_SH_SHMIN) := shmin | ||
108 | machdir-$(CONFIG_SH_UNKNOWN) := unknown | 112 | machdir-$(CONFIG_SH_UNKNOWN) := unknown |
109 | 113 | ||
110 | incdir-y := $(notdir $(machdir-y)) | 114 | incdir-y := $(notdir $(machdir-y)) |
111 | 115 | incdir-$(CONFIG_SH_HP6XX) := hp6xx | |
112 | incdir-$(CONFIG_SH_SOLUTION_ENGINE) := se | ||
113 | incdir-$(CONFIG_SH_7751_SOLUTION_ENGINE) := se7751 | ||
114 | incdir-$(CONFIG_SH_7300_SOLUTION_ENGINE) := se7300 | ||
115 | incdir-$(CONFIG_SH_73180_SOLUTION_ENGINE) := se73180 | ||
116 | incdir-$(CONFIG_SH_HP600) := hp6xx | ||
117 | 116 | ||
118 | ifneq ($(machdir-y),) | 117 | ifneq ($(machdir-y),) |
119 | core-y += arch/sh/boards/$(machdir-y)/ | 118 | core-y += arch/sh/boards/$(machdir-y)/ |
@@ -137,17 +136,14 @@ boot := arch/sh/boot | |||
137 | 136 | ||
138 | CPPFLAGS_vmlinux.lds := -traditional | 137 | CPPFLAGS_vmlinux.lds := -traditional |
139 | 138 | ||
140 | ifneq ($(KBUILD_SRC),) | ||
141 | incdir-prefix := $(srctree)/include/asm-sh/ | 139 | incdir-prefix := $(srctree)/include/asm-sh/ |
142 | else | ||
143 | incdir-prefix := | ||
144 | endif | ||
145 | 140 | ||
146 | # Update machine arch and proc symlinks if something which affects | 141 | # Update machine arch and proc symlinks if something which affects |
147 | # them changed. We use .arch and .mach to indicate when they were | 142 | # them changed. We use .arch and .mach to indicate when they were |
148 | # updated last, otherwise make uses the target directory mtime. | 143 | # updated last, otherwise make uses the target directory mtime. |
149 | 144 | ||
150 | include/asm-sh/.cpu: $(wildcard include/config/cpu/*.h) include/config/auto.conf | 145 | include/asm-sh/.cpu: $(wildcard include/config/cpu/*.h) \ |
146 | include/config/auto.conf FORCE | ||
151 | @echo ' SYMLINK include/asm-sh/cpu -> include/asm-sh/$(cpuincdir-y)' | 147 | @echo ' SYMLINK include/asm-sh/cpu -> include/asm-sh/$(cpuincdir-y)' |
152 | $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi | 148 | $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi |
153 | $(Q)ln -fsn $(incdir-prefix)$(cpuincdir-y) include/asm-sh/cpu | 149 | $(Q)ln -fsn $(incdir-prefix)$(cpuincdir-y) include/asm-sh/cpu |
@@ -157,7 +153,8 @@ include/asm-sh/.cpu: $(wildcard include/config/cpu/*.h) include/config/auto.conf | |||
157 | # don't, just reference the parent directory so the semantics are | 153 | # don't, just reference the parent directory so the semantics are |
158 | # kept roughly the same. | 154 | # kept roughly the same. |
159 | 155 | ||
160 | include/asm-sh/.mach: $(wildcard include/config/sh/*.h) include/config/auto.conf | 156 | include/asm-sh/.mach: $(wildcard include/config/sh/*.h) \ |
157 | include/config/auto.conf FORCE | ||
161 | @echo -n ' SYMLINK include/asm-sh/mach -> ' | 158 | @echo -n ' SYMLINK include/asm-sh/mach -> ' |
162 | $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi | 159 | $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi |
163 | $(Q)if [ -d $(incdir-prefix)$(incdir-y) ]; then \ | 160 | $(Q)if [ -d $(incdir-prefix)$(incdir-y) ]; then \ |
@@ -170,7 +167,7 @@ include/asm-sh/.mach: $(wildcard include/config/sh/*.h) include/config/auto.conf | |||
170 | fi | 167 | fi |
171 | @touch $@ | 168 | @touch $@ |
172 | 169 | ||
173 | archprepare: maketools include/asm-sh/.cpu include/asm-sh/.mach | 170 | archprepare: include/asm-sh/.cpu include/asm-sh/.mach maketools |
174 | 171 | ||
175 | PHONY += maketools FORCE | 172 | PHONY += maketools FORCE |
176 | maketools: include/linux/version.h FORCE | 173 | maketools: include/linux/version.h FORCE |
@@ -191,4 +188,3 @@ CLEAN_FILES += include/asm-sh/machtypes.h | |||
191 | define archhelp | 188 | define archhelp |
192 | @echo ' zImage - Compressed kernel image (arch/sh/boot/zImage)' | 189 | @echo ' zImage - Compressed kernel image (arch/sh/boot/zImage)' |
193 | endef | 190 | endef |
194 | |||
diff --git a/arch/sh/boards/adx/Makefile b/arch/sh/boards/adx/Makefile deleted file mode 100644 index 5b1c531b3991..000000000000 --- a/arch/sh/boards/adx/Makefile +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for ADX boards | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o irq.o irq_maskreq.o | ||
6 | |||
diff --git a/arch/sh/boards/adx/irq.c b/arch/sh/boards/adx/irq.c deleted file mode 100644 index c6ca409dff98..000000000000 --- a/arch/sh/boards/adx/irq.c +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/boards/adx/irq.c | ||
3 | * | ||
4 | * Copyright (C) 2001 A&D Co., Ltd. | ||
5 | * | ||
6 | * I/O routine and setup routines for A&D ADX Board | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #include <asm/irq.h> | ||
15 | |||
16 | void init_adx_IRQ(void) | ||
17 | { | ||
18 | int i; | ||
19 | |||
20 | /* printk("init_adx_IRQ()\n");*/ | ||
21 | /* setup irq_mask_register */ | ||
22 | irq_mask_register = (unsigned short *)0xa6000008; | ||
23 | |||
24 | /* cover all external interrupt area by maskreg_irq_type | ||
25 | * (Actually, irq15 doesn't exist) | ||
26 | */ | ||
27 | for (i = 0; i < 16; i++) { | ||
28 | make_maskreg_irq(i); | ||
29 | disable_irq(i); | ||
30 | } | ||
31 | } | ||
diff --git a/arch/sh/boards/adx/setup.c b/arch/sh/boards/adx/setup.c deleted file mode 100644 index 4938d9592343..000000000000 --- a/arch/sh/boards/adx/setup.c +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/board/adx/setup.c | ||
3 | * | ||
4 | * Copyright (C) 2001 A&D Co., Ltd. | ||
5 | * | ||
6 | * I/O routine and setup routines for A&D ADX Board | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #include <asm/machvec.h> | ||
15 | #include <linux/module.h> | ||
16 | |||
17 | extern void init_adx_IRQ(void); | ||
18 | extern void *cf_io_base; | ||
19 | |||
20 | const char *get_system_type(void) | ||
21 | { | ||
22 | return "A&D ADX"; | ||
23 | } | ||
24 | |||
25 | unsigned long adx_isa_port2addr(unsigned long offset) | ||
26 | { | ||
27 | /* CompactFlash (IDE) */ | ||
28 | if (((offset >= 0x1f0) && (offset <= 0x1f7)) || (offset == 0x3f6)) { | ||
29 | return (unsigned long)cf_io_base + offset; | ||
30 | } | ||
31 | |||
32 | /* eth0 */ | ||
33 | if ((offset >= 0x300) && (offset <= 0x30f)) { | ||
34 | return 0xa5000000 + offset; /* COMM BOARD (AREA1) */ | ||
35 | } | ||
36 | |||
37 | return offset + 0xb0000000; /* IOBUS (AREA 4)*/ | ||
38 | } | ||
39 | |||
40 | /* | ||
41 | * The Machine Vector | ||
42 | */ | ||
43 | |||
44 | struct sh_machine_vector mv_adx __initmv = { | ||
45 | .mv_nr_irqs = 48, | ||
46 | .mv_isa_port2addr = adx_isa_port2addr, | ||
47 | .mv_init_irq = init_adx_IRQ, | ||
48 | }; | ||
49 | ALIAS_MV(adx) | ||
50 | |||
51 | int __init platform_setup(void) | ||
52 | { | ||
53 | /* Nothing to see here .. */ | ||
54 | return 0; | ||
55 | } | ||
56 | |||
diff --git a/arch/sh/boards/bigsur/irq.c b/arch/sh/boards/bigsur/irq.c index ac946a2201c7..1ab04da36382 100644 --- a/arch/sh/boards/bigsur/irq.c +++ b/arch/sh/boards/bigsur/irq.c | |||
@@ -19,6 +19,7 @@ | |||
19 | * IRQ functions for a Hitachi Big Sur Evaluation Board. | 19 | * IRQ functions for a Hitachi Big Sur Evaluation Board. |
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | #undef DEBUG | ||
22 | 23 | ||
23 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
@@ -41,10 +42,8 @@ | |||
41 | #undef BIGSUR_DEBUG | 42 | #undef BIGSUR_DEBUG |
42 | 43 | ||
43 | #ifdef BIGSUR_DEBUG | 44 | #ifdef BIGSUR_DEBUG |
44 | #define DPRINTK(args...) printk(args) | ||
45 | #define DIPRINTK(n, args...) if (BIGSUR_DEBUG>(n)) printk(args) | 45 | #define DIPRINTK(n, args...) if (BIGSUR_DEBUG>(n)) printk(args) |
46 | #else | 46 | #else |
47 | #define DPRINTK(args...) | ||
48 | #define DIPRINTK(n, args...) | 47 | #define DIPRINTK(n, args...) |
49 | #endif /* BIGSUR_DEBUG */ | 48 | #endif /* BIGSUR_DEBUG */ |
50 | 49 | ||
@@ -60,45 +59,39 @@ extern int hd64465_irq_demux(int irq); | |||
60 | /* Level 1 IRQ routines */ | 59 | /* Level 1 IRQ routines */ |
61 | static void disable_bigsur_l1irq(unsigned int irq) | 60 | static void disable_bigsur_l1irq(unsigned int irq) |
62 | { | 61 | { |
63 | unsigned long flags; | ||
64 | unsigned char mask; | 62 | unsigned char mask; |
65 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; | 63 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; |
66 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); | 64 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); |
67 | 65 | ||
68 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { | 66 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { |
69 | DPRINTK("Disable L1 IRQ %d\n", irq); | 67 | pr_debug("Disable L1 IRQ %d\n", irq); |
70 | DIPRINTK(2,"disable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", | 68 | DIPRINTK(2,"disable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", |
71 | mask_port, bit); | 69 | mask_port, bit); |
72 | local_irq_save(flags); | ||
73 | 70 | ||
74 | /* Disable IRQ - set mask bit */ | 71 | /* Disable IRQ - set mask bit */ |
75 | mask = inb(mask_port) | bit; | 72 | mask = inb(mask_port) | bit; |
76 | outb(mask, mask_port); | 73 | outb(mask, mask_port); |
77 | local_irq_restore(flags); | ||
78 | return; | 74 | return; |
79 | } | 75 | } |
80 | DPRINTK("disable_bigsur_l1irq: Invalid IRQ %d\n", irq); | 76 | pr_debug("disable_bigsur_l1irq: Invalid IRQ %d\n", irq); |
81 | } | 77 | } |
82 | 78 | ||
83 | static void enable_bigsur_l1irq(unsigned int irq) | 79 | static void enable_bigsur_l1irq(unsigned int irq) |
84 | { | 80 | { |
85 | unsigned long flags; | ||
86 | unsigned char mask; | 81 | unsigned char mask; |
87 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; | 82 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; |
88 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); | 83 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); |
89 | 84 | ||
90 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { | 85 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { |
91 | DPRINTK("Enable L1 IRQ %d\n", irq); | 86 | pr_debug("Enable L1 IRQ %d\n", irq); |
92 | DIPRINTK(2,"enable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", | 87 | DIPRINTK(2,"enable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", |
93 | mask_port, bit); | 88 | mask_port, bit); |
94 | local_irq_save(flags); | ||
95 | /* Enable L1 IRQ - clear mask bit */ | 89 | /* Enable L1 IRQ - clear mask bit */ |
96 | mask = inb(mask_port) & ~bit; | 90 | mask = inb(mask_port) & ~bit; |
97 | outb(mask, mask_port); | 91 | outb(mask, mask_port); |
98 | local_irq_restore(flags); | ||
99 | return; | 92 | return; |
100 | } | 93 | } |
101 | DPRINTK("enable_bigsur_l1irq: Invalid IRQ %d\n", irq); | 94 | pr_debug("enable_bigsur_l1irq: Invalid IRQ %d\n", irq); |
102 | } | 95 | } |
103 | 96 | ||
104 | 97 | ||
@@ -126,51 +119,45 @@ static const u32 imr_offset = BIGSUR_IMR0 - BIGSUR_IMR1; | |||
126 | /* Level 2 IRQ routines */ | 119 | /* Level 2 IRQ routines */ |
127 | static void disable_bigsur_l2irq(unsigned int irq) | 120 | static void disable_bigsur_l2irq(unsigned int irq) |
128 | { | 121 | { |
129 | unsigned long flags; | ||
130 | unsigned char mask; | 122 | unsigned char mask; |
131 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); | 123 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); |
132 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; | 124 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; |
133 | 125 | ||
134 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { | 126 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { |
135 | DPRINTK("Disable L2 IRQ %d\n", irq); | 127 | pr_debug("Disable L2 IRQ %d\n", irq); |
136 | DIPRINTK(2,"disable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", | 128 | DIPRINTK(2,"disable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", |
137 | mask_port, bit); | 129 | mask_port, bit); |
138 | local_irq_save(flags); | ||
139 | 130 | ||
140 | /* Disable L2 IRQ - set mask bit */ | 131 | /* Disable L2 IRQ - set mask bit */ |
141 | mask = inb(mask_port) | bit; | 132 | mask = inb(mask_port) | bit; |
142 | outb(mask, mask_port); | 133 | outb(mask, mask_port); |
143 | local_irq_restore(flags); | ||
144 | return; | 134 | return; |
145 | } | 135 | } |
146 | DPRINTK("disable_bigsur_l2irq: Invalid IRQ %d\n", irq); | 136 | pr_debug("disable_bigsur_l2irq: Invalid IRQ %d\n", irq); |
147 | } | 137 | } |
148 | 138 | ||
149 | static void enable_bigsur_l2irq(unsigned int irq) | 139 | static void enable_bigsur_l2irq(unsigned int irq) |
150 | { | 140 | { |
151 | unsigned long flags; | ||
152 | unsigned char mask; | 141 | unsigned char mask; |
153 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); | 142 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); |
154 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; | 143 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; |
155 | 144 | ||
156 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { | 145 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { |
157 | DPRINTK("Enable L2 IRQ %d\n", irq); | 146 | pr_debug("Enable L2 IRQ %d\n", irq); |
158 | DIPRINTK(2,"enable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", | 147 | DIPRINTK(2,"enable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", |
159 | mask_port, bit); | 148 | mask_port, bit); |
160 | local_irq_save(flags); | ||
161 | 149 | ||
162 | /* Enable L2 IRQ - clear mask bit */ | 150 | /* Enable L2 IRQ - clear mask bit */ |
163 | mask = inb(mask_port) & ~bit; | 151 | mask = inb(mask_port) & ~bit; |
164 | outb(mask, mask_port); | 152 | outb(mask, mask_port); |
165 | local_irq_restore(flags); | ||
166 | return; | 153 | return; |
167 | } | 154 | } |
168 | DPRINTK("enable_bigsur_l2irq: Invalid IRQ %d\n", irq); | 155 | pr_debug("enable_bigsur_l2irq: Invalid IRQ %d\n", irq); |
169 | } | 156 | } |
170 | 157 | ||
171 | static void mask_and_ack_bigsur(unsigned int irq) | 158 | static void mask_and_ack_bigsur(unsigned int irq) |
172 | { | 159 | { |
173 | DPRINTK("mask_and_ack_bigsur IRQ %d\n", irq); | 160 | pr_debug("mask_and_ack_bigsur IRQ %d\n", irq); |
174 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) | 161 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) |
175 | disable_bigsur_l1irq(irq); | 162 | disable_bigsur_l1irq(irq); |
176 | else | 163 | else |
@@ -179,7 +166,7 @@ static void mask_and_ack_bigsur(unsigned int irq) | |||
179 | 166 | ||
180 | static void end_bigsur_irq(unsigned int irq) | 167 | static void end_bigsur_irq(unsigned int irq) |
181 | { | 168 | { |
182 | DPRINTK("end_bigsur_irq IRQ %d\n", irq); | 169 | pr_debug("end_bigsur_irq IRQ %d\n", irq); |
183 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) { | 170 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) { |
184 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) | 171 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) |
185 | enable_bigsur_l1irq(irq); | 172 | enable_bigsur_l1irq(irq); |
@@ -193,7 +180,7 @@ static unsigned int startup_bigsur_irq(unsigned int irq) | |||
193 | u8 mask; | 180 | u8 mask; |
194 | u32 reg; | 181 | u32 reg; |
195 | 182 | ||
196 | DPRINTK("startup_bigsur_irq IRQ %d\n", irq); | 183 | pr_debug("startup_bigsur_irq IRQ %d\n", irq); |
197 | 184 | ||
198 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { | 185 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { |
199 | /* Enable the L1 IRQ */ | 186 | /* Enable the L1 IRQ */ |
@@ -218,7 +205,7 @@ static unsigned int startup_bigsur_irq(unsigned int irq) | |||
218 | 205 | ||
219 | static void shutdown_bigsur_irq(unsigned int irq) | 206 | static void shutdown_bigsur_irq(unsigned int irq) |
220 | { | 207 | { |
221 | DPRINTK("shutdown_bigsur_irq IRQ %d\n", irq); | 208 | pr_debug("shutdown_bigsur_irq IRQ %d\n", irq); |
222 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) | 209 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) |
223 | disable_bigsur_l1irq(irq); | 210 | disable_bigsur_l1irq(irq); |
224 | else | 211 | else |
@@ -260,7 +247,7 @@ static void make_bigsur_l1isr(unsigned int irq) { | |||
260 | disable_bigsur_l1irq(irq); | 247 | disable_bigsur_l1irq(irq); |
261 | return; | 248 | return; |
262 | } | 249 | } |
263 | DPRINTK("make_bigsur_l1isr: bad irq, %d\n", irq); | 250 | pr_debug("make_bigsur_l1isr: bad irq, %d\n", irq); |
264 | return; | 251 | return; |
265 | } | 252 | } |
266 | 253 | ||
@@ -277,7 +264,7 @@ static void make_bigsur_l2isr(unsigned int irq) { | |||
277 | disable_bigsur_l2irq(irq); | 264 | disable_bigsur_l2irq(irq); |
278 | return; | 265 | return; |
279 | } | 266 | } |
280 | DPRINTK("make_bigsur_l2isr: bad irq, %d\n", irq); | 267 | pr_debug("make_bigsur_l2isr: bad irq, %d\n", irq); |
281 | return; | 268 | return; |
282 | } | 269 | } |
283 | 270 | ||
diff --git a/arch/sh/boards/bigsur/setup.c b/arch/sh/boards/bigsur/setup.c index dfeede9da50f..9711c20fc9e4 100644 --- a/arch/sh/boards/bigsur/setup.c +++ b/arch/sh/boards/bigsur/setup.c | |||
@@ -41,31 +41,7 @@ | |||
41 | // Big Sur Init Routines | 41 | // Big Sur Init Routines |
42 | /*===========================================================*/ | 42 | /*===========================================================*/ |
43 | 43 | ||
44 | const char *get_system_type(void) | 44 | static void __init bigsur_setup(char **cmdline_p) |
45 | { | ||
46 | return "Big Sur"; | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | * The Machine Vector | ||
51 | */ | ||
52 | extern void heartbeat_bigsur(void); | ||
53 | extern void init_bigsur_IRQ(void); | ||
54 | |||
55 | struct sh_machine_vector mv_bigsur __initmv = { | ||
56 | .mv_nr_irqs = NR_IRQS, // Defined in <asm/irq.h> | ||
57 | |||
58 | .mv_isa_port2addr = bigsur_isa_port2addr, | ||
59 | .mv_irq_demux = bigsur_irq_demux, | ||
60 | |||
61 | .mv_init_irq = init_bigsur_IRQ, | ||
62 | #ifdef CONFIG_HEARTBEAT | ||
63 | .mv_heartbeat = heartbeat_bigsur, | ||
64 | #endif | ||
65 | }; | ||
66 | ALIAS_MV(bigsur) | ||
67 | |||
68 | int __init platform_setup(void) | ||
69 | { | 45 | { |
70 | /* Mask all 2nd level IRQ's */ | 46 | /* Mask all 2nd level IRQ's */ |
71 | outb(-1,BIGSUR_IMR0); | 47 | outb(-1,BIGSUR_IMR0); |
@@ -89,7 +65,24 @@ int __init platform_setup(void) | |||
89 | outw(1, BIGSUR_ETHR+0xe); | 65 | outw(1, BIGSUR_ETHR+0xe); |
90 | /* set the IO port to BIGSUR_ETHER_IOPORT */ | 66 | /* set the IO port to BIGSUR_ETHER_IOPORT */ |
91 | outw(BIGSUR_ETHER_IOPORT<<3, BIGSUR_ETHR+0x2); | 67 | outw(BIGSUR_ETHER_IOPORT<<3, BIGSUR_ETHR+0x2); |
92 | |||
93 | return 0; | ||
94 | } | 68 | } |
95 | 69 | ||
70 | /* | ||
71 | * The Machine Vector | ||
72 | */ | ||
73 | extern void heartbeat_bigsur(void); | ||
74 | extern void init_bigsur_IRQ(void); | ||
75 | |||
76 | struct sh_machine_vector mv_bigsur __initmv = { | ||
77 | .mv_name = "Big Sur", | ||
78 | .mv_setup = bigsur_setup, | ||
79 | |||
80 | .mv_isa_port2addr = bigsur_isa_port2addr, | ||
81 | .mv_irq_demux = bigsur_irq_demux, | ||
82 | |||
83 | .mv_init_irq = init_bigsur_IRQ, | ||
84 | #ifdef CONFIG_HEARTBEAT | ||
85 | .mv_heartbeat = heartbeat_bigsur, | ||
86 | #endif | ||
87 | }; | ||
88 | ALIAS_MV(bigsur) | ||
diff --git a/arch/sh/boards/cat68701/Makefile b/arch/sh/boards/cat68701/Makefile deleted file mode 100644 index 52c1de0a6dfd..000000000000 --- a/arch/sh/boards/cat68701/Makefile +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the CAT-68701 specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o irq.o | ||
6 | |||
diff --git a/arch/sh/boards/cat68701/irq.c b/arch/sh/boards/cat68701/irq.c deleted file mode 100644 index f9a6d185fb8b..000000000000 --- a/arch/sh/boards/cat68701/irq.c +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/boards/cat68701/irq.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Niibe Yutaka | ||
5 | * 2001 Yutaro Ebihara | ||
6 | * | ||
7 | * Setup routines for A-ONE Corp CAT-68701 SH7708 Board | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <asm/irq.h> | ||
16 | |||
17 | int cat68701_irq_demux(int irq) | ||
18 | { | ||
19 | if(irq==13) return 14; | ||
20 | if(irq==7) return 10; | ||
21 | return irq; | ||
22 | } | ||
23 | |||
24 | void init_cat68701_IRQ() | ||
25 | { | ||
26 | make_imask_irq(10); | ||
27 | make_imask_irq(14); | ||
28 | } | ||
diff --git a/arch/sh/boards/cat68701/setup.c b/arch/sh/boards/cat68701/setup.c deleted file mode 100644 index 90e5175df227..000000000000 --- a/arch/sh/boards/cat68701/setup.c +++ /dev/null | |||
@@ -1,85 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/boards/cat68701/setup.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Niibe Yutaka | ||
5 | * 2001 Yutaro Ebihara | ||
6 | * | ||
7 | * Setup routines for A-ONE Corp CAT-68701 SH7708 Board | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <asm/io.h> | ||
16 | #include <asm/machvec.h> | ||
17 | #include <asm/mach/io.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/sched.h> | ||
21 | |||
22 | const char *get_system_type(void) | ||
23 | { | ||
24 | return "CAT-68701"; | ||
25 | } | ||
26 | |||
27 | #ifdef CONFIG_HEARTBEAT | ||
28 | void heartbeat_cat68701() | ||
29 | { | ||
30 | static unsigned int cnt = 0, period = 0 , bit = 0; | ||
31 | cnt += 1; | ||
32 | if (cnt < period) { | ||
33 | return; | ||
34 | } | ||
35 | cnt = 0; | ||
36 | |||
37 | /* Go through the points (roughly!): | ||
38 | * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110 | ||
39 | */ | ||
40 | period = 110 - ( (300<<FSHIFT)/ | ||
41 | ((avenrun[0]/5) + (3<<FSHIFT)) ); | ||
42 | |||
43 | if(bit){ bit=0; }else{ bit=1; } | ||
44 | outw(bit<<15,0x3fe); | ||
45 | } | ||
46 | #endif /* CONFIG_HEARTBEAT */ | ||
47 | |||
48 | unsigned long cat68701_isa_port2addr(unsigned long offset) | ||
49 | { | ||
50 | /* CompactFlash (IDE) */ | ||
51 | if (((offset >= 0x1f0) && (offset <= 0x1f7)) || (offset==0x3f6)) | ||
52 | return 0xba000000 + offset; | ||
53 | |||
54 | /* INPUT PORT */ | ||
55 | if ((offset >= 0x3fc) && (offset <= 0x3fd)) | ||
56 | return 0xb4007000 + offset; | ||
57 | |||
58 | /* OUTPUT PORT */ | ||
59 | if ((offset >= 0x3fe) && (offset <= 0x3ff)) | ||
60 | return 0xb4007400 + offset; | ||
61 | |||
62 | return offset + 0xb4000000; /* other I/O (EREA 5)*/ | ||
63 | } | ||
64 | |||
65 | /* | ||
66 | * The Machine Vector | ||
67 | */ | ||
68 | |||
69 | struct sh_machine_vector mv_cat68701 __initmv = { | ||
70 | .mv_nr_irqs = 32, | ||
71 | .mv_isa_port2addr = cat68701_isa_port2addr, | ||
72 | .mv_irq_demux = cat68701_irq_demux, | ||
73 | |||
74 | .mv_init_irq = init_cat68701_IRQ, | ||
75 | #ifdef CONFIG_HEARTBEAT | ||
76 | .mv_heartbeat = heartbeat_cat68701, | ||
77 | #endif | ||
78 | }; | ||
79 | ALIAS_MV(cat68701) | ||
80 | |||
81 | int __init platform_setup(void) | ||
82 | { | ||
83 | /* dummy read erea5 (CS8900A) */ | ||
84 | } | ||
85 | |||
diff --git a/arch/sh/boards/cqreek/Makefile b/arch/sh/boards/cqreek/Makefile deleted file mode 100644 index 1a788a85eba3..000000000000 --- a/arch/sh/boards/cqreek/Makefile +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the CqREEK specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o irq.o | ||
6 | |||
diff --git a/arch/sh/boards/cqreek/irq.c b/arch/sh/boards/cqreek/irq.c deleted file mode 100644 index 2955adc52310..000000000000 --- a/arch/sh/boards/cqreek/irq.c +++ /dev/null | |||
@@ -1,128 +0,0 @@ | |||
1 | /* $Id: irq.c,v 1.1.2.4 2002/11/04 20:33:56 lethal Exp $ | ||
2 | * | ||
3 | * arch/sh/boards/cqreek/irq.c | ||
4 | * | ||
5 | * Copyright (C) 2000 Niibe Yutaka | ||
6 | * | ||
7 | * CqREEK IDE/ISA Bridge Support. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/irq.h> | ||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/cqreek/cqreek.h> | ||
15 | #include <asm/io.h> | ||
16 | #include <asm/io_generic.h> | ||
17 | #include <asm/irq.h> | ||
18 | #include <asm/machvec.h> | ||
19 | #include <asm/machvec_init.h> | ||
20 | #include <asm/rtc.h> | ||
21 | |||
22 | struct cqreek_irq_data { | ||
23 | unsigned short mask_port; /* Port of Interrupt Mask Register */ | ||
24 | unsigned short stat_port; /* Port of Interrupt Status Register */ | ||
25 | unsigned short bit; /* Value of the bit */ | ||
26 | }; | ||
27 | static struct cqreek_irq_data cqreek_irq_data[NR_IRQS]; | ||
28 | |||
29 | static void disable_cqreek_irq(unsigned int irq) | ||
30 | { | ||
31 | unsigned long flags; | ||
32 | unsigned short mask; | ||
33 | unsigned short mask_port = cqreek_irq_data[irq].mask_port; | ||
34 | unsigned short bit = cqreek_irq_data[irq].bit; | ||
35 | |||
36 | local_irq_save(flags); | ||
37 | /* Disable IRQ */ | ||
38 | mask = inw(mask_port) & ~bit; | ||
39 | outw_p(mask, mask_port); | ||
40 | local_irq_restore(flags); | ||
41 | } | ||
42 | |||
43 | static void enable_cqreek_irq(unsigned int irq) | ||
44 | { | ||
45 | unsigned long flags; | ||
46 | unsigned short mask; | ||
47 | unsigned short mask_port = cqreek_irq_data[irq].mask_port; | ||
48 | unsigned short bit = cqreek_irq_data[irq].bit; | ||
49 | |||
50 | local_irq_save(flags); | ||
51 | /* Enable IRQ */ | ||
52 | mask = inw(mask_port) | bit; | ||
53 | outw_p(mask, mask_port); | ||
54 | local_irq_restore(flags); | ||
55 | } | ||
56 | |||
57 | static void mask_and_ack_cqreek(unsigned int irq) | ||
58 | { | ||
59 | unsigned short stat_port = cqreek_irq_data[irq].stat_port; | ||
60 | unsigned short bit = cqreek_irq_data[irq].bit; | ||
61 | |||
62 | disable_cqreek_irq(irq); | ||
63 | /* Clear IRQ (it might be edge IRQ) */ | ||
64 | inw(stat_port); | ||
65 | outw_p(bit, stat_port); | ||
66 | } | ||
67 | |||
68 | static void end_cqreek_irq(unsigned int irq) | ||
69 | { | ||
70 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
71 | enable_cqreek_irq(irq); | ||
72 | } | ||
73 | |||
74 | static unsigned int startup_cqreek_irq(unsigned int irq) | ||
75 | { | ||
76 | enable_cqreek_irq(irq); | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static void shutdown_cqreek_irq(unsigned int irq) | ||
81 | { | ||
82 | disable_cqreek_irq(irq); | ||
83 | } | ||
84 | |||
85 | static struct hw_interrupt_type cqreek_irq_type = { | ||
86 | .typename = "CqREEK-IRQ", | ||
87 | .startup = startup_cqreek_irq, | ||
88 | .shutdown = shutdown_cqreek_irq, | ||
89 | .enable = enable_cqreek_irq, | ||
90 | .disable = disable_cqreek_irq, | ||
91 | .ack = mask_and_ack_cqreek, | ||
92 | .end = end_cqreek_irq | ||
93 | }; | ||
94 | |||
95 | int cqreek_has_ide, cqreek_has_isa; | ||
96 | |||
97 | /* XXX: This is just for test for my NE2000 ISA board | ||
98 | What we really need is virtualized IRQ and demultiplexer like HP600 port */ | ||
99 | void __init init_cqreek_IRQ(void) | ||
100 | { | ||
101 | if (cqreek_has_ide) { | ||
102 | cqreek_irq_data[14].mask_port = BRIDGE_IDE_INTR_MASK; | ||
103 | cqreek_irq_data[14].stat_port = BRIDGE_IDE_INTR_STAT; | ||
104 | cqreek_irq_data[14].bit = 1; | ||
105 | |||
106 | irq_desc[14].chip = &cqreek_irq_type; | ||
107 | irq_desc[14].status = IRQ_DISABLED; | ||
108 | irq_desc[14].action = 0; | ||
109 | irq_desc[14].depth = 1; | ||
110 | |||
111 | disable_cqreek_irq(14); | ||
112 | } | ||
113 | |||
114 | if (cqreek_has_isa) { | ||
115 | cqreek_irq_data[10].mask_port = BRIDGE_ISA_INTR_MASK; | ||
116 | cqreek_irq_data[10].stat_port = BRIDGE_ISA_INTR_STAT; | ||
117 | cqreek_irq_data[10].bit = (1 << 10); | ||
118 | |||
119 | /* XXX: Err... we may need demultiplexer for ISA irq... */ | ||
120 | irq_desc[10].chip = &cqreek_irq_type; | ||
121 | irq_desc[10].status = IRQ_DISABLED; | ||
122 | irq_desc[10].action = 0; | ||
123 | irq_desc[10].depth = 1; | ||
124 | |||
125 | disable_cqreek_irq(10); | ||
126 | } | ||
127 | } | ||
128 | |||
diff --git a/arch/sh/boards/cqreek/setup.c b/arch/sh/boards/cqreek/setup.c deleted file mode 100644 index eff4ed93599f..000000000000 --- a/arch/sh/boards/cqreek/setup.c +++ /dev/null | |||
@@ -1,100 +0,0 @@ | |||
1 | /* $Id: setup.c,v 1.5 2003/08/04 01:51:58 lethal Exp $ | ||
2 | * | ||
3 | * arch/sh/kernel/setup_cqreek.c | ||
4 | * | ||
5 | * Copyright (C) 2000 Niibe Yutaka | ||
6 | * | ||
7 | * CqREEK IDE/ISA Bridge Support. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/irq.h> | ||
14 | |||
15 | #include <asm/mach/cqreek.h> | ||
16 | #include <asm/machvec.h> | ||
17 | #include <asm/io.h> | ||
18 | #include <asm/io_generic.h> | ||
19 | #include <asm/irq.h> | ||
20 | #include <asm/rtc.h> | ||
21 | |||
22 | #define IDE_OFFSET 0xA4000000UL | ||
23 | #define ISA_OFFSET 0xA4A00000UL | ||
24 | |||
25 | const char *get_system_type(void) | ||
26 | { | ||
27 | return "CqREEK"; | ||
28 | } | ||
29 | |||
30 | static unsigned long cqreek_port2addr(unsigned long port) | ||
31 | { | ||
32 | if (0x0000<=port && port<=0x0040) | ||
33 | return IDE_OFFSET + port; | ||
34 | if ((0x01f0<=port && port<=0x01f7) || port == 0x03f6) | ||
35 | return IDE_OFFSET + port; | ||
36 | |||
37 | return ISA_OFFSET + port; | ||
38 | } | ||
39 | |||
40 | /* | ||
41 | * The Machine Vector | ||
42 | */ | ||
43 | struct sh_machine_vector mv_cqreek __initmv = { | ||
44 | #if defined(CONFIG_CPU_SH4) | ||
45 | .mv_nr_irqs = 48, | ||
46 | #elif defined(CONFIG_CPU_SUBTYPE_SH7708) | ||
47 | .mv_nr_irqs = 32, | ||
48 | #elif defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
49 | .mv_nr_irqs = 61, | ||
50 | #endif | ||
51 | |||
52 | .mv_init_irq = init_cqreek_IRQ, | ||
53 | |||
54 | .mv_isa_port2addr = cqreek_port2addr, | ||
55 | }; | ||
56 | ALIAS_MV(cqreek) | ||
57 | |||
58 | /* | ||
59 | * Initialize the board | ||
60 | */ | ||
61 | void __init platform_setup(void) | ||
62 | { | ||
63 | int i; | ||
64 | /* udelay is not available at setup time yet... */ | ||
65 | #define DELAY() do {for (i=0; i<10000; i++) ctrl_inw(0xa0000000);} while(0) | ||
66 | |||
67 | if ((inw (BRIDGE_FEATURE) & 1)) { /* We have IDE interface */ | ||
68 | outw_p(0, BRIDGE_IDE_INTR_LVL); | ||
69 | outw_p(0, BRIDGE_IDE_INTR_MASK); | ||
70 | |||
71 | outw_p(0, BRIDGE_IDE_CTRL); | ||
72 | DELAY(); | ||
73 | |||
74 | outw_p(0x8000, BRIDGE_IDE_CTRL); | ||
75 | DELAY(); | ||
76 | |||
77 | outw_p(0xffff, BRIDGE_IDE_INTR_STAT); /* Clear interrupt status */ | ||
78 | outw_p(0x0f-14, BRIDGE_IDE_INTR_LVL); /* Use 14 IPR */ | ||
79 | outw_p(1, BRIDGE_IDE_INTR_MASK); /* Enable interrupt */ | ||
80 | cqreek_has_ide=1; | ||
81 | } | ||
82 | |||
83 | if ((inw (BRIDGE_FEATURE) & 2)) { /* We have ISA interface */ | ||
84 | outw_p(0, BRIDGE_ISA_INTR_LVL); | ||
85 | outw_p(0, BRIDGE_ISA_INTR_MASK); | ||
86 | |||
87 | outw_p(0, BRIDGE_ISA_CTRL); | ||
88 | DELAY(); | ||
89 | outw_p(0x8000, BRIDGE_ISA_CTRL); | ||
90 | DELAY(); | ||
91 | |||
92 | outw_p(0xffff, BRIDGE_ISA_INTR_STAT); /* Clear interrupt status */ | ||
93 | outw_p(0x0f-10, BRIDGE_ISA_INTR_LVL); /* Use 10 IPR */ | ||
94 | outw_p(0xfff8, BRIDGE_ISA_INTR_MASK); /* Enable interrupt */ | ||
95 | cqreek_has_isa=1; | ||
96 | } | ||
97 | |||
98 | printk(KERN_INFO "CqREEK Setup (IDE=%d, ISA=%d)...done\n", cqreek_has_ide, cqreek_has_isa); | ||
99 | } | ||
100 | |||
diff --git a/arch/sh/boards/dmida/Makefile b/arch/sh/boards/dmida/Makefile deleted file mode 100644 index 75999aa0a2d9..000000000000 --- a/arch/sh/boards/dmida/Makefile +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the DataMyte Industrial Digital Assistant(tm) specific parts | ||
3 | # of the kernel | ||
4 | # | ||
5 | |||
6 | obj-y := mach.o | ||
7 | |||
diff --git a/arch/sh/boards/dmida/mach.c b/arch/sh/boards/dmida/mach.c deleted file mode 100644 index d03a25f989c2..000000000000 --- a/arch/sh/boards/dmida/mach.c +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/boards/dmida/mach.c | ||
3 | * | ||
4 | * by Greg Banks <gbanks@pocketpenguins.com> | ||
5 | * (c) 2000 PocketPenguins Inc | ||
6 | * | ||
7 | * Derived from mach_hp600.c, which bore the message: | ||
8 | * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com) | ||
9 | * | ||
10 | * May be copied or modified under the terms of the GNU General Public | ||
11 | * License. See linux/COPYING for more information. | ||
12 | * | ||
13 | * Machine vector for the DataMyte Industrial Digital Assistant(tm). | ||
14 | * See http://www.dmida.com | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #include <linux/init.h> | ||
19 | |||
20 | #include <asm/machvec.h> | ||
21 | #include <asm/rtc.h> | ||
22 | #include <asm/machvec_init.h> | ||
23 | |||
24 | #include <asm/io.h> | ||
25 | #include <asm/hd64465/hd64465.h> | ||
26 | #include <asm/irq.h> | ||
27 | |||
28 | /* | ||
29 | * The Machine Vector | ||
30 | */ | ||
31 | |||
32 | struct sh_machine_vector mv_dmida __initmv = { | ||
33 | .mv_nr_irqs = HD64465_IRQ_BASE+HD64465_IRQ_NUM, | ||
34 | |||
35 | .mv_inb = hd64465_inb, | ||
36 | .mv_inw = hd64465_inw, | ||
37 | .mv_inl = hd64465_inl, | ||
38 | .mv_outb = hd64465_outb, | ||
39 | .mv_outw = hd64465_outw, | ||
40 | .mv_outl = hd64465_outl, | ||
41 | |||
42 | .mv_inb_p = hd64465_inb_p, | ||
43 | .mv_inw_p = hd64465_inw, | ||
44 | .mv_inl_p = hd64465_inl, | ||
45 | .mv_outb_p = hd64465_outb_p, | ||
46 | .mv_outw_p = hd64465_outw, | ||
47 | .mv_outl_p = hd64465_outl, | ||
48 | |||
49 | .mv_insb = hd64465_insb, | ||
50 | .mv_insw = hd64465_insw, | ||
51 | .mv_insl = hd64465_insl, | ||
52 | .mv_outsb = hd64465_outsb, | ||
53 | .mv_outsw = hd64465_outsw, | ||
54 | .mv_outsl = hd64465_outsl, | ||
55 | |||
56 | .mv_irq_demux = hd64465_irq_demux, | ||
57 | }; | ||
58 | ALIAS_MV(dmida) | ||
59 | |||
diff --git a/arch/sh/boards/dreamcast/irq.c b/arch/sh/boards/dreamcast/irq.c index b10a6b11c034..5bf01f86c20c 100644 --- a/arch/sh/boards/dreamcast/irq.c +++ b/arch/sh/boards/dreamcast/irq.c | |||
@@ -10,7 +10,6 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
13 | |||
14 | #include <asm/io.h> | 13 | #include <asm/io.h> |
15 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
16 | #include <asm/dreamcast/sysasic.h> | 15 | #include <asm/dreamcast/sysasic.h> |
@@ -26,10 +25,10 @@ | |||
26 | event. | 25 | event. |
27 | 26 | ||
28 | There are three 32-bit ESRs located at 0xa05f8900 - 0xa05f6908. Event | 27 | There are three 32-bit ESRs located at 0xa05f8900 - 0xa05f6908. Event |
29 | types can be found in include/asm-sh/dc_sysasic.h. There are three groups | 28 | types can be found in include/asm-sh/dreamcast/sysasic.h. There are three |
30 | of EMRs that parallel the ESRs. Each EMR group corresponds to an IRQ, so | 29 | groups of EMRs that parallel the ESRs. Each EMR group corresponds to an |
31 | 0xa05f6910 - 0xa05f6918 triggers IRQ 13, 0xa05f6920 - 0xa05f6928 triggers | 30 | IRQ, so 0xa05f6910 - 0xa05f6918 triggers IRQ 13, 0xa05f6920 - 0xa05f6928 |
32 | IRQ 11, and 0xa05f6930 - 0xa05f6938 triggers IRQ 9. | 31 | triggers IRQ 11, and 0xa05f6930 - 0xa05f6938 triggers IRQ 9. |
33 | 32 | ||
34 | In the kernel, these events are mapped to virtual IRQs so that drivers can | 33 | In the kernel, these events are mapped to virtual IRQs so that drivers can |
35 | respond to them as they would a normal interrupt. In order to keep this | 34 | respond to them as they would a normal interrupt. In order to keep this |
@@ -57,29 +56,23 @@ | |||
57 | /* Disable the hardware event by masking its bit in its EMR */ | 56 | /* Disable the hardware event by masking its bit in its EMR */ |
58 | static inline void disable_systemasic_irq(unsigned int irq) | 57 | static inline void disable_systemasic_irq(unsigned int irq) |
59 | { | 58 | { |
60 | unsigned long flags; | ||
61 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); | 59 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); |
62 | __u32 mask; | 60 | __u32 mask; |
63 | 61 | ||
64 | local_irq_save(flags); | ||
65 | mask = inl(emr); | 62 | mask = inl(emr); |
66 | mask &= ~(1 << EVENT_BIT(irq)); | 63 | mask &= ~(1 << EVENT_BIT(irq)); |
67 | outl(mask, emr); | 64 | outl(mask, emr); |
68 | local_irq_restore(flags); | ||
69 | } | 65 | } |
70 | 66 | ||
71 | /* Enable the hardware event by setting its bit in its EMR */ | 67 | /* Enable the hardware event by setting its bit in its EMR */ |
72 | static inline void enable_systemasic_irq(unsigned int irq) | 68 | static inline void enable_systemasic_irq(unsigned int irq) |
73 | { | 69 | { |
74 | unsigned long flags; | ||
75 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); | 70 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); |
76 | __u32 mask; | 71 | __u32 mask; |
77 | 72 | ||
78 | local_irq_save(flags); | ||
79 | mask = inl(emr); | 73 | mask = inl(emr); |
80 | mask |= (1 << EVENT_BIT(irq)); | 74 | mask |= (1 << EVENT_BIT(irq)); |
81 | outl(mask, emr); | 75 | outl(mask, emr); |
82 | local_irq_restore(flags); | ||
83 | } | 76 | } |
84 | 77 | ||
85 | /* Acknowledge a hardware event by writing its bit back to its ESR */ | 78 | /* Acknowledge a hardware event by writing its bit back to its ESR */ |
diff --git a/arch/sh/boards/dreamcast/rtc.c b/arch/sh/boards/dreamcast/rtc.c index 379de1629134..b3a876a3b859 100644 --- a/arch/sh/boards/dreamcast/rtc.c +++ b/arch/sh/boards/dreamcast/rtc.c | |||
@@ -1,4 +1,5 @@ | |||
1 | /* arch/sh/kernel/rtc-aica.c | 1 | /* |
2 | * arch/sh/boards/dreamcast/rtc.c | ||
2 | * | 3 | * |
3 | * Dreamcast AICA RTC routines. | 4 | * Dreamcast AICA RTC routines. |
4 | * | 5 | * |
@@ -10,15 +11,12 @@ | |||
10 | */ | 11 | */ |
11 | 12 | ||
12 | #include <linux/time.h> | 13 | #include <linux/time.h> |
13 | 14 | #include <asm/rtc.h> | |
14 | #include <asm/io.h> | 15 | #include <asm/io.h> |
15 | 16 | ||
16 | extern void (*rtc_get_time)(struct timespec *); | ||
17 | extern int (*rtc_set_time)(const time_t); | ||
18 | |||
19 | /* The AICA RTC has an Epoch of 1/1/1950, so we must subtract 20 years (in | 17 | /* The AICA RTC has an Epoch of 1/1/1950, so we must subtract 20 years (in |
20 | seconds to get the standard Unix Epoch when getting the time, and add 20 | 18 | seconds) to get the standard Unix Epoch when getting the time, and add |
21 | years when setting the time. */ | 19 | 20 years when setting the time. */ |
22 | #define TWENTY_YEARS ((20 * 365LU + 5) * 86400) | 20 | #define TWENTY_YEARS ((20 * 365LU + 5) * 86400) |
23 | 21 | ||
24 | /* The AICA RTC is represented by a 32-bit seconds counter stored in 2 16-bit | 22 | /* The AICA RTC is represented by a 32-bit seconds counter stored in 2 16-bit |
@@ -32,7 +30,8 @@ extern int (*rtc_set_time)(const time_t); | |||
32 | * | 30 | * |
33 | * Grabs the current RTC seconds counter and adjusts it to the Unix Epoch. | 31 | * Grabs the current RTC seconds counter and adjusts it to the Unix Epoch. |
34 | */ | 32 | */ |
35 | void aica_rtc_gettimeofday(struct timespec *ts) { | 33 | void aica_rtc_gettimeofday(struct timespec *ts) |
34 | { | ||
36 | unsigned long val1, val2; | 35 | unsigned long val1, val2; |
37 | 36 | ||
38 | do { | 37 | do { |
@@ -55,7 +54,8 @@ void aica_rtc_gettimeofday(struct timespec *ts) { | |||
55 | * | 54 | * |
56 | * Adjusts the given @tv to the AICA Epoch and sets the RTC seconds counter. | 55 | * Adjusts the given @tv to the AICA Epoch and sets the RTC seconds counter. |
57 | */ | 56 | */ |
58 | int aica_rtc_settimeofday(const time_t secs) { | 57 | int aica_rtc_settimeofday(const time_t secs) |
58 | { | ||
59 | unsigned long val1, val2; | 59 | unsigned long val1, val2; |
60 | unsigned long adj = secs + TWENTY_YEARS; | 60 | unsigned long adj = secs + TWENTY_YEARS; |
61 | 61 | ||
@@ -75,7 +75,7 @@ int aica_rtc_settimeofday(const time_t secs) { | |||
75 | 75 | ||
76 | void aica_time_init(void) | 76 | void aica_time_init(void) |
77 | { | 77 | { |
78 | rtc_get_time = aica_rtc_gettimeofday; | 78 | rtc_sh_get_time = aica_rtc_gettimeofday; |
79 | rtc_set_time = aica_rtc_settimeofday; | 79 | rtc_sh_set_time = aica_rtc_settimeofday; |
80 | } | 80 | } |
81 | 81 | ||
diff --git a/arch/sh/boards/dreamcast/setup.c b/arch/sh/boards/dreamcast/setup.c index 0027b80a2343..f13017eeeb27 100644 --- a/arch/sh/boards/dreamcast/setup.c +++ b/arch/sh/boards/dreamcast/setup.c | |||
@@ -22,41 +22,21 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/device.h> | 24 | #include <linux/device.h> |
25 | |||
26 | #include <asm/io.h> | 25 | #include <asm/io.h> |
27 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
27 | #include <asm/rtc.h> | ||
28 | #include <asm/machvec.h> | 28 | #include <asm/machvec.h> |
29 | #include <asm/machvec_init.h> | ||
30 | #include <asm/mach/sysasic.h> | 29 | #include <asm/mach/sysasic.h> |
31 | 30 | ||
32 | extern struct hw_interrupt_type systemasic_int; | 31 | extern struct hw_interrupt_type systemasic_int; |
33 | /* XXX: Move this into it's proper header. */ | ||
34 | extern void (*board_time_init)(void); | ||
35 | extern void aica_time_init(void); | 32 | extern void aica_time_init(void); |
36 | extern int gapspci_init(void); | 33 | extern int gapspci_init(void); |
37 | extern int systemasic_irq_demux(int); | 34 | extern int systemasic_irq_demux(int); |
38 | 35 | ||
39 | void *dreamcast_consistent_alloc(struct device *, size_t, dma_addr_t *, int); | 36 | void *dreamcast_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t); |
40 | int dreamcast_consistent_free(struct device *, size_t, void *, dma_addr_t); | 37 | int dreamcast_consistent_free(struct device *, size_t, void *, dma_addr_t); |
41 | 38 | ||
42 | const char *get_system_type(void) | 39 | static void __init dreamcast_setup(char **cmdline_p) |
43 | { | ||
44 | return "Sega Dreamcast"; | ||
45 | } | ||
46 | |||
47 | struct sh_machine_vector mv_dreamcast __initmv = { | ||
48 | .mv_nr_irqs = NR_IRQS, | ||
49 | |||
50 | .mv_irq_demux = systemasic_irq_demux, | ||
51 | |||
52 | #ifdef CONFIG_PCI | ||
53 | .mv_consistent_alloc = dreamcast_consistent_alloc, | ||
54 | .mv_consistent_free = dreamcast_consistent_free, | ||
55 | #endif | ||
56 | }; | ||
57 | ALIAS_MV(dreamcast) | ||
58 | |||
59 | int __init platform_setup(void) | ||
60 | { | 40 | { |
61 | int i; | 41 | int i; |
62 | 42 | ||
@@ -78,6 +58,16 @@ int __init platform_setup(void) | |||
78 | if (gapspci_init() < 0) | 58 | if (gapspci_init() < 0) |
79 | printk(KERN_WARNING "GAPSPCI was not detected.\n"); | 59 | printk(KERN_WARNING "GAPSPCI was not detected.\n"); |
80 | #endif | 60 | #endif |
81 | |||
82 | return 0; | ||
83 | } | 61 | } |
62 | |||
63 | struct sh_machine_vector mv_dreamcast __initmv = { | ||
64 | .mv_name = "Sega Dreamcast", | ||
65 | .mv_setup = dreamcast_setup, | ||
66 | .mv_irq_demux = systemasic_irq_demux, | ||
67 | |||
68 | #ifdef CONFIG_PCI | ||
69 | .mv_consistent_alloc = dreamcast_consistent_alloc, | ||
70 | .mv_consistent_free = dreamcast_consistent_free, | ||
71 | #endif | ||
72 | }; | ||
73 | ALIAS_MV(dreamcast) | ||
diff --git a/arch/sh/boards/ec3104/setup.c b/arch/sh/boards/ec3104/setup.c index 4b3ef16a0e96..902bc975a13e 100644 --- a/arch/sh/boards/ec3104/setup.c +++ b/arch/sh/boards/ec3104/setup.c | |||
@@ -21,22 +21,36 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
24 | |||
25 | #include <asm/io.h> | 24 | #include <asm/io.h> |
26 | #include <asm/irq.h> | 25 | #include <asm/irq.h> |
27 | #include <asm/machvec.h> | 26 | #include <asm/machvec.h> |
28 | #include <asm/mach/ec3104.h> | 27 | #include <asm/mach/ec3104.h> |
29 | 28 | ||
30 | const char *get_system_type(void) | 29 | static void __init ec3104_setup(char **cmdline_p) |
31 | { | 30 | { |
32 | return "EC3104"; | 31 | char str[8]; |
32 | int i; | ||
33 | |||
34 | for (i=0; i<8; i++) | ||
35 | str[i] = ctrl_readb(EC3104_BASE + i); | ||
36 | |||
37 | for (i = EC3104_IRQBASE; i < EC3104_IRQBASE + 32; i++) | ||
38 | irq_desc[i].handler = &ec3104_int; | ||
39 | |||
40 | printk("initializing EC3104 \"%.8s\" at %08x, IRQ %d, IRQ base %d\n", | ||
41 | str, EC3104_BASE, EC3104_IRQ, EC3104_IRQBASE); | ||
42 | |||
43 | /* mask all interrupts. this should have been done by the boot | ||
44 | * loader for us but we want to be sure ... */ | ||
45 | ctrl_writel(0xffffffff, EC3104_IMR); | ||
33 | } | 46 | } |
34 | 47 | ||
35 | /* | 48 | /* |
36 | * The Machine Vector | 49 | * The Machine Vector |
37 | */ | 50 | */ |
38 | |||
39 | struct sh_machine_vector mv_ec3104 __initmv = { | 51 | struct sh_machine_vector mv_ec3104 __initmv = { |
52 | .mv_name = "EC3104", | ||
53 | .mv_setup = ec3104_setup, | ||
40 | .mv_nr_irqs = 96, | 54 | .mv_nr_irqs = 96, |
41 | 55 | ||
42 | .mv_inb = ec3104_inb, | 56 | .mv_inb = ec3104_inb, |
@@ -48,31 +62,4 @@ struct sh_machine_vector mv_ec3104 __initmv = { | |||
48 | 62 | ||
49 | .mv_irq_demux = ec3104_irq_demux, | 63 | .mv_irq_demux = ec3104_irq_demux, |
50 | }; | 64 | }; |
51 | |||
52 | ALIAS_MV(ec3104) | 65 | ALIAS_MV(ec3104) |
53 | |||
54 | int __init platform_setup(void) | ||
55 | { | ||
56 | char str[8]; | ||
57 | int i; | ||
58 | |||
59 | if (0) | ||
60 | return 0; | ||
61 | |||
62 | for (i=0; i<8; i++) | ||
63 | str[i] = ctrl_readb(EC3104_BASE + i); | ||
64 | |||
65 | for (i = EC3104_IRQBASE; i < EC3104_IRQBASE + 32; i++) | ||
66 | irq_desc[i].chip = &ec3104_int; | ||
67 | |||
68 | printk("initializing EC3104 \"%.8s\" at %08x, IRQ %d, IRQ base %d\n", | ||
69 | str, EC3104_BASE, EC3104_IRQ, EC3104_IRQBASE); | ||
70 | |||
71 | |||
72 | /* mask all interrupts. this should have been done by the boot | ||
73 | * loader for us but we want to be sure ... */ | ||
74 | ctrl_writel(0xffffffff, EC3104_IMR); | ||
75 | |||
76 | return 0; | ||
77 | } | ||
78 | |||
diff --git a/arch/sh/boards/harp/Makefile b/arch/sh/boards/harp/Makefile deleted file mode 100644 index eb753d31812e..000000000000 --- a/arch/sh/boards/harp/Makefile +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for STMicroelectronics board specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := irq.o setup.o mach.o led.o | ||
6 | |||
7 | obj-$(CONFIG_PCI) += pcidma.o | ||
8 | |||
diff --git a/arch/sh/boards/harp/irq.c b/arch/sh/boards/harp/irq.c deleted file mode 100644 index 96bb41c9fc55..000000000000 --- a/arch/sh/boards/harp/irq.c +++ /dev/null | |||
@@ -1,147 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 David J. Mckay (david.mckay@st.com) | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * Looks after interrupts on the HARP board. | ||
8 | * | ||
9 | * Bases on the IPR irq system | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/irq.h> | ||
14 | |||
15 | #include <asm/system.h> | ||
16 | #include <asm/io.h> | ||
17 | #include <asm/harp/harp.h> | ||
18 | |||
19 | |||
20 | #define NUM_EXTERNAL_IRQS 16 | ||
21 | |||
22 | // Early versions of the STB1 Overdrive required this nasty frig | ||
23 | //#define INVERT_INTMASK_WRITES | ||
24 | |||
25 | static void enable_harp_irq(unsigned int irq); | ||
26 | static void disable_harp_irq(unsigned int irq); | ||
27 | |||
28 | /* shutdown is same as "disable" */ | ||
29 | #define shutdown_harp_irq disable_harp_irq | ||
30 | |||
31 | static void mask_and_ack_harp(unsigned int); | ||
32 | static void end_harp_irq(unsigned int irq); | ||
33 | |||
34 | static unsigned int startup_harp_irq(unsigned int irq) | ||
35 | { | ||
36 | enable_harp_irq(irq); | ||
37 | return 0; /* never anything pending */ | ||
38 | } | ||
39 | |||
40 | static struct hw_interrupt_type harp_irq_type = { | ||
41 | .typename = "Harp-IRQ", | ||
42 | .startup = startup_harp_irq, | ||
43 | .shutdown = shutdown_harp_irq, | ||
44 | .enable = enable_harp_irq, | ||
45 | .disable = disable_harp_irq, | ||
46 | .ack = mask_and_ack_harp, | ||
47 | .end = end_harp_irq | ||
48 | }; | ||
49 | |||
50 | static void disable_harp_irq(unsigned int irq) | ||
51 | { | ||
52 | unsigned val, flags; | ||
53 | unsigned maskReg; | ||
54 | unsigned mask; | ||
55 | int pri; | ||
56 | |||
57 | if (irq < 0 || irq >= NUM_EXTERNAL_IRQS) | ||
58 | return; | ||
59 | |||
60 | pri = 15 - irq; | ||
61 | |||
62 | if (pri < 8) { | ||
63 | maskReg = EPLD_INTMASK0; | ||
64 | } else { | ||
65 | maskReg = EPLD_INTMASK1; | ||
66 | pri -= 8; | ||
67 | } | ||
68 | |||
69 | local_irq_save(flags); | ||
70 | mask = ctrl_inl(maskReg); | ||
71 | mask &= (~(1 << pri)); | ||
72 | #if defined(INVERT_INTMASK_WRITES) | ||
73 | mask ^= 0xff; | ||
74 | #endif | ||
75 | ctrl_outl(mask, maskReg); | ||
76 | local_irq_restore(flags); | ||
77 | } | ||
78 | |||
79 | static void enable_harp_irq(unsigned int irq) | ||
80 | { | ||
81 | unsigned flags; | ||
82 | unsigned maskReg; | ||
83 | unsigned mask; | ||
84 | int pri; | ||
85 | |||
86 | if (irq < 0 || irq >= NUM_EXTERNAL_IRQS) | ||
87 | return; | ||
88 | |||
89 | pri = 15 - irq; | ||
90 | |||
91 | if (pri < 8) { | ||
92 | maskReg = EPLD_INTMASK0; | ||
93 | } else { | ||
94 | maskReg = EPLD_INTMASK1; | ||
95 | pri -= 8; | ||
96 | } | ||
97 | |||
98 | local_irq_save(flags); | ||
99 | mask = ctrl_inl(maskReg); | ||
100 | |||
101 | |||
102 | mask |= (1 << pri); | ||
103 | |||
104 | #if defined(INVERT_INTMASK_WRITES) | ||
105 | mask ^= 0xff; | ||
106 | #endif | ||
107 | ctrl_outl(mask, maskReg); | ||
108 | |||
109 | local_irq_restore(flags); | ||
110 | } | ||
111 | |||
112 | /* This functions sets the desired irq handler to be an overdrive type */ | ||
113 | static void __init make_harp_irq(unsigned int irq) | ||
114 | { | ||
115 | disable_irq_nosync(irq); | ||
116 | irq_desc[irq].chip = &harp_irq_type; | ||
117 | disable_harp_irq(irq); | ||
118 | } | ||
119 | |||
120 | static void mask_and_ack_harp(unsigned int irq) | ||
121 | { | ||
122 | disable_harp_irq(irq); | ||
123 | } | ||
124 | |||
125 | static void end_harp_irq(unsigned int irq) | ||
126 | { | ||
127 | enable_harp_irq(irq); | ||
128 | } | ||
129 | |||
130 | void __init init_harp_irq(void) | ||
131 | { | ||
132 | int i; | ||
133 | |||
134 | #if !defined(INVERT_INTMASK_WRITES) | ||
135 | // On the harp these are set to enable an interrupt | ||
136 | ctrl_outl(0x00, EPLD_INTMASK0); | ||
137 | ctrl_outl(0x00, EPLD_INTMASK1); | ||
138 | #else | ||
139 | // On the Overdrive the data is inverted before being stored in the reg | ||
140 | ctrl_outl(0xff, EPLD_INTMASK0); | ||
141 | ctrl_outl(0xff, EPLD_INTMASK1); | ||
142 | #endif | ||
143 | |||
144 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) { | ||
145 | make_harp_irq(i); | ||
146 | } | ||
147 | } | ||
diff --git a/arch/sh/boards/harp/led.c b/arch/sh/boards/harp/led.c deleted file mode 100644 index aeb7b392b190..000000000000 --- a/arch/sh/boards/harp/led.c +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/stboards/led.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com> | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * This file contains ST40STB1 HARP and compatible code. | ||
10 | */ | ||
11 | |||
12 | #include <asm/io.h> | ||
13 | #include <asm/harp/harp.h> | ||
14 | |||
15 | /* Harp: Flash LD10 (front pannel) connected to EPLD (IC8) */ | ||
16 | /* Overdrive: Flash LD1 (front panel) connected to EPLD (IC4) */ | ||
17 | /* Works for HARP and overdrive */ | ||
18 | static void mach_led(int position, int value) | ||
19 | { | ||
20 | if (value) { | ||
21 | ctrl_outl(EPLD_LED_ON, EPLD_LED); | ||
22 | } else { | ||
23 | ctrl_outl(EPLD_LED_OFF, EPLD_LED); | ||
24 | } | ||
25 | } | ||
26 | |||
27 | #ifdef CONFIG_HEARTBEAT | ||
28 | |||
29 | #include <linux/sched.h> | ||
30 | |||
31 | /* acts like an actual heart beat -- ie thump-thump-pause... */ | ||
32 | void heartbeat_harp(void) | ||
33 | { | ||
34 | static unsigned cnt = 0, period = 0, dist = 0; | ||
35 | |||
36 | if (cnt == 0 || cnt == dist) | ||
37 | mach_led( -1, 1); | ||
38 | else if (cnt == 7 || cnt == dist+7) | ||
39 | mach_led( -1, 0); | ||
40 | |||
41 | if (++cnt > period) { | ||
42 | cnt = 0; | ||
43 | /* The hyperbolic function below modifies the heartbeat period | ||
44 | * length in dependency of the current (5min) load. It goes | ||
45 | * through the points f(0)=126, f(1)=86, f(5)=51, | ||
46 | * f(inf)->30. */ | ||
47 | period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30; | ||
48 | dist = period / 4; | ||
49 | } | ||
50 | } | ||
51 | #endif | ||
diff --git a/arch/sh/boards/harp/mach.c b/arch/sh/boards/harp/mach.c deleted file mode 100644 index a946dd1674ca..000000000000 --- a/arch/sh/boards/harp/mach.c +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/boards/harp/mach.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com) | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * Machine vector for the STMicroelectronics STB1 HARP and compatible boards | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/machvec.h> | ||
15 | #include <asm/rtc.h> | ||
16 | #include <asm/machvec_init.h> | ||
17 | #include <asm/hd64465/io.h> | ||
18 | #include <asm/hd64465/hd64465.h> | ||
19 | |||
20 | void setup_harp(void); | ||
21 | void init_harp_irq(void); | ||
22 | void heartbeat_harp(void); | ||
23 | |||
24 | /* | ||
25 | * The Machine Vector | ||
26 | */ | ||
27 | |||
28 | struct sh_machine_vector mv_harp __initmv = { | ||
29 | .mv_nr_irqs = 89 + HD64465_IRQ_NUM, | ||
30 | |||
31 | .mv_inb = hd64465_inb, | ||
32 | .mv_inw = hd64465_inw, | ||
33 | .mv_inl = hd64465_inl, | ||
34 | .mv_outb = hd64465_outb, | ||
35 | .mv_outw = hd64465_outw, | ||
36 | .mv_outl = hd64465_outl, | ||
37 | |||
38 | .mv_inb_p = hd64465_inb_p, | ||
39 | .mv_inw_p = hd64465_inw, | ||
40 | .mv_inl_p = hd64465_inl, | ||
41 | .mv_outb_p = hd64465_outb_p, | ||
42 | .mv_outw_p = hd64465_outw, | ||
43 | .mv_outl_p = hd64465_outl, | ||
44 | |||
45 | .mv_insb = hd64465_insb, | ||
46 | .mv_insw = hd64465_insw, | ||
47 | .mv_insl = hd64465_insl, | ||
48 | .mv_outsb = hd64465_outsb, | ||
49 | .mv_outsw = hd64465_outsw, | ||
50 | .mv_outsl = hd64465_outsl, | ||
51 | |||
52 | .mv_isa_port2addr = hd64465_isa_port2addr, | ||
53 | |||
54 | #ifdef CONFIG_PCI | ||
55 | .mv_init_irq = init_harp_irq, | ||
56 | #endif | ||
57 | #ifdef CONFIG_HEARTBEAT | ||
58 | .mv_heartbeat = heartbeat_harp, | ||
59 | #endif | ||
60 | }; | ||
61 | |||
62 | ALIAS_MV(harp) | ||
diff --git a/arch/sh/boards/harp/pcidma.c b/arch/sh/boards/harp/pcidma.c deleted file mode 100644 index 475311390fd6..000000000000 --- a/arch/sh/boards/harp/pcidma.c +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 David J. Mckay (david.mckay@st.com) | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * Dynamic DMA mapping support. | ||
8 | */ | ||
9 | |||
10 | #include <linux/types.h> | ||
11 | #include <linux/mm.h> | ||
12 | #include <linux/string.h> | ||
13 | #include <linux/pci.h> | ||
14 | #include <asm/io.h> | ||
15 | #include <asm/addrspace.h> | ||
16 | |||
17 | |||
18 | void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, | ||
19 | dma_addr_t * dma_handle) | ||
20 | { | ||
21 | void *ret; | ||
22 | int gfp = GFP_ATOMIC; | ||
23 | |||
24 | ret = (void *) __get_free_pages(gfp, get_order(size)); | ||
25 | |||
26 | if (ret != NULL) { | ||
27 | /* Is it neccessary to do the memset? */ | ||
28 | memset(ret, 0, size); | ||
29 | *dma_handle = virt_to_bus(ret); | ||
30 | } | ||
31 | /* We must flush the cache before we pass it on to the device */ | ||
32 | flush_cache_all(); | ||
33 | return P2SEGADDR(ret); | ||
34 | } | ||
35 | |||
36 | void pci_free_consistent(struct pci_dev *hwdev, size_t size, | ||
37 | void *vaddr, dma_addr_t dma_handle) | ||
38 | { | ||
39 | unsigned long p1addr=P1SEGADDR((unsigned long)vaddr); | ||
40 | |||
41 | free_pages(p1addr, get_order(size)); | ||
42 | } | ||
diff --git a/arch/sh/boards/harp/setup.c b/arch/sh/boards/harp/setup.c deleted file mode 100644 index 886e450ab63e..000000000000 --- a/arch/sh/boards/harp/setup.c +++ /dev/null | |||
@@ -1,90 +0,0 @@ | |||
1 | /* | ||
2 | * arch/sh/stboard/setup.c | ||
3 | * | ||
4 | * Copyright (C) 2001 Stuart Menefy (stuart.menefy@st.com) | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * STMicroelectronics ST40STB1 HARP and compatible support. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <asm/io.h> | ||
15 | #include <asm/harp/harp.h> | ||
16 | |||
17 | const char *get_system_type(void) | ||
18 | { | ||
19 | return "STB1 Harp"; | ||
20 | } | ||
21 | |||
22 | /* | ||
23 | * Initialize the board | ||
24 | */ | ||
25 | int __init platform_setup(void) | ||
26 | { | ||
27 | #ifdef CONFIG_SH_STB1_HARP | ||
28 | unsigned long ic8_version, ic36_version; | ||
29 | |||
30 | ic8_version = ctrl_inl(EPLD_REVID2); | ||
31 | ic36_version = ctrl_inl(EPLD_REVID1); | ||
32 | |||
33 | printk("STMicroelectronics STB1 HARP initialisaton\n"); | ||
34 | printk("EPLD versions: IC8: %d.%02d, IC36: %d.%02d\n", | ||
35 | (ic8_version >> 4) & 0xf, ic8_version & 0xf, | ||
36 | (ic36_version >> 4) & 0xf, ic36_version & 0xf); | ||
37 | #elif defined(CONFIG_SH_STB1_OVERDRIVE) | ||
38 | unsigned long version; | ||
39 | |||
40 | version = ctrl_inl(EPLD_REVID); | ||
41 | |||
42 | printk("STMicroelectronics STB1 Overdrive initialisaton\n"); | ||
43 | printk("EPLD version: %d.%02d\n", | ||
44 | (version >> 4) & 0xf, version & 0xf); | ||
45 | #else | ||
46 | #error Undefined machine | ||
47 | #endif | ||
48 | |||
49 | /* Currently all STB1 chips have problems with the sleep instruction, | ||
50 | * so disable it here. | ||
51 | */ | ||
52 | disable_hlt(); | ||
53 | |||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | /* | ||
58 | * pcibios_map_platform_irq | ||
59 | * | ||
60 | * This is board specific and returns the IRQ for a given PCI device. | ||
61 | * It is used by the PCI code (arch/sh/kernel/st40_pci*) | ||
62 | * | ||
63 | */ | ||
64 | |||
65 | #define HARP_PCI_IRQ 1 | ||
66 | #define HARP_BRIDGE_IRQ 2 | ||
67 | #define OVERDRIVE_SLOT0_IRQ 0 | ||
68 | |||
69 | |||
70 | int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
71 | { | ||
72 | switch (slot) { | ||
73 | #ifdef CONFIG_SH_STB1_HARP | ||
74 | case 2: /*This is the PCI slot on the */ | ||
75 | return HARP_PCI_IRQ; | ||
76 | case 1: /* this is the bridge */ | ||
77 | return HARP_BRIDGE_IRQ; | ||
78 | #elif defined(CONFIG_SH_STB1_OVERDRIVE) | ||
79 | case 1: | ||
80 | case 2: | ||
81 | case 3: | ||
82 | return slot - 1; | ||
83 | #else | ||
84 | #error Unknown board | ||
85 | #endif | ||
86 | default: | ||
87 | return -1; | ||
88 | } | ||
89 | } | ||
90 | |||
diff --git a/arch/sh/boards/hp6xx/Makefile b/arch/sh/boards/hp6xx/Makefile index 927fe0aa5dfa..ff1b7f5b4e91 100644 --- a/arch/sh/boards/hp6xx/Makefile +++ b/arch/sh/boards/hp6xx/Makefile | |||
@@ -2,5 +2,6 @@ | |||
2 | # Makefile for the HP6xx specific parts of the kernel | 2 | # Makefile for the HP6xx specific parts of the kernel |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := mach.o setup.o | 5 | obj-y := setup.o |
6 | 6 | obj-$(CONFIG_PM) += pm.o pm_wakeup.o | |
7 | obj-$(CONFIG_APM) += hp6xx_apm.o | ||
diff --git a/arch/sh/boards/hp6xx/hp6xx_apm.c b/arch/sh/boards/hp6xx/hp6xx_apm.c new file mode 100644 index 000000000000..ad0e712c29f6 --- /dev/null +++ b/arch/sh/boards/hp6xx/hp6xx_apm.c | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * bios-less APM driver for hp680 | ||
3 | * | ||
4 | * Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License. | ||
8 | */ | ||
9 | #include <linux/config.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/apm_bios.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <asm/io.h> | ||
16 | #include <asm/apm.h> | ||
17 | #include <asm/adc.h> | ||
18 | #include <asm/hp6xx/hp6xx.h> | ||
19 | |||
20 | #define SH7709_PGDR 0xa400012c | ||
21 | |||
22 | #define APM_CRITICAL 10 | ||
23 | #define APM_LOW 30 | ||
24 | |||
25 | #define HP680_BATTERY_MAX 875 | ||
26 | #define HP680_BATTERY_MIN 600 | ||
27 | #define HP680_BATTERY_AC_ON 900 | ||
28 | |||
29 | #define MODNAME "hp6x0_apm" | ||
30 | |||
31 | static int hp6x0_apm_get_info(char *buf, char **start, off_t fpos, int length) | ||
32 | { | ||
33 | u8 pgdr; | ||
34 | char *p; | ||
35 | int battery_status; | ||
36 | int battery_flag; | ||
37 | int ac_line_status; | ||
38 | int time_units = APM_BATTERY_LIFE_UNKNOWN; | ||
39 | |||
40 | int battery = adc_single(ADC_CHANNEL_BATTERY); | ||
41 | int backup = adc_single(ADC_CHANNEL_BACKUP); | ||
42 | int charging = adc_single(ADC_CHANNEL_CHARGE); | ||
43 | int percentage; | ||
44 | |||
45 | percentage = 100 * (battery - HP680_BATTERY_MIN) / | ||
46 | (HP680_BATTERY_MAX - HP680_BATTERY_MIN); | ||
47 | |||
48 | ac_line_status = (battery > HP680_BATTERY_AC_ON) ? | ||
49 | APM_AC_ONLINE : APM_AC_OFFLINE; | ||
50 | |||
51 | p = buf; | ||
52 | |||
53 | pgdr = ctrl_inb(SH7709_PGDR); | ||
54 | if (pgdr & PGDR_MAIN_BATTERY_OUT) { | ||
55 | battery_status = APM_BATTERY_STATUS_NOT_PRESENT; | ||
56 | battery_flag = 0x80; | ||
57 | percentage = -1; | ||
58 | } else if (charging < 8 ) { | ||
59 | battery_status = APM_BATTERY_STATUS_CHARGING; | ||
60 | battery_flag = 0x08; | ||
61 | ac_line_status = 0xff; | ||
62 | } else if (percentage <= APM_CRITICAL) { | ||
63 | battery_status = APM_BATTERY_STATUS_CRITICAL; | ||
64 | battery_flag = 0x04; | ||
65 | } else if (percentage <= APM_LOW) { | ||
66 | battery_status = APM_BATTERY_STATUS_LOW; | ||
67 | battery_flag = 0x02; | ||
68 | } else { | ||
69 | battery_status = APM_BATTERY_STATUS_HIGH; | ||
70 | battery_flag = 0x01; | ||
71 | } | ||
72 | |||
73 | p += sprintf(p, "1.0 1.2 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n", | ||
74 | APM_32_BIT_SUPPORT, | ||
75 | ac_line_status, | ||
76 | battery_status, | ||
77 | battery_flag, | ||
78 | percentage, | ||
79 | time_units, | ||
80 | "min"); | ||
81 | p += sprintf(p, "bat=%d backup=%d charge=%d\n", | ||
82 | battery, backup, charging); | ||
83 | |||
84 | return p - buf; | ||
85 | } | ||
86 | |||
87 | static irqreturn_t hp6x0_apm_interrupt(int irq, void *dev, struct pt_regs *regs) | ||
88 | { | ||
89 | if (!apm_suspended) | ||
90 | apm_queue_event(APM_USER_SUSPEND); | ||
91 | |||
92 | return IRQ_HANDLED; | ||
93 | } | ||
94 | |||
95 | static int __init hp6x0_apm_init(void) | ||
96 | { | ||
97 | int ret; | ||
98 | |||
99 | ret = request_irq(HP680_BTN_IRQ, hp6x0_apm_interrupt, | ||
100 | SA_INTERRUPT, MODNAME, 0); | ||
101 | if (unlikely(ret < 0)) { | ||
102 | printk(KERN_ERR MODNAME ": IRQ %d request failed\n", | ||
103 | HP680_BTN_IRQ); | ||
104 | return ret; | ||
105 | } | ||
106 | |||
107 | apm_get_info = hp6x0_apm_get_info; | ||
108 | |||
109 | return ret; | ||
110 | } | ||
111 | |||
112 | static void __exit hp6x0_apm_exit(void) | ||
113 | { | ||
114 | free_irq(HP680_BTN_IRQ, 0); | ||
115 | apm_get_info = 0; | ||
116 | } | ||
117 | |||
118 | module_init(hp6x0_apm_init); | ||
119 | module_exit(hp6x0_apm_exit); | ||
120 | |||
121 | MODULE_AUTHOR("Adriy Skulysh"); | ||
122 | MODULE_DESCRIPTION("hp6xx Advanced Power Management"); | ||
123 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/sh/boards/hp6xx/pm.c b/arch/sh/boards/hp6xx/pm.c new file mode 100644 index 000000000000..0e501bcbd7a9 --- /dev/null +++ b/arch/sh/boards/hp6xx/pm.c | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * hp6x0 Power Management Routines | ||
3 | * | ||
4 | * Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License. | ||
8 | */ | ||
9 | #include <linux/config.h> | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/suspend.h> | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/time.h> | ||
14 | #include <asm/io.h> | ||
15 | #include <asm/hd64461.h> | ||
16 | #include <asm/hp6xx/hp6xx.h> | ||
17 | #include <asm/cpu/dac.h> | ||
18 | #include <asm/pm.h> | ||
19 | |||
20 | #define STBCR 0xffffff82 | ||
21 | #define STBCR2 0xffffff88 | ||
22 | |||
23 | static int hp6x0_pm_enter(suspend_state_t state) | ||
24 | { | ||
25 | u8 stbcr, stbcr2; | ||
26 | #ifdef CONFIG_HD64461_ENABLER | ||
27 | u8 scr; | ||
28 | u16 hd64461_stbcr; | ||
29 | #endif | ||
30 | |||
31 | if (state != PM_SUSPEND_MEM) | ||
32 | return -EINVAL; | ||
33 | |||
34 | #ifdef CONFIG_HD64461_ENABLER | ||
35 | outb(0, HD64461_PCC1CSCIER); | ||
36 | |||
37 | scr = inb(HD64461_PCC1SCR); | ||
38 | scr |= HD64461_PCCSCR_VCC1; | ||
39 | outb(scr, HD64461_PCC1SCR); | ||
40 | |||
41 | hd64461_stbcr = inw(HD64461_STBCR); | ||
42 | hd64461_stbcr |= HD64461_STBCR_SPC1ST; | ||
43 | outw(hd64461_stbcr, HD64461_STBCR); | ||
44 | #endif | ||
45 | |||
46 | ctrl_outb(0x1f, DACR); | ||
47 | |||
48 | stbcr = ctrl_inb(STBCR); | ||
49 | ctrl_outb(0x01, STBCR); | ||
50 | |||
51 | stbcr2 = ctrl_inb(STBCR2); | ||
52 | ctrl_outb(0x7f , STBCR2); | ||
53 | |||
54 | outw(0xf07f, HD64461_SCPUCR); | ||
55 | |||
56 | pm_enter(); | ||
57 | |||
58 | outw(0, HD64461_SCPUCR); | ||
59 | ctrl_outb(stbcr, STBCR); | ||
60 | ctrl_outb(stbcr2, STBCR2); | ||
61 | |||
62 | #ifdef CONFIG_HD64461_ENABLER | ||
63 | hd64461_stbcr = inw(HD64461_STBCR); | ||
64 | hd64461_stbcr &= ~HD64461_STBCR_SPC1ST; | ||
65 | outw(hd64461_stbcr, HD64461_STBCR); | ||
66 | |||
67 | outb(0x4c, HD64461_PCC1CSCIER); | ||
68 | outb(0x00, HD64461_PCC1CSCR); | ||
69 | #endif | ||
70 | |||
71 | return 0; | ||
72 | } | ||
73 | |||
74 | /* | ||
75 | * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk. | ||
76 | */ | ||
77 | static struct pm_ops hp6x0_pm_ops = { | ||
78 | .pm_disk_mode = PM_DISK_FIRMWARE, | ||
79 | .enter = hp6x0_pm_enter, | ||
80 | }; | ||
81 | |||
82 | static int __init hp6x0_pm_init(void) | ||
83 | { | ||
84 | pm_set_ops(&hp6x0_pm_ops); | ||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | late_initcall(hp6x0_pm_init); | ||
diff --git a/arch/sh/boards/hp6xx/pm_wakeup.S b/arch/sh/boards/hp6xx/pm_wakeup.S new file mode 100644 index 000000000000..45e9bf0b9115 --- /dev/null +++ b/arch/sh/boards/hp6xx/pm_wakeup.S | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com> | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/cpu/mmu_context.h> | ||
12 | |||
13 | #define k0 r0 | ||
14 | #define k1 r1 | ||
15 | #define k2 r2 | ||
16 | #define k3 r3 | ||
17 | #define k4 r4 | ||
18 | |||
19 | /* | ||
20 | * Kernel mode register usage: | ||
21 | * k0 scratch | ||
22 | * k1 scratch | ||
23 | * k2 scratch (Exception code) | ||
24 | * k3 scratch (Return address) | ||
25 | * k4 scratch | ||
26 | * k5 reserved | ||
27 | * k6 Global Interrupt Mask (0--15 << 4) | ||
28 | * k7 CURRENT_THREAD_INFO (pointer to current thread info) | ||
29 | */ | ||
30 | |||
31 | ENTRY(wakeup_start) | ||
32 | ! clear STBY bit | ||
33 | mov #-126, k2 | ||
34 | and #127, k0 | ||
35 | mov.b k0, @k2 | ||
36 | ! enable refresh | ||
37 | mov.l 5f, k1 | ||
38 | mov.w 6f, k0 | ||
39 | mov.w k0, @k1 | ||
40 | ! jump to handler | ||
41 | mov.l 2f, k2 | ||
42 | mov.l 3f, k3 | ||
43 | mov.l @k2, k2 | ||
44 | |||
45 | mov.l 4f, k1 | ||
46 | jmp @k1 | ||
47 | nop | ||
48 | |||
49 | .align 2 | ||
50 | 1: .long EXPEVT | ||
51 | 2: .long INTEVT | ||
52 | 3: .long ret_from_irq | ||
53 | 4: .long handle_exception | ||
54 | 5: .long 0xffffff68 | ||
55 | 6: .word 0x0524 | ||
56 | |||
57 | ENTRY(wakeup_end) | ||
58 | nop | ||
diff --git a/arch/sh/boards/hp6xx/setup.c b/arch/sh/boards/hp6xx/setup.c index 71f315663cc9..60ab17ad6054 100644 --- a/arch/sh/boards/hp6xx/setup.c +++ b/arch/sh/boards/hp6xx/setup.c | |||
@@ -8,22 +8,22 @@ | |||
8 | * | 8 | * |
9 | * Setup code for an HP680 (internal peripherials only) | 9 | * Setup code for an HP680 (internal peripherials only) |
10 | */ | 10 | */ |
11 | 11 | #include <linux/types.h> | |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <asm/io.h> | ||
14 | #include <asm/hd64461.h> | 13 | #include <asm/hd64461.h> |
14 | #include <asm/io.h> | ||
15 | #include <asm/irq.h> | ||
15 | #include <asm/hp6xx/hp6xx.h> | 16 | #include <asm/hp6xx/hp6xx.h> |
16 | #include <asm/cpu/dac.h> | 17 | #include <asm/cpu/dac.h> |
17 | 18 | ||
18 | const char *get_system_type(void) | 19 | #define SCPCR 0xa4000116 |
19 | { | 20 | #define SCPDR 0xa4000136 |
20 | return "HP6xx"; | ||
21 | } | ||
22 | 21 | ||
23 | int __init platform_setup(void) | 22 | static void __init hp6xx_setup(char **cmdline_p) |
24 | { | 23 | { |
25 | u8 v8; | 24 | u8 v8; |
26 | u16 v; | 25 | u16 v; |
26 | |||
27 | v = inw(HD64461_STBCR); | 27 | v = inw(HD64461_STBCR); |
28 | v |= HD64461_STBCR_SURTST | HD64461_STBCR_SIRST | | 28 | v |= HD64461_STBCR_SURTST | HD64461_STBCR_SIRST | |
29 | HD64461_STBCR_STM1ST | HD64461_STBCR_STM0ST | | 29 | HD64461_STBCR_STM1ST | HD64461_STBCR_STM0ST | |
@@ -50,5 +50,51 @@ int __init platform_setup(void) | |||
50 | v8 &= ~DACR_DAE; | 50 | v8 &= ~DACR_DAE; |
51 | ctrl_outb(v8,DACR); | 51 | ctrl_outb(v8,DACR); |
52 | 52 | ||
53 | return 0; | 53 | v8 = ctrl_inb(SCPDR); |
54 | v8 |= SCPDR_TS_SCAN_X | SCPDR_TS_SCAN_Y; | ||
55 | v8 &= ~SCPDR_TS_SCAN_ENABLE; | ||
56 | ctrl_outb(v8, SCPDR); | ||
57 | |||
58 | v = ctrl_inw(SCPCR); | ||
59 | v &= ~SCPCR_TS_MASK; | ||
60 | v |= SCPCR_TS_ENABLE; | ||
61 | ctrl_outw(v, SCPCR); | ||
54 | } | 62 | } |
63 | |||
64 | /* | ||
65 | * XXX: This is stupid, we should have a generic machine vector for the cchips | ||
66 | * and just wrap the platform setup code in to this, as it's the only thing | ||
67 | * that ends up being different. | ||
68 | */ | ||
69 | struct sh_machine_vector mv_hp6xx __initmv = { | ||
70 | .mv_name = "hp6xx", | ||
71 | .mv_setup = hp6xx_setup, | ||
72 | .mv_nr_irqs = HD64461_IRQBASE + HD64461_IRQ_NUM, | ||
73 | |||
74 | .mv_inb = hd64461_inb, | ||
75 | .mv_inw = hd64461_inw, | ||
76 | .mv_inl = hd64461_inl, | ||
77 | .mv_outb = hd64461_outb, | ||
78 | .mv_outw = hd64461_outw, | ||
79 | .mv_outl = hd64461_outl, | ||
80 | |||
81 | .mv_inb_p = hd64461_inb_p, | ||
82 | .mv_inw_p = hd64461_inw, | ||
83 | .mv_inl_p = hd64461_inl, | ||
84 | .mv_outb_p = hd64461_outb_p, | ||
85 | .mv_outw_p = hd64461_outw, | ||
86 | .mv_outl_p = hd64461_outl, | ||
87 | |||
88 | .mv_insb = hd64461_insb, | ||
89 | .mv_insw = hd64461_insw, | ||
90 | .mv_insl = hd64461_insl, | ||
91 | .mv_outsb = hd64461_outsb, | ||
92 | .mv_outsw = hd64461_outsw, | ||
93 | .mv_outsl = hd64461_outsl, | ||
94 | |||
95 | .mv_readw = hd64461_readw, | ||
96 | .mv_writew = hd64461_writew, | ||
97 | |||
98 | .mv_irq_demux = hd64461_irq_demux, | ||
99 | }; | ||
100 | ALIAS_MV(hp6xx) | ||
diff --git a/arch/sh/boards/landisk/Makefile b/arch/sh/boards/landisk/Makefile new file mode 100644 index 000000000000..89e4beb2ad47 --- /dev/null +++ b/arch/sh/boards/landisk/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # | ||
2 | # Makefile for I-O DATA DEVICE, INC. "LANDISK Series" | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o io.o irq.o rtc.o landisk_pwb.o | ||
diff --git a/arch/sh/boards/landisk/io.c b/arch/sh/boards/landisk/io.c new file mode 100644 index 000000000000..92498b4947d5 --- /dev/null +++ b/arch/sh/boards/landisk/io.c | |||
@@ -0,0 +1,250 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/landisk/io.c | ||
3 | * | ||
4 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel | ||
5 | * Based largely on io_se.c. | ||
6 | * | ||
7 | * I/O routine for I-O Data Device, Inc. LANDISK. | ||
8 | * | ||
9 | * Initial version only to support LAN access; some | ||
10 | * placeholder code from io_landisk.c left in with the | ||
11 | * expectation of later SuperIO and PCMCIA access. | ||
12 | */ | ||
13 | /* | ||
14 | * modifed by kogiidena | ||
15 | * 2005.03.03 | ||
16 | */ | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/types.h> | ||
19 | #include <linux/pci.h> | ||
20 | #include <asm/landisk/iodata_landisk.h> | ||
21 | #include <asm/addrspace.h> | ||
22 | #include <asm/io.h> | ||
23 | |||
24 | extern void *area5_io_base; /* Area 5 I/O Base address */ | ||
25 | extern void *area6_io_base; /* Area 6 I/O Base address */ | ||
26 | |||
27 | static inline unsigned long port2adr(unsigned int port) | ||
28 | { | ||
29 | if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6) | ||
30 | if (port == 0x3f6) | ||
31 | return ((unsigned long)area5_io_base + 0x2c); | ||
32 | else | ||
33 | return ((unsigned long)area5_io_base + PA_PIDE_OFFSET + | ||
34 | ((port - 0x1f0) << 1)); | ||
35 | else if ((0x170 <= port && port < 0x178) || port == 0x376) | ||
36 | if (port == 0x376) | ||
37 | return ((unsigned long)area6_io_base + 0x2c); | ||
38 | else | ||
39 | return ((unsigned long)area6_io_base + PA_SIDE_OFFSET + | ||
40 | ((port - 0x170) << 1)); | ||
41 | else | ||
42 | maybebadio((unsigned long)port); | ||
43 | |||
44 | return port; | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | * General outline: remap really low stuff [eventually] to SuperIO, | ||
49 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) | ||
50 | * is mapped through the PCI IO window. Stuff with high bits (PXSEG) | ||
51 | * should be way beyond the window, and is used w/o translation for | ||
52 | * compatibility. | ||
53 | */ | ||
54 | u8 landisk_inb(unsigned long port) | ||
55 | { | ||
56 | if (PXSEG(port)) | ||
57 | return ctrl_inb(port); | ||
58 | else if (is_pci_ioaddr(port)) | ||
59 | return ctrl_inb(pci_ioaddr(port)); | ||
60 | |||
61 | return ctrl_inw(port2adr(port)) & 0xff; | ||
62 | } | ||
63 | |||
64 | u8 landisk_inb_p(unsigned long port) | ||
65 | { | ||
66 | u8 v; | ||
67 | |||
68 | if (PXSEG(port)) | ||
69 | v = ctrl_inb(port); | ||
70 | else if (is_pci_ioaddr(port)) | ||
71 | v = ctrl_inb(pci_ioaddr(port)); | ||
72 | else | ||
73 | v = ctrl_inw(port2adr(port)) & 0xff; | ||
74 | |||
75 | ctrl_delay(); | ||
76 | |||
77 | return v; | ||
78 | } | ||
79 | |||
80 | u16 landisk_inw(unsigned long port) | ||
81 | { | ||
82 | if (PXSEG(port)) | ||
83 | return ctrl_inw(port); | ||
84 | else if (is_pci_ioaddr(port)) | ||
85 | return ctrl_inw(pci_ioaddr(port)); | ||
86 | else | ||
87 | maybebadio(port); | ||
88 | |||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | u32 landisk_inl(unsigned long port) | ||
93 | { | ||
94 | if (PXSEG(port)) | ||
95 | return ctrl_inl(port); | ||
96 | else if (is_pci_ioaddr(port)) | ||
97 | return ctrl_inl(pci_ioaddr(port)); | ||
98 | else | ||
99 | maybebadio(port); | ||
100 | |||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | void landisk_outb(u8 value, unsigned long port) | ||
105 | { | ||
106 | if (PXSEG(port)) | ||
107 | ctrl_outb(value, port); | ||
108 | else if (is_pci_ioaddr(port)) | ||
109 | ctrl_outb(value, pci_ioaddr(port)); | ||
110 | else | ||
111 | ctrl_outw(value, port2adr(port)); | ||
112 | } | ||
113 | |||
114 | void landisk_outb_p(u8 value, unsigned long port) | ||
115 | { | ||
116 | if (PXSEG(port)) | ||
117 | ctrl_outb(value, port); | ||
118 | else if (is_pci_ioaddr(port)) | ||
119 | ctrl_outb(value, pci_ioaddr(port)); | ||
120 | else | ||
121 | ctrl_outw(value, port2adr(port)); | ||
122 | ctrl_delay(); | ||
123 | } | ||
124 | |||
125 | void landisk_outw(u16 value, unsigned long port) | ||
126 | { | ||
127 | if (PXSEG(port)) | ||
128 | ctrl_outw(value, port); | ||
129 | else if (is_pci_ioaddr(port)) | ||
130 | ctrl_outw(value, pci_ioaddr(port)); | ||
131 | else | ||
132 | maybebadio(port); | ||
133 | } | ||
134 | |||
135 | void landisk_outl(u32 value, unsigned long port) | ||
136 | { | ||
137 | if (PXSEG(port)) | ||
138 | ctrl_outl(value, port); | ||
139 | else if (is_pci_ioaddr(port)) | ||
140 | ctrl_outl(value, pci_ioaddr(port)); | ||
141 | else | ||
142 | maybebadio(port); | ||
143 | } | ||
144 | |||
145 | void landisk_insb(unsigned long port, void *dst, unsigned long count) | ||
146 | { | ||
147 | volatile u16 *p; | ||
148 | u8 *buf = dst; | ||
149 | |||
150 | if (PXSEG(port)) { | ||
151 | while (count--) | ||
152 | *buf++ = *(volatile u8 *)port; | ||
153 | } else if (is_pci_ioaddr(port)) { | ||
154 | volatile u8 *bp = (volatile u8 *)pci_ioaddr(port); | ||
155 | |||
156 | while (count--) | ||
157 | *buf++ = *bp; | ||
158 | } else { | ||
159 | p = (volatile u16 *)port2adr(port); | ||
160 | while (count--) | ||
161 | *buf++ = *p & 0xff; | ||
162 | } | ||
163 | } | ||
164 | |||
165 | void landisk_insw(unsigned long port, void *dst, unsigned long count) | ||
166 | { | ||
167 | volatile u16 *p; | ||
168 | u16 *buf = dst; | ||
169 | |||
170 | if (PXSEG(port)) | ||
171 | p = (volatile u16 *)port; | ||
172 | else if (is_pci_ioaddr(port)) | ||
173 | p = (volatile u16 *)pci_ioaddr(port); | ||
174 | else | ||
175 | p = (volatile u16 *)port2adr(port); | ||
176 | while (count--) | ||
177 | *buf++ = *p; | ||
178 | } | ||
179 | |||
180 | void landisk_insl(unsigned long port, void *dst, unsigned long count) | ||
181 | { | ||
182 | u32 *buf = dst; | ||
183 | |||
184 | if (is_pci_ioaddr(port)) { | ||
185 | volatile u32 *p = (volatile u32 *)pci_ioaddr(port); | ||
186 | |||
187 | while (count--) | ||
188 | *buf++ = *p; | ||
189 | } else | ||
190 | maybebadio(port); | ||
191 | } | ||
192 | |||
193 | void landisk_outsb(unsigned long port, const void *src, unsigned long count) | ||
194 | { | ||
195 | volatile u16 *p; | ||
196 | const u8 *buf = src; | ||
197 | |||
198 | if (PXSEG(port)) | ||
199 | while (count--) | ||
200 | ctrl_outb(*buf++, port); | ||
201 | else if (is_pci_ioaddr(port)) { | ||
202 | volatile u8 *bp = (volatile u8 *)pci_ioaddr(port); | ||
203 | |||
204 | while (count--) | ||
205 | *bp = *buf++; | ||
206 | } else { | ||
207 | p = (volatile u16 *)port2adr(port); | ||
208 | while (count--) | ||
209 | *p = *buf++; | ||
210 | } | ||
211 | } | ||
212 | |||
213 | void landisk_outsw(unsigned long port, const void *src, unsigned long count) | ||
214 | { | ||
215 | volatile u16 *p; | ||
216 | const u16 *buf = src; | ||
217 | |||
218 | if (PXSEG(port)) | ||
219 | p = (volatile u16 *)port; | ||
220 | else if (is_pci_ioaddr(port)) | ||
221 | p = (volatile u16 *)pci_ioaddr(port); | ||
222 | else | ||
223 | p = (volatile u16 *)port2adr(port); | ||
224 | |||
225 | while (count--) | ||
226 | *p = *buf++; | ||
227 | } | ||
228 | |||
229 | void landisk_outsl(unsigned long port, const void *src, unsigned long count) | ||
230 | { | ||
231 | const u32 *buf = src; | ||
232 | |||
233 | if (is_pci_ioaddr(port)) { | ||
234 | volatile u32 *p = (volatile u32 *)pci_ioaddr(port); | ||
235 | |||
236 | while (count--) | ||
237 | *p = *buf++; | ||
238 | } else | ||
239 | maybebadio(port); | ||
240 | } | ||
241 | |||
242 | void __iomem *landisk_ioport_map(unsigned long port, unsigned int size) | ||
243 | { | ||
244 | if (PXSEG(port)) | ||
245 | return (void __iomem *)port; | ||
246 | else if (is_pci_ioaddr(port)) | ||
247 | return (void __iomem *)pci_ioaddr(port); | ||
248 | |||
249 | return (void __iomem *)port2adr(port); | ||
250 | } | ||
diff --git a/arch/sh/boards/landisk/irq.c b/arch/sh/boards/landisk/irq.c new file mode 100644 index 000000000000..a006d6443225 --- /dev/null +++ b/arch/sh/boards/landisk/irq.c | |||
@@ -0,0 +1,99 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/landisk/irq.c | ||
3 | * | ||
4 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel | ||
5 | * Based largely on io_se.c. | ||
6 | * | ||
7 | * I/O routine for I-O Data Device, Inc. LANDISK. | ||
8 | * | ||
9 | * Initial version only to support LAN access; some | ||
10 | * placeholder code from io_landisk.c left in with the | ||
11 | * expectation of later SuperIO and PCMCIA access. | ||
12 | */ | ||
13 | /* | ||
14 | * modified by kogiidena | ||
15 | * 2005.03.03 | ||
16 | */ | ||
17 | |||
18 | #include <linux/config.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/irq.h> | ||
21 | #include <asm/io.h> | ||
22 | #include <asm/irq.h> | ||
23 | #include <asm/landisk/iodata_landisk.h> | ||
24 | |||
25 | static void enable_landisk_irq(unsigned int irq); | ||
26 | static void disable_landisk_irq(unsigned int irq); | ||
27 | |||
28 | /* shutdown is same as "disable" */ | ||
29 | #define shutdown_landisk_irq disable_landisk_irq | ||
30 | |||
31 | static void ack_landisk_irq(unsigned int irq); | ||
32 | static void end_landisk_irq(unsigned int irq); | ||
33 | |||
34 | static unsigned int startup_landisk_irq(unsigned int irq) | ||
35 | { | ||
36 | enable_landisk_irq(irq); | ||
37 | return 0; /* never anything pending */ | ||
38 | } | ||
39 | |||
40 | static void disable_landisk_irq(unsigned int irq) | ||
41 | { | ||
42 | unsigned char val; | ||
43 | unsigned char mask = 0xff ^ (0x01 << (irq - 5)); | ||
44 | |||
45 | /* Set the priority in IPR to 0 */ | ||
46 | val = ctrl_inb(PA_IMASK); | ||
47 | val &= mask; | ||
48 | ctrl_outb(val, PA_IMASK); | ||
49 | } | ||
50 | |||
51 | static void enable_landisk_irq(unsigned int irq) | ||
52 | { | ||
53 | unsigned char val; | ||
54 | unsigned char value = (0x01 << (irq - 5)); | ||
55 | |||
56 | /* Set priority in IPR back to original value */ | ||
57 | val = ctrl_inb(PA_IMASK); | ||
58 | val |= value; | ||
59 | ctrl_outb(val, PA_IMASK); | ||
60 | } | ||
61 | |||
62 | static void ack_landisk_irq(unsigned int irq) | ||
63 | { | ||
64 | disable_landisk_irq(irq); | ||
65 | } | ||
66 | |||
67 | static void end_landisk_irq(unsigned int irq) | ||
68 | { | ||
69 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
70 | enable_landisk_irq(irq); | ||
71 | } | ||
72 | |||
73 | static struct hw_interrupt_type landisk_irq_type = { | ||
74 | .typename = "LANDISK IRQ", | ||
75 | .startup = startup_landisk_irq, | ||
76 | .shutdown = shutdown_landisk_irq, | ||
77 | .enable = enable_landisk_irq, | ||
78 | .disable = disable_landisk_irq, | ||
79 | .ack = ack_landisk_irq, | ||
80 | .end = end_landisk_irq | ||
81 | }; | ||
82 | |||
83 | static void make_landisk_irq(unsigned int irq) | ||
84 | { | ||
85 | disable_irq_nosync(irq); | ||
86 | irq_desc[irq].handler = &landisk_irq_type; | ||
87 | disable_landisk_irq(irq); | ||
88 | } | ||
89 | |||
90 | /* | ||
91 | * Initialize IRQ setting | ||
92 | */ | ||
93 | void __init init_landisk_IRQ(void) | ||
94 | { | ||
95 | int i; | ||
96 | |||
97 | for (i = 5; i < 14; i++) | ||
98 | make_landisk_irq(i); | ||
99 | } | ||
diff --git a/arch/sh/boards/landisk/landisk_pwb.c b/arch/sh/boards/landisk/landisk_pwb.c new file mode 100644 index 000000000000..e75cb578a28b --- /dev/null +++ b/arch/sh/boards/landisk/landisk_pwb.c | |||
@@ -0,0 +1,348 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/landisk/landisk_pwb.c -- driver for the Power control switch. | ||
3 | * | ||
4 | * This driver will also support the I-O DATA Device, Inc. LANDISK Board. | ||
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 | * Copylight (C) 2002 Atom Create Engineering Co., Ltd. | ||
11 | * | ||
12 | * LED control drive function added by kogiidena | ||
13 | */ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/errno.h> | ||
18 | #include <linux/signal.h> | ||
19 | #include <linux/major.h> | ||
20 | #include <linux/poll.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/delay.h> | ||
23 | #include <linux/sched.h> | ||
24 | #include <linux/timer.h> | ||
25 | #include <linux/interrupt.h> | ||
26 | |||
27 | #include <asm/system.h> | ||
28 | #include <asm/io.h> | ||
29 | #include <asm/irq.h> | ||
30 | #include <asm/uaccess.h> | ||
31 | #include <asm/landisk/iodata_landisk.h> | ||
32 | |||
33 | #define SHUTDOWN_BTN_MINOR 1 /* Shutdown button device minor no. */ | ||
34 | #define LED_MINOR 21 /* LED minor no. */ | ||
35 | #define BTN_MINOR 22 /* BUTTON minor no. */ | ||
36 | #define GIO_MINOR 40 /* GIO minor no. */ | ||
37 | |||
38 | static int openCnt; | ||
39 | static int openCntLED; | ||
40 | static int openCntGio; | ||
41 | static int openCntBtn; | ||
42 | static int landisk_btn; | ||
43 | static int landisk_btnctrlpid; | ||
44 | /* | ||
45 | * Functions prototypes | ||
46 | */ | ||
47 | |||
48 | static int gio_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | ||
49 | unsigned long arg); | ||
50 | |||
51 | static int swdrv_open(struct inode *inode, struct file *filp) | ||
52 | { | ||
53 | int minor; | ||
54 | |||
55 | minor = MINOR(inode->i_rdev); | ||
56 | filp->private_data = (void *)minor; | ||
57 | |||
58 | if (minor == SHUTDOWN_BTN_MINOR) { | ||
59 | if (openCnt > 0) { | ||
60 | return -EALREADY; | ||
61 | } else { | ||
62 | openCnt++; | ||
63 | return 0; | ||
64 | } | ||
65 | } else if (minor == LED_MINOR) { | ||
66 | if (openCntLED > 0) { | ||
67 | return -EALREADY; | ||
68 | } else { | ||
69 | openCntLED++; | ||
70 | return 0; | ||
71 | } | ||
72 | } else if (minor == BTN_MINOR) { | ||
73 | if (openCntBtn > 0) { | ||
74 | return -EALREADY; | ||
75 | } else { | ||
76 | openCntBtn++; | ||
77 | return 0; | ||
78 | } | ||
79 | } else if (minor == GIO_MINOR) { | ||
80 | if (openCntGio > 0) { | ||
81 | return -EALREADY; | ||
82 | } else { | ||
83 | openCntGio++; | ||
84 | return 0; | ||
85 | } | ||
86 | } | ||
87 | return -ENOENT; | ||
88 | |||
89 | } | ||
90 | |||
91 | static int swdrv_close(struct inode *inode, struct file *filp) | ||
92 | { | ||
93 | int minor; | ||
94 | |||
95 | minor = MINOR(inode->i_rdev); | ||
96 | if (minor == SHUTDOWN_BTN_MINOR) { | ||
97 | openCnt--; | ||
98 | } else if (minor == LED_MINOR) { | ||
99 | openCntLED--; | ||
100 | } else if (minor == BTN_MINOR) { | ||
101 | openCntBtn--; | ||
102 | } else if (minor == GIO_MINOR) { | ||
103 | openCntGio--; | ||
104 | } | ||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | static int swdrv_read(struct file *filp, char *buff, size_t count, | ||
109 | loff_t * ppos) | ||
110 | { | ||
111 | int minor; | ||
112 | minor = (int)(filp->private_data); | ||
113 | |||
114 | if (!access_ok(VERIFY_WRITE, (void *)buff, count)) | ||
115 | return -EFAULT; | ||
116 | |||
117 | if (minor == SHUTDOWN_BTN_MINOR) { | ||
118 | if (landisk_btn & 0x10) { | ||
119 | put_user(1, buff); | ||
120 | return 1; | ||
121 | } else { | ||
122 | return 0; | ||
123 | } | ||
124 | } | ||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | static int swdrv_write(struct file *filp, const char *buff, size_t count, | ||
129 | loff_t * ppos) | ||
130 | { | ||
131 | int minor; | ||
132 | minor = (int)(filp->private_data); | ||
133 | |||
134 | if (minor == SHUTDOWN_BTN_MINOR) { | ||
135 | return count; | ||
136 | } | ||
137 | return count; | ||
138 | } | ||
139 | |||
140 | static irqreturn_t sw_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
141 | { | ||
142 | landisk_btn = (0x0ff & (~ctrl_inb(PA_STATUS))); | ||
143 | disable_irq(IRQ_BUTTON); | ||
144 | disable_irq(IRQ_POWER); | ||
145 | ctrl_outb(0x00, PA_PWRINT_CLR); | ||
146 | |||
147 | if (landisk_btnctrlpid != 0) { | ||
148 | kill_proc(landisk_btnctrlpid, SIGUSR1, 1); | ||
149 | landisk_btnctrlpid = 0; | ||
150 | } | ||
151 | |||
152 | return IRQ_HANDLED; | ||
153 | } | ||
154 | |||
155 | static struct file_operations swdrv_fops = { | ||
156 | .read = swdrv_read, /* read */ | ||
157 | .write = swdrv_write, /* write */ | ||
158 | .open = swdrv_open, /* open */ | ||
159 | .release = swdrv_close, /* release */ | ||
160 | .ioctl = gio_ioctl, /* ioctl */ | ||
161 | |||
162 | }; | ||
163 | |||
164 | static char banner[] __initdata = | ||
165 | KERN_INFO "LANDISK and USL-5P Button, LED and GIO driver initialized\n"; | ||
166 | |||
167 | int __init swdrv_init(void) | ||
168 | { | ||
169 | int error; | ||
170 | |||
171 | printk("%s", banner); | ||
172 | |||
173 | openCnt = 0; | ||
174 | openCntLED = 0; | ||
175 | openCntBtn = 0; | ||
176 | openCntGio = 0; | ||
177 | landisk_btn = 0; | ||
178 | landisk_btnctrlpid = 0; | ||
179 | |||
180 | if ((error = register_chrdev(SHUTDOWN_BTN_MAJOR, "swdrv", &swdrv_fops))) { | ||
181 | printk(KERN_ERR | ||
182 | "Button, LED and GIO driver:Couldn't register driver, error=%d\n", | ||
183 | error); | ||
184 | return 1; | ||
185 | } | ||
186 | |||
187 | if (request_irq(IRQ_POWER, sw_interrupt, 0, "SHUTDOWNSWITCH", NULL)) { | ||
188 | printk(KERN_ERR "Unable to get IRQ 11.\n"); | ||
189 | return 1; | ||
190 | } | ||
191 | if (request_irq(IRQ_BUTTON, sw_interrupt, 0, "USL-5P BUTTON", NULL)) { | ||
192 | printk(KERN_ERR "Unable to get IRQ 12.\n"); | ||
193 | return 1; | ||
194 | } | ||
195 | ctrl_outb(0x00, PA_PWRINT_CLR); | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | module_init(swdrv_init); | ||
201 | |||
202 | /* | ||
203 | * gio driver | ||
204 | * | ||
205 | */ | ||
206 | |||
207 | #include <asm/landisk/gio.h> | ||
208 | |||
209 | static int gio_ioctl(struct inode *inode, struct file *filp, | ||
210 | unsigned int cmd, unsigned long arg) | ||
211 | { | ||
212 | int minor; | ||
213 | unsigned int data, mask; | ||
214 | static unsigned int addr = 0; | ||
215 | |||
216 | minor = (int)(filp->private_data); | ||
217 | |||
218 | /* access control */ | ||
219 | if (minor == GIO_MINOR) { | ||
220 | ; | ||
221 | } else if (minor == LED_MINOR) { | ||
222 | if (((cmd & 0x0ff) >= 9) && ((cmd & 0x0ff) < 20)) { | ||
223 | ; | ||
224 | } else { | ||
225 | return -EINVAL; | ||
226 | } | ||
227 | } else if (minor == BTN_MINOR) { | ||
228 | if (((cmd & 0x0ff) >= 20) && ((cmd & 0x0ff) < 30)) { | ||
229 | ; | ||
230 | } else { | ||
231 | return -EINVAL; | ||
232 | } | ||
233 | } else { | ||
234 | return -EINVAL; | ||
235 | } | ||
236 | |||
237 | if (cmd & 0x01) { /* write */ | ||
238 | if (copy_from_user(&data, (int *)arg, sizeof(int))) { | ||
239 | return -EFAULT; | ||
240 | } | ||
241 | } | ||
242 | |||
243 | switch (cmd) { | ||
244 | case GIODRV_IOCSGIOSETADDR: /* addres set */ | ||
245 | addr = data; | ||
246 | break; | ||
247 | |||
248 | case GIODRV_IOCSGIODATA1: /* write byte */ | ||
249 | ctrl_outb((unsigned char)(0x0ff & data), addr); | ||
250 | break; | ||
251 | |||
252 | case GIODRV_IOCSGIODATA2: /* write word */ | ||
253 | if (addr & 0x01) { | ||
254 | return -EFAULT; | ||
255 | } | ||
256 | ctrl_outw((unsigned short int)(0x0ffff & data), addr); | ||
257 | break; | ||
258 | |||
259 | case GIODRV_IOCSGIODATA4: /* write long */ | ||
260 | if (addr & 0x03) { | ||
261 | return -EFAULT; | ||
262 | } | ||
263 | ctrl_outl(data, addr); | ||
264 | break; | ||
265 | |||
266 | case GIODRV_IOCGGIODATA1: /* read byte */ | ||
267 | data = ctrl_inb(addr); | ||
268 | break; | ||
269 | |||
270 | case GIODRV_IOCGGIODATA2: /* read word */ | ||
271 | if (addr & 0x01) { | ||
272 | return -EFAULT; | ||
273 | } | ||
274 | data = ctrl_inw(addr); | ||
275 | break; | ||
276 | |||
277 | case GIODRV_IOCGGIODATA4: /* read long */ | ||
278 | if (addr & 0x03) { | ||
279 | return -EFAULT; | ||
280 | } | ||
281 | data = ctrl_inl(addr); | ||
282 | break; | ||
283 | case GIODRV_IOCSGIO_LED: /* write */ | ||
284 | mask = ((data & 0x00ffffff) << 8) | ||
285 | | ((data & 0x0000ffff) << 16) | ||
286 | | ((data & 0x000000ff) << 24); | ||
287 | landisk_ledparam = data & (~mask); | ||
288 | if (landisk_arch == 0) { /* arch == landisk */ | ||
289 | landisk_ledparam &= 0x03030303; | ||
290 | mask = (~(landisk_ledparam >> 22)) & 0x000c; | ||
291 | landisk_ledparam |= mask; | ||
292 | } else { /* arch == usl-5p */ | ||
293 | mask = (landisk_ledparam >> 24) & 0x0001; | ||
294 | landisk_ledparam |= mask; | ||
295 | landisk_ledparam &= 0x007f7f7f; | ||
296 | } | ||
297 | landisk_ledparam |= 0x80; | ||
298 | break; | ||
299 | case GIODRV_IOCGGIO_LED: /* read */ | ||
300 | data = landisk_ledparam; | ||
301 | if (landisk_arch == 0) { /* arch == landisk */ | ||
302 | data &= 0x03030303; | ||
303 | } else { /* arch == usl-5p */ | ||
304 | ; | ||
305 | } | ||
306 | data &= (~0x080); | ||
307 | break; | ||
308 | case GIODRV_IOCSGIO_BUZZER: /* write */ | ||
309 | landisk_buzzerparam = data; | ||
310 | landisk_ledparam |= 0x80; | ||
311 | break; | ||
312 | case GIODRV_IOCGGIO_LANDISK: /* read */ | ||
313 | data = landisk_arch & 0x01; | ||
314 | break; | ||
315 | case GIODRV_IOCGGIO_BTN: /* read */ | ||
316 | data = (0x0ff & ctrl_inb(PA_PWRINT_CLR)); | ||
317 | data <<= 8; | ||
318 | data |= (0x0ff & ctrl_inb(PA_IMASK)); | ||
319 | data <<= 8; | ||
320 | data |= (0x0ff & landisk_btn); | ||
321 | data <<= 8; | ||
322 | data |= (0x0ff & (~ctrl_inb(PA_STATUS))); | ||
323 | break; | ||
324 | case GIODRV_IOCSGIO_BTNPID: /* write */ | ||
325 | landisk_btnctrlpid = data; | ||
326 | landisk_btn = 0; | ||
327 | if (irq_desc[IRQ_BUTTON].depth) { | ||
328 | enable_irq(IRQ_BUTTON); | ||
329 | } | ||
330 | if (irq_desc[IRQ_POWER].depth) { | ||
331 | enable_irq(IRQ_POWER); | ||
332 | } | ||
333 | break; | ||
334 | case GIODRV_IOCGGIO_BTNPID: /* read */ | ||
335 | data = landisk_btnctrlpid; | ||
336 | break; | ||
337 | default: | ||
338 | return -EFAULT; | ||
339 | break; | ||
340 | } | ||
341 | |||
342 | if ((cmd & 0x01) == 0) { /* read */ | ||
343 | if (copy_to_user((int *)arg, &data, sizeof(int))) { | ||
344 | return -EFAULT; | ||
345 | } | ||
346 | } | ||
347 | return 0; | ||
348 | } | ||
diff --git a/arch/sh/boards/landisk/rtc.c b/arch/sh/boards/landisk/rtc.c new file mode 100644 index 000000000000..35ba726a0979 --- /dev/null +++ b/arch/sh/boards/landisk/rtc.c | |||
@@ -0,0 +1,93 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/landisk/rtc.c -- RTC support | ||
3 | * | ||
4 | * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> | ||
5 | * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka | ||
6 | */ | ||
7 | /* | ||
8 | * modifed by kogiidena | ||
9 | * 2005.09.16 | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/sched.h> | ||
16 | #include <linux/time.h> | ||
17 | #include <linux/delay.h> | ||
18 | #include <linux/spinlock.h> | ||
19 | #include <linux/bcd.h> | ||
20 | #include <asm/rtc.h> | ||
21 | |||
22 | extern spinlock_t rtc_lock; | ||
23 | |||
24 | extern void | ||
25 | rs5c313_set_cmos_time(unsigned int BCD_yr, unsigned int BCD_mon, | ||
26 | unsigned int BCD_day, unsigned int BCD_hr, | ||
27 | unsigned int BCD_min, unsigned int BCD_sec); | ||
28 | |||
29 | extern unsigned long | ||
30 | rs5c313_get_cmos_time(unsigned int *BCD_yr, unsigned int *BCD_mon, | ||
31 | unsigned int *BCD_day, unsigned int *BCD_hr, | ||
32 | unsigned int *BCD_min, unsigned int *BCD_sec); | ||
33 | |||
34 | void landisk_rtc_gettimeofday(struct timespec *tv) | ||
35 | { | ||
36 | unsigned int BCD_yr, BCD_mon, BCD_day, BCD_hr, BCD_min, BCD_sec; | ||
37 | unsigned long flags; | ||
38 | |||
39 | spin_lock_irqsave(&rtc_lock, flags); | ||
40 | tv->tv_sec = rs5c313_get_cmos_time | ||
41 | (&BCD_yr, &BCD_mon, &BCD_day, &BCD_hr, &BCD_min, &BCD_sec); | ||
42 | tv->tv_nsec = 0; | ||
43 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
44 | } | ||
45 | |||
46 | int landisk_rtc_settimeofday(const time_t secs) | ||
47 | { | ||
48 | int retval = 0; | ||
49 | int real_seconds, real_minutes, cmos_minutes; | ||
50 | unsigned long flags; | ||
51 | unsigned long nowtime = secs; | ||
52 | unsigned int BCD_yr, BCD_mon, BCD_day, BCD_hr, BCD_min, BCD_sec; | ||
53 | |||
54 | spin_lock_irqsave(&rtc_lock, flags); | ||
55 | |||
56 | rs5c313_get_cmos_time | ||
57 | (&BCD_yr, &BCD_mon, &BCD_day, &BCD_hr, &BCD_min, &BCD_sec); | ||
58 | cmos_minutes = BCD_min; | ||
59 | BCD_TO_BIN(cmos_minutes); | ||
60 | |||
61 | /* | ||
62 | * since we're only adjusting minutes and seconds, | ||
63 | * don't interfere with hour overflow. This avoids | ||
64 | * messing with unknown time zones but requires your | ||
65 | * RTC not to be off by more than 15 minutes | ||
66 | */ | ||
67 | real_seconds = nowtime % 60; | ||
68 | real_minutes = nowtime / 60; | ||
69 | if (((abs(real_minutes - cmos_minutes) + 15) / 30) & 1) | ||
70 | real_minutes += 30; /* correct for half hour time zone */ | ||
71 | real_minutes %= 60; | ||
72 | |||
73 | if (abs(real_minutes - cmos_minutes) < 30) { | ||
74 | BIN_TO_BCD(real_seconds); | ||
75 | BIN_TO_BCD(real_minutes); | ||
76 | rs5c313_set_cmos_time(BCD_yr, BCD_mon, BCD_day, BCD_hr, | ||
77 | real_minutes, real_seconds); | ||
78 | } else { | ||
79 | printk(KERN_WARNING | ||
80 | "set_rtc_time: can't update from %d to %d\n", | ||
81 | cmos_minutes, real_minutes); | ||
82 | retval = -1; | ||
83 | } | ||
84 | |||
85 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
86 | return retval; | ||
87 | } | ||
88 | |||
89 | void landisk_time_init(void) | ||
90 | { | ||
91 | rtc_sh_get_time = landisk_rtc_gettimeofday; | ||
92 | rtc_sh_set_time = landisk_rtc_settimeofday; | ||
93 | } | ||
diff --git a/arch/sh/boards/landisk/setup.c b/arch/sh/boards/landisk/setup.c new file mode 100644 index 000000000000..127b9e020e00 --- /dev/null +++ b/arch/sh/boards/landisk/setup.c | |||
@@ -0,0 +1,177 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/landisk/setup.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Kazumoto Kojima | ||
5 | * Copyright (C) 2002 Paul Mundt | ||
6 | * | ||
7 | * I-O DATA Device, Inc. LANDISK Support. | ||
8 | * | ||
9 | * Modified for LANDISK by | ||
10 | * Atom Create Engineering Co., Ltd. 2002. | ||
11 | * | ||
12 | * modifed by kogiidena | ||
13 | * 2005.09.16 | ||
14 | * | ||
15 | * This file is subject to the terms and conditions of the GNU General Public | ||
16 | * License. See the file "COPYING" in the main directory of this archive | ||
17 | * for more details. | ||
18 | */ | ||
19 | #include <linux/config.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/pm.h> | ||
22 | #include <linux/mm.h> | ||
23 | #include <asm/machvec.h> | ||
24 | #include <asm/rtc.h> | ||
25 | #include <asm/landisk/iodata_landisk.h> | ||
26 | #include <asm/io.h> | ||
27 | |||
28 | void landisk_time_init(void); | ||
29 | void init_landisk_IRQ(void); | ||
30 | |||
31 | int landisk_ledparam; | ||
32 | int landisk_buzzerparam; | ||
33 | int landisk_arch; | ||
34 | |||
35 | /* cycle the led's in the clasic knightrider/sun pattern */ | ||
36 | static void heartbeat_landisk(void) | ||
37 | { | ||
38 | static unsigned int cnt = 0, blink = 0x00, period = 25; | ||
39 | volatile u8 *p = (volatile u8 *)PA_LED; | ||
40 | char data; | ||
41 | |||
42 | if ((landisk_ledparam & 0x080) == 0) | ||
43 | return; | ||
44 | |||
45 | cnt += 1; | ||
46 | |||
47 | if (cnt < period) | ||
48 | return; | ||
49 | |||
50 | cnt = 0; | ||
51 | blink++; | ||
52 | |||
53 | data = (blink & 0x01) ? (landisk_ledparam >> 16) : 0; | ||
54 | data |= (blink & 0x02) ? (landisk_ledparam >> 8) : 0; | ||
55 | data |= landisk_ledparam; | ||
56 | |||
57 | /* buzzer */ | ||
58 | if (landisk_buzzerparam & 0x1) { | ||
59 | data |= 0x80; | ||
60 | } else { | ||
61 | data &= 0x7f; | ||
62 | } | ||
63 | *p = data; | ||
64 | |||
65 | if (((landisk_ledparam & 0x007f7f00) == 0) && | ||
66 | (landisk_buzzerparam == 0)) | ||
67 | landisk_ledparam &= (~0x0080); | ||
68 | |||
69 | landisk_buzzerparam >>= 1; | ||
70 | } | ||
71 | |||
72 | static void landisk_power_off(void) | ||
73 | { | ||
74 | ctrl_outb(0x01, PA_SHUTDOWN); | ||
75 | } | ||
76 | |||
77 | static void check_usl5p(void) | ||
78 | { | ||
79 | volatile u8 *p = (volatile u8 *)PA_LED; | ||
80 | u8 tmp1, tmp2; | ||
81 | |||
82 | tmp1 = *p; | ||
83 | *p = 0x40; | ||
84 | tmp2 = *p; | ||
85 | *p = tmp1; | ||
86 | |||
87 | landisk_arch = (tmp2 == 0x40); | ||
88 | if (landisk_arch == 1) { | ||
89 | /* arch == usl-5p */ | ||
90 | landisk_ledparam = 0x00000380; | ||
91 | landisk_ledparam |= (tmp1 & 0x07c); | ||
92 | } else { | ||
93 | /* arch == landisk */ | ||
94 | landisk_ledparam = 0x02000180; | ||
95 | landisk_ledparam |= 0x04; | ||
96 | } | ||
97 | } | ||
98 | |||
99 | void *area5_io_base; | ||
100 | void *area6_io_base; | ||
101 | |||
102 | static int __init landisk_cf_init(void) | ||
103 | { | ||
104 | pgprot_t prot; | ||
105 | unsigned long paddrbase, psize; | ||
106 | |||
107 | /* open I/O area window */ | ||
108 | paddrbase = virt_to_phys((void *)PA_AREA5_IO); | ||
109 | psize = PAGE_SIZE; | ||
110 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); | ||
111 | area5_io_base = p3_ioremap(paddrbase, psize, prot.pgprot); | ||
112 | if (!area5_io_base) { | ||
113 | printk("allocate_cf_area : can't open CF I/O window!\n"); | ||
114 | return -ENOMEM; | ||
115 | } | ||
116 | |||
117 | paddrbase = virt_to_phys((void *)PA_AREA6_IO); | ||
118 | psize = PAGE_SIZE; | ||
119 | prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16); | ||
120 | area6_io_base = p3_ioremap(paddrbase, psize, prot.pgprot); | ||
121 | if (!area6_io_base) { | ||
122 | printk("allocate_cf_area : can't open HDD I/O window!\n"); | ||
123 | return -ENOMEM; | ||
124 | } | ||
125 | |||
126 | printk(KERN_INFO "Allocate Area5/6 success.\n"); | ||
127 | |||
128 | /* XXX : do we need attribute and common-memory area also? */ | ||
129 | |||
130 | return 0; | ||
131 | } | ||
132 | |||
133 | static void __init landisk_setup(char **cmdline_p) | ||
134 | { | ||
135 | device_initcall(landisk_cf_init); | ||
136 | |||
137 | landisk_buzzerparam = 0; | ||
138 | check_usl5p(); | ||
139 | |||
140 | printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); | ||
141 | |||
142 | board_time_init = landisk_time_init; | ||
143 | pm_power_off = landisk_power_off; | ||
144 | } | ||
145 | |||
146 | /* | ||
147 | * The Machine Vector | ||
148 | */ | ||
149 | struct sh_machine_vector mv_landisk __initmv = { | ||
150 | .mv_name = "LANDISK", | ||
151 | .mv_setup = landisk_setup, | ||
152 | .mv_nr_irqs = 72, | ||
153 | .mv_inb = landisk_inb, | ||
154 | .mv_inw = landisk_inw, | ||
155 | .mv_inl = landisk_inl, | ||
156 | .mv_outb = landisk_outb, | ||
157 | .mv_outw = landisk_outw, | ||
158 | .mv_outl = landisk_outl, | ||
159 | .mv_inb_p = landisk_inb_p, | ||
160 | .mv_inw_p = landisk_inw, | ||
161 | .mv_inl_p = landisk_inl, | ||
162 | .mv_outb_p = landisk_outb_p, | ||
163 | .mv_outw_p = landisk_outw, | ||
164 | .mv_outl_p = landisk_outl, | ||
165 | .mv_insb = landisk_insb, | ||
166 | .mv_insw = landisk_insw, | ||
167 | .mv_insl = landisk_insl, | ||
168 | .mv_outsb = landisk_outsb, | ||
169 | .mv_outsw = landisk_outsw, | ||
170 | .mv_outsl = landisk_outsl, | ||
171 | .mv_ioport_map = landisk_ioport_map, | ||
172 | .mv_init_irq = init_landisk_IRQ, | ||
173 | #ifdef CONFIG_HEARTBEAT | ||
174 | .mv_heartbeat = heartbeat_landisk, | ||
175 | #endif | ||
176 | }; | ||
177 | ALIAS_MV(landisk) | ||
diff --git a/arch/sh/boards/mpc1211/rtc.c b/arch/sh/boards/mpc1211/rtc.c index a76c655dceee..03b123a4bba4 100644 --- a/arch/sh/boards/mpc1211/rtc.c +++ b/arch/sh/boards/mpc1211/rtc.c | |||
@@ -130,7 +130,7 @@ int mpc1211_rtc_settimeofday(const struct timeval *tv) | |||
130 | 130 | ||
131 | void mpc1211_time_init(void) | 131 | void mpc1211_time_init(void) |
132 | { | 132 | { |
133 | rtc_get_time = mpc1211_rtc_gettimeofday; | 133 | rtc_sh_get_time = mpc1211_rtc_gettimeofday; |
134 | rtc_set_time = mpc1211_rtc_settimeofday; | 134 | rtc_sh_set_time = mpc1211_rtc_settimeofday; |
135 | } | 135 | } |
136 | 136 | ||
diff --git a/arch/sh/boards/mpc1211/setup.c b/arch/sh/boards/mpc1211/setup.c index 2bfb221cc35c..8eb5d4303972 100644 --- a/arch/sh/boards/mpc1211/setup.c +++ b/arch/sh/boards/mpc1211/setup.c | |||
@@ -10,14 +10,12 @@ | |||
10 | #include <linux/hdreg.h> | 10 | #include <linux/hdreg.h> |
11 | #include <linux/ide.h> | 11 | #include <linux/ide.h> |
12 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
13 | |||
14 | #include <asm/io.h> | 13 | #include <asm/io.h> |
15 | #include <asm/machvec.h> | 14 | #include <asm/machvec.h> |
16 | #include <asm/mpc1211/mpc1211.h> | 15 | #include <asm/mpc1211/mpc1211.h> |
17 | #include <asm/mpc1211/pci.h> | 16 | #include <asm/mpc1211/pci.h> |
18 | #include <asm/mpc1211/m1543c.h> | 17 | #include <asm/mpc1211/m1543c.h> |
19 | 18 | ||
20 | |||
21 | /* ALI15X3 SMBus address offsets */ | 19 | /* ALI15X3 SMBus address offsets */ |
22 | #define SMBHSTSTS (0 + 0x3100) | 20 | #define SMBHSTSTS (0 + 0x3100) |
23 | #define SMBHSTCNT (1 + 0x3100) | 21 | #define SMBHSTCNT (1 + 0x3100) |
@@ -50,11 +48,6 @@ | |||
50 | #define ALI15X3_STS_TERM 0x80 /* terminated by abort */ | 48 | #define ALI15X3_STS_TERM 0x80 /* terminated by abort */ |
51 | #define ALI15X3_STS_ERR 0xE0 /* all the bad error bits */ | 49 | #define ALI15X3_STS_ERR 0xE0 /* all the bad error bits */ |
52 | 50 | ||
53 | const char *get_system_type(void) | ||
54 | { | ||
55 | return "Interface MPC-1211(CTP/PCI/MPC-SH02)"; | ||
56 | } | ||
57 | |||
58 | static void __init pci_write_config(unsigned long busNo, | 51 | static void __init pci_write_config(unsigned long busNo, |
59 | unsigned long devNo, | 52 | unsigned long devNo, |
60 | unsigned long fncNo, | 53 | unsigned long fncNo, |
@@ -80,9 +73,6 @@ volatile unsigned long irq_err_count; | |||
80 | 73 | ||
81 | static void disable_mpc1211_irq(unsigned int irq) | 74 | static void disable_mpc1211_irq(unsigned int irq) |
82 | { | 75 | { |
83 | unsigned long flags; | ||
84 | |||
85 | save_and_cli(flags); | ||
86 | if( irq < 8) { | 76 | if( irq < 8) { |
87 | m_irq_mask |= (1 << irq); | 77 | m_irq_mask |= (1 << irq); |
88 | outb(m_irq_mask,I8259_M_MR); | 78 | outb(m_irq_mask,I8259_M_MR); |
@@ -90,16 +80,11 @@ static void disable_mpc1211_irq(unsigned int irq) | |||
90 | s_irq_mask |= (1 << (irq - 8)); | 80 | s_irq_mask |= (1 << (irq - 8)); |
91 | outb(s_irq_mask,I8259_S_MR); | 81 | outb(s_irq_mask,I8259_S_MR); |
92 | } | 82 | } |
93 | restore_flags(flags); | ||
94 | 83 | ||
95 | } | 84 | } |
96 | 85 | ||
97 | static void enable_mpc1211_irq(unsigned int irq) | 86 | static void enable_mpc1211_irq(unsigned int irq) |
98 | { | 87 | { |
99 | unsigned long flags; | ||
100 | |||
101 | save_and_cli(flags); | ||
102 | |||
103 | if( irq < 8) { | 88 | if( irq < 8) { |
104 | m_irq_mask &= ~(1 << irq); | 89 | m_irq_mask &= ~(1 << irq); |
105 | outb(m_irq_mask,I8259_M_MR); | 90 | outb(m_irq_mask,I8259_M_MR); |
@@ -107,7 +92,6 @@ static void enable_mpc1211_irq(unsigned int irq) | |||
107 | s_irq_mask &= ~(1 << (irq - 8)); | 92 | s_irq_mask &= ~(1 << (irq - 8)); |
108 | outb(s_irq_mask,I8259_S_MR); | 93 | outb(s_irq_mask,I8259_S_MR); |
109 | } | 94 | } |
110 | restore_flags(flags); | ||
111 | } | 95 | } |
112 | 96 | ||
113 | static inline int mpc1211_irq_real(unsigned int irq) | 97 | static inline int mpc1211_irq_real(unsigned int irq) |
@@ -131,10 +115,6 @@ static inline int mpc1211_irq_real(unsigned int irq) | |||
131 | 115 | ||
132 | static void mask_and_ack_mpc1211(unsigned int irq) | 116 | static void mask_and_ack_mpc1211(unsigned int irq) |
133 | { | 117 | { |
134 | unsigned long flags; | ||
135 | |||
136 | save_and_cli(flags); | ||
137 | |||
138 | if(irq < 8) { | 118 | if(irq < 8) { |
139 | if(m_irq_mask & (1<<irq)){ | 119 | if(m_irq_mask & (1<<irq)){ |
140 | if(!mpc1211_irq_real(irq)){ | 120 | if(!mpc1211_irq_real(irq)){ |
@@ -162,7 +142,6 @@ static void mask_and_ack_mpc1211(unsigned int irq) | |||
162 | outb(0x60+(irq-8),I8259_S_CR); /* EOI */ | 142 | outb(0x60+(irq-8),I8259_S_CR); /* EOI */ |
163 | outb(0x60+2,I8259_M_CR); | 143 | outb(0x60+2,I8259_M_CR); |
164 | } | 144 | } |
165 | restore_flags(flags); | ||
166 | } | 145 | } |
167 | 146 | ||
168 | static void end_mpc1211_irq(unsigned int irq) | 147 | static void end_mpc1211_irq(unsigned int irq) |
@@ -219,7 +198,7 @@ int mpc1211_irq_demux(int irq) | |||
219 | return irq; | 198 | return irq; |
220 | } | 199 | } |
221 | 200 | ||
222 | void __init init_mpc1211_IRQ(void) | 201 | static void __init init_mpc1211_IRQ(void) |
223 | { | 202 | { |
224 | int i; | 203 | int i; |
225 | /* | 204 | /* |
@@ -255,23 +234,12 @@ void __init init_mpc1211_IRQ(void) | |||
255 | } | 234 | } |
256 | } | 235 | } |
257 | 236 | ||
258 | /* | 237 | static void delay1000(void) |
259 | Initialize the board | ||
260 | */ | ||
261 | |||
262 | |||
263 | static void delay (void) | ||
264 | { | ||
265 | volatile unsigned short tmp; | ||
266 | tmp = *(volatile unsigned short *) 0xa0000000; | ||
267 | } | ||
268 | |||
269 | static void delay1000 (void) | ||
270 | { | 238 | { |
271 | int i; | 239 | int i; |
272 | 240 | ||
273 | for (i=0; i<1000; i++) | 241 | for (i=0; i<1000; i++) |
274 | delay (); | 242 | ctrl_delay(); |
275 | } | 243 | } |
276 | 244 | ||
277 | static int put_smb_blk(unsigned char *p, int address, int command, int no) | 245 | static int put_smb_blk(unsigned char *p, int address, int command, int no) |
@@ -314,26 +282,10 @@ static int put_smb_blk(unsigned char *p, int address, int command, int no) | |||
314 | return 0; | 282 | return 0; |
315 | } | 283 | } |
316 | 284 | ||
317 | /* | ||
318 | * The Machine Vector | ||
319 | */ | ||
320 | |||
321 | struct sh_machine_vector mv_mpc1211 __initmv = { | ||
322 | .mv_nr_irqs = 48, | ||
323 | .mv_irq_demux = mpc1211_irq_demux, | ||
324 | .mv_init_irq = init_mpc1211_IRQ, | ||
325 | |||
326 | #ifdef CONFIG_HEARTBEAT | ||
327 | .mv_heartbeat = heartbeat_mpc1211, | ||
328 | #endif | ||
329 | }; | ||
330 | |||
331 | ALIAS_MV(mpc1211) | ||
332 | |||
333 | /* arch/sh/boards/mpc1211/rtc.c */ | 285 | /* arch/sh/boards/mpc1211/rtc.c */ |
334 | void mpc1211_time_init(void); | 286 | void mpc1211_time_init(void); |
335 | 287 | ||
336 | int __init platform_setup(void) | 288 | static void __init mpc1211_setup(char **cmdline_p) |
337 | { | 289 | { |
338 | unsigned char spd_buf[128]; | 290 | unsigned char spd_buf[128]; |
339 | 291 | ||
@@ -357,3 +309,18 @@ int __init platform_setup(void) | |||
357 | return 0; | 309 | return 0; |
358 | } | 310 | } |
359 | 311 | ||
312 | /* | ||
313 | * The Machine Vector | ||
314 | */ | ||
315 | struct sh_machine_vector mv_mpc1211 __initmv = { | ||
316 | .mv_name = "Interface MPC-1211(CTP/PCI/MPC-SH02)", | ||
317 | .mv_setup = mpc1211_setup, | ||
318 | .mv_nr_irqs = 48, | ||
319 | .mv_irq_demux = mpc1211_irq_demux, | ||
320 | .mv_init_irq = init_mpc1211_IRQ, | ||
321 | |||
322 | #ifdef CONFIG_HEARTBEAT | ||
323 | .mv_heartbeat = heartbeat_mpc1211, | ||
324 | #endif | ||
325 | }; | ||
326 | ALIAS_MV(mpc1211) | ||
diff --git a/arch/sh/boards/overdrive/Makefile b/arch/sh/boards/overdrive/Makefile deleted file mode 100644 index 245f03baf762..000000000000 --- a/arch/sh/boards/overdrive/Makefile +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the STMicroelectronics Overdrive specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := mach.o setup.o io.o irq.o led.o | ||
6 | |||
7 | obj-$(CONFIG_PCI) += fpga.o galileo.o pcidma.o | ||
8 | |||
diff --git a/arch/sh/boards/overdrive/fpga.c b/arch/sh/boards/overdrive/fpga.c deleted file mode 100644 index 956c23901228..000000000000 --- a/arch/sh/boards/overdrive/fpga.c +++ /dev/null | |||
@@ -1,133 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 David J. Mckay (david.mckay@st.com) | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * This file handles programming up the Altera Flex10K that interfaces to | ||
8 | * the Galileo, and does the PS/2 keyboard and mouse | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/smp.h> | ||
15 | #include <linux/smp_lock.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/errno.h> | ||
18 | #include <linux/pci.h> | ||
19 | #include <linux/delay.h> | ||
20 | |||
21 | |||
22 | #include <asm/overdriver/gt64111.h> | ||
23 | #include <asm/overdrive/overdrive.h> | ||
24 | #include <asm/overdrive/fpga.h> | ||
25 | |||
26 | #define FPGA_NotConfigHigh() (*FPGA_ControlReg) = (*FPGA_ControlReg) | ENABLE_FPGA_BIT | ||
27 | #define FPGA_NotConfigLow() (*FPGA_ControlReg) = (*FPGA_ControlReg) & RESET_FPGA_MASK | ||
28 | |||
29 | /* I need to find out what (if any) the real delay factor here is */ | ||
30 | /* The delay is definately not critical */ | ||
31 | #define long_delay() {int i;for(i=0;i<10000;i++);} | ||
32 | #define short_delay() {int i;for(i=0;i<100;i++);} | ||
33 | |||
34 | static void __init program_overdrive_fpga(const unsigned char *fpgacode, | ||
35 | int size) | ||
36 | { | ||
37 | int timeout = 0; | ||
38 | int i, j; | ||
39 | unsigned char b; | ||
40 | static volatile unsigned char *FPGA_ControlReg = | ||
41 | (volatile unsigned char *) (OVERDRIVE_CTRL); | ||
42 | static volatile unsigned char *FPGA_ProgramReg = | ||
43 | (volatile unsigned char *) (FPGA_DCLK_ADDRESS); | ||
44 | |||
45 | printk("FPGA: Commencing FPGA Programming\n"); | ||
46 | |||
47 | /* The PCI reset but MUST be low when programming the FPGA !!! */ | ||
48 | b = (*FPGA_ControlReg) & RESET_PCI_MASK; | ||
49 | |||
50 | (*FPGA_ControlReg) = b; | ||
51 | |||
52 | /* Prepare FPGA to program */ | ||
53 | |||
54 | FPGA_NotConfigHigh(); | ||
55 | long_delay(); | ||
56 | |||
57 | FPGA_NotConfigLow(); | ||
58 | short_delay(); | ||
59 | |||
60 | while ((*FPGA_ProgramReg & FPGA_NOT_STATUS) != 0) { | ||
61 | printk("FPGA: Waiting for NotStatus to go Low ... \n"); | ||
62 | } | ||
63 | |||
64 | FPGA_NotConfigHigh(); | ||
65 | |||
66 | /* Wait for FPGA "ready to be programmed" signal */ | ||
67 | printk("FPGA: Waiting for NotStatus to go high (FPGA ready)... \n"); | ||
68 | |||
69 | for (timeout = 0; | ||
70 | (((*FPGA_ProgramReg & FPGA_NOT_STATUS) == 0) | ||
71 | && (timeout < FPGA_TIMEOUT)); timeout++); | ||
72 | |||
73 | /* Check if timeout condition occured - i.e. an error */ | ||
74 | |||
75 | if (timeout == FPGA_TIMEOUT) { | ||
76 | printk | ||
77 | ("FPGA: Failed to program - Timeout waiting for notSTATUS to go high\n"); | ||
78 | return; | ||
79 | } | ||
80 | |||
81 | printk("FPGA: Copying data to FPGA ... %d bytes\n", size); | ||
82 | |||
83 | /* Copy array to FPGA - bit at a time */ | ||
84 | |||
85 | for (i = 0; i < size; i++) { | ||
86 | volatile unsigned w = 0; | ||
87 | |||
88 | for (j = 0; j < 8; j++) { | ||
89 | *FPGA_ProgramReg = (fpgacode[i] >> j) & 0x01; | ||
90 | short_delay(); | ||
91 | } | ||
92 | if ((i & 0x3ff) == 0) { | ||
93 | printk("."); | ||
94 | } | ||
95 | } | ||
96 | |||
97 | /* Waiting for CONFDONE to go high - means the program is complete */ | ||
98 | |||
99 | for (timeout = 0; | ||
100 | (((*FPGA_ProgramReg & FPGA_CONFDONE) == 0) | ||
101 | && (timeout < FPGA_TIMEOUT)); timeout++) { | ||
102 | |||
103 | *FPGA_ProgramReg = 0x0; | ||
104 | long_delay(); | ||
105 | } | ||
106 | |||
107 | if (timeout == FPGA_TIMEOUT) { | ||
108 | printk | ||
109 | ("FPGA: Failed to program - Timeout waiting for CONFDONE to go high\n"); | ||
110 | return; | ||
111 | } else { /* Clock another 10 times - gets the device into a working state */ | ||
112 | for (i = 0; i < 10; i++) { | ||
113 | *FPGA_ProgramReg = 0x0; | ||
114 | short_delay(); | ||
115 | } | ||
116 | } | ||
117 | |||
118 | printk("FPGA: Programming complete\n"); | ||
119 | } | ||
120 | |||
121 | |||
122 | static const unsigned char __init fpgacode[] = { | ||
123 | #include "./overdrive.ttf" /* Code from maxplus2 compiler */ | ||
124 | , 0, 0 | ||
125 | }; | ||
126 | |||
127 | |||
128 | int __init init_overdrive_fpga(void) | ||
129 | { | ||
130 | program_overdrive_fpga(fpgacode, sizeof(fpgacode)); | ||
131 | |||
132 | return 0; | ||
133 | } | ||
diff --git a/arch/sh/boards/overdrive/galileo.c b/arch/sh/boards/overdrive/galileo.c deleted file mode 100644 index 29e48971bba0..000000000000 --- a/arch/sh/boards/overdrive/galileo.c +++ /dev/null | |||
@@ -1,587 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 David J. Mckay (david.mckay@st.com) | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * This file contains the PCI routines required for the Galileo GT6411 | ||
8 | * PCI bridge as used on the Orion and Overdrive boards. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/smp.h> | ||
14 | #include <linux/smp_lock.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/pci.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/types.h> | ||
20 | #include <linux/ioport.h> | ||
21 | |||
22 | #include <asm/overdrive/overdrive.h> | ||
23 | #include <asm/overdrive/gt64111.h> | ||
24 | |||
25 | |||
26 | /* After boot, we shift the Galileo registers so that they appear | ||
27 | * in BANK6, along with IO space. This means we can have one contingous | ||
28 | * lump of PCI address space without these registers appearing in the | ||
29 | * middle of them | ||
30 | */ | ||
31 | |||
32 | #define GT64111_BASE_ADDRESS 0xbb000000 | ||
33 | #define GT64111_IO_BASE_ADDRESS 0x1000 | ||
34 | /* The GT64111 registers appear at this address to the SH4 after reset */ | ||
35 | #define RESET_GT64111_BASE_ADDRESS 0xb4000000 | ||
36 | |||
37 | /* Macros used to access the Galileo registers */ | ||
38 | #define RESET_GT64111_REG(x) (RESET_GT64111_BASE_ADDRESS+x) | ||
39 | #define GT64111_REG(x) (GT64111_BASE_ADDRESS+x) | ||
40 | |||
41 | #define RESET_GT_WRITE(x,v) writel((v),RESET_GT64111_REG(x)) | ||
42 | |||
43 | #define RESET_GT_READ(x) readl(RESET_GT64111_REG(x)) | ||
44 | |||
45 | #define GT_WRITE(x,v) writel((v),GT64111_REG(x)) | ||
46 | #define GT_WRITE_BYTE(x,v) writeb((v),GT64111_REG(x)) | ||
47 | #define GT_WRITE_SHORT(x,v) writew((v),GT64111_REG(x)) | ||
48 | |||
49 | #define GT_READ(x) readl(GT64111_REG(x)) | ||
50 | #define GT_READ_BYTE(x) readb(GT64111_REG(x)) | ||
51 | #define GT_READ_SHORT(x) readw(GT64111_REG(x)) | ||
52 | |||
53 | |||
54 | /* Where the various SH banks start at */ | ||
55 | #define SH_BANK4_ADR 0xb0000000 | ||
56 | #define SH_BANK5_ADR 0xb4000000 | ||
57 | #define SH_BANK6_ADR 0xb8000000 | ||
58 | |||
59 | /* Masks out everything but lines 28,27,26 */ | ||
60 | #define BANK_SELECT_MASK 0x1c000000 | ||
61 | |||
62 | #define SH4_TO_BANK(x) ( (x) & BANK_SELECT_MASK) | ||
63 | |||
64 | /* | ||
65 | * Masks used for address conversaion. Bank 6 is used for IO and | ||
66 | * has all the address bits zeroed by the FPGA. Special case this | ||
67 | */ | ||
68 | #define MEMORY_BANK_MASK 0x1fffffff | ||
69 | #define IO_BANK_MASK 0x03ffffff | ||
70 | |||
71 | /* Mark bank 6 as the bank used for IO. You can change this in the FPGA code | ||
72 | * if you want | ||
73 | */ | ||
74 | #define IO_BANK_ADR PCI_GTIO_BASE | ||
75 | |||
76 | /* Will select the correct mask to apply depending on the SH$ address */ | ||
77 | #define SELECT_BANK_MASK(x) \ | ||
78 | ( (SH4_TO_BANK(x)==SH4_TO_BANK(IO_BANK_ADR)) ? IO_BANK_MASK : MEMORY_BANK_MASK) | ||
79 | |||
80 | /* Converts between PCI space and P2 region */ | ||
81 | #define SH4_TO_PCI(x) ((x)&SELECT_BANK_MASK(x)) | ||
82 | |||
83 | /* Various macros for figuring out what to stick in the Galileo registers. | ||
84 | * You *really* don't want to figure this stuff out by hand, you always get | ||
85 | * it wrong | ||
86 | */ | ||
87 | #define GT_MEM_LO_ADR(x) ((((unsigned)((x)&SELECT_BANK_MASK(x)))>>21)&0x7ff) | ||
88 | #define GT_MEM_HI_ADR(x) ((((unsigned)((x)&SELECT_BANK_MASK(x)))>>21)&0x7f) | ||
89 | #define GT_MEM_SUB_ADR(x) ((((unsigned)((x)&SELECT_BANK_MASK(x)))>>20)&0xff) | ||
90 | |||
91 | #define PROGRAM_HI_LO(block,a,s) \ | ||
92 | GT_WRITE(block##_LO_DEC_ADR,GT_MEM_LO_ADR(a));\ | ||
93 | GT_WRITE(block##_HI_DEC_ADR,GT_MEM_HI_ADR(a+s-1)) | ||
94 | |||
95 | #define PROGRAM_SUB_HI_LO(block,a,s) \ | ||
96 | GT_WRITE(block##_LO_DEC_ADR,GT_MEM_SUB_ADR(a));\ | ||
97 | GT_WRITE(block##_HI_DEC_ADR,GT_MEM_SUB_ADR(a+s-1)) | ||
98 | |||
99 | /* We need to set the size, and the offset register */ | ||
100 | |||
101 | #define GT_BAR_MASK(x) ((x)&~0xfff) | ||
102 | |||
103 | /* Macro to set up the BAR in the Galileo. Essentially used for the DRAM */ | ||
104 | #define PROGRAM_GT_BAR(block,a,s) \ | ||
105 | GT_WRITE(PCI_##block##_BANK_SIZE,GT_BAR_MASK((s-1)));\ | ||
106 | write_config_to_galileo(PCI_CONFIG_##block##_BASE_ADR,\ | ||
107 | GT_BAR_MASK(a)) | ||
108 | |||
109 | #define DISABLE_GT_BAR(block) \ | ||
110 | GT_WRITE(PCI_##block##_BANK_SIZE,0),\ | ||
111 | GT_CONFIG_WRITE(PCI_CONFIG_##block##_BASE_ADR,\ | ||
112 | 0x80000000) | ||
113 | |||
114 | /* Macros to disable things we are not going to use */ | ||
115 | #define DISABLE_DECODE(x) GT_WRITE(x##_LO_DEC_ADR,0x7ff);\ | ||
116 | GT_WRITE(x##_HI_DEC_ADR,0x00) | ||
117 | |||
118 | #define DISABLE_SUB_DECODE(x) GT_WRITE(x##_LO_DEC_ADR,0xff);\ | ||
119 | GT_WRITE(x##_HI_DEC_ADR,0x00) | ||
120 | |||
121 | static void __init reset_pci(void) | ||
122 | { | ||
123 | /* Set RESET_PCI bit high */ | ||
124 | writeb(readb(OVERDRIVE_CTRL) | ENABLE_PCI_BIT, OVERDRIVE_CTRL); | ||
125 | udelay(250); | ||
126 | |||
127 | /* Set RESET_PCI bit low */ | ||
128 | writeb(readb(OVERDRIVE_CTRL) & RESET_PCI_MASK, OVERDRIVE_CTRL); | ||
129 | udelay(250); | ||
130 | |||
131 | writeb(readb(OVERDRIVE_CTRL) | ENABLE_PCI_BIT, OVERDRIVE_CTRL); | ||
132 | udelay(250); | ||
133 | } | ||
134 | |||
135 | static int write_config_to_galileo(int where, u32 val); | ||
136 | #define GT_CONFIG_WRITE(where,val) write_config_to_galileo(where,val) | ||
137 | |||
138 | #define ENABLE_PCI_DRAM | ||
139 | |||
140 | |||
141 | #ifdef TEST_DRAM | ||
142 | /* Test function to check out if the PCI DRAM is working OK */ | ||
143 | static int /* __init */ test_dram(unsigned *base, unsigned size) | ||
144 | { | ||
145 | unsigned *p = base; | ||
146 | unsigned *end = (unsigned *) (((unsigned) base) + size); | ||
147 | unsigned w; | ||
148 | |||
149 | for (p = base; p < end; p++) { | ||
150 | *p = 0xffffffff; | ||
151 | if (*p != 0xffffffff) { | ||
152 | printk("AAARGH -write failed!!! at %p is %x\n", p, | ||
153 | *p); | ||
154 | return 0; | ||
155 | } | ||
156 | *p = 0x0; | ||
157 | if (*p != 0x0) { | ||
158 | printk("AAARGH -write failed!!!\n"); | ||
159 | return 0; | ||
160 | } | ||
161 | } | ||
162 | |||
163 | for (p = base; p < end; p++) { | ||
164 | *p = (unsigned) p; | ||
165 | if (*p != (unsigned) p) { | ||
166 | printk("Failed at 0x%p, actually is 0x%x\n", p, | ||
167 | *p); | ||
168 | return 0; | ||
169 | } | ||
170 | } | ||
171 | |||
172 | for (p = base; p < end; p++) { | ||
173 | w = ((unsigned) p & 0xffff0000); | ||
174 | *p = w | (w >> 16); | ||
175 | } | ||
176 | |||
177 | for (p = base; p < end; p++) { | ||
178 | w = ((unsigned) p & 0xffff0000); | ||
179 | w |= (w >> 16); | ||
180 | if (*p != w) { | ||
181 | printk | ||
182 | ("Failed at 0x%p, should be 0x%x actually is 0x%x\n", | ||
183 | p, w, *p); | ||
184 | return 0; | ||
185 | } | ||
186 | } | ||
187 | |||
188 | return 1; | ||
189 | } | ||
190 | #endif | ||
191 | |||
192 | |||
193 | /* Function to set up and initialise the galileo. This sets up the BARS, | ||
194 | * maps the DRAM into the address space etc,etc | ||
195 | */ | ||
196 | int __init galileo_init(void) | ||
197 | { | ||
198 | reset_pci(); | ||
199 | |||
200 | /* Now shift the galileo regs into this block */ | ||
201 | RESET_GT_WRITE(INTERNAL_SPACE_DEC, | ||
202 | GT_MEM_LO_ADR(GT64111_BASE_ADDRESS)); | ||
203 | |||
204 | /* Should have a sanity check here, that you can read back at the new | ||
205 | * address what you just wrote | ||
206 | */ | ||
207 | |||
208 | /* Disable decode for all regions */ | ||
209 | DISABLE_DECODE(RAS10); | ||
210 | DISABLE_DECODE(RAS32); | ||
211 | DISABLE_DECODE(CS20); | ||
212 | DISABLE_DECODE(CS3); | ||
213 | DISABLE_DECODE(PCI_IO); | ||
214 | DISABLE_DECODE(PCI_MEM0); | ||
215 | DISABLE_DECODE(PCI_MEM1); | ||
216 | |||
217 | /* Disable all BARS */ | ||
218 | GT_WRITE(BAR_ENABLE_ADR, 0x1ff); | ||
219 | DISABLE_GT_BAR(RAS10); | ||
220 | DISABLE_GT_BAR(RAS32); | ||
221 | DISABLE_GT_BAR(CS20); | ||
222 | DISABLE_GT_BAR(CS3); | ||
223 | |||
224 | /* Tell the BAR where the IO registers now are */ | ||
225 | GT_CONFIG_WRITE(PCI_CONFIG_INT_REG_IO_ADR,GT_BAR_MASK( | ||
226 | (GT64111_IO_BASE_ADDRESS & | ||
227 | IO_BANK_MASK))); | ||
228 | /* set up a 112 Mb decode */ | ||
229 | PROGRAM_HI_LO(PCI_MEM0, SH_BANK4_ADR, 112 * 1024 * 1024); | ||
230 | |||
231 | /* Set up a 32 MB io space decode */ | ||
232 | PROGRAM_HI_LO(PCI_IO, IO_BANK_ADR, 32 * 1024 * 1024); | ||
233 | |||
234 | #ifdef ENABLE_PCI_DRAM | ||
235 | /* Program up the DRAM configuration - there is DRAM only in bank 0 */ | ||
236 | /* Now set up the DRAM decode */ | ||
237 | PROGRAM_HI_LO(RAS10, PCI_DRAM_BASE, PCI_DRAM_SIZE); | ||
238 | /* And the sub decode */ | ||
239 | PROGRAM_SUB_HI_LO(RAS0, PCI_DRAM_BASE, PCI_DRAM_SIZE); | ||
240 | |||
241 | DISABLE_SUB_DECODE(RAS1); | ||
242 | |||
243 | /* Set refresh rate */ | ||
244 | GT_WRITE(DRAM_BANK0_PARMS, 0x3f); | ||
245 | GT_WRITE(DRAM_CFG, 0x100); | ||
246 | |||
247 | /* we have to lob off the top bits rememeber!! */ | ||
248 | PROGRAM_GT_BAR(RAS10, SH4_TO_PCI(PCI_DRAM_BASE), PCI_DRAM_SIZE); | ||
249 | |||
250 | #endif | ||
251 | |||
252 | /* We are only interested in decoding RAS10 and the Galileo's internal | ||
253 | * registers (as IO) on the PCI bus | ||
254 | */ | ||
255 | #ifdef ENABLE_PCI_DRAM | ||
256 | GT_WRITE(BAR_ENABLE_ADR, (~((1 << 8) | (1 << 3))) & 0x1ff); | ||
257 | #else | ||
258 | GT_WRITE(BAR_ENABLE_ADR, (~(1 << 3)) & 0x1ff); | ||
259 | #endif | ||
260 | |||
261 | /* Change the class code to host bridge, it actually powers up | ||
262 | * as a memory controller | ||
263 | */ | ||
264 | GT_CONFIG_WRITE(8, 0x06000011); | ||
265 | |||
266 | /* Allow the galileo to master the PCI bus */ | ||
267 | GT_CONFIG_WRITE(PCI_COMMAND, | ||
268 | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | | ||
269 | PCI_COMMAND_IO); | ||
270 | |||
271 | |||
272 | #if 0 | ||
273 | printk("Testing PCI DRAM - "); | ||
274 | if(test_dram(PCI_DRAM_BASE,PCI_DRAM_SIZE)) { | ||
275 | printk("Passed\n"); | ||
276 | }else { | ||
277 | printk("FAILED\n"); | ||
278 | } | ||
279 | #endif | ||
280 | return 0; | ||
281 | |||
282 | } | ||
283 | |||
284 | |||
285 | #define SET_CONFIG_BITS(bus,devfn,where)\ | ||
286 | ((1<<31) | ((bus) << 16) | ((devfn) << 8) | ((where) & ~3)) | ||
287 | |||
288 | #define CONFIG_CMD(dev, where) SET_CONFIG_BITS((dev)->bus->number,(dev)->devfn,where) | ||
289 | |||
290 | /* This write to the galileo config registers, unlike the functions below, can | ||
291 | * be used before the PCI subsystem has started up | ||
292 | */ | ||
293 | static int __init write_config_to_galileo(int where, u32 val) | ||
294 | { | ||
295 | GT_WRITE(PCI_CFG_ADR, SET_CONFIG_BITS(0, 0, where)); | ||
296 | |||
297 | GT_WRITE(PCI_CFG_DATA, val); | ||
298 | return 0; | ||
299 | } | ||
300 | |||
301 | /* We exclude the galileo and slot 31, the galileo because I don't know how to stop | ||
302 | * the setup code shagging up the setup I have done on it, and 31 because the whole | ||
303 | * thing locks up if you try to access that slot (which doesn't exist of course anyway | ||
304 | */ | ||
305 | |||
306 | #define EXCLUDED_DEV(dev) ((dev->bus->number==0) && ((PCI_SLOT(dev->devfn)==0) || (PCI_SLOT(dev->devfn) == 31))) | ||
307 | |||
308 | static int galileo_read_config_byte(struct pci_dev *dev, int where, | ||
309 | u8 * val) | ||
310 | { | ||
311 | |||
312 | |||
313 | /* I suspect this doesn't work because this drives a special cycle ? */ | ||
314 | if (EXCLUDED_DEV(dev)) { | ||
315 | *val = 0xff; | ||
316 | return PCIBIOS_SUCCESSFUL; | ||
317 | } | ||
318 | /* Start the config cycle */ | ||
319 | GT_WRITE(PCI_CFG_ADR, CONFIG_CMD(dev, where)); | ||
320 | /* Read back the result */ | ||
321 | *val = GT_READ_BYTE(PCI_CFG_DATA + (where & 3)); | ||
322 | |||
323 | return PCIBIOS_SUCCESSFUL; | ||
324 | } | ||
325 | |||
326 | |||
327 | static int galileo_read_config_word(struct pci_dev *dev, int where, | ||
328 | u16 * val) | ||
329 | { | ||
330 | |||
331 | if (EXCLUDED_DEV(dev)) { | ||
332 | *val = 0xffff; | ||
333 | return PCIBIOS_SUCCESSFUL; | ||
334 | } | ||
335 | |||
336 | GT_WRITE(PCI_CFG_ADR, CONFIG_CMD(dev, where)); | ||
337 | *val = GT_READ_SHORT(PCI_CFG_DATA + (where & 2)); | ||
338 | |||
339 | return PCIBIOS_SUCCESSFUL; | ||
340 | } | ||
341 | |||
342 | |||
343 | static int galileo_read_config_dword(struct pci_dev *dev, int where, | ||
344 | u32 * val) | ||
345 | { | ||
346 | if (EXCLUDED_DEV(dev)) { | ||
347 | *val = 0xffffffff; | ||
348 | return PCIBIOS_SUCCESSFUL; | ||
349 | } | ||
350 | |||
351 | GT_WRITE(PCI_CFG_ADR, CONFIG_CMD(dev, where)); | ||
352 | *val = GT_READ(PCI_CFG_DATA); | ||
353 | |||
354 | return PCIBIOS_SUCCESSFUL; | ||
355 | } | ||
356 | |||
357 | static int galileo_write_config_byte(struct pci_dev *dev, int where, | ||
358 | u8 val) | ||
359 | { | ||
360 | GT_WRITE(PCI_CFG_ADR, CONFIG_CMD(dev, where)); | ||
361 | |||
362 | GT_WRITE_BYTE(PCI_CFG_DATA + (where & 3), val); | ||
363 | |||
364 | return PCIBIOS_SUCCESSFUL; | ||
365 | } | ||
366 | |||
367 | |||
368 | static int galileo_write_config_word(struct pci_dev *dev, int where, | ||
369 | u16 val) | ||
370 | { | ||
371 | GT_WRITE(PCI_CFG_ADR, CONFIG_CMD(dev, where)); | ||
372 | |||
373 | GT_WRITE_SHORT(PCI_CFG_DATA + (where & 2), val); | ||
374 | |||
375 | return PCIBIOS_SUCCESSFUL; | ||
376 | } | ||
377 | |||
378 | static int galileo_write_config_dword(struct pci_dev *dev, int where, | ||
379 | u32 val) | ||
380 | { | ||
381 | GT_WRITE(PCI_CFG_ADR, CONFIG_CMD(dev, where)); | ||
382 | |||
383 | GT_WRITE(PCI_CFG_DATA, val); | ||
384 | |||
385 | return PCIBIOS_SUCCESSFUL; | ||
386 | } | ||
387 | |||
388 | static struct pci_ops pci_config_ops = { | ||
389 | galileo_read_config_byte, | ||
390 | galileo_read_config_word, | ||
391 | galileo_read_config_dword, | ||
392 | galileo_write_config_byte, | ||
393 | galileo_write_config_word, | ||
394 | galileo_write_config_dword | ||
395 | }; | ||
396 | |||
397 | |||
398 | /* Everything hangs off this */ | ||
399 | static struct pci_bus *pci_root_bus; | ||
400 | |||
401 | |||
402 | static u8 __init no_swizzle(struct pci_dev *dev, u8 * pin) | ||
403 | { | ||
404 | return PCI_SLOT(dev->devfn); | ||
405 | } | ||
406 | |||
407 | static int __init map_od_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
408 | { | ||
409 | /* Slot 1: Galileo | ||
410 | * Slot 2: PCI Slot 1 | ||
411 | * Slot 3: PCI Slot 2 | ||
412 | * Slot 4: ESS | ||
413 | */ | ||
414 | switch (slot) { | ||
415 | case 2: | ||
416 | return OVERDRIVE_PCI_IRQ1; | ||
417 | case 3: | ||
418 | /* Note this assumes you have a hacked card in slot 2 */ | ||
419 | return OVERDRIVE_PCI_IRQ2; | ||
420 | case 4: | ||
421 | return OVERDRIVE_ESS_IRQ; | ||
422 | default: | ||
423 | /* printk("PCI: Unexpected IRQ mapping request for slot %d\n", slot); */ | ||
424 | return -1; | ||
425 | } | ||
426 | } | ||
427 | |||
428 | |||
429 | |||
430 | void __init | ||
431 | pcibios_fixup_pbus_ranges(struct pci_bus *bus, struct pbus_set_ranges_data *ranges) | ||
432 | { | ||
433 | ranges->io_start -= bus->resource[0]->start; | ||
434 | ranges->io_end -= bus->resource[0]->start; | ||
435 | ranges->mem_start -= bus->resource[1]->start; | ||
436 | ranges->mem_end -= bus->resource[1]->start; | ||
437 | } | ||
438 | |||
439 | static void __init pci_fixup_ide_bases(struct pci_dev *d) | ||
440 | { | ||
441 | int i; | ||
442 | |||
443 | /* | ||
444 | * PCI IDE controllers use non-standard I/O port decoding, respect it. | ||
445 | */ | ||
446 | if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE) | ||
447 | return; | ||
448 | printk("PCI: IDE base address fixup for %s\n", pci_name(d)); | ||
449 | for(i=0; i<4; i++) { | ||
450 | struct resource *r = &d->resource[i]; | ||
451 | if ((r->start & ~0x80) == 0x374) { | ||
452 | r->start |= 2; | ||
453 | r->end = r->start; | ||
454 | } | ||
455 | } | ||
456 | } | ||
457 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases); | ||
458 | |||
459 | void __init pcibios_init(void) | ||
460 | { | ||
461 | static struct resource galio,galmem; | ||
462 | |||
463 | /* Allocate the registers used by the Galileo */ | ||
464 | galio.flags = IORESOURCE_IO; | ||
465 | galio.name = "Galileo GT64011"; | ||
466 | galmem.flags = IORESOURCE_MEM|IORESOURCE_PREFETCH; | ||
467 | galmem.name = "Galileo GT64011 DRAM"; | ||
468 | |||
469 | allocate_resource(&ioport_resource, &galio, 256, | ||
470 | GT64111_IO_BASE_ADDRESS,GT64111_IO_BASE_ADDRESS+256, 256, NULL, NULL); | ||
471 | allocate_resource(&iomem_resource, &galmem,PCI_DRAM_SIZE, | ||
472 | PHYSADDR(PCI_DRAM_BASE), PHYSADDR(PCI_DRAM_BASE)+PCI_DRAM_SIZE, | ||
473 | PCI_DRAM_SIZE, NULL, NULL); | ||
474 | |||
475 | /* ok, do the scan man */ | ||
476 | pci_root_bus = pci_scan_bus(0, &pci_config_ops, NULL); | ||
477 | |||
478 | pci_assign_unassigned_resources(); | ||
479 | pci_fixup_irqs(no_swizzle, map_od_irq); | ||
480 | |||
481 | #ifdef TEST_DRAM | ||
482 | printk("Testing PCI DRAM - "); | ||
483 | if(test_dram(PCI_DRAM_BASE,PCI_DRAM_SIZE)) { | ||
484 | printk("Passed\n"); | ||
485 | }else { | ||
486 | printk("FAILED\n"); | ||
487 | } | ||
488 | #endif | ||
489 | |||
490 | } | ||
491 | |||
492 | char * __init pcibios_setup(char *str) | ||
493 | { | ||
494 | return str; | ||
495 | } | ||
496 | |||
497 | |||
498 | |||
499 | int pcibios_enable_device(struct pci_dev *dev) | ||
500 | { | ||
501 | |||
502 | u16 cmd, old_cmd; | ||
503 | int idx; | ||
504 | struct resource *r; | ||
505 | |||
506 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
507 | old_cmd = cmd; | ||
508 | for (idx = 0; idx < 6; idx++) { | ||
509 | r = dev->resource + idx; | ||
510 | if (!r->start && r->end) { | ||
511 | printk(KERN_ERR | ||
512 | "PCI: Device %s not available because" | ||
513 | " of resource collisions\n", | ||
514 | pci_name(dev)); | ||
515 | return -EINVAL; | ||
516 | } | ||
517 | if (r->flags & IORESOURCE_IO) | ||
518 | cmd |= PCI_COMMAND_IO; | ||
519 | if (r->flags & IORESOURCE_MEM) | ||
520 | cmd |= PCI_COMMAND_MEMORY; | ||
521 | } | ||
522 | if (cmd != old_cmd) { | ||
523 | printk("PCI: enabling device %s (%04x -> %04x)\n", | ||
524 | pci_name(dev), old_cmd, cmd); | ||
525 | pci_write_config_word(dev, PCI_COMMAND, cmd); | ||
526 | } | ||
527 | return 0; | ||
528 | |||
529 | } | ||
530 | |||
531 | /* We should do some optimisation work here I think. Ok for now though */ | ||
532 | void __init pcibios_fixup_bus(struct pci_bus *bus) | ||
533 | { | ||
534 | |||
535 | } | ||
536 | |||
537 | void pcibios_align_resource(void *data, struct resource *res, | ||
538 | resource_size_t size) | ||
539 | { | ||
540 | } | ||
541 | |||
542 | void __init pcibios_update_resource(struct pci_dev *dev, struct resource *root, | ||
543 | struct resource *res, int resource) | ||
544 | { | ||
545 | |||
546 | unsigned long where, size; | ||
547 | u32 reg; | ||
548 | |||
549 | |||
550 | printk("PCI: Assigning %3s %08lx to %s\n", | ||
551 | res->flags & IORESOURCE_IO ? "IO" : "MEM", | ||
552 | res->start, dev->name); | ||
553 | |||
554 | where = PCI_BASE_ADDRESS_0 + resource * 4; | ||
555 | size = res->end - res->start; | ||
556 | |||
557 | pci_read_config_dword(dev, where, ®); | ||
558 | reg = (reg & size) | (((u32) (res->start - root->start)) & ~size); | ||
559 | pci_write_config_dword(dev, where, reg); | ||
560 | } | ||
561 | |||
562 | |||
563 | void __init pcibios_update_irq(struct pci_dev *dev, int irq) | ||
564 | { | ||
565 | printk("PCI: Assigning IRQ %02d to %s\n", irq, dev->name); | ||
566 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | ||
567 | } | ||
568 | |||
569 | /* | ||
570 | * If we set up a device for bus mastering, we need to check the latency | ||
571 | * timer as certain crappy BIOSes forget to set it properly. | ||
572 | */ | ||
573 | unsigned int pcibios_max_latency = 255; | ||
574 | |||
575 | void pcibios_set_master(struct pci_dev *dev) | ||
576 | { | ||
577 | u8 lat; | ||
578 | pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); | ||
579 | if (lat < 16) | ||
580 | lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency; | ||
581 | else if (lat > pcibios_max_latency) | ||
582 | lat = pcibios_max_latency; | ||
583 | else | ||
584 | return; | ||
585 | printk("PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat); | ||
586 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); | ||
587 | } | ||
diff --git a/arch/sh/boards/overdrive/io.c b/arch/sh/boards/overdrive/io.c deleted file mode 100644 index 4671b6b047bb..000000000000 --- a/arch/sh/boards/overdrive/io.c +++ /dev/null | |||
@@ -1,172 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 David J. Mckay (david.mckay@st.com) | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * This file contains the I/O routines for use on the overdrive board | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | #include <linux/delay.h> | ||
13 | #include <asm/processor.h> | ||
14 | #include <asm/io.h> | ||
15 | #include <asm/addrspace.h> | ||
16 | |||
17 | #include <asm/overdrive/overdrive.h> | ||
18 | |||
19 | /* | ||
20 | * readX/writeX() are used to access memory mapped devices. On some | ||
21 | * architectures the memory mapped IO stuff needs to be accessed | ||
22 | * differently. On the SuperH architecture, we just read/write the | ||
23 | * memory location directly. | ||
24 | */ | ||
25 | |||
26 | #define dprintk(x...) | ||
27 | |||
28 | /* Translates an IO address to where it is mapped in memory */ | ||
29 | |||
30 | #define io_addr(x) (((unsigned)(x))|PCI_GTIO_BASE) | ||
31 | |||
32 | unsigned char od_inb(unsigned long port) | ||
33 | { | ||
34 | dprintk("od_inb(%x)\n", port); | ||
35 | return readb(io_addr(port)) & 0xff; | ||
36 | } | ||
37 | |||
38 | |||
39 | unsigned short od_inw(unsigned long port) | ||
40 | { | ||
41 | dprintk("od_inw(%x)\n", port); | ||
42 | return readw(io_addr(port)) & 0xffff; | ||
43 | } | ||
44 | |||
45 | unsigned int od_inl(unsigned long port) | ||
46 | { | ||
47 | dprintk("od_inl(%x)\n", port); | ||
48 | return readl(io_addr(port)); | ||
49 | } | ||
50 | |||
51 | void od_outb(unsigned char value, unsigned long port) | ||
52 | { | ||
53 | dprintk("od_outb(%x, %x)\n", value, port); | ||
54 | writeb(value, io_addr(port)); | ||
55 | } | ||
56 | |||
57 | void od_outw(unsigned short value, unsigned long port) | ||
58 | { | ||
59 | dprintk("od_outw(%x, %x)\n", value, port); | ||
60 | writew(value, io_addr(port)); | ||
61 | } | ||
62 | |||
63 | void od_outl(unsigned int value, unsigned long port) | ||
64 | { | ||
65 | dprintk("od_outl(%x, %x)\n", value, port); | ||
66 | writel(value, io_addr(port)); | ||
67 | } | ||
68 | |||
69 | /* This is horrible at the moment - needs more work to do something sensible */ | ||
70 | #define IO_DELAY() udelay(10) | ||
71 | |||
72 | #define OUT_DELAY(x,type) \ | ||
73 | void od_out##x##_p(unsigned type value,unsigned long port){out##x(value,port);IO_DELAY();} | ||
74 | |||
75 | #define IN_DELAY(x,type) \ | ||
76 | unsigned type od_in##x##_p(unsigned long port) {unsigned type tmp=in##x(port);IO_DELAY();return tmp;} | ||
77 | |||
78 | |||
79 | OUT_DELAY(b,char) | ||
80 | OUT_DELAY(w,short) | ||
81 | OUT_DELAY(l,int) | ||
82 | |||
83 | IN_DELAY(b,char) | ||
84 | IN_DELAY(w,short) | ||
85 | IN_DELAY(l,int) | ||
86 | |||
87 | |||
88 | /* Now for the string version of these functions */ | ||
89 | void od_outsb(unsigned long port, const void *addr, unsigned long count) | ||
90 | { | ||
91 | int i; | ||
92 | unsigned char *p = (unsigned char *) addr; | ||
93 | |||
94 | for (i = 0; i < count; i++, p++) { | ||
95 | outb(*p, port); | ||
96 | } | ||
97 | } | ||
98 | |||
99 | |||
100 | void od_insb(unsigned long port, void *addr, unsigned long count) | ||
101 | { | ||
102 | int i; | ||
103 | unsigned char *p = (unsigned char *) addr; | ||
104 | |||
105 | for (i = 0; i < count; i++, p++) { | ||
106 | *p = inb(port); | ||
107 | } | ||
108 | } | ||
109 | |||
110 | /* For the 16 and 32 bit string functions, we have to worry about alignment. | ||
111 | * The SH does not do unaligned accesses, so we have to read as bytes and | ||
112 | * then write as a word or dword. | ||
113 | * This can be optimised a lot more, especially in the case where the data | ||
114 | * is aligned | ||
115 | */ | ||
116 | |||
117 | void od_outsw(unsigned long port, const void *addr, unsigned long count) | ||
118 | { | ||
119 | int i; | ||
120 | unsigned short tmp; | ||
121 | unsigned char *p = (unsigned char *) addr; | ||
122 | |||
123 | for (i = 0; i < count; i++, p += 2) { | ||
124 | tmp = (*p) | ((*(p + 1)) << 8); | ||
125 | outw(tmp, port); | ||
126 | } | ||
127 | } | ||
128 | |||
129 | |||
130 | void od_insw(unsigned long port, void *addr, unsigned long count) | ||
131 | { | ||
132 | int i; | ||
133 | unsigned short tmp; | ||
134 | unsigned char *p = (unsigned char *) addr; | ||
135 | |||
136 | for (i = 0; i < count; i++, p += 2) { | ||
137 | tmp = inw(port); | ||
138 | p[0] = tmp & 0xff; | ||
139 | p[1] = (tmp >> 8) & 0xff; | ||
140 | } | ||
141 | } | ||
142 | |||
143 | |||
144 | void od_outsl(unsigned long port, const void *addr, unsigned long count) | ||
145 | { | ||
146 | int i; | ||
147 | unsigned tmp; | ||
148 | unsigned char *p = (unsigned char *) addr; | ||
149 | |||
150 | for (i = 0; i < count; i++, p += 4) { | ||
151 | tmp = (*p) | ((*(p + 1)) << 8) | ((*(p + 2)) << 16) | | ||
152 | ((*(p + 3)) << 24); | ||
153 | outl(tmp, port); | ||
154 | } | ||
155 | } | ||
156 | |||
157 | |||
158 | void od_insl(unsigned long port, void *addr, unsigned long count) | ||
159 | { | ||
160 | int i; | ||
161 | unsigned tmp; | ||
162 | unsigned char *p = (unsigned char *) addr; | ||
163 | |||
164 | for (i = 0; i < count; i++, p += 4) { | ||
165 | tmp = inl(port); | ||
166 | p[0] = tmp & 0xff; | ||
167 | p[1] = (tmp >> 8) & 0xff; | ||
168 | p[2] = (tmp >> 16) & 0xff; | ||
169 | p[3] = (tmp >> 24) & 0xff; | ||
170 | |||
171 | } | ||
172 | } | ||
diff --git a/arch/sh/boards/overdrive/irq.c b/arch/sh/boards/overdrive/irq.c deleted file mode 100644 index 5d730c70389e..000000000000 --- a/arch/sh/boards/overdrive/irq.c +++ /dev/null | |||
@@ -1,191 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 David J. Mckay (david.mckay@st.com) | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * Looks after interrupts on the overdrive board. | ||
8 | * | ||
9 | * Bases on the IPR irq system | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/irq.h> | ||
14 | |||
15 | #include <asm/system.h> | ||
16 | #include <asm/io.h> | ||
17 | |||
18 | #include <asm/overdrive/overdrive.h> | ||
19 | |||
20 | struct od_data { | ||
21 | int overdrive_irq; | ||
22 | int irq_mask; | ||
23 | }; | ||
24 | |||
25 | #define NUM_EXTERNAL_IRQS 16 | ||
26 | #define EXTERNAL_IRQ_NOT_IN_USE (-1) | ||
27 | #define EXTERNAL_IRQ_NOT_ASSIGNED (-1) | ||
28 | |||
29 | /* | ||
30 | * This table is used to determine what to program into the FPGA's CT register | ||
31 | * for the specified Linux IRQ. | ||
32 | * | ||
33 | * The irq_mask gives the interrupt number from the PCI board (PCI_Int(6:0)) | ||
34 | * but is one greater than that because the because the FPGA treats 0 | ||
35 | * as disabled, a value of 1 asserts PCI_Int0, and so on. | ||
36 | * | ||
37 | * The overdrive_irq specifies which of the eight interrupt sources generates | ||
38 | * that interrupt, and but is multiplied by four to give the bit offset into | ||
39 | * the CT register. | ||
40 | * | ||
41 | * The seven interrupts levels (SH4 IRL's) we have available here is hardwired | ||
42 | * by the EPLD. The assignments here of which PCI interrupt generates each | ||
43 | * level is arbitary. | ||
44 | */ | ||
45 | static struct od_data od_data_table[NUM_EXTERNAL_IRQS] = { | ||
46 | /* overdrive_irq , irq_mask */ | ||
47 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 0 */ | ||
48 | {EXTERNAL_IRQ_NOT_ASSIGNED, 7}, /* 1 */ | ||
49 | {EXTERNAL_IRQ_NOT_ASSIGNED, 6}, /* 2 */ | ||
50 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 3 */ | ||
51 | {EXTERNAL_IRQ_NOT_ASSIGNED, 5}, /* 4 */ | ||
52 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 5 */ | ||
53 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 6 */ | ||
54 | {EXTERNAL_IRQ_NOT_ASSIGNED, 4}, /* 7 */ | ||
55 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 8 */ | ||
56 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 9 */ | ||
57 | {EXTERNAL_IRQ_NOT_ASSIGNED, 3}, /* 10 */ | ||
58 | {EXTERNAL_IRQ_NOT_ASSIGNED, 2}, /* 11 */ | ||
59 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 12 */ | ||
60 | {EXTERNAL_IRQ_NOT_ASSIGNED, 1}, /* 13 */ | ||
61 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE}, /* 14 */ | ||
62 | {EXTERNAL_IRQ_NOT_ASSIGNED, EXTERNAL_IRQ_NOT_IN_USE} /* 15 */ | ||
63 | }; | ||
64 | |||
65 | static void set_od_data(int overdrive_irq, int irq) | ||
66 | { | ||
67 | if (irq >= NUM_EXTERNAL_IRQS || irq < 0) | ||
68 | return; | ||
69 | od_data_table[irq].overdrive_irq = overdrive_irq << 2; | ||
70 | } | ||
71 | |||
72 | static void enable_od_irq(unsigned int irq); | ||
73 | void disable_od_irq(unsigned int irq); | ||
74 | |||
75 | /* shutdown is same as "disable" */ | ||
76 | #define shutdown_od_irq disable_od_irq | ||
77 | |||
78 | static void mask_and_ack_od(unsigned int); | ||
79 | static void end_od_irq(unsigned int irq); | ||
80 | |||
81 | static unsigned int startup_od_irq(unsigned int irq) | ||
82 | { | ||
83 | enable_od_irq(irq); | ||
84 | return 0; /* never anything pending */ | ||
85 | } | ||
86 | |||
87 | static struct hw_interrupt_type od_irq_type = { | ||
88 | .typename = "Overdrive-IRQ", | ||
89 | .startup = startup_od_irq, | ||
90 | .shutdown = shutdown_od_irq, | ||
91 | .enable = enable_od_irq, | ||
92 | .disable = disable_od_irq, | ||
93 | .ack = mask_and_ack_od, | ||
94 | .end = end_od_irq | ||
95 | }; | ||
96 | |||
97 | static void disable_od_irq(unsigned int irq) | ||
98 | { | ||
99 | unsigned val, flags; | ||
100 | int overdrive_irq; | ||
101 | unsigned mask; | ||
102 | |||
103 | /* Not a valid interrupt */ | ||
104 | if (irq < 0 || irq >= NUM_EXTERNAL_IRQS) | ||
105 | return; | ||
106 | |||
107 | /* Is is necessary to use a cli here? Would a spinlock not be | ||
108 | * mroe efficient? | ||
109 | */ | ||
110 | local_irq_save(flags); | ||
111 | overdrive_irq = od_data_table[irq].overdrive_irq; | ||
112 | if (overdrive_irq != EXTERNAL_IRQ_NOT_ASSIGNED) { | ||
113 | mask = ~(0x7 << overdrive_irq); | ||
114 | val = ctrl_inl(OVERDRIVE_INT_CT); | ||
115 | val &= mask; | ||
116 | ctrl_outl(val, OVERDRIVE_INT_CT); | ||
117 | } | ||
118 | local_irq_restore(flags); | ||
119 | } | ||
120 | |||
121 | static void enable_od_irq(unsigned int irq) | ||
122 | { | ||
123 | unsigned val, flags; | ||
124 | int overdrive_irq; | ||
125 | unsigned mask; | ||
126 | |||
127 | /* Not a valid interrupt */ | ||
128 | if (irq < 0 || irq >= NUM_EXTERNAL_IRQS) | ||
129 | return; | ||
130 | |||
131 | /* Set priority in OD back to original value */ | ||
132 | local_irq_save(flags); | ||
133 | /* This one is not in use currently */ | ||
134 | overdrive_irq = od_data_table[irq].overdrive_irq; | ||
135 | if (overdrive_irq != EXTERNAL_IRQ_NOT_ASSIGNED) { | ||
136 | val = ctrl_inl(OVERDRIVE_INT_CT); | ||
137 | mask = ~(0x7 << overdrive_irq); | ||
138 | val &= mask; | ||
139 | mask = od_data_table[irq].irq_mask << overdrive_irq; | ||
140 | val |= mask; | ||
141 | ctrl_outl(val, OVERDRIVE_INT_CT); | ||
142 | } | ||
143 | local_irq_restore(flags); | ||
144 | } | ||
145 | |||
146 | |||
147 | |||
148 | /* this functions sets the desired irq handler to be an overdrive type */ | ||
149 | static void __init make_od_irq(unsigned int irq) | ||
150 | { | ||
151 | disable_irq_nosync(irq); | ||
152 | irq_desc[irq].chip = &od_irq_type; | ||
153 | disable_od_irq(irq); | ||
154 | } | ||
155 | |||
156 | |||
157 | static void mask_and_ack_od(unsigned int irq) | ||
158 | { | ||
159 | disable_od_irq(irq); | ||
160 | } | ||
161 | |||
162 | static void end_od_irq(unsigned int irq) | ||
163 | { | ||
164 | enable_od_irq(irq); | ||
165 | } | ||
166 | |||
167 | void __init init_overdrive_irq(void) | ||
168 | { | ||
169 | int i; | ||
170 | |||
171 | /* Disable all interrupts */ | ||
172 | ctrl_outl(0, OVERDRIVE_INT_CT); | ||
173 | |||
174 | /* Update interrupt pin mode to use encoded interrupts */ | ||
175 | i = ctrl_inw(INTC_ICR); | ||
176 | i &= ~INTC_ICR_IRLM; | ||
177 | ctrl_outw(i, INTC_ICR); | ||
178 | |||
179 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) { | ||
180 | if (od_data_table[i].irq_mask != EXTERNAL_IRQ_NOT_IN_USE) { | ||
181 | make_od_irq(i); | ||
182 | } else if (i != 15) { // Cannot use imask on level 15 | ||
183 | make_imask_irq(i); | ||
184 | } | ||
185 | } | ||
186 | |||
187 | /* Set up the interrupts */ | ||
188 | set_od_data(OVERDRIVE_PCI_INTA, OVERDRIVE_PCI_IRQ1); | ||
189 | set_od_data(OVERDRIVE_PCI_INTB, OVERDRIVE_PCI_IRQ2); | ||
190 | set_od_data(OVERDRIVE_AUDIO_INT, OVERDRIVE_ESS_IRQ); | ||
191 | } | ||
diff --git a/arch/sh/boards/overdrive/led.c b/arch/sh/boards/overdrive/led.c deleted file mode 100644 index 860d7f204a4e..000000000000 --- a/arch/sh/boards/overdrive/led.c +++ /dev/null | |||
@@ -1,58 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/overdrive/led.c | ||
3 | * | ||
4 | * Copyright (C) 1999 Stuart Menefy <stuart.menefy@st.com> | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * This file contains an Overdrive specific LED feature. | ||
10 | */ | ||
11 | |||
12 | #include <asm/system.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/overdrive/overdrive.h> | ||
15 | |||
16 | static void mach_led(int position, int value) | ||
17 | { | ||
18 | unsigned long flags; | ||
19 | unsigned long reg; | ||
20 | |||
21 | local_irq_save(flags); | ||
22 | |||
23 | reg = readl(OVERDRIVE_CTRL); | ||
24 | if (value) { | ||
25 | reg |= (1<<3); | ||
26 | } else { | ||
27 | reg &= ~(1<<3); | ||
28 | } | ||
29 | writel(reg, OVERDRIVE_CTRL); | ||
30 | |||
31 | local_irq_restore(flags); | ||
32 | } | ||
33 | |||
34 | #ifdef CONFIG_HEARTBEAT | ||
35 | |||
36 | #include <linux/sched.h> | ||
37 | |||
38 | /* acts like an actual heart beat -- ie thump-thump-pause... */ | ||
39 | void heartbeat_od(void) | ||
40 | { | ||
41 | static unsigned cnt = 0, period = 0, dist = 0; | ||
42 | |||
43 | if (cnt == 0 || cnt == dist) | ||
44 | mach_led( -1, 1); | ||
45 | else if (cnt == 7 || cnt == dist+7) | ||
46 | mach_led( -1, 0); | ||
47 | |||
48 | if (++cnt > period) { | ||
49 | cnt = 0; | ||
50 | /* The hyperbolic function below modifies the heartbeat period | ||
51 | * length in dependency of the current (5min) load. It goes | ||
52 | * through the points f(0)=126, f(1)=86, f(5)=51, | ||
53 | * f(inf)->30. */ | ||
54 | period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30; | ||
55 | dist = period / 4; | ||
56 | } | ||
57 | } | ||
58 | #endif /* CONFIG_HEARTBEAT */ | ||
diff --git a/arch/sh/boards/overdrive/mach.c b/arch/sh/boards/overdrive/mach.c deleted file mode 100644 index 2834a03ae477..000000000000 --- a/arch/sh/boards/overdrive/mach.c +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/overdrive/mach.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com) | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * Machine vector for the STMicroelectronics Overdrive | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/machvec.h> | ||
15 | #include <asm/rtc.h> | ||
16 | #include <asm/machvec_init.h> | ||
17 | |||
18 | #include <asm/io_unknown.h> | ||
19 | #include <asm/io_generic.h> | ||
20 | #include <asm/overdrive/io.h> | ||
21 | |||
22 | void heartbeat_od(void); | ||
23 | void init_overdrive_irq(void); | ||
24 | void galileo_pcibios_init(void); | ||
25 | |||
26 | /* | ||
27 | * The Machine Vector | ||
28 | */ | ||
29 | |||
30 | struct sh_machine_vector mv_od __initmv = { | ||
31 | .mv_nr_irqs = 48, | ||
32 | |||
33 | .mv_inb = od_inb, | ||
34 | .mv_inw = od_inw, | ||
35 | .mv_inl = od_inl, | ||
36 | .mv_outb = od_outb, | ||
37 | .mv_outw = od_outw, | ||
38 | .mv_outl = od_outl, | ||
39 | |||
40 | .mv_inb_p = od_inb_p, | ||
41 | .mv_inw_p = od_inw_p, | ||
42 | .mv_inl_p = od_inl_p, | ||
43 | .mv_outb_p = od_outb_p, | ||
44 | .mv_outw_p = od_outw_p, | ||
45 | .mv_outl_p = od_outl_p, | ||
46 | |||
47 | .mv_insb = od_insb, | ||
48 | .mv_insw = od_insw, | ||
49 | .mv_insl = od_insl, | ||
50 | .mv_outsb = od_outsb, | ||
51 | .mv_outsw = od_outsw, | ||
52 | .mv_outsl = od_outsl, | ||
53 | |||
54 | #ifdef CONFIG_PCI | ||
55 | .mv_init_irq = init_overdrive_irq, | ||
56 | #endif | ||
57 | #ifdef CONFIG_HEARTBEAT | ||
58 | .mv_heartbeat = heartbeat_od, | ||
59 | #endif | ||
60 | }; | ||
61 | |||
62 | ALIAS_MV(od) | ||
diff --git a/arch/sh/boards/overdrive/pcidma.c b/arch/sh/boards/overdrive/pcidma.c deleted file mode 100644 index 1c9bfeda00b7..000000000000 --- a/arch/sh/boards/overdrive/pcidma.c +++ /dev/null | |||
@@ -1,46 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 David J. Mckay (david.mckay@st.com) | ||
3 | * | ||
4 | * May be copied or modified under the terms of the GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * Dynamic DMA mapping support. | ||
8 | * | ||
9 | * On the overdrive, we can only DMA from memory behind the PCI bus! | ||
10 | * this means that all DMA'able memory must come from there. | ||
11 | * this restriction will not apply to later boards. | ||
12 | */ | ||
13 | |||
14 | #include <linux/types.h> | ||
15 | #include <linux/mm.h> | ||
16 | #include <linux/string.h> | ||
17 | #include <linux/pci.h> | ||
18 | #include <asm/io.h> | ||
19 | |||
20 | void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, | ||
21 | dma_addr_t * dma_handle) | ||
22 | { | ||
23 | void *ret; | ||
24 | int gfp = GFP_ATOMIC; | ||
25 | |||
26 | printk("BUG: pci_alloc_consistent() called - not yet supported\n"); | ||
27 | /* We ALWAYS need DMA memory on the overdrive hardware, | ||
28 | * due to it's extreme weirdness | ||
29 | * Need to flush the cache here as well, since the memory | ||
30 | * can still be seen through the cache! | ||
31 | */ | ||
32 | gfp |= GFP_DMA; | ||
33 | ret = (void *) __get_free_pages(gfp, get_order(size)); | ||
34 | |||
35 | if (ret != NULL) { | ||
36 | memset(ret, 0, size); | ||
37 | *dma_handle = virt_to_bus(ret); | ||
38 | } | ||
39 | return ret; | ||
40 | } | ||
41 | |||
42 | void pci_free_consistent(struct pci_dev *hwdev, size_t size, | ||
43 | void *vaddr, dma_addr_t dma_handle) | ||
44 | { | ||
45 | free_pages((unsigned long) vaddr, get_order(size)); | ||
46 | } | ||
diff --git a/arch/sh/boards/overdrive/setup.c b/arch/sh/boards/overdrive/setup.c deleted file mode 100644 index a3a7744c2047..000000000000 --- a/arch/sh/boards/overdrive/setup.c +++ /dev/null | |||
@@ -1,36 +0,0 @@ | |||
1 | /* | ||
2 | * arch/sh/overdrive/setup.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com) | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * STMicroelectronics Overdrive Support. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <asm/io.h> | ||
15 | |||
16 | #include <asm/overdrive/overdrive.h> | ||
17 | #include <asm/overdrive/fpga.h> | ||
18 | |||
19 | const char *get_system_type(void) | ||
20 | { | ||
21 | return "SH7750 Overdrive"; | ||
22 | } | ||
23 | |||
24 | /* | ||
25 | * Initialize the board | ||
26 | */ | ||
27 | int __init platform_setup(void) | ||
28 | { | ||
29 | #ifdef CONFIG_PCI | ||
30 | init_overdrive_fpga(); | ||
31 | galileo_init(); | ||
32 | #endif | ||
33 | |||
34 | /* Enable RS232 receive buffers */ | ||
35 | writel(0x1e, OVERDRIVE_CTRL); | ||
36 | } | ||
diff --git a/arch/sh/boards/renesas/edosk7705/Makefile b/arch/sh/boards/renesas/edosk7705/Makefile index 7fccbf2e4a1d..14bdd531f116 100644 --- a/arch/sh/boards/renesas/edosk7705/Makefile +++ b/arch/sh/boards/renesas/edosk7705/Makefile | |||
@@ -1,10 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the EDOSK7705 specific parts of the kernel | 2 | # Makefile for the EDOSK7705 specific parts of the kernel |
3 | # | 3 | # |
4 | # Note! Dependencies are done automagically by 'make dep', which also | ||
5 | # removes any old dependencies. DON'T put your own dependencies here | ||
6 | # unless it's something special (ie not a .c file). | ||
7 | # | ||
8 | 4 | ||
9 | obj-y := setup.o io.o | 5 | obj-y := setup.o io.o |
10 | 6 | ||
diff --git a/arch/sh/boards/renesas/edosk7705/setup.c b/arch/sh/boards/renesas/edosk7705/setup.c index ba143fa4afaa..ec5be0107719 100644 --- a/arch/sh/boards/renesas/edosk7705/setup.c +++ b/arch/sh/boards/renesas/edosk7705/setup.c | |||
@@ -8,19 +8,21 @@ | |||
8 | * Modified for edosk7705 development | 8 | * Modified for edosk7705 development |
9 | * board by S. Dunn, 2003. | 9 | * board by S. Dunn, 2003. |
10 | */ | 10 | */ |
11 | |||
12 | #include <linux/init.h> | 11 | #include <linux/init.h> |
13 | #include <asm/machvec.h> | 12 | #include <asm/machvec.h> |
14 | #include <asm/machvec_init.h> | ||
15 | #include <asm/edosk7705/io.h> | 13 | #include <asm/edosk7705/io.h> |
16 | 14 | ||
17 | static void init_edosk7705(void); | 15 | static void __init sh_edosk7705_init_irq(void) |
16 | { | ||
17 | /* This is the Ethernet interrupt */ | ||
18 | make_imask_irq(0x09); | ||
19 | } | ||
18 | 20 | ||
19 | /* | 21 | /* |
20 | * The Machine Vector | 22 | * The Machine Vector |
21 | */ | 23 | */ |
22 | |||
23 | struct sh_machine_vector mv_edosk7705 __initmv = { | 24 | struct sh_machine_vector mv_edosk7705 __initmv = { |
25 | .mv_name = "EDOSK7705", | ||
24 | .mv_nr_irqs = 80, | 26 | .mv_nr_irqs = 80, |
25 | 27 | ||
26 | .mv_inb = sh_edosk7705_inb, | 28 | .mv_inb = sh_edosk7705_inb, |
@@ -37,23 +39,6 @@ struct sh_machine_vector mv_edosk7705 __initmv = { | |||
37 | .mv_outsl = sh_edosk7705_outsl, | 39 | .mv_outsl = sh_edosk7705_outsl, |
38 | 40 | ||
39 | .mv_isa_port2addr = sh_edosk7705_isa_port2addr, | 41 | .mv_isa_port2addr = sh_edosk7705_isa_port2addr, |
40 | .mv_init_irq = init_edosk7705, | 42 | .mv_init_irq = sh_edosk7705_init_irq, |
41 | }; | 43 | }; |
42 | ALIAS_MV(edosk7705) | 44 | ALIAS_MV(edosk7705) |
43 | |||
44 | static void __init init_edosk7705(void) | ||
45 | { | ||
46 | /* This is the Ethernet interrupt */ | ||
47 | make_imask_irq(0x09); | ||
48 | } | ||
49 | |||
50 | const char *get_system_type(void) | ||
51 | { | ||
52 | return "EDOSK7705"; | ||
53 | } | ||
54 | |||
55 | void __init platform_setup(void) | ||
56 | { | ||
57 | /* Nothing .. */ | ||
58 | } | ||
59 | |||
diff --git a/arch/sh/boards/renesas/hs7751rvoip/Kconfig b/arch/sh/boards/renesas/hs7751rvoip/Kconfig new file mode 100644 index 000000000000..1743be477be5 --- /dev/null +++ b/arch/sh/boards/renesas/hs7751rvoip/Kconfig | |||
@@ -0,0 +1,12 @@ | |||
1 | if SH_HS7751RVOIP | ||
2 | |||
3 | menu "HS7751RVoIP options" | ||
4 | |||
5 | config HS7751RVOIP_CODEC | ||
6 | bool "Support VoIP Codec section" | ||
7 | help | ||
8 | Selecting this option will support CODEC section. | ||
9 | |||
10 | endmenu | ||
11 | |||
12 | endif | ||
diff --git a/arch/sh/boards/renesas/hs7751rvoip/Makefile b/arch/sh/boards/renesas/hs7751rvoip/Makefile index e8b4109ace11..e626377c55ee 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/Makefile +++ b/arch/sh/boards/renesas/hs7751rvoip/Makefile | |||
@@ -1,12 +1,8 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the HS7751RVoIP specific parts of the kernel | 2 | # Makefile for the HS7751RVoIP specific parts of the kernel |
3 | # | 3 | # |
4 | # Note! Dependencies are done automagically by 'make dep', which also | ||
5 | # removes any old dependencies. DON'T put your own dependencies here | ||
6 | # unless it's something special (ie not a .c file). | ||
7 | # | ||
8 | 4 | ||
9 | obj-y := mach.o setup.o io.o irq.o led.o | 5 | obj-y := setup.o io.o irq.o |
10 | 6 | ||
11 | obj-$(CONFIG_PCI) += pci.o | 7 | obj-$(CONFIG_PCI) += pci.o |
12 | 8 | ||
diff --git a/arch/sh/boards/renesas/hs7751rvoip/io.c b/arch/sh/boards/renesas/hs7751rvoip/io.c index 3a1abfa2fefb..9ea1136b219b 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/io.c +++ b/arch/sh/boards/renesas/hs7751rvoip/io.c | |||
@@ -10,21 +10,16 @@ | |||
10 | * placeholder code from io_hs7751rvoip.c left in with the | 10 | * placeholder code from io_hs7751rvoip.c left in with the |
11 | * expectation of later SuperIO and PCMCIA access. | 11 | * expectation of later SuperIO and PCMCIA access. |
12 | */ | 12 | */ |
13 | |||
14 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
15 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/module.h> | ||
16 | #include <linux/pci.h> | ||
16 | #include <asm/io.h> | 17 | #include <asm/io.h> |
17 | #include <asm/hs7751rvoip/hs7751rvoip.h> | 18 | #include <asm/hs7751rvoip/hs7751rvoip.h> |
18 | #include <asm/addrspace.h> | 19 | #include <asm/addrspace.h> |
19 | 20 | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/pci.h> | ||
22 | #include "../../../drivers/pci/pci-sh7751.h" | ||
23 | |||
24 | extern void *area5_io8_base; /* Area 5 8bit I/O Base address */ | ||
25 | extern void *area6_io8_base; /* Area 6 8bit I/O Base address */ | 21 | extern void *area6_io8_base; /* Area 6 8bit I/O Base address */ |
26 | extern void *area5_io16_base; /* Area 5 16bit I/O Base address */ | 22 | extern void *area5_io16_base; /* Area 5 16bit I/O Base address */ |
27 | extern void *area6_io16_base; /* Area 6 16bit I/O Base address */ | ||
28 | 23 | ||
29 | /* | 24 | /* |
30 | * The 7751R HS7751RVoIP uses the built-in PCI controller (PCIC) | 25 | * The 7751R HS7751RVoIP uses the built-in PCI controller (PCIC) |
@@ -33,25 +28,8 @@ extern void *area6_io16_base; /* Area 6 16bit I/O Base address */ | |||
33 | * like the other Solution Engine boards. | 28 | * like the other Solution Engine boards. |
34 | */ | 29 | */ |
35 | 30 | ||
36 | #define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR) | ||
37 | #define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR) | ||
38 | #define PCI_IO_AREA SH7751_PCI_IO_BASE | ||
39 | #define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE | ||
40 | |||
41 | #define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK)) | ||
42 | |||
43 | #if defined(CONFIG_HS7751RVOIP_CODEC) | ||
44 | #define CODEC_IO_BASE 0x1000 | 31 | #define CODEC_IO_BASE 0x1000 |
45 | #endif | 32 | #define CODEC_IOMAP(a) ((unsigned long)area6_io8_base + ((a) - CODEC_IO_BASE)) |
46 | |||
47 | #define maybebadio(name,port) \ | ||
48 | printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ | ||
49 | #name, (port), (__u32) __builtin_return_address(0)) | ||
50 | |||
51 | static inline void delay(void) | ||
52 | { | ||
53 | ctrl_inw(0xa0000000); | ||
54 | } | ||
55 | 33 | ||
56 | static inline unsigned long port2adr(unsigned int port) | 34 | static inline unsigned long port2adr(unsigned int port) |
57 | { | 35 | { |
@@ -59,9 +37,10 @@ static inline unsigned long port2adr(unsigned int port) | |||
59 | if (port == 0x3f6) | 37 | if (port == 0x3f6) |
60 | return ((unsigned long)area5_io16_base + 0x0c); | 38 | return ((unsigned long)area5_io16_base + 0x0c); |
61 | else | 39 | else |
62 | return ((unsigned long)area5_io16_base + 0x800 + ((port-0x1f0) << 1)); | 40 | return ((unsigned long)area5_io16_base + 0x800 + |
41 | ((port-0x1f0) << 1)); | ||
63 | else | 42 | else |
64 | maybebadio(port2adr, (unsigned long)port); | 43 | maybebadio((unsigned long)port); |
65 | return port; | 44 | return port; |
66 | } | 45 | } |
67 | 46 | ||
@@ -78,25 +57,10 @@ static inline int shifted_port(unsigned long port) | |||
78 | } | 57 | } |
79 | 58 | ||
80 | #if defined(CONFIG_HS7751RVOIP_CODEC) | 59 | #if defined(CONFIG_HS7751RVOIP_CODEC) |
81 | static inline int | 60 | #define codec_port(port) \ |
82 | codec_port(unsigned long port) | 61 | ((CODEC_IO_BASE <= (port)) && ((port) < (CODEC_IO_BASE + 0x20))) |
83 | { | ||
84 | if (CODEC_IO_BASE <= port && port < (CODEC_IO_BASE+0x20)) | ||
85 | return 1; | ||
86 | else | ||
87 | return 0; | ||
88 | } | ||
89 | #endif | ||
90 | |||
91 | /* In case someone configures the kernel w/o PCI support: in that */ | ||
92 | /* scenario, don't ever bother to check for PCI-window addresses */ | ||
93 | |||
94 | /* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */ | ||
95 | #if defined(CONFIG_PCI) | ||
96 | #define CHECK_SH7751_PCIIO(port) \ | ||
97 | ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE))) | ||
98 | #else | 62 | #else |
99 | #define CHECK_SH7751_PCIIO(port) (0) | 63 | #define codec_port(port) (0) |
100 | #endif | 64 | #endif |
101 | 65 | ||
102 | /* | 66 | /* |
@@ -109,15 +73,13 @@ codec_port(unsigned long port) | |||
109 | unsigned char hs7751rvoip_inb(unsigned long port) | 73 | unsigned char hs7751rvoip_inb(unsigned long port) |
110 | { | 74 | { |
111 | if (PXSEG(port)) | 75 | if (PXSEG(port)) |
112 | return *(volatile unsigned char *)port; | 76 | return ctrl_inb(port); |
113 | #if defined(CONFIG_HS7751RVOIP_CODEC) | ||
114 | else if (codec_port(port)) | 77 | else if (codec_port(port)) |
115 | return *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)); | 78 | return ctrl_inb(CODEC_IOMAP(port)); |
116 | #endif | 79 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
117 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 80 | return ctrl_inb(pci_ioaddr(port)); |
118 | return *(volatile unsigned char *)PCI_IOMAP(port); | ||
119 | else | 81 | else |
120 | return (*(volatile unsigned short *)port2adr(port) & 0xff); | 82 | return ctrl_inw(port2adr(port)) & 0xff; |
121 | } | 83 | } |
122 | 84 | ||
123 | unsigned char hs7751rvoip_inb_p(unsigned long port) | 85 | unsigned char hs7751rvoip_inb_p(unsigned long port) |
@@ -125,38 +87,36 @@ unsigned char hs7751rvoip_inb_p(unsigned long port) | |||
125 | unsigned char v; | 87 | unsigned char v; |
126 | 88 | ||
127 | if (PXSEG(port)) | 89 | if (PXSEG(port)) |
128 | v = *(volatile unsigned char *)port; | 90 | v = ctrl_inb(port); |
129 | #if defined(CONFIG_HS7751RVOIP_CODEC) | ||
130 | else if (codec_port(port)) | 91 | else if (codec_port(port)) |
131 | v = *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)); | 92 | v = ctrl_inb(CODEC_IOMAP(port)); |
132 | #endif | 93 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
133 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 94 | v = ctrl_inb(pci_ioaddr(port)); |
134 | v = *(volatile unsigned char *)PCI_IOMAP(port); | ||
135 | else | 95 | else |
136 | v = (*(volatile unsigned short *)port2adr(port) & 0xff); | 96 | v = ctrl_inw(port2adr(port)) & 0xff; |
137 | delay(); | 97 | ctrl_delay(); |
138 | return v; | 98 | return v; |
139 | } | 99 | } |
140 | 100 | ||
141 | unsigned short hs7751rvoip_inw(unsigned long port) | 101 | unsigned short hs7751rvoip_inw(unsigned long port) |
142 | { | 102 | { |
143 | if (PXSEG(port)) | 103 | if (PXSEG(port)) |
144 | return *(volatile unsigned short *)port; | 104 | return ctrl_inw(port); |
145 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 105 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
146 | return *(volatile unsigned short *)PCI_IOMAP(port); | 106 | return ctrl_inw(pci_ioaddr(port)); |
147 | else | 107 | else |
148 | maybebadio(inw, port); | 108 | maybebadio(port); |
149 | return 0; | 109 | return 0; |
150 | } | 110 | } |
151 | 111 | ||
152 | unsigned int hs7751rvoip_inl(unsigned long port) | 112 | unsigned int hs7751rvoip_inl(unsigned long port) |
153 | { | 113 | { |
154 | if (PXSEG(port)) | 114 | if (PXSEG(port)) |
155 | return *(volatile unsigned long *)port; | 115 | return ctrl_inl(port); |
156 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 116 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
157 | return *(volatile unsigned long *)PCI_IOMAP(port); | 117 | return ctrl_inl(pci_ioaddr(port)); |
158 | else | 118 | else |
159 | maybebadio(inl, port); | 119 | maybebadio(port); |
160 | return 0; | 120 | return 0; |
161 | } | 121 | } |
162 | 122 | ||
@@ -164,146 +124,160 @@ void hs7751rvoip_outb(unsigned char value, unsigned long port) | |||
164 | { | 124 | { |
165 | 125 | ||
166 | if (PXSEG(port)) | 126 | if (PXSEG(port)) |
167 | *(volatile unsigned char *)port = value; | 127 | ctrl_outb(value, port); |
168 | #if defined(CONFIG_HS7751RVOIP_CODEC) | ||
169 | else if (codec_port(port)) | 128 | else if (codec_port(port)) |
170 | *(volatile unsigned cjar *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)) = value; | 129 | ctrl_outb(value, CODEC_IOMAP(port)); |
171 | #endif | 130 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
172 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 131 | ctrl_outb(value, pci_ioaddr(port)); |
173 | *(unsigned char *)PCI_IOMAP(port) = value; | ||
174 | else | 132 | else |
175 | *(volatile unsigned short *)port2adr(port) = value; | 133 | ctrl_outb(value, port2adr(port)); |
176 | } | 134 | } |
177 | 135 | ||
178 | void hs7751rvoip_outb_p(unsigned char value, unsigned long port) | 136 | void hs7751rvoip_outb_p(unsigned char value, unsigned long port) |
179 | { | 137 | { |
180 | if (PXSEG(port)) | 138 | if (PXSEG(port)) |
181 | *(volatile unsigned char *)port = value; | 139 | ctrl_outb(value, port); |
182 | #if defined(CONFIG_HS7751RVOIP_CODEC) | ||
183 | else if (codec_port(port)) | 140 | else if (codec_port(port)) |
184 | *(volatile unsigned cjar *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)) = value; | 141 | ctrl_outb(value, CODEC_IOMAP(port)); |
185 | #endif | 142 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
186 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 143 | ctrl_outb(value, pci_ioaddr(port)); |
187 | *(unsigned char *)PCI_IOMAP(port) = value; | ||
188 | else | 144 | else |
189 | *(volatile unsigned short *)port2adr(port) = value; | 145 | ctrl_outw(value, port2adr(port)); |
190 | delay(); | 146 | |
147 | ctrl_delay(); | ||
191 | } | 148 | } |
192 | 149 | ||
193 | void hs7751rvoip_outw(unsigned short value, unsigned long port) | 150 | void hs7751rvoip_outw(unsigned short value, unsigned long port) |
194 | { | 151 | { |
195 | if (PXSEG(port)) | 152 | if (PXSEG(port)) |
196 | *(volatile unsigned short *)port = value; | 153 | ctrl_outw(value, port); |
197 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 154 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
198 | *(unsigned short *)PCI_IOMAP(port) = value; | 155 | ctrl_outw(value, pci_ioaddr(port)); |
199 | else | 156 | else |
200 | maybebadio(outw, port); | 157 | maybebadio(port); |
201 | } | 158 | } |
202 | 159 | ||
203 | void hs7751rvoip_outl(unsigned int value, unsigned long port) | 160 | void hs7751rvoip_outl(unsigned int value, unsigned long port) |
204 | { | 161 | { |
205 | if (PXSEG(port)) | 162 | if (PXSEG(port)) |
206 | *(volatile unsigned long *)port = value; | 163 | ctrl_outl(value, port); |
207 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 164 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
208 | *((unsigned long *)PCI_IOMAP(port)) = value; | 165 | ctrl_outl(value, pci_ioaddr(port)); |
209 | else | 166 | else |
210 | maybebadio(outl, port); | 167 | maybebadio(port); |
211 | } | 168 | } |
212 | 169 | ||
213 | void hs7751rvoip_insb(unsigned long port, void *addr, unsigned long count) | 170 | void hs7751rvoip_insb(unsigned long port, void *addr, unsigned long count) |
214 | { | 171 | { |
172 | u8 *buf = addr; | ||
173 | |||
215 | if (PXSEG(port)) | 174 | if (PXSEG(port)) |
216 | while (count--) *((unsigned char *) addr)++ = *(volatile unsigned char *)port; | 175 | while (count--) |
217 | #if defined(CONFIG_HS7751RVOIP_CODEC) | 176 | *buf++ = ctrl_inb(port); |
218 | else if (codec_port(port)) | 177 | else if (codec_port(port)) |
219 | while (count--) *((unsigned char *) addr)++ = *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)); | 178 | while (count--) |
220 | #endif | 179 | *buf++ = ctrl_inb(CODEC_IOMAP(port)); |
221 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | 180 | else if (is_pci_ioaddr(port) || shifted_port(port)) { |
222 | volatile __u8 *bp = (__u8 *)PCI_IOMAP(port); | 181 | volatile u8 *bp = (volatile u8 *)pci_ioaddr(port); |
223 | 182 | ||
224 | while (count--) *((volatile unsigned char *) addr)++ = *bp; | 183 | while (count--) |
184 | *buf++ = *bp; | ||
225 | } else { | 185 | } else { |
226 | volatile __u16 *p = (volatile unsigned short *)port2adr(port); | 186 | volatile u16 *p = (volatile u16 *)port2adr(port); |
227 | 187 | ||
228 | while (count--) *((unsigned char *) addr)++ = *p & 0xff; | 188 | while (count--) |
189 | *buf++ = *p & 0xff; | ||
229 | } | 190 | } |
230 | } | 191 | } |
231 | 192 | ||
232 | void hs7751rvoip_insw(unsigned long port, void *addr, unsigned long count) | 193 | void hs7751rvoip_insw(unsigned long port, void *addr, unsigned long count) |
233 | { | 194 | { |
234 | volatile __u16 *p; | 195 | volatile u16 *p; |
196 | u16 *buf = addr; | ||
235 | 197 | ||
236 | if (PXSEG(port)) | 198 | if (PXSEG(port)) |
237 | p = (volatile unsigned short *)port; | 199 | p = (volatile u16 *)port; |
238 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 200 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
239 | p = (volatile unsigned short *)PCI_IOMAP(port); | 201 | p = (volatile u16 *)pci_ioaddr(port); |
240 | else | 202 | else |
241 | p = (volatile unsigned short *)port2adr(port); | 203 | p = (volatile u16 *)port2adr(port); |
242 | while (count--) *((__u16 *) addr)++ = *p; | 204 | while (count--) |
205 | *buf++ = *p; | ||
243 | } | 206 | } |
244 | 207 | ||
245 | void hs7751rvoip_insl(unsigned long port, void *addr, unsigned long count) | 208 | void hs7751rvoip_insl(unsigned long port, void *addr, unsigned long count) |
246 | { | 209 | { |
247 | if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | ||
248 | volatile __u32 *p = (__u32 *)PCI_IOMAP(port); | ||
249 | 210 | ||
250 | while (count--) *((__u32 *) addr)++ = *p; | 211 | if (is_pci_ioaddr(port) || shifted_port(port)) { |
212 | volatile u32 *p = (volatile u32 *)pci_ioaddr(port); | ||
213 | u32 *buf = addr; | ||
214 | |||
215 | while (count--) | ||
216 | *buf++ = *p; | ||
251 | } else | 217 | } else |
252 | maybebadio(insl, port); | 218 | maybebadio(port); |
253 | } | 219 | } |
254 | 220 | ||
255 | void hs7751rvoip_outsb(unsigned long port, const void *addr, unsigned long count) | 221 | void hs7751rvoip_outsb(unsigned long port, const void *addr, unsigned long count) |
256 | { | 222 | { |
223 | const u8 *buf = addr; | ||
224 | |||
257 | if (PXSEG(port)) | 225 | if (PXSEG(port)) |
258 | while (count--) *(volatile unsigned char *)port = *((unsigned char *) addr)++; | 226 | while (count--) |
259 | #if defined(CONFIG_HS7751RVOIP_CODEC) | 227 | ctrl_outb(*buf++, port); |
260 | else if (codec_port(port)) | 228 | else if (codec_port(port)) |
261 | while (count--) *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)) = *((unsigned char *) addr)++; | 229 | while (count--) |
262 | #endif | 230 | ctrl_outb(*buf++, CODEC_IOMAP(port)); |
263 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | 231 | else if (is_pci_ioaddr(port) || shifted_port(port)) { |
264 | volatile __u8 *bp = (__u8 *)PCI_IOMAP(port); | 232 | volatile u8 *bp = (volatile u8 *)pci_ioaddr(port); |
265 | 233 | ||
266 | while (count--) *bp = *((volatile unsigned char *) addr)++; | 234 | while (count--) |
235 | *bp = *buf++; | ||
267 | } else { | 236 | } else { |
268 | volatile __u16 *p = (volatile unsigned short *)port2adr(port); | 237 | volatile u16 *p = (volatile u16 *)port2adr(port); |
269 | 238 | ||
270 | while (count--) *p = *((unsigned char *) addr)++; | 239 | while (count--) |
240 | *p = *buf++; | ||
271 | } | 241 | } |
272 | } | 242 | } |
273 | 243 | ||
274 | void hs7751rvoip_outsw(unsigned long port, const void *addr, unsigned long count) | 244 | void hs7751rvoip_outsw(unsigned long port, const void *addr, unsigned long count) |
275 | { | 245 | { |
276 | volatile __u16 *p; | 246 | volatile u16 *p; |
247 | const u16 *buf = addr; | ||
277 | 248 | ||
278 | if (PXSEG(port)) | 249 | if (PXSEG(port)) |
279 | p = (volatile unsigned short *)port; | 250 | p = (volatile u16 *)port; |
280 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 251 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
281 | p = (volatile unsigned short *)PCI_IOMAP(port); | 252 | p = (volatile u16 *)pci_ioaddr(port); |
282 | else | 253 | else |
283 | p = (volatile unsigned short *)port2adr(port); | 254 | p = (volatile u16 *)port2adr(port); |
284 | while (count--) *p = *((__u16 *) addr)++; | 255 | |
256 | while (count--) | ||
257 | *p = *buf++; | ||
285 | } | 258 | } |
286 | 259 | ||
287 | void hs7751rvoip_outsl(unsigned long port, const void *addr, unsigned long count) | 260 | void hs7751rvoip_outsl(unsigned long port, const void *addr, unsigned long count) |
288 | { | 261 | { |
289 | if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | 262 | const u32 *buf = addr; |
290 | volatile __u32 *p = (__u32 *)PCI_IOMAP(port); | ||
291 | 263 | ||
292 | while (count--) *p = *((__u32 *) addr)++; | 264 | if (is_pci_ioaddr(port) || shifted_port(port)) { |
265 | volatile u32 *p = (volatile u32 *)pci_ioaddr(port); | ||
266 | |||
267 | while (count--) | ||
268 | *p = *buf++; | ||
293 | } else | 269 | } else |
294 | maybebadio(outsl, port); | 270 | maybebadio(port); |
295 | } | 271 | } |
296 | 272 | ||
297 | void *hs7751rvoip_ioremap(unsigned long offset, unsigned long size) | 273 | void __iomem *hs7751rvoip_ioport_map(unsigned long port, unsigned int size) |
298 | { | 274 | { |
299 | if (offset >= 0xfd000000) | 275 | if (PXSEG(port)) |
300 | return (void *)offset; | 276 | return (void __iomem *)port; |
301 | else | 277 | else if (unlikely(codec_port(port) && (size == 1))) |
302 | return (void *)P2SEGADDR(offset); | 278 | return (void __iomem *)CODEC_IOMAP(port); |
303 | } | 279 | else if (is_pci_ioaddr(port)) |
304 | EXPORT_SYMBOL(hs7751rvoip_ioremap); | 280 | return (void __iomem *)pci_ioaddr(port); |
305 | 281 | ||
306 | unsigned long hs7751rvoip_isa_port2addr(unsigned long offset) | 282 | return (void __iomem *)port2adr(port); |
307 | { | ||
308 | return port2adr(offset); | ||
309 | } | 283 | } |
diff --git a/arch/sh/boards/renesas/hs7751rvoip/irq.c b/arch/sh/boards/renesas/hs7751rvoip/irq.c index 705b7ddcb0d2..c617b188258a 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/irq.c +++ b/arch/sh/boards/renesas/hs7751rvoip/irq.c | |||
@@ -35,30 +35,24 @@ static unsigned int startup_hs7751rvoip_irq(unsigned int irq) | |||
35 | 35 | ||
36 | static void disable_hs7751rvoip_irq(unsigned int irq) | 36 | static void disable_hs7751rvoip_irq(unsigned int irq) |
37 | { | 37 | { |
38 | unsigned long flags; | ||
39 | unsigned short val; | 38 | unsigned short val; |
40 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); | 39 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); |
41 | 40 | ||
42 | /* Set the priority in IPR to 0 */ | 41 | /* Set the priority in IPR to 0 */ |
43 | local_irq_save(flags); | ||
44 | val = ctrl_inw(IRLCNTR3); | 42 | val = ctrl_inw(IRLCNTR3); |
45 | val &= mask; | 43 | val &= mask; |
46 | ctrl_outw(val, IRLCNTR3); | 44 | ctrl_outw(val, IRLCNTR3); |
47 | local_irq_restore(flags); | ||
48 | } | 45 | } |
49 | 46 | ||
50 | static void enable_hs7751rvoip_irq(unsigned int irq) | 47 | static void enable_hs7751rvoip_irq(unsigned int irq) |
51 | { | 48 | { |
52 | unsigned long flags; | ||
53 | unsigned short val; | 49 | unsigned short val; |
54 | unsigned short value = (0x0001 << mask_pos[irq]); | 50 | unsigned short value = (0x0001 << mask_pos[irq]); |
55 | 51 | ||
56 | /* Set priority in IPR back to original value */ | 52 | /* Set priority in IPR back to original value */ |
57 | local_irq_save(flags); | ||
58 | val = ctrl_inw(IRLCNTR3); | 53 | val = ctrl_inw(IRLCNTR3); |
59 | val |= value; | 54 | val |= value; |
60 | ctrl_outw(val, IRLCNTR3); | 55 | ctrl_outw(val, IRLCNTR3); |
61 | local_irq_restore(flags); | ||
62 | } | 56 | } |
63 | 57 | ||
64 | static void ack_hs7751rvoip_irq(unsigned int irq) | 58 | static void ack_hs7751rvoip_irq(unsigned int irq) |
diff --git a/arch/sh/boards/renesas/hs7751rvoip/led.c b/arch/sh/boards/renesas/hs7751rvoip/led.c deleted file mode 100644 index b6608fff9f38..000000000000 --- a/arch/sh/boards/renesas/hs7751rvoip/led.c +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/kernel/setup_hs7751rvoip.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Kazumoto Kojima | ||
5 | * | ||
6 | * Renesas Technology Sales HS7751RVoIP Support. | ||
7 | * | ||
8 | * Modified for HS7751RVoIP by | ||
9 | * Atom Create Engineering Co., Ltd. 2002. | ||
10 | * Lineo uSolutions, Inc. 2003. | ||
11 | */ | ||
12 | |||
13 | #include <asm/io.h> | ||
14 | #include <asm/hs7751rvoip/hs7751rvoip.h> | ||
15 | |||
16 | extern unsigned int debug_counter; | ||
17 | |||
18 | void debug_led_disp(void) | ||
19 | { | ||
20 | unsigned short value; | ||
21 | |||
22 | value = (unsigned char)debug_counter++; | ||
23 | ctrl_outb((0xf0|value), PA_OUTPORTR); | ||
24 | if (value == 0x0f) | ||
25 | debug_counter = 0; | ||
26 | } | ||
diff --git a/arch/sh/boards/renesas/hs7751rvoip/mach.c b/arch/sh/boards/renesas/hs7751rvoip/mach.c deleted file mode 100644 index caf967f77c61..000000000000 --- a/arch/sh/boards/renesas/hs7751rvoip/mach.c +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/kernel/mach_hs7751rvoip.c | ||
3 | * | ||
4 | * Minor tweak of mach_se.c file to reference hs7751rvoip-specific items. | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * Machine vector for the Renesas Technology sales HS7751RVoIP | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/machvec.h> | ||
15 | #include <asm/rtc.h> | ||
16 | #include <asm/irq.h> | ||
17 | #include <asm/hs7751rvoip/io.h> | ||
18 | |||
19 | extern void init_hs7751rvoip_IRQ(void); | ||
20 | extern void *hs7751rvoip_ioremap(unsigned long, unsigned long); | ||
21 | |||
22 | /* | ||
23 | * The Machine Vector | ||
24 | */ | ||
25 | |||
26 | struct sh_machine_vector mv_hs7751rvoip __initmv = { | ||
27 | .mv_nr_irqs = 72, | ||
28 | |||
29 | .mv_inb = hs7751rvoip_inb, | ||
30 | .mv_inw = hs7751rvoip_inw, | ||
31 | .mv_inl = hs7751rvoip_inl, | ||
32 | .mv_outb = hs7751rvoip_outb, | ||
33 | .mv_outw = hs7751rvoip_outw, | ||
34 | .mv_outl = hs7751rvoip_outl, | ||
35 | |||
36 | .mv_inb_p = hs7751rvoip_inb_p, | ||
37 | .mv_inw_p = hs7751rvoip_inw, | ||
38 | .mv_inl_p = hs7751rvoip_inl, | ||
39 | .mv_outb_p = hs7751rvoip_outb_p, | ||
40 | .mv_outw_p = hs7751rvoip_outw, | ||
41 | .mv_outl_p = hs7751rvoip_outl, | ||
42 | |||
43 | .mv_insb = hs7751rvoip_insb, | ||
44 | .mv_insw = hs7751rvoip_insw, | ||
45 | .mv_insl = hs7751rvoip_insl, | ||
46 | .mv_outsb = hs7751rvoip_outsb, | ||
47 | .mv_outsw = hs7751rvoip_outsw, | ||
48 | .mv_outsl = hs7751rvoip_outsl, | ||
49 | |||
50 | .mv_ioremap = hs7751rvoip_ioremap, | ||
51 | .mv_isa_port2addr = hs7751rvoip_isa_port2addr, | ||
52 | .mv_init_irq = init_hs7751rvoip_IRQ, | ||
53 | }; | ||
54 | ALIAS_MV(hs7751rvoip) | ||
diff --git a/arch/sh/boards/renesas/hs7751rvoip/setup.c b/arch/sh/boards/renesas/hs7751rvoip/setup.c index 29fb5ff70fb5..0414c15c3458 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/setup.c +++ b/arch/sh/boards/renesas/hs7751rvoip/setup.c | |||
@@ -1,44 +1,38 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/setup_hs7751rvoip.c | 2 | * Renesas Technology Sales HS7751RVoIP Support. |
3 | * | 3 | * |
4 | * Copyright (C) 2000 Kazumoto Kojima | 4 | * Copyright (C) 2000 Kazumoto Kojima |
5 | * | 5 | * |
6 | * Renesas Technology Sales HS7751RVoIP Support. | ||
7 | * | ||
8 | * Modified for HS7751RVoIP by | 6 | * Modified for HS7751RVoIP by |
9 | * Atom Create Engineering Co., Ltd. 2002. | 7 | * Atom Create Engineering Co., Ltd. 2002. |
10 | * Lineo uSolutions, Inc. 2003. | 8 | * Lineo uSolutions, Inc. 2003. |
11 | */ | 9 | */ |
12 | |||
13 | #include <linux/init.h> | 10 | #include <linux/init.h> |
14 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
15 | 12 | #include <linux/mm.h> | |
13 | #include <linux/vmalloc.h> | ||
16 | #include <linux/hdreg.h> | 14 | #include <linux/hdreg.h> |
17 | #include <linux/ide.h> | 15 | #include <linux/ide.h> |
16 | #include <linux/pm.h> | ||
18 | #include <asm/io.h> | 17 | #include <asm/io.h> |
19 | #include <asm/hs7751rvoip/hs7751rvoip.h> | 18 | #include <asm/hs7751rvoip/hs7751rvoip.h> |
19 | #include <asm/machvec.h> | ||
20 | #include <asm/rtc.h> | ||
21 | #include <asm/irq.h> | ||
20 | 22 | ||
21 | #include <linux/mm.h> | 23 | static void __init hs7751rvoip_init_irq(void) |
22 | #include <linux/vmalloc.h> | ||
23 | |||
24 | /* defined in mm/ioremap.c */ | ||
25 | extern void * p3_ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags); | ||
26 | |||
27 | unsigned int debug_counter; | ||
28 | |||
29 | const char *get_system_type(void) | ||
30 | { | 24 | { |
31 | return "HS7751RVoIP"; | 25 | #if defined(CONFIG_HS7751RVOIP_CODEC) |
26 | make_ipr_irq(DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
27 | make_ipr_irq(DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
28 | #endif | ||
29 | |||
30 | init_hs7751rvoip_IRQ(); | ||
32 | } | 31 | } |
33 | 32 | ||
34 | /* | 33 | static void hs7751rvoip_power_off(void) |
35 | * Initialize the board | ||
36 | */ | ||
37 | void __init platform_setup(void) | ||
38 | { | 34 | { |
39 | printk(KERN_INFO "Renesas Technology Sales HS7751RVoIP-2 support.\n"); | 35 | ctrl_outw(ctrl_inw(PA_OUTPORTR) & 0xffdf, PA_OUTPORTR); |
40 | ctrl_outb(0xf0, PA_OUTPORTR); | ||
41 | debug_counter = 0; | ||
42 | } | 36 | } |
43 | 37 | ||
44 | void *area5_io8_base; | 38 | void *area5_io8_base; |
@@ -46,16 +40,15 @@ void *area6_io8_base; | |||
46 | void *area5_io16_base; | 40 | void *area5_io16_base; |
47 | void *area6_io16_base; | 41 | void *area6_io16_base; |
48 | 42 | ||
49 | int __init cf_init(void) | 43 | static int __init hs7751rvoip_cf_init(void) |
50 | { | 44 | { |
51 | pgprot_t prot; | 45 | pgprot_t prot; |
52 | unsigned long paddrbase, psize; | 46 | unsigned long paddrbase; |
53 | 47 | ||
54 | /* open I/O area window */ | 48 | /* open I/O area window */ |
55 | paddrbase = virt_to_phys((void *)(PA_AREA5_IO+0x00000800)); | 49 | paddrbase = virt_to_phys((void *)(PA_AREA5_IO+0x00000800)); |
56 | psize = PAGE_SIZE; | ||
57 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_COM16); | 50 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_COM16); |
58 | area5_io16_base = p3_ioremap(paddrbase, psize, prot.pgprot); | 51 | area5_io16_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot); |
59 | if (!area5_io16_base) { | 52 | if (!area5_io16_base) { |
60 | printk("allocate_cf_area : can't open CF I/O window!\n"); | 53 | printk("allocate_cf_area : can't open CF I/O window!\n"); |
61 | return -ENOMEM; | 54 | return -ENOMEM; |
@@ -64,19 +57,18 @@ int __init cf_init(void) | |||
64 | /* XXX : do we need attribute and common-memory area also? */ | 57 | /* XXX : do we need attribute and common-memory area also? */ |
65 | 58 | ||
66 | paddrbase = virt_to_phys((void *)PA_AREA6_IO); | 59 | paddrbase = virt_to_phys((void *)PA_AREA6_IO); |
67 | psize = PAGE_SIZE; | ||
68 | #if defined(CONFIG_HS7751RVOIP_CODEC) | 60 | #if defined(CONFIG_HS7751RVOIP_CODEC) |
69 | prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_COM8); | 61 | prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_COM8); |
70 | #else | 62 | #else |
71 | prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO8); | 63 | prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO8); |
72 | #endif | 64 | #endif |
73 | area6_io8_base = p3_ioremap(paddrbase, psize, prot.pgprot); | 65 | area6_io8_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot); |
74 | if (!area6_io8_base) { | 66 | if (!area6_io8_base) { |
75 | printk("allocate_cf_area : can't open CODEC I/O 8bit window!\n"); | 67 | printk("allocate_cf_area : can't open CODEC I/O 8bit window!\n"); |
76 | return -ENOMEM; | 68 | return -ENOMEM; |
77 | } | 69 | } |
78 | prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16); | 70 | prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16); |
79 | area6_io16_base = p3_ioremap(paddrbase, psize, prot.pgprot); | 71 | area6_io16_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot); |
80 | if (!area6_io16_base) { | 72 | if (!area6_io16_base) { |
81 | printk("allocate_cf_area : can't open CODEC I/O 16bit window!\n"); | 73 | printk("allocate_cf_area : can't open CODEC I/O 16bit window!\n"); |
82 | return -ENOMEM; | 74 | return -ENOMEM; |
@@ -85,4 +77,46 @@ int __init cf_init(void) | |||
85 | return 0; | 77 | return 0; |
86 | } | 78 | } |
87 | 79 | ||
88 | __initcall (cf_init); | 80 | /* |
81 | * Initialize the board | ||
82 | */ | ||
83 | static void __init hs7751rvoip_setup(char **cmdline_p) | ||
84 | { | ||
85 | device_initcall(hs7751rvoip_cf_init); | ||
86 | |||
87 | ctrl_outb(0xf0, PA_OUTPORTR); | ||
88 | pm_power_off = hs7751rvoip_power_off; | ||
89 | |||
90 | printk(KERN_INFO "Renesas Technology Sales HS7751RVoIP-2 support.\n"); | ||
91 | } | ||
92 | |||
93 | struct sh_machine_vector mv_hs7751rvoip __initmv = { | ||
94 | .mv_name = "HS7751RVoIP", | ||
95 | .mv_setup = hs7751rvoip_setup, | ||
96 | .mv_nr_irqs = 72, | ||
97 | |||
98 | .mv_inb = hs7751rvoip_inb, | ||
99 | .mv_inw = hs7751rvoip_inw, | ||
100 | .mv_inl = hs7751rvoip_inl, | ||
101 | .mv_outb = hs7751rvoip_outb, | ||
102 | .mv_outw = hs7751rvoip_outw, | ||
103 | .mv_outl = hs7751rvoip_outl, | ||
104 | |||
105 | .mv_inb_p = hs7751rvoip_inb_p, | ||
106 | .mv_inw_p = hs7751rvoip_inw, | ||
107 | .mv_inl_p = hs7751rvoip_inl, | ||
108 | .mv_outb_p = hs7751rvoip_outb_p, | ||
109 | .mv_outw_p = hs7751rvoip_outw, | ||
110 | .mv_outl_p = hs7751rvoip_outl, | ||
111 | |||
112 | .mv_insb = hs7751rvoip_insb, | ||
113 | .mv_insw = hs7751rvoip_insw, | ||
114 | .mv_insl = hs7751rvoip_insl, | ||
115 | .mv_outsb = hs7751rvoip_outsb, | ||
116 | .mv_outsw = hs7751rvoip_outsw, | ||
117 | .mv_outsl = hs7751rvoip_outsl, | ||
118 | |||
119 | .mv_init_irq = hs7751rvoip_init_irq, | ||
120 | .mv_ioport_map = hs7751rvoip_ioport_map, | ||
121 | }; | ||
122 | ALIAS_MV(hs7751rvoip) | ||
diff --git a/arch/sh/boards/renesas/r7780rp/Kconfig b/arch/sh/boards/renesas/r7780rp/Kconfig new file mode 100644 index 000000000000..c26d9813d239 --- /dev/null +++ b/arch/sh/boards/renesas/r7780rp/Kconfig | |||
@@ -0,0 +1,14 @@ | |||
1 | if SH_R7780RP | ||
2 | |||
3 | menu "R7780RP options" | ||
4 | |||
5 | config SH_R7780MP | ||
6 | bool "R7780MP board support" | ||
7 | default y | ||
8 | help | ||
9 | Selecting this option will enable support for the mass-production | ||
10 | version of the R7780RP. If in doubt, say Y. | ||
11 | |||
12 | endmenu | ||
13 | |||
14 | endif | ||
diff --git a/arch/sh/boards/renesas/r7780rp/Makefile b/arch/sh/boards/renesas/r7780rp/Makefile new file mode 100644 index 000000000000..f1776d027978 --- /dev/null +++ b/arch/sh/boards/renesas/r7780rp/Makefile | |||
@@ -0,0 +1,6 @@ | |||
1 | # | ||
2 | # Makefile for the R7780RP-1 specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o io.o irq.o | ||
6 | obj-$(CONFIG_HEARTBEAT) += led.o | ||
diff --git a/arch/sh/boards/renesas/r7780rp/io.c b/arch/sh/boards/renesas/r7780rp/io.c new file mode 100644 index 000000000000..db92d6e6ae99 --- /dev/null +++ b/arch/sh/boards/renesas/r7780rp/io.c | |||
@@ -0,0 +1,301 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel | ||
3 | * Based largely on io_se.c. | ||
4 | * | ||
5 | * I/O routine for Renesas Solutions Highlander R7780RP-1 | ||
6 | * | ||
7 | * Initial version only to support LAN access; some | ||
8 | * placeholder code from io_r7780rp.c left in with the | ||
9 | * expectation of later SuperIO and PCMCIA access. | ||
10 | */ | ||
11 | #include <linux/pci.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <asm/r7780rp/r7780rp.h> | ||
15 | #include <asm/addrspace.h> | ||
16 | #include <asm/io.h> | ||
17 | |||
18 | static inline unsigned long port2adr(unsigned int port) | ||
19 | { | ||
20 | if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6) | ||
21 | if (port == 0x3f6) | ||
22 | return (PA_AREA5_IO + 0x80c); | ||
23 | else | ||
24 | return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1)); | ||
25 | else | ||
26 | maybebadio((unsigned long)port); | ||
27 | |||
28 | return port; | ||
29 | } | ||
30 | |||
31 | static inline unsigned long port88796l(unsigned int port, int flag) | ||
32 | { | ||
33 | unsigned long addr; | ||
34 | |||
35 | if (flag) | ||
36 | addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1); | ||
37 | else | ||
38 | addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1) + 0x1000; | ||
39 | |||
40 | return addr; | ||
41 | } | ||
42 | |||
43 | /* The 7780 R7780RP-1 seems to have everything hooked */ | ||
44 | /* up pretty normally (nothing on high-bytes only...) so this */ | ||
45 | /* shouldn't be needed */ | ||
46 | static inline int shifted_port(unsigned long port) | ||
47 | { | ||
48 | /* For IDE registers, value is not shifted */ | ||
49 | if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6) | ||
50 | return 0; | ||
51 | else | ||
52 | return 1; | ||
53 | } | ||
54 | |||
55 | #if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE) | ||
56 | #define CHECK_AX88796L_PORT(port) \ | ||
57 | ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20))) | ||
58 | #else | ||
59 | #define CHECK_AX88796L_PORT(port) (0) | ||
60 | #endif | ||
61 | |||
62 | /* | ||
63 | * General outline: remap really low stuff [eventually] to SuperIO, | ||
64 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) | ||
65 | * is mapped through the PCI IO window. Stuff with high bits (PXSEG) | ||
66 | * should be way beyond the window, and is used w/o translation for | ||
67 | * compatibility. | ||
68 | */ | ||
69 | u8 r7780rp_inb(unsigned long port) | ||
70 | { | ||
71 | if (CHECK_AX88796L_PORT(port)) | ||
72 | return ctrl_inw(port88796l(port, 0)) & 0xff; | ||
73 | else if (PXSEG(port)) | ||
74 | return ctrl_inb(port); | ||
75 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
76 | return ctrl_inb(pci_ioaddr(port)); | ||
77 | |||
78 | return ctrl_inw(port2adr(port)) & 0xff; | ||
79 | } | ||
80 | |||
81 | u8 r7780rp_inb_p(unsigned long port) | ||
82 | { | ||
83 | u8 v; | ||
84 | |||
85 | if (CHECK_AX88796L_PORT(port)) | ||
86 | v = ctrl_inw(port88796l(port, 0)) & 0xff; | ||
87 | else if (PXSEG(port)) | ||
88 | v = ctrl_inb(port); | ||
89 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
90 | v = ctrl_inb(pci_ioaddr(port)); | ||
91 | else | ||
92 | v = ctrl_inw(port2adr(port)) & 0xff; | ||
93 | |||
94 | ctrl_delay(); | ||
95 | |||
96 | return v; | ||
97 | } | ||
98 | |||
99 | u16 r7780rp_inw(unsigned long port) | ||
100 | { | ||
101 | if (CHECK_AX88796L_PORT(port)) | ||
102 | maybebadio(port); | ||
103 | else if (PXSEG(port)) | ||
104 | return ctrl_inw(port); | ||
105 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
106 | return ctrl_inw(pci_ioaddr(port)); | ||
107 | else | ||
108 | maybebadio(port); | ||
109 | |||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | u32 r7780rp_inl(unsigned long port) | ||
114 | { | ||
115 | if (CHECK_AX88796L_PORT(port)) | ||
116 | maybebadio(port); | ||
117 | else if (PXSEG(port)) | ||
118 | return ctrl_inl(port); | ||
119 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
120 | return ctrl_inl(pci_ioaddr(port)); | ||
121 | else | ||
122 | maybebadio(port); | ||
123 | |||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | void r7780rp_outb(u8 value, unsigned long port) | ||
128 | { | ||
129 | if (CHECK_AX88796L_PORT(port)) | ||
130 | ctrl_outw(value, port88796l(port, 0)); | ||
131 | else if (PXSEG(port)) | ||
132 | ctrl_outb(value, port); | ||
133 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
134 | ctrl_outb(value, pci_ioaddr(port)); | ||
135 | else | ||
136 | ctrl_outw(value, port2adr(port)); | ||
137 | } | ||
138 | |||
139 | void r7780rp_outb_p(u8 value, unsigned long port) | ||
140 | { | ||
141 | if (CHECK_AX88796L_PORT(port)) | ||
142 | ctrl_outw(value, port88796l(port, 0)); | ||
143 | else if (PXSEG(port)) | ||
144 | ctrl_outb(value, port); | ||
145 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
146 | ctrl_outb(value, pci_ioaddr(port)); | ||
147 | else | ||
148 | ctrl_outw(value, port2adr(port)); | ||
149 | |||
150 | ctrl_delay(); | ||
151 | } | ||
152 | |||
153 | void r7780rp_outw(u16 value, unsigned long port) | ||
154 | { | ||
155 | if (CHECK_AX88796L_PORT(port)) | ||
156 | maybebadio(port); | ||
157 | else if (PXSEG(port)) | ||
158 | ctrl_outw(value, port); | ||
159 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
160 | ctrl_outw(value, pci_ioaddr(port)); | ||
161 | else | ||
162 | maybebadio(port); | ||
163 | } | ||
164 | |||
165 | void r7780rp_outl(u32 value, unsigned long port) | ||
166 | { | ||
167 | if (CHECK_AX88796L_PORT(port)) | ||
168 | maybebadio(port); | ||
169 | else if (PXSEG(port)) | ||
170 | ctrl_outl(value, port); | ||
171 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
172 | ctrl_outl(value, pci_ioaddr(port)); | ||
173 | else | ||
174 | maybebadio(port); | ||
175 | } | ||
176 | |||
177 | void r7780rp_insb(unsigned long port, void *dst, unsigned long count) | ||
178 | { | ||
179 | volatile u16 *p; | ||
180 | u8 *buf = dst; | ||
181 | |||
182 | if (CHECK_AX88796L_PORT(port)) { | ||
183 | p = (volatile u16 *)port88796l(port, 0); | ||
184 | while (count--) | ||
185 | *buf++ = *p & 0xff; | ||
186 | } else if (PXSEG(port)) { | ||
187 | while (count--) | ||
188 | *buf++ = *(volatile u8 *)port; | ||
189 | } else if (is_pci_ioaddr(port) || shifted_port(port)) { | ||
190 | volatile u8 *bp = (volatile u8 *)pci_ioaddr(port); | ||
191 | |||
192 | while (count--) | ||
193 | *buf++ = *bp; | ||
194 | } else { | ||
195 | p = (volatile u16 *)port2adr(port); | ||
196 | while (count--) | ||
197 | *buf++ = *p & 0xff; | ||
198 | } | ||
199 | } | ||
200 | |||
201 | void r7780rp_insw(unsigned long port, void *dst, unsigned long count) | ||
202 | { | ||
203 | volatile u16 *p; | ||
204 | u16 *buf = dst; | ||
205 | |||
206 | if (CHECK_AX88796L_PORT(port)) | ||
207 | p = (volatile u16 *)port88796l(port, 1); | ||
208 | else if (PXSEG(port)) | ||
209 | p = (volatile u16 *)port; | ||
210 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
211 | p = (volatile u16 *)pci_ioaddr(port); | ||
212 | else | ||
213 | p = (volatile u16 *)port2adr(port); | ||
214 | |||
215 | while (count--) | ||
216 | *buf++ = *p; | ||
217 | } | ||
218 | |||
219 | void r7780rp_insl(unsigned long port, void *dst, unsigned long count) | ||
220 | { | ||
221 | u32 *buf = dst; | ||
222 | |||
223 | if (CHECK_AX88796L_PORT(port)) | ||
224 | maybebadio(port); | ||
225 | else if (is_pci_ioaddr(port) || shifted_port(port)) { | ||
226 | volatile u32 *p = (volatile u32 *)pci_ioaddr(port); | ||
227 | |||
228 | while (count--) | ||
229 | *buf++ = *p; | ||
230 | } else | ||
231 | maybebadio(port); | ||
232 | } | ||
233 | |||
234 | void r7780rp_outsb(unsigned long port, const void *src, unsigned long count) | ||
235 | { | ||
236 | volatile u16 *p; | ||
237 | const u8 *buf = src; | ||
238 | |||
239 | if (CHECK_AX88796L_PORT(port)) { | ||
240 | p = (volatile u16 *)port88796l(port, 0); | ||
241 | while (count--) | ||
242 | *p = *buf++; | ||
243 | } else if (PXSEG(port)) | ||
244 | while (count--) | ||
245 | ctrl_outb(*buf++, port); | ||
246 | else if (is_pci_ioaddr(port) || shifted_port(port)) { | ||
247 | volatile u8 *bp = (volatile u8 *)pci_ioaddr(port); | ||
248 | |||
249 | while (count--) | ||
250 | *bp = *buf++; | ||
251 | } else { | ||
252 | p = (volatile u16 *)port2adr(port); | ||
253 | while (count--) | ||
254 | *p = *buf++; | ||
255 | } | ||
256 | } | ||
257 | |||
258 | void r7780rp_outsw(unsigned long port, const void *src, unsigned long count) | ||
259 | { | ||
260 | volatile u16 *p; | ||
261 | const u16 *buf = src; | ||
262 | |||
263 | if (CHECK_AX88796L_PORT(port)) | ||
264 | p = (volatile u16 *)port88796l(port, 1); | ||
265 | else if (PXSEG(port)) | ||
266 | p = (volatile u16 *)port; | ||
267 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
268 | p = (volatile u16 *)pci_ioaddr(port); | ||
269 | else | ||
270 | p = (volatile u16 *)port2adr(port); | ||
271 | |||
272 | while (count--) | ||
273 | *p = *buf++; | ||
274 | } | ||
275 | |||
276 | void r7780rp_outsl(unsigned long port, const void *src, unsigned long count) | ||
277 | { | ||
278 | const u32 *buf = src; | ||
279 | |||
280 | if (CHECK_AX88796L_PORT(port)) | ||
281 | maybebadio(port); | ||
282 | else if (is_pci_ioaddr(port) || shifted_port(port)) { | ||
283 | volatile u32 *p = (volatile u32 *)pci_ioaddr(port); | ||
284 | |||
285 | while (count--) | ||
286 | *p = *buf++; | ||
287 | } else | ||
288 | maybebadio(port); | ||
289 | } | ||
290 | |||
291 | void __iomem *r7780rp_ioport_map(unsigned long port, unsigned int size) | ||
292 | { | ||
293 | if (CHECK_AX88796L_PORT(port)) | ||
294 | return (void __iomem *)port88796l(port, size > 1); | ||
295 | else if (PXSEG(port)) | ||
296 | return (void __iomem *)port; | ||
297 | else if (is_pci_ioaddr(port) || shifted_port(port)) | ||
298 | return (void __iomem *)pci_ioaddr(port); | ||
299 | |||
300 | return (void __iomem *)port2adr(port); | ||
301 | } | ||
diff --git a/arch/sh/boards/renesas/r7780rp/irq.c b/arch/sh/boards/renesas/r7780rp/irq.c new file mode 100644 index 000000000000..61d5e5d3c294 --- /dev/null +++ b/arch/sh/boards/renesas/r7780rp/irq.c | |||
@@ -0,0 +1,117 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/boards/renesas/r7780rp/irq.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Kazumoto Kojima | ||
5 | * | ||
6 | * Renesas Solutions Highlander R7780RP-1 Support. | ||
7 | * | ||
8 | * Modified for R7780RP-1 by | ||
9 | * Atom Create Engineering Co., Ltd. 2002. | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <asm/io.h> | ||
16 | #include <asm/irq.h> | ||
17 | #include <asm/r7780rp/r7780rp.h> | ||
18 | |||
19 | #ifdef CONFIG_SH_R7780MP | ||
20 | static int mask_pos[] = {12, 11, 9, 14, 15, 8, 13, 6, 5, 4, 3, 2, 0, 0, 1, 0}; | ||
21 | #else | ||
22 | static int mask_pos[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 5, 6, 4, 0, 1, 2, 0}; | ||
23 | #endif | ||
24 | |||
25 | static void enable_r7780rp_irq(unsigned int irq); | ||
26 | static void disable_r7780rp_irq(unsigned int irq); | ||
27 | |||
28 | /* shutdown is same as "disable" */ | ||
29 | #define shutdown_r7780rp_irq disable_r7780rp_irq | ||
30 | |||
31 | static void ack_r7780rp_irq(unsigned int irq); | ||
32 | static void end_r7780rp_irq(unsigned int irq); | ||
33 | |||
34 | static unsigned int startup_r7780rp_irq(unsigned int irq) | ||
35 | { | ||
36 | enable_r7780rp_irq(irq); | ||
37 | return 0; /* never anything pending */ | ||
38 | } | ||
39 | |||
40 | static void disable_r7780rp_irq(unsigned int irq) | ||
41 | { | ||
42 | unsigned short val; | ||
43 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); | ||
44 | |||
45 | /* Set the priority in IPR to 0 */ | ||
46 | val = ctrl_inw(IRLCNTR1); | ||
47 | val &= mask; | ||
48 | ctrl_outw(val, IRLCNTR1); | ||
49 | } | ||
50 | |||
51 | static void enable_r7780rp_irq(unsigned int irq) | ||
52 | { | ||
53 | unsigned short val; | ||
54 | unsigned short value = (0x0001 << mask_pos[irq]); | ||
55 | |||
56 | /* Set priority in IPR back to original value */ | ||
57 | val = ctrl_inw(IRLCNTR1); | ||
58 | val |= value; | ||
59 | ctrl_outw(val, IRLCNTR1); | ||
60 | } | ||
61 | |||
62 | static void ack_r7780rp_irq(unsigned int irq) | ||
63 | { | ||
64 | disable_r7780rp_irq(irq); | ||
65 | } | ||
66 | |||
67 | static void end_r7780rp_irq(unsigned int irq) | ||
68 | { | ||
69 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
70 | enable_r7780rp_irq(irq); | ||
71 | } | ||
72 | |||
73 | static struct hw_interrupt_type r7780rp_irq_type = { | ||
74 | .typename = "R7780RP-IRQ", | ||
75 | .startup = startup_r7780rp_irq, | ||
76 | .shutdown = shutdown_r7780rp_irq, | ||
77 | .enable = enable_r7780rp_irq, | ||
78 | .disable = disable_r7780rp_irq, | ||
79 | .ack = ack_r7780rp_irq, | ||
80 | .end = end_r7780rp_irq, | ||
81 | }; | ||
82 | |||
83 | static void make_r7780rp_irq(unsigned int irq) | ||
84 | { | ||
85 | disable_irq_nosync(irq); | ||
86 | irq_desc[irq].handler = &r7780rp_irq_type; | ||
87 | disable_r7780rp_irq(irq); | ||
88 | } | ||
89 | |||
90 | /* | ||
91 | * Initialize IRQ setting | ||
92 | */ | ||
93 | void __init init_r7780rp_IRQ(void) | ||
94 | { | ||
95 | int i; | ||
96 | |||
97 | /* IRL0=PCI Slot #A | ||
98 | * IRL1=PCI Slot #B | ||
99 | * IRL2=PCI Slot #C | ||
100 | * IRL3=PCI Slot #D | ||
101 | * IRL4=CF Card | ||
102 | * IRL5=CF Card Insert | ||
103 | * IRL6=M66596 | ||
104 | * IRL7=SD Card | ||
105 | * IRL8=Touch Panel | ||
106 | * IRL9=SCI | ||
107 | * IRL10=Serial | ||
108 | * IRL11=Extention #A | ||
109 | * IRL11=Extention #B | ||
110 | * IRL12=Debug LAN | ||
111 | * IRL13=Push Switch | ||
112 | * IRL14=ZiggBee IO | ||
113 | */ | ||
114 | |||
115 | for (i=0; i<15; i++) | ||
116 | make_r7780rp_irq(i); | ||
117 | } | ||
diff --git a/arch/sh/boards/renesas/r7780rp/led.c b/arch/sh/boards/renesas/r7780rp/led.c new file mode 100644 index 000000000000..9f02766b6f53 --- /dev/null +++ b/arch/sh/boards/renesas/r7780rp/led.c | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * Copyright (C) Atom Create Engineering Co., Ltd. | ||
3 | * | ||
4 | * May be copied or modified under the terms of GNU General Public | ||
5 | * License. See linux/COPYING for more information. | ||
6 | * | ||
7 | * This file contains Renesas Solutions HIGHLANDER R7780RP-1 specific LED code. | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/sched.h> | ||
12 | #include <asm/io.h> | ||
13 | #include <asm/r7780rp/r7780rp.h> | ||
14 | |||
15 | /* Cycle the LED's in the clasic Knightriger/Sun pattern */ | ||
16 | void heartbeat_r7780rp(void) | ||
17 | { | ||
18 | static unsigned int cnt = 0, period = 0; | ||
19 | volatile unsigned short *p = (volatile unsigned short *)PA_OBLED; | ||
20 | static unsigned bit = 0, up = 1; | ||
21 | unsigned bit_pos[] = {2, 1, 0, 3, 6, 5, 4, 7}; | ||
22 | |||
23 | cnt += 1; | ||
24 | if (cnt < period) | ||
25 | return; | ||
26 | |||
27 | cnt = 0; | ||
28 | |||
29 | /* Go through the points (roughly!): | ||
30 | * f(0)=10, f(1)=16, f(2)=20, f(5)=35, f(int)->110 | ||
31 | */ | ||
32 | period = 110 - ((300 << FSHIFT)/((avenrun[0]/5) + (3<<FSHIFT))); | ||
33 | |||
34 | *p = 1 << bit_pos[bit]; | ||
35 | if (up) | ||
36 | if (bit == 7) { | ||
37 | bit--; | ||
38 | up = 0; | ||
39 | } else | ||
40 | bit++; | ||
41 | else if (bit == 0) | ||
42 | up = 1; | ||
43 | else | ||
44 | bit--; | ||
45 | } | ||
diff --git a/arch/sh/boards/renesas/r7780rp/setup.c b/arch/sh/boards/renesas/r7780rp/setup.c new file mode 100644 index 000000000000..b941aa0aa34e --- /dev/null +++ b/arch/sh/boards/renesas/r7780rp/setup.c | |||
@@ -0,0 +1,163 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/renesas/r7780rp/setup.c | ||
3 | * | ||
4 | * Copyright (C) 2002 Atom Create Engineering Co., Ltd. | ||
5 | * Copyright (C) 2005, 2006 Paul Mundt | ||
6 | * | ||
7 | * Renesas Solutions Highlander R7780RP-1 Support. | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | */ | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <asm/machvec.h> | ||
16 | #include <asm/r7780rp/r7780rp.h> | ||
17 | #include <asm/clock.h> | ||
18 | #include <asm/io.h> | ||
19 | |||
20 | extern void heartbeat_r7780rp(void); | ||
21 | extern void init_r7780rp_IRQ(void); | ||
22 | |||
23 | static struct resource m66596_usb_host_resources[] = { | ||
24 | [0] = { | ||
25 | .start = 0xa4800000, | ||
26 | .end = 0xa4ffffff, | ||
27 | .flags = IORESOURCE_MEM, | ||
28 | }, | ||
29 | [1] = { | ||
30 | .start = 6, /* irq number */ | ||
31 | .end = 6, | ||
32 | .flags = IORESOURCE_IRQ, | ||
33 | }, | ||
34 | }; | ||
35 | |||
36 | static struct platform_device m66596_usb_host_device = { | ||
37 | .name = "m66596-hcd", | ||
38 | .id = 0, | ||
39 | .dev = { | ||
40 | .dma_mask = NULL, /* don't use dma */ | ||
41 | .coherent_dma_mask = 0xffffffff, | ||
42 | }, | ||
43 | .num_resources = ARRAY_SIZE(m66596_usb_host_resources), | ||
44 | .resource = m66596_usb_host_resources, | ||
45 | }; | ||
46 | |||
47 | static struct platform_device *r7780rp_devices[] __initdata = { | ||
48 | &m66596_usb_host_device, | ||
49 | }; | ||
50 | |||
51 | static int __init r7780rp_devices_setup(void) | ||
52 | { | ||
53 | return platform_add_devices(r7780rp_devices, | ||
54 | ARRAY_SIZE(r7780rp_devices)); | ||
55 | } | ||
56 | |||
57 | /* | ||
58 | * Platform specific clocks | ||
59 | */ | ||
60 | static void ivdr_clk_enable(struct clk *clk) | ||
61 | { | ||
62 | ctrl_outw(ctrl_inw(PA_IVDRCTL) | (1 << 8), PA_IVDRCTL); | ||
63 | } | ||
64 | |||
65 | static void ivdr_clk_disable(struct clk *clk) | ||
66 | { | ||
67 | ctrl_outw(ctrl_inw(PA_IVDRCTL) & ~(1 << 8), PA_IVDRCTL); | ||
68 | } | ||
69 | |||
70 | static struct clk_ops ivdr_clk_ops = { | ||
71 | .enable = ivdr_clk_enable, | ||
72 | .disable = ivdr_clk_disable, | ||
73 | }; | ||
74 | |||
75 | static struct clk ivdr_clk = { | ||
76 | .name = "ivdr_clk", | ||
77 | .ops = &ivdr_clk_ops, | ||
78 | }; | ||
79 | |||
80 | static struct clk *r7780rp_clocks[] = { | ||
81 | &ivdr_clk, | ||
82 | }; | ||
83 | |||
84 | static void r7780rp_power_off(void) | ||
85 | { | ||
86 | #ifdef CONFIG_SH_R7780MP | ||
87 | ctrl_outw(0x0001, PA_POFF); | ||
88 | #endif | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * Initialize the board | ||
93 | */ | ||
94 | static void __init r7780rp_setup(char **cmdline_p) | ||
95 | { | ||
96 | u16 ver = ctrl_inw(PA_VERREG); | ||
97 | int i; | ||
98 | |||
99 | device_initcall(r7780rp_devices_setup); | ||
100 | |||
101 | printk(KERN_INFO "Renesas Solutions Highlander R7780RP-1 support.\n"); | ||
102 | |||
103 | printk(KERN_INFO "Board version: %d (revision %d), " | ||
104 | "FPGA version: %d (revision %d)\n", | ||
105 | (ver >> 12) & 0xf, (ver >> 8) & 0xf, | ||
106 | (ver >> 4) & 0xf, ver & 0xf); | ||
107 | |||
108 | /* | ||
109 | * Enable the important clocks right away.. | ||
110 | */ | ||
111 | for (i = 0; i < ARRAY_SIZE(r7780rp_clocks); i++) { | ||
112 | struct clk *clk = r7780rp_clocks[i]; | ||
113 | |||
114 | clk_register(clk); | ||
115 | clk_enable(clk); | ||
116 | } | ||
117 | |||
118 | ctrl_outw(0x0000, PA_OBLED); /* Clear LED. */ | ||
119 | #ifndef CONFIG_SH_R7780MP | ||
120 | ctrl_outw(0x0001, PA_SDPOW); /* SD Power ON */ | ||
121 | #endif | ||
122 | ctrl_outw(ctrl_inw(PA_IVDRCTL) | 0x0100, PA_IVDRCTL); /* Si13112 */ | ||
123 | |||
124 | pm_power_off = r7780rp_power_off; | ||
125 | } | ||
126 | |||
127 | /* | ||
128 | * The Machine Vector | ||
129 | */ | ||
130 | struct sh_machine_vector mv_r7780rp __initmv = { | ||
131 | .mv_name = "Highlander R7780RP-1", | ||
132 | .mv_setup = r7780rp_setup, | ||
133 | |||
134 | .mv_nr_irqs = 109, | ||
135 | |||
136 | .mv_inb = r7780rp_inb, | ||
137 | .mv_inw = r7780rp_inw, | ||
138 | .mv_inl = r7780rp_inl, | ||
139 | .mv_outb = r7780rp_outb, | ||
140 | .mv_outw = r7780rp_outw, | ||
141 | .mv_outl = r7780rp_outl, | ||
142 | |||
143 | .mv_inb_p = r7780rp_inb_p, | ||
144 | .mv_inw_p = r7780rp_inw, | ||
145 | .mv_inl_p = r7780rp_inl, | ||
146 | .mv_outb_p = r7780rp_outb_p, | ||
147 | .mv_outw_p = r7780rp_outw, | ||
148 | .mv_outl_p = r7780rp_outl, | ||
149 | |||
150 | .mv_insb = r7780rp_insb, | ||
151 | .mv_insw = r7780rp_insw, | ||
152 | .mv_insl = r7780rp_insl, | ||
153 | .mv_outsb = r7780rp_outsb, | ||
154 | .mv_outsw = r7780rp_outsw, | ||
155 | .mv_outsl = r7780rp_outsl, | ||
156 | |||
157 | .mv_ioport_map = r7780rp_ioport_map, | ||
158 | .mv_init_irq = init_r7780rp_IRQ, | ||
159 | #ifdef CONFIG_HEARTBEAT | ||
160 | .mv_heartbeat = heartbeat_r7780rp, | ||
161 | #endif | ||
162 | }; | ||
163 | ALIAS_MV(r7780rp) | ||
diff --git a/arch/sh/boards/renesas/rts7751r2d/Kconfig b/arch/sh/boards/renesas/rts7751r2d/Kconfig new file mode 100644 index 000000000000..7780d1fb13ff --- /dev/null +++ b/arch/sh/boards/renesas/rts7751r2d/Kconfig | |||
@@ -0,0 +1,12 @@ | |||
1 | if SH_RTS7751R2D | ||
2 | |||
3 | menu "RTS7751R2D options" | ||
4 | |||
5 | config RTS7751R2D_REV11 | ||
6 | bool "RTS7751R2D Rev. 1.1 board support" | ||
7 | help | ||
8 | Selecting this option will support version rev. 1.1. | ||
9 | endmenu | ||
10 | |||
11 | endif | ||
12 | |||
diff --git a/arch/sh/boards/renesas/rts7751r2d/Makefile b/arch/sh/boards/renesas/rts7751r2d/Makefile index daa53334bdc3..686fc9ea5989 100644 --- a/arch/sh/boards/renesas/rts7751r2d/Makefile +++ b/arch/sh/boards/renesas/rts7751r2d/Makefile | |||
@@ -1,10 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the RTS7751R2D specific parts of the kernel | 2 | # Makefile for the RTS7751R2D specific parts of the kernel |
3 | # | 3 | # |
4 | # Note! Dependencies are done automagically by 'make dep', which also | ||
5 | # removes any old dependencies. DON'T put your own dependencies here | ||
6 | # unless it's something special (ie not a .c file). | ||
7 | # | ||
8 | |||
9 | obj-y := mach.o setup.o io.o irq.o led.o | ||
10 | 4 | ||
5 | obj-y := setup.o io.o irq.o | ||
6 | obj-$(CONFIG_HEARTBEAT) += led.o | ||
diff --git a/arch/sh/boards/renesas/rts7751r2d/io.c b/arch/sh/boards/renesas/rts7751r2d/io.c index 123abbbc91e0..135aa0b5e62d 100644 --- a/arch/sh/boards/renesas/rts7751r2d/io.c +++ b/arch/sh/boards/renesas/rts7751r2d/io.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/io_rts7751r2d.c | ||
3 | * | ||
4 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel | 2 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel |
5 | * Based largely on io_se.c. | 3 | * Based largely on io_se.c. |
6 | * | 4 | * |
@@ -10,17 +8,13 @@ | |||
10 | * placeholder code from io_rts7751r2d.c left in with the | 8 | * placeholder code from io_rts7751r2d.c left in with the |
11 | * expectation of later SuperIO and PCMCIA access. | 9 | * expectation of later SuperIO and PCMCIA access. |
12 | */ | 10 | */ |
13 | |||
14 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
15 | #include <linux/types.h> | 12 | #include <linux/types.h> |
16 | #include <asm/io.h> | 13 | #include <linux/pci.h> |
17 | #include <asm/rts7751r2d/rts7751r2d.h> | 14 | #include <asm/rts7751r2d/rts7751r2d.h> |
15 | #include <asm/io.h> | ||
18 | #include <asm/addrspace.h> | 16 | #include <asm/addrspace.h> |
19 | 17 | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/pci.h> | ||
22 | #include "../../../drivers/pci/pci-sh7751.h" | ||
23 | |||
24 | /* | 18 | /* |
25 | * The 7751R RTS7751R2D uses the built-in PCI controller (PCIC) | 19 | * The 7751R RTS7751R2D uses the built-in PCI controller (PCIC) |
26 | * of the 7751R processor, and has a SuperIO accessible via the PCI. | 20 | * of the 7751R processor, and has a SuperIO accessible via the PCI. |
@@ -28,22 +22,6 @@ | |||
28 | * like the other Solution Engine boards. | 22 | * like the other Solution Engine boards. |
29 | */ | 23 | */ |
30 | 24 | ||
31 | #define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR) | ||
32 | #define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR) | ||
33 | #define PCI_IO_AREA SH7751_PCI_IO_BASE | ||
34 | #define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE | ||
35 | |||
36 | #define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK)) | ||
37 | |||
38 | #define maybebadio(name,port) \ | ||
39 | printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ | ||
40 | #name, (port), (__u32) __builtin_return_address(0)) | ||
41 | |||
42 | static inline void delay(void) | ||
43 | { | ||
44 | ctrl_inw(0xa0000000); | ||
45 | } | ||
46 | |||
47 | static inline unsigned long port2adr(unsigned int port) | 25 | static inline unsigned long port2adr(unsigned int port) |
48 | { | 26 | { |
49 | if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6) | 27 | if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6) |
@@ -52,7 +30,7 @@ static inline unsigned long port2adr(unsigned int port) | |||
52 | else | 30 | else |
53 | return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1)); | 31 | return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1)); |
54 | else | 32 | else |
55 | maybebadio(port2adr, (unsigned long)port); | 33 | maybebadio((unsigned long)port); |
56 | 34 | ||
57 | return port; | 35 | return port; |
58 | } | 36 | } |
@@ -81,17 +59,6 @@ static inline int shifted_port(unsigned long port) | |||
81 | return 1; | 59 | return 1; |
82 | } | 60 | } |
83 | 61 | ||
84 | /* In case someone configures the kernel w/o PCI support: in that */ | ||
85 | /* scenario, don't ever bother to check for PCI-window addresses */ | ||
86 | |||
87 | /* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */ | ||
88 | #if defined(CONFIG_PCI) | ||
89 | #define CHECK_SH7751_PCIIO(port) \ | ||
90 | ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE))) | ||
91 | #else | ||
92 | #define CHECK_SH7751_PCIIO(port) (0) | ||
93 | #endif | ||
94 | |||
95 | #if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE) | 62 | #if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE) |
96 | #define CHECK_AX88796L_PORT(port) \ | 63 | #define CHECK_AX88796L_PORT(port) \ |
97 | ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20))) | 64 | ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20))) |
@@ -112,8 +79,8 @@ unsigned char rts7751r2d_inb(unsigned long port) | |||
112 | return (*(volatile unsigned short *)port88796l(port, 0)) & 0xff; | 79 | return (*(volatile unsigned short *)port88796l(port, 0)) & 0xff; |
113 | else if (PXSEG(port)) | 80 | else if (PXSEG(port)) |
114 | return *(volatile unsigned char *)port; | 81 | return *(volatile unsigned char *)port; |
115 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 82 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
116 | return *(volatile unsigned char *)PCI_IOMAP(port); | 83 | return *(volatile unsigned char *)pci_ioaddr(port); |
117 | else | 84 | else |
118 | return (*(volatile unsigned short *)port2adr(port) & 0xff); | 85 | return (*(volatile unsigned short *)port2adr(port) & 0xff); |
119 | } | 86 | } |
@@ -126,11 +93,12 @@ unsigned char rts7751r2d_inb_p(unsigned long port) | |||
126 | v = (*(volatile unsigned short *)port88796l(port, 0)) & 0xff; | 93 | v = (*(volatile unsigned short *)port88796l(port, 0)) & 0xff; |
127 | else if (PXSEG(port)) | 94 | else if (PXSEG(port)) |
128 | v = *(volatile unsigned char *)port; | 95 | v = *(volatile unsigned char *)port; |
129 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 96 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
130 | v = *(volatile unsigned char *)PCI_IOMAP(port); | 97 | v = *(volatile unsigned char *)pci_ioaddr(port); |
131 | else | 98 | else |
132 | v = (*(volatile unsigned short *)port2adr(port) & 0xff); | 99 | v = (*(volatile unsigned short *)port2adr(port) & 0xff); |
133 | delay(); | 100 | |
101 | ctrl_delay(); | ||
134 | 102 | ||
135 | return v; | 103 | return v; |
136 | } | 104 | } |
@@ -138,13 +106,13 @@ unsigned char rts7751r2d_inb_p(unsigned long port) | |||
138 | unsigned short rts7751r2d_inw(unsigned long port) | 106 | unsigned short rts7751r2d_inw(unsigned long port) |
139 | { | 107 | { |
140 | if (CHECK_AX88796L_PORT(port)) | 108 | if (CHECK_AX88796L_PORT(port)) |
141 | maybebadio(inw, port); | 109 | maybebadio(port); |
142 | else if (PXSEG(port)) | 110 | else if (PXSEG(port)) |
143 | return *(volatile unsigned short *)port; | 111 | return *(volatile unsigned short *)port; |
144 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 112 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
145 | return *(volatile unsigned short *)PCI_IOMAP(port); | 113 | return *(volatile unsigned short *)pci_ioaddr(port); |
146 | else | 114 | else |
147 | maybebadio(inw, port); | 115 | maybebadio(port); |
148 | 116 | ||
149 | return 0; | 117 | return 0; |
150 | } | 118 | } |
@@ -152,13 +120,13 @@ unsigned short rts7751r2d_inw(unsigned long port) | |||
152 | unsigned int rts7751r2d_inl(unsigned long port) | 120 | unsigned int rts7751r2d_inl(unsigned long port) |
153 | { | 121 | { |
154 | if (CHECK_AX88796L_PORT(port)) | 122 | if (CHECK_AX88796L_PORT(port)) |
155 | maybebadio(inl, port); | 123 | maybebadio(port); |
156 | else if (PXSEG(port)) | 124 | else if (PXSEG(port)) |
157 | return *(volatile unsigned long *)port; | 125 | return *(volatile unsigned long *)port; |
158 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 126 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
159 | return *(volatile unsigned long *)PCI_IOMAP(port); | 127 | return *(volatile unsigned long *)pci_ioaddr(port); |
160 | else | 128 | else |
161 | maybebadio(inl, port); | 129 | maybebadio(port); |
162 | 130 | ||
163 | return 0; | 131 | return 0; |
164 | } | 132 | } |
@@ -169,8 +137,8 @@ void rts7751r2d_outb(unsigned char value, unsigned long port) | |||
169 | *((volatile unsigned short *)port88796l(port, 0)) = value; | 137 | *((volatile unsigned short *)port88796l(port, 0)) = value; |
170 | else if (PXSEG(port)) | 138 | else if (PXSEG(port)) |
171 | *(volatile unsigned char *)port = value; | 139 | *(volatile unsigned char *)port = value; |
172 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 140 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
173 | *(volatile unsigned char *)PCI_IOMAP(port) = value; | 141 | *(volatile unsigned char *)pci_ioaddr(port) = value; |
174 | else | 142 | else |
175 | *(volatile unsigned short *)port2adr(port) = value; | 143 | *(volatile unsigned short *)port2adr(port) = value; |
176 | } | 144 | } |
@@ -181,143 +149,152 @@ void rts7751r2d_outb_p(unsigned char value, unsigned long port) | |||
181 | *((volatile unsigned short *)port88796l(port, 0)) = value; | 149 | *((volatile unsigned short *)port88796l(port, 0)) = value; |
182 | else if (PXSEG(port)) | 150 | else if (PXSEG(port)) |
183 | *(volatile unsigned char *)port = value; | 151 | *(volatile unsigned char *)port = value; |
184 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 152 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
185 | *(volatile unsigned char *)PCI_IOMAP(port) = value; | 153 | *(volatile unsigned char *)pci_ioaddr(port) = value; |
186 | else | 154 | else |
187 | *(volatile unsigned short *)port2adr(port) = value; | 155 | *(volatile unsigned short *)port2adr(port) = value; |
188 | delay(); | 156 | |
157 | ctrl_delay(); | ||
189 | } | 158 | } |
190 | 159 | ||
191 | void rts7751r2d_outw(unsigned short value, unsigned long port) | 160 | void rts7751r2d_outw(unsigned short value, unsigned long port) |
192 | { | 161 | { |
193 | if (CHECK_AX88796L_PORT(port)) | 162 | if (CHECK_AX88796L_PORT(port)) |
194 | maybebadio(outw, port); | 163 | maybebadio(port); |
195 | else if (PXSEG(port)) | 164 | else if (PXSEG(port)) |
196 | *(volatile unsigned short *)port = value; | 165 | *(volatile unsigned short *)port = value; |
197 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 166 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
198 | *(volatile unsigned short *)PCI_IOMAP(port) = value; | 167 | *(volatile unsigned short *)pci_ioaddr(port) = value; |
199 | else | 168 | else |
200 | maybebadio(outw, port); | 169 | maybebadio(port); |
201 | } | 170 | } |
202 | 171 | ||
203 | void rts7751r2d_outl(unsigned int value, unsigned long port) | 172 | void rts7751r2d_outl(unsigned int value, unsigned long port) |
204 | { | 173 | { |
205 | if (CHECK_AX88796L_PORT(port)) | 174 | if (CHECK_AX88796L_PORT(port)) |
206 | maybebadio(outl, port); | 175 | maybebadio(port); |
207 | else if (PXSEG(port)) | 176 | else if (PXSEG(port)) |
208 | *(volatile unsigned long *)port = value; | 177 | *(volatile unsigned long *)port = value; |
209 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 178 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
210 | *(volatile unsigned long *)PCI_IOMAP(port) = value; | 179 | *(volatile unsigned long *)pci_ioaddr(port) = value; |
211 | else | 180 | else |
212 | maybebadio(outl, port); | 181 | maybebadio(port); |
213 | } | 182 | } |
214 | 183 | ||
215 | void rts7751r2d_insb(unsigned long port, void *addr, unsigned long count) | 184 | void rts7751r2d_insb(unsigned long port, void *addr, unsigned long count) |
216 | { | 185 | { |
186 | unsigned long a = (unsigned long)addr; | ||
217 | volatile __u8 *bp; | 187 | volatile __u8 *bp; |
218 | volatile __u16 *p; | 188 | volatile __u16 *p; |
219 | unsigned char *s = addr; | ||
220 | 189 | ||
221 | if (CHECK_AX88796L_PORT(port)) { | 190 | if (CHECK_AX88796L_PORT(port)) { |
222 | p = (volatile unsigned short *)port88796l(port, 0); | 191 | p = (volatile unsigned short *)port88796l(port, 0); |
223 | while (count--) *s++ = *p & 0xff; | 192 | while (count--) |
193 | ctrl_outb(*p & 0xff, a++); | ||
224 | } else if (PXSEG(port)) | 194 | } else if (PXSEG(port)) |
225 | while (count--) *s++ = *(volatile unsigned char *)port; | 195 | while (count--) |
226 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | 196 | ctrl_outb(ctrl_inb(port), a++); |
227 | bp = (__u8 *)PCI_IOMAP(port); | 197 | else if (is_pci_ioaddr(port) || shifted_port(port)) { |
228 | while (count--) *s++ = *bp; | 198 | bp = (__u8 *)pci_ioaddr(port); |
199 | while (count--) | ||
200 | ctrl_outb(*bp, a++); | ||
229 | } else { | 201 | } else { |
230 | p = (volatile unsigned short *)port2adr(port); | 202 | p = (volatile unsigned short *)port2adr(port); |
231 | while (count--) *s++ = *p & 0xff; | 203 | while (count--) |
204 | ctrl_outb(*p & 0xff, a++); | ||
232 | } | 205 | } |
233 | } | 206 | } |
234 | 207 | ||
235 | void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count) | 208 | void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count) |
236 | { | 209 | { |
210 | unsigned long a = (unsigned long)addr; | ||
237 | volatile __u16 *p; | 211 | volatile __u16 *p; |
238 | __u16 *s = addr; | ||
239 | 212 | ||
240 | if (CHECK_AX88796L_PORT(port)) | 213 | if (CHECK_AX88796L_PORT(port)) |
241 | p = (volatile unsigned short *)port88796l(port, 1); | 214 | p = (volatile unsigned short *)port88796l(port, 1); |
242 | else if (PXSEG(port)) | 215 | else if (PXSEG(port)) |
243 | p = (volatile unsigned short *)port; | 216 | p = (volatile unsigned short *)port; |
244 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 217 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
245 | p = (volatile unsigned short *)PCI_IOMAP(port); | 218 | p = (volatile unsigned short *)pci_ioaddr(port); |
246 | else | 219 | else |
247 | p = (volatile unsigned short *)port2adr(port); | 220 | p = (volatile unsigned short *)port2adr(port); |
248 | while (count--) *s++ = *p; | 221 | while (count--) |
222 | ctrl_outw(*p, a++); | ||
249 | } | 223 | } |
250 | 224 | ||
251 | void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count) | 225 | void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count) |
252 | { | 226 | { |
253 | if (CHECK_AX88796L_PORT(port)) | 227 | if (CHECK_AX88796L_PORT(port)) |
254 | maybebadio(insl, port); | 228 | maybebadio(port); |
255 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | 229 | else if (is_pci_ioaddr(port) || shifted_port(port)) { |
256 | volatile __u32 *p = (__u32 *)PCI_IOMAP(port); | 230 | unsigned long a = (unsigned long)addr; |
257 | __u32 *s = addr; | 231 | |
258 | 232 | while (count--) { | |
259 | while (count--) *s++ = *p; | 233 | ctrl_outl(ctrl_inl(pci_ioaddr(port)), a); |
234 | a += 4; | ||
235 | } | ||
260 | } else | 236 | } else |
261 | maybebadio(insl, port); | 237 | maybebadio(port); |
262 | } | 238 | } |
263 | 239 | ||
264 | void rts7751r2d_outsb(unsigned long port, const void *addr, unsigned long count) | 240 | void rts7751r2d_outsb(unsigned long port, const void *addr, unsigned long count) |
265 | { | 241 | { |
242 | unsigned long a = (unsigned long)addr; | ||
266 | volatile __u8 *bp; | 243 | volatile __u8 *bp; |
267 | volatile __u16 *p; | 244 | volatile __u16 *p; |
268 | const __u8 *s = addr; | ||
269 | 245 | ||
270 | if (CHECK_AX88796L_PORT(port)) { | 246 | if (CHECK_AX88796L_PORT(port)) { |
271 | p = (volatile unsigned short *)port88796l(port, 0); | 247 | p = (volatile unsigned short *)port88796l(port, 0); |
272 | while (count--) *p = *s++; | 248 | while (count--) |
249 | *p = ctrl_inb(a++); | ||
273 | } else if (PXSEG(port)) | 250 | } else if (PXSEG(port)) |
274 | while (count--) *(volatile unsigned char *)port = *s++; | 251 | while (count--) |
275 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | 252 | ctrl_outb(a++, port); |
276 | bp = (__u8 *)PCI_IOMAP(port); | 253 | else if (is_pci_ioaddr(port) || shifted_port(port)) { |
277 | while (count--) *bp = *s++; | 254 | bp = (__u8 *)pci_ioaddr(port); |
255 | while (count--) | ||
256 | *bp = ctrl_inb(a++); | ||
278 | } else { | 257 | } else { |
279 | p = (volatile unsigned short *)port2adr(port); | 258 | p = (volatile unsigned short *)port2adr(port); |
280 | while (count--) *p = *s++; | 259 | while (count--) |
260 | *p = ctrl_inb(a++); | ||
281 | } | 261 | } |
282 | } | 262 | } |
283 | 263 | ||
284 | void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count) | 264 | void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count) |
285 | { | 265 | { |
266 | unsigned long a = (unsigned long)addr; | ||
286 | volatile __u16 *p; | 267 | volatile __u16 *p; |
287 | const __u16 *s = addr; | ||
288 | 268 | ||
289 | if (CHECK_AX88796L_PORT(port)) | 269 | if (CHECK_AX88796L_PORT(port)) |
290 | p = (volatile unsigned short *)port88796l(port, 1); | 270 | p = (volatile unsigned short *)port88796l(port, 1); |
291 | else if (PXSEG(port)) | 271 | else if (PXSEG(port)) |
292 | p = (volatile unsigned short *)port; | 272 | p = (volatile unsigned short *)port; |
293 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) | 273 | else if (is_pci_ioaddr(port) || shifted_port(port)) |
294 | p = (volatile unsigned short *)PCI_IOMAP(port); | 274 | p = (volatile unsigned short *)pci_ioaddr(port); |
295 | else | 275 | else |
296 | p = (volatile unsigned short *)port2adr(port); | 276 | p = (volatile unsigned short *)port2adr(port); |
297 | while (count--) *p = *s++; | 277 | |
278 | while (count--) { | ||
279 | ctrl_outw(*p, a); | ||
280 | a += 2; | ||
281 | } | ||
298 | } | 282 | } |
299 | 283 | ||
300 | void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count) | 284 | void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count) |
301 | { | 285 | { |
302 | if (CHECK_AX88796L_PORT(port)) | 286 | if (CHECK_AX88796L_PORT(port)) |
303 | maybebadio(outsl, port); | 287 | maybebadio(port); |
304 | else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { | 288 | else if (is_pci_ioaddr(port) || shifted_port(port)) { |
305 | volatile __u32 *p = (__u32 *)PCI_IOMAP(port); | 289 | unsigned long a = (unsigned long)addr; |
306 | const __u32 *s = addr; | 290 | |
307 | 291 | while (count--) { | |
308 | while (count--) *p = *s++; | 292 | ctrl_outl(ctrl_inl(a), pci_ioaddr(port)); |
293 | a += 4; | ||
294 | } | ||
309 | } else | 295 | } else |
310 | maybebadio(outsl, port); | 296 | maybebadio(port); |
311 | } | ||
312 | |||
313 | void *rts7751r2d_ioremap(unsigned long offset, unsigned long size) | ||
314 | { | ||
315 | if (offset >= 0xfd000000) | ||
316 | return (void *)offset; | ||
317 | else | ||
318 | return (void *)P2SEGADDR(offset); | ||
319 | } | 297 | } |
320 | EXPORT_SYMBOL(rts7751r2d_ioremap); | ||
321 | 298 | ||
322 | unsigned long rts7751r2d_isa_port2addr(unsigned long offset) | 299 | unsigned long rts7751r2d_isa_port2addr(unsigned long offset) |
323 | { | 300 | { |
diff --git a/arch/sh/boards/renesas/rts7751r2d/irq.c b/arch/sh/boards/renesas/rts7751r2d/irq.c index 154535440bbf..c915e7a3693a 100644 --- a/arch/sh/boards/renesas/rts7751r2d/irq.c +++ b/arch/sh/boards/renesas/rts7751r2d/irq.c | |||
@@ -41,30 +41,24 @@ static unsigned int startup_rts7751r2d_irq(unsigned int irq) | |||
41 | 41 | ||
42 | static void disable_rts7751r2d_irq(unsigned int irq) | 42 | static void disable_rts7751r2d_irq(unsigned int irq) |
43 | { | 43 | { |
44 | unsigned long flags; | ||
45 | unsigned short val; | 44 | unsigned short val; |
46 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); | 45 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); |
47 | 46 | ||
48 | /* Set the priority in IPR to 0 */ | 47 | /* Set the priority in IPR to 0 */ |
49 | local_irq_save(flags); | ||
50 | val = ctrl_inw(IRLCNTR1); | 48 | val = ctrl_inw(IRLCNTR1); |
51 | val &= mask; | 49 | val &= mask; |
52 | ctrl_outw(val, IRLCNTR1); | 50 | ctrl_outw(val, IRLCNTR1); |
53 | local_irq_restore(flags); | ||
54 | } | 51 | } |
55 | 52 | ||
56 | static void enable_rts7751r2d_irq(unsigned int irq) | 53 | static void enable_rts7751r2d_irq(unsigned int irq) |
57 | { | 54 | { |
58 | unsigned long flags; | ||
59 | unsigned short val; | 55 | unsigned short val; |
60 | unsigned short value = (0x0001 << mask_pos[irq]); | 56 | unsigned short value = (0x0001 << mask_pos[irq]); |
61 | 57 | ||
62 | /* Set priority in IPR back to original value */ | 58 | /* Set priority in IPR back to original value */ |
63 | local_irq_save(flags); | ||
64 | val = ctrl_inw(IRLCNTR1); | 59 | val = ctrl_inw(IRLCNTR1); |
65 | val |= value; | 60 | val |= value; |
66 | ctrl_outw(val, IRLCNTR1); | 61 | ctrl_outw(val, IRLCNTR1); |
67 | local_irq_restore(flags); | ||
68 | } | 62 | } |
69 | 63 | ||
70 | int rts7751r2d_irq_demux(int irq) | 64 | int rts7751r2d_irq_demux(int irq) |
diff --git a/arch/sh/boards/renesas/rts7751r2d/led.c b/arch/sh/boards/renesas/rts7751r2d/led.c index 4d16de71fac1..e14a13d12d4a 100644 --- a/arch/sh/boards/renesas/rts7751r2d/led.c +++ b/arch/sh/boards/renesas/rts7751r2d/led.c | |||
@@ -12,8 +12,6 @@ | |||
12 | #include <asm/io.h> | 12 | #include <asm/io.h> |
13 | #include <asm/rts7751r2d/rts7751r2d.h> | 13 | #include <asm/rts7751r2d/rts7751r2d.h> |
14 | 14 | ||
15 | extern unsigned int debug_counter; | ||
16 | |||
17 | #ifdef CONFIG_HEARTBEAT | 15 | #ifdef CONFIG_HEARTBEAT |
18 | 16 | ||
19 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
@@ -55,12 +53,3 @@ void rts7751r2d_led(unsigned short value) | |||
55 | ctrl_outw(value, PA_OUTPORT); | 53 | ctrl_outw(value, PA_OUTPORT); |
56 | } | 54 | } |
57 | 55 | ||
58 | void debug_led_disp(void) | ||
59 | { | ||
60 | unsigned short value; | ||
61 | |||
62 | value = (unsigned short)debug_counter++; | ||
63 | rts7751r2d_led(value); | ||
64 | if (value == 0xff) | ||
65 | debug_counter = 0; | ||
66 | } | ||
diff --git a/arch/sh/boards/renesas/rts7751r2d/mach.c b/arch/sh/boards/renesas/rts7751r2d/mach.c deleted file mode 100644 index 5ed9e97ea197..000000000000 --- a/arch/sh/boards/renesas/rts7751r2d/mach.c +++ /dev/null | |||
@@ -1,69 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/kernel/mach_rts7751r2d.c | ||
3 | * | ||
4 | * Minor tweak of mach_se.c file to reference rts7751r2d-specific items. | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * Machine vector for the Renesas Technology sales RTS7751R2D | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/types.h> | ||
14 | |||
15 | #include <asm/machvec.h> | ||
16 | #include <asm/rtc.h> | ||
17 | #include <asm/irq.h> | ||
18 | #include <asm/rts7751r2d/io.h> | ||
19 | |||
20 | extern void heartbeat_rts7751r2d(void); | ||
21 | extern void init_rts7751r2d_IRQ(void); | ||
22 | extern void *rts7751r2d_ioremap(unsigned long, unsigned long); | ||
23 | extern int rts7751r2d_irq_demux(int irq); | ||
24 | |||
25 | extern void *voyagergx_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t); | ||
26 | extern int voyagergx_consistent_free(struct device *, size_t, void *, dma_addr_t); | ||
27 | |||
28 | /* | ||
29 | * The Machine Vector | ||
30 | */ | ||
31 | |||
32 | struct sh_machine_vector mv_rts7751r2d __initmv = { | ||
33 | .mv_nr_irqs = 72, | ||
34 | |||
35 | .mv_inb = rts7751r2d_inb, | ||
36 | .mv_inw = rts7751r2d_inw, | ||
37 | .mv_inl = rts7751r2d_inl, | ||
38 | .mv_outb = rts7751r2d_outb, | ||
39 | .mv_outw = rts7751r2d_outw, | ||
40 | .mv_outl = rts7751r2d_outl, | ||
41 | |||
42 | .mv_inb_p = rts7751r2d_inb_p, | ||
43 | .mv_inw_p = rts7751r2d_inw, | ||
44 | .mv_inl_p = rts7751r2d_inl, | ||
45 | .mv_outb_p = rts7751r2d_outb_p, | ||
46 | .mv_outw_p = rts7751r2d_outw, | ||
47 | .mv_outl_p = rts7751r2d_outl, | ||
48 | |||
49 | .mv_insb = rts7751r2d_insb, | ||
50 | .mv_insw = rts7751r2d_insw, | ||
51 | .mv_insl = rts7751r2d_insl, | ||
52 | .mv_outsb = rts7751r2d_outsb, | ||
53 | .mv_outsw = rts7751r2d_outsw, | ||
54 | .mv_outsl = rts7751r2d_outsl, | ||
55 | |||
56 | .mv_ioremap = rts7751r2d_ioremap, | ||
57 | .mv_isa_port2addr = rts7751r2d_isa_port2addr, | ||
58 | .mv_init_irq = init_rts7751r2d_IRQ, | ||
59 | #ifdef CONFIG_HEARTBEAT | ||
60 | .mv_heartbeat = heartbeat_rts7751r2d, | ||
61 | #endif | ||
62 | .mv_irq_demux = rts7751r2d_irq_demux, | ||
63 | |||
64 | #ifdef CONFIG_USB_OHCI_HCD | ||
65 | .mv_consistent_alloc = voyagergx_consistent_alloc, | ||
66 | .mv_consistent_free = voyagergx_consistent_free, | ||
67 | #endif | ||
68 | }; | ||
69 | ALIAS_MV(rts7751r2d) | ||
diff --git a/arch/sh/boards/renesas/rts7751r2d/setup.c b/arch/sh/boards/renesas/rts7751r2d/setup.c index 2587fd1a0240..20597a6e6702 100644 --- a/arch/sh/boards/renesas/rts7751r2d/setup.c +++ b/arch/sh/boards/renesas/rts7751r2d/setup.c | |||
@@ -1,31 +1,142 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/setup_rts7751r2d.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Kazumoto Kojima | ||
5 | * | ||
6 | * Renesas Technology Sales RTS7751R2D Support. | 2 | * Renesas Technology Sales RTS7751R2D Support. |
7 | * | 3 | * |
8 | * Modified for RTS7751R2D by | 4 | * Copyright (C) 2002 Atom Create Engineering Co., Ltd. |
9 | * Atom Create Engineering Co., Ltd. 2002. | 5 | * Copyright (C) 2004 - 2006 Paul Mundt |
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | 10 | */ |
11 | |||
12 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/serial_8250.h> | ||
14 | #include <linux/pm.h> | ||
13 | #include <asm/io.h> | 15 | #include <asm/io.h> |
14 | #include <asm/rts7751r2d/rts7751r2d.h> | 16 | #include <asm/machvec.h> |
17 | #include <asm/mach/rts7751r2d.h> | ||
18 | #include <asm/voyagergx.h> | ||
19 | |||
20 | extern void heartbeat_rts7751r2d(void); | ||
21 | extern void init_rts7751r2d_IRQ(void); | ||
22 | extern int rts7751r2d_irq_demux(int irq); | ||
23 | |||
24 | extern void *voyagergx_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t); | ||
25 | extern int voyagergx_consistent_free(struct device *, size_t, void *, dma_addr_t); | ||
26 | |||
27 | static struct plat_serial8250_port uart_platform_data[] = { | ||
28 | { | ||
29 | .membase = (void *)VOYAGER_UART_BASE, | ||
30 | .mapbase = VOYAGER_UART_BASE, | ||
31 | .iotype = UPIO_MEM, | ||
32 | .irq = VOYAGER_UART0_IRQ, | ||
33 | .flags = UPF_BOOT_AUTOCONF, | ||
34 | .regshift = 2, | ||
35 | .uartclk = (9600 * 16), | ||
36 | }, { | ||
37 | .flags = 0, | ||
38 | }, | ||
39 | }; | ||
40 | |||
41 | static void __init voyagergx_serial_init(void) | ||
42 | { | ||
43 | unsigned long val; | ||
44 | |||
45 | /* | ||
46 | * GPIO Control | ||
47 | */ | ||
48 | val = inl(GPIO_MUX_HIGH); | ||
49 | val |= 0x00001fe0; | ||
50 | outl(val, GPIO_MUX_HIGH); | ||
51 | |||
52 | /* | ||
53 | * Power Mode Gate | ||
54 | */ | ||
55 | val = inl(POWER_MODE0_GATE); | ||
56 | val |= (POWER_MODE0_GATE_U0 | POWER_MODE0_GATE_U1); | ||
57 | outl(val, POWER_MODE0_GATE); | ||
58 | |||
59 | val = inl(POWER_MODE1_GATE); | ||
60 | val |= (POWER_MODE1_GATE_U0 | POWER_MODE1_GATE_U1); | ||
61 | outl(val, POWER_MODE1_GATE); | ||
62 | } | ||
63 | |||
64 | static struct platform_device uart_device = { | ||
65 | .name = "serial8250", | ||
66 | .id = -1, | ||
67 | .dev = { | ||
68 | .platform_data = uart_platform_data, | ||
69 | }, | ||
70 | }; | ||
71 | |||
72 | static struct platform_device *rts7751r2d_devices[] __initdata = { | ||
73 | &uart_device, | ||
74 | }; | ||
15 | 75 | ||
16 | unsigned int debug_counter; | 76 | static int __init rts7751r2d_devices_setup(void) |
77 | { | ||
78 | return platform_add_devices(rts7751r2d_devices, | ||
79 | ARRAY_SIZE(rts7751r2d_devices)); | ||
80 | } | ||
17 | 81 | ||
18 | const char *get_system_type(void) | 82 | static void rts7751r2d_power_off(void) |
19 | { | 83 | { |
20 | return "RTS7751R2D"; | 84 | ctrl_outw(0x0001, PA_POWOFF); |
21 | } | 85 | } |
22 | 86 | ||
23 | /* | 87 | /* |
24 | * Initialize the board | 88 | * Initialize the board |
25 | */ | 89 | */ |
26 | void __init platform_setup(void) | 90 | static void __init rts7751r2d_setup(char **cmdline_p) |
27 | { | 91 | { |
28 | printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n"); | 92 | device_initcall(rts7751r2d_devices_setup); |
93 | |||
29 | ctrl_outw(0x0000, PA_OUTPORT); | 94 | ctrl_outw(0x0000, PA_OUTPORT); |
30 | debug_counter = 0; | 95 | pm_power_off = rts7751r2d_power_off; |
96 | |||
97 | voyagergx_serial_init(); | ||
98 | |||
99 | printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n"); | ||
31 | } | 100 | } |
101 | |||
102 | /* | ||
103 | * The Machine Vector | ||
104 | */ | ||
105 | struct sh_machine_vector mv_rts7751r2d __initmv = { | ||
106 | .mv_name = "RTS7751R2D", | ||
107 | .mv_setup = rts7751r2d_setup, | ||
108 | .mv_nr_irqs = 72, | ||
109 | |||
110 | .mv_inb = rts7751r2d_inb, | ||
111 | .mv_inw = rts7751r2d_inw, | ||
112 | .mv_inl = rts7751r2d_inl, | ||
113 | .mv_outb = rts7751r2d_outb, | ||
114 | .mv_outw = rts7751r2d_outw, | ||
115 | .mv_outl = rts7751r2d_outl, | ||
116 | |||
117 | .mv_inb_p = rts7751r2d_inb_p, | ||
118 | .mv_inw_p = rts7751r2d_inw, | ||
119 | .mv_inl_p = rts7751r2d_inl, | ||
120 | .mv_outb_p = rts7751r2d_outb_p, | ||
121 | .mv_outw_p = rts7751r2d_outw, | ||
122 | .mv_outl_p = rts7751r2d_outl, | ||
123 | |||
124 | .mv_insb = rts7751r2d_insb, | ||
125 | .mv_insw = rts7751r2d_insw, | ||
126 | .mv_insl = rts7751r2d_insl, | ||
127 | .mv_outsb = rts7751r2d_outsb, | ||
128 | .mv_outsw = rts7751r2d_outsw, | ||
129 | .mv_outsl = rts7751r2d_outsl, | ||
130 | |||
131 | .mv_init_irq = init_rts7751r2d_IRQ, | ||
132 | #ifdef CONFIG_HEARTBEAT | ||
133 | .mv_heartbeat = heartbeat_rts7751r2d, | ||
134 | #endif | ||
135 | .mv_irq_demux = rts7751r2d_irq_demux, | ||
136 | |||
137 | #ifdef CONFIG_USB_SM501 | ||
138 | .mv_consistent_alloc = voyagergx_consistent_alloc, | ||
139 | .mv_consistent_free = voyagergx_consistent_free, | ||
140 | #endif | ||
141 | }; | ||
142 | ALIAS_MV(rts7751r2d) | ||
diff --git a/arch/sh/boards/renesas/sh7710voipgw/Makefile b/arch/sh/boards/renesas/sh7710voipgw/Makefile new file mode 100644 index 000000000000..77037567633b --- /dev/null +++ b/arch/sh/boards/renesas/sh7710voipgw/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-y := setup.o | |||
diff --git a/arch/sh/boards/renesas/sh7710voipgw/setup.c b/arch/sh/boards/renesas/sh7710voipgw/setup.c new file mode 100644 index 000000000000..e57e7afab8c6 --- /dev/null +++ b/arch/sh/boards/renesas/sh7710voipgw/setup.c | |||
@@ -0,0 +1,109 @@ | |||
1 | /* | ||
2 | * Renesas Technology SH7710 VoIP Gateway | ||
3 | * | ||
4 | * Copyright (C) 2006 Ranjit Deshpande | ||
5 | * Kenati Technologies Inc. | ||
6 | * | ||
7 | * May be copied or modified under the terms of the GNU General Public | ||
8 | * License. See linux/COPYING for more information. | ||
9 | */ | ||
10 | #include <linux/init.h> | ||
11 | #include <asm/machvec.h> | ||
12 | #include <asm/irq.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/irq.h> | ||
15 | |||
16 | /* | ||
17 | * Initialize IRQ setting | ||
18 | */ | ||
19 | static void __init sh7710voipgw_init_irq(void) | ||
20 | { | ||
21 | /* Disable all interrupts in IPR registers */ | ||
22 | ctrl_outw(0x0, INTC_IPRA); | ||
23 | ctrl_outw(0x0, INTC_IPRB); | ||
24 | ctrl_outw(0x0, INTC_IPRC); | ||
25 | ctrl_outw(0x0, INTC_IPRD); | ||
26 | ctrl_outw(0x0, INTC_IPRE); | ||
27 | ctrl_outw(0x0, INTC_IPRF); | ||
28 | ctrl_outw(0x0, INTC_IPRG); | ||
29 | ctrl_outw(0x0, INTC_IPRH); | ||
30 | ctrl_outw(0x0, INTC_IPRI); | ||
31 | |||
32 | /* Ack all interrupt sources in the IRR0 register */ | ||
33 | ctrl_outb(0x3f, INTC_IRR0); | ||
34 | |||
35 | /* Use IRQ0 - IRQ3 as active low interrupt lines i.e. disable | ||
36 | * IRL mode. | ||
37 | */ | ||
38 | ctrl_outw(0x2aa, INTC_ICR1); | ||
39 | |||
40 | /* Now make IPR interrupts */ | ||
41 | make_ipr_irq(TIMER2_IRQ, TIMER2_IPR_ADDR, | ||
42 | TIMER2_IPR_POS, TIMER2_PRIORITY); | ||
43 | make_ipr_irq(WDT_IRQ, WDT_IPR_ADDR, WDT_IPR_POS, WDT_PRIORITY); | ||
44 | |||
45 | /* SCIF0 */ | ||
46 | make_ipr_irq(SCIF0_ERI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
47 | SCIF0_PRIORITY); | ||
48 | make_ipr_irq(SCIF0_RXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
49 | SCIF0_PRIORITY); | ||
50 | make_ipr_irq(SCIF0_BRI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
51 | SCIF0_PRIORITY); | ||
52 | make_ipr_irq(SCIF0_TXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
53 | SCIF0_PRIORITY); | ||
54 | |||
55 | /* DMAC-1 */ | ||
56 | make_ipr_irq(DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
57 | make_ipr_irq(DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
58 | make_ipr_irq(DMTE2_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
59 | make_ipr_irq(DMTE3_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
60 | |||
61 | /* DMAC-2 */ | ||
62 | make_ipr_irq(DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
63 | make_ipr_irq(DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
64 | |||
65 | /* IPSEC */ | ||
66 | make_ipr_irq(IPSEC_IRQ, IPSEC_IPR_ADDR, IPSEC_IPR_POS, IPSEC_PRIORITY); | ||
67 | |||
68 | /* EDMAC */ | ||
69 | make_ipr_irq(EDMAC0_IRQ, EDMAC0_IPR_ADDR, EDMAC0_IPR_POS, | ||
70 | EDMAC0_PRIORITY); | ||
71 | make_ipr_irq(EDMAC1_IRQ, EDMAC1_IPR_ADDR, EDMAC1_IPR_POS, | ||
72 | EDMAC1_PRIORITY); | ||
73 | make_ipr_irq(EDMAC2_IRQ, EDMAC2_IPR_ADDR, EDMAC2_IPR_POS, | ||
74 | EDMAC2_PRIORITY); | ||
75 | |||
76 | /* SIOF0 */ | ||
77 | make_ipr_irq(SIOF0_ERI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
78 | SIOF0_PRIORITY); | ||
79 | make_ipr_irq(SIOF0_TXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
80 | SIOF0_PRIORITY); | ||
81 | make_ipr_irq(SIOF0_RXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
82 | SIOF0_PRIORITY); | ||
83 | make_ipr_irq(SIOF0_CCI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
84 | SIOF0_PRIORITY); | ||
85 | |||
86 | /* SIOF1 */ | ||
87 | make_ipr_irq(SIOF1_ERI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
88 | SIOF1_PRIORITY); | ||
89 | make_ipr_irq(SIOF1_TXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
90 | SIOF1_PRIORITY); | ||
91 | make_ipr_irq(SIOF1_RXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
92 | SIOF1_PRIORITY); | ||
93 | make_ipr_irq(SIOF1_CCI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
94 | SIOF1_PRIORITY); | ||
95 | |||
96 | /* SLIC IRQ's */ | ||
97 | make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY); | ||
98 | make_ipr_irq(IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY); | ||
99 | } | ||
100 | |||
101 | /* | ||
102 | * The Machine Vector | ||
103 | */ | ||
104 | struct sh_machine_vector mv_sh7710voipgw __initmv = { | ||
105 | .mv_name = "SH7710 VoIP Gateway", | ||
106 | .mv_nr_irqs = 104, | ||
107 | .mv_init_irq = sh7710voipgw_init_irq, | ||
108 | }; | ||
109 | ALIAS_MV(sh7710voipgw) | ||
diff --git a/arch/sh/boards/renesas/systemh/io.c b/arch/sh/boards/renesas/systemh/io.c index cf979011aa94..cde6e5d192c4 100644 --- a/arch/sh/boards/renesas/systemh/io.c +++ b/arch/sh/boards/renesas/systemh/io.c | |||
@@ -5,66 +5,25 @@ | |||
5 | * Based largely on io_se.c. | 5 | * Based largely on io_se.c. |
6 | * | 6 | * |
7 | * I/O routine for Hitachi 7751 Systemh. | 7 | * I/O routine for Hitachi 7751 Systemh. |
8 | * | ||
9 | */ | 8 | */ |
10 | |||
11 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
12 | #include <linux/types.h> | 10 | #include <linux/types.h> |
13 | #include <asm/systemh/7751systemh.h> | 11 | #include <linux/pci.h> |
12 | #include <asm/systemh7751.h> | ||
14 | #include <asm/addrspace.h> | 13 | #include <asm/addrspace.h> |
15 | #include <asm/io.h> | 14 | #include <asm/io.h> |
16 | 15 | ||
17 | #include <linux/pci.h> | ||
18 | #include "../../drivers/pci/pci-sh7751.h" | ||
19 | |||
20 | /* | ||
21 | * The 7751 SystemH Engine uses the built-in PCI controller (PCIC) | ||
22 | * of the 7751 processor, and has a SuperIO accessible on its memory | ||
23 | * bus. | ||
24 | */ | ||
25 | |||
26 | #define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR) | ||
27 | #define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR) | ||
28 | #define PCI_IO_AREA SH7751_PCI_IO_BASE | ||
29 | #define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE | ||
30 | |||
31 | #define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK)) | ||
32 | #define ETHER_IOMAP(adr) (0xB3000000 + (adr)) /*map to 16bits access area | 16 | #define ETHER_IOMAP(adr) (0xB3000000 + (adr)) /*map to 16bits access area |
33 | of smc lan chip*/ | 17 | of smc lan chip*/ |
34 | |||
35 | #define maybebadio(name,port) \ | ||
36 | printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ | ||
37 | #name, (port), (__u32) __builtin_return_address(0)) | ||
38 | |||
39 | static inline void delay(void) | ||
40 | { | ||
41 | ctrl_inw(0xa0000000); | ||
42 | } | ||
43 | |||
44 | static inline volatile __u16 * | 18 | static inline volatile __u16 * |
45 | port2adr(unsigned int port) | 19 | port2adr(unsigned int port) |
46 | { | 20 | { |
47 | if (port >= 0x2000) | 21 | if (port >= 0x2000) |
48 | return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000)); | 22 | return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000)); |
49 | #if 0 | 23 | maybebadio((unsigned long)port); |
50 | else | ||
51 | return (volatile __u16 *) (PA_SUPERIO + (port << 1)); | ||
52 | #endif | ||
53 | maybebadio(name,(unsigned long)port); | ||
54 | return (volatile __u16*)port; | 24 | return (volatile __u16*)port; |
55 | } | 25 | } |
56 | 26 | ||
57 | /* In case someone configures the kernel w/o PCI support: in that */ | ||
58 | /* scenario, don't ever bother to check for PCI-window addresses */ | ||
59 | |||
60 | /* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */ | ||
61 | #if defined(CONFIG_PCI) | ||
62 | #define CHECK_SH7751_PCIIO(port) \ | ||
63 | ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE))) | ||
64 | #else | ||
65 | #define CHECK_SH7751_PCIIO(port) (0) | ||
66 | #endif | ||
67 | |||
68 | /* | 27 | /* |
69 | * General outline: remap really low stuff [eventually] to SuperIO, | 28 | * General outline: remap really low stuff [eventually] to SuperIO, |
70 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) | 29 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) |
@@ -76,8 +35,8 @@ unsigned char sh7751systemh_inb(unsigned long port) | |||
76 | { | 35 | { |
77 | if (PXSEG(port)) | 36 | if (PXSEG(port)) |
78 | return *(volatile unsigned char *)port; | 37 | return *(volatile unsigned char *)port; |
79 | else if (CHECK_SH7751_PCIIO(port)) | 38 | else if (is_pci_ioaddr(port)) |
80 | return *(volatile unsigned char *)PCI_IOMAP(port); | 39 | return *(volatile unsigned char *)pci_ioaddr(port); |
81 | else if (port <= 0x3F1) | 40 | else if (port <= 0x3F1) |
82 | return *(volatile unsigned char *)ETHER_IOMAP(port); | 41 | return *(volatile unsigned char *)ETHER_IOMAP(port); |
83 | else | 42 | else |
@@ -90,13 +49,13 @@ unsigned char sh7751systemh_inb_p(unsigned long port) | |||
90 | 49 | ||
91 | if (PXSEG(port)) | 50 | if (PXSEG(port)) |
92 | v = *(volatile unsigned char *)port; | 51 | v = *(volatile unsigned char *)port; |
93 | else if (CHECK_SH7751_PCIIO(port)) | 52 | else if (is_pci_ioaddr(port)) |
94 | v = *(volatile unsigned char *)PCI_IOMAP(port); | 53 | v = *(volatile unsigned char *)pci_ioaddr(port); |
95 | else if (port <= 0x3F1) | 54 | else if (port <= 0x3F1) |
96 | v = *(volatile unsigned char *)ETHER_IOMAP(port); | 55 | v = *(volatile unsigned char *)ETHER_IOMAP(port); |
97 | else | 56 | else |
98 | v = (*port2adr(port))&0xff; | 57 | v = (*port2adr(port))&0xff; |
99 | delay(); | 58 | ctrl_delay(); |
100 | return v; | 59 | return v; |
101 | } | 60 | } |
102 | 61 | ||
@@ -104,14 +63,14 @@ unsigned short sh7751systemh_inw(unsigned long port) | |||
104 | { | 63 | { |
105 | if (PXSEG(port)) | 64 | if (PXSEG(port)) |
106 | return *(volatile unsigned short *)port; | 65 | return *(volatile unsigned short *)port; |
107 | else if (CHECK_SH7751_PCIIO(port)) | 66 | else if (is_pci_ioaddr(port)) |
108 | return *(volatile unsigned short *)PCI_IOMAP(port); | 67 | return *(volatile unsigned short *)pci_ioaddr(port); |
109 | else if (port >= 0x2000) | 68 | else if (port >= 0x2000) |
110 | return *port2adr(port); | 69 | return *port2adr(port); |
111 | else if (port <= 0x3F1) | 70 | else if (port <= 0x3F1) |
112 | return *(volatile unsigned int *)ETHER_IOMAP(port); | 71 | return *(volatile unsigned int *)ETHER_IOMAP(port); |
113 | else | 72 | else |
114 | maybebadio(inw, port); | 73 | maybebadio(port); |
115 | return 0; | 74 | return 0; |
116 | } | 75 | } |
117 | 76 | ||
@@ -119,14 +78,14 @@ unsigned int sh7751systemh_inl(unsigned long port) | |||
119 | { | 78 | { |
120 | if (PXSEG(port)) | 79 | if (PXSEG(port)) |
121 | return *(volatile unsigned long *)port; | 80 | return *(volatile unsigned long *)port; |
122 | else if (CHECK_SH7751_PCIIO(port)) | 81 | else if (is_pci_ioaddr(port)) |
123 | return *(volatile unsigned int *)PCI_IOMAP(port); | 82 | return *(volatile unsigned int *)pci_ioaddr(port); |
124 | else if (port >= 0x2000) | 83 | else if (port >= 0x2000) |
125 | return *port2adr(port); | 84 | return *port2adr(port); |
126 | else if (port <= 0x3F1) | 85 | else if (port <= 0x3F1) |
127 | return *(volatile unsigned int *)ETHER_IOMAP(port); | 86 | return *(volatile unsigned int *)ETHER_IOMAP(port); |
128 | else | 87 | else |
129 | maybebadio(inl, port); | 88 | maybebadio(port); |
130 | return 0; | 89 | return 0; |
131 | } | 90 | } |
132 | 91 | ||
@@ -135,8 +94,8 @@ void sh7751systemh_outb(unsigned char value, unsigned long port) | |||
135 | 94 | ||
136 | if (PXSEG(port)) | 95 | if (PXSEG(port)) |
137 | *(volatile unsigned char *)port = value; | 96 | *(volatile unsigned char *)port = value; |
138 | else if (CHECK_SH7751_PCIIO(port)) | 97 | else if (is_pci_ioaddr(port)) |
139 | *((unsigned char*)PCI_IOMAP(port)) = value; | 98 | *((unsigned char*)pci_ioaddr(port)) = value; |
140 | else if (port <= 0x3F1) | 99 | else if (port <= 0x3F1) |
141 | *(volatile unsigned char *)ETHER_IOMAP(port) = value; | 100 | *(volatile unsigned char *)ETHER_IOMAP(port) = value; |
142 | else | 101 | else |
@@ -147,37 +106,37 @@ void sh7751systemh_outb_p(unsigned char value, unsigned long port) | |||
147 | { | 106 | { |
148 | if (PXSEG(port)) | 107 | if (PXSEG(port)) |
149 | *(volatile unsigned char *)port = value; | 108 | *(volatile unsigned char *)port = value; |
150 | else if (CHECK_SH7751_PCIIO(port)) | 109 | else if (is_pci_ioaddr(port)) |
151 | *((unsigned char*)PCI_IOMAP(port)) = value; | 110 | *((unsigned char*)pci_ioaddr(port)) = value; |
152 | else if (port <= 0x3F1) | 111 | else if (port <= 0x3F1) |
153 | *(volatile unsigned char *)ETHER_IOMAP(port) = value; | 112 | *(volatile unsigned char *)ETHER_IOMAP(port) = value; |
154 | else | 113 | else |
155 | *(port2adr(port)) = value; | 114 | *(port2adr(port)) = value; |
156 | delay(); | 115 | ctrl_delay(); |
157 | } | 116 | } |
158 | 117 | ||
159 | void sh7751systemh_outw(unsigned short value, unsigned long port) | 118 | void sh7751systemh_outw(unsigned short value, unsigned long port) |
160 | { | 119 | { |
161 | if (PXSEG(port)) | 120 | if (PXSEG(port)) |
162 | *(volatile unsigned short *)port = value; | 121 | *(volatile unsigned short *)port = value; |
163 | else if (CHECK_SH7751_PCIIO(port)) | 122 | else if (is_pci_ioaddr(port)) |
164 | *((unsigned short *)PCI_IOMAP(port)) = value; | 123 | *((unsigned short *)pci_ioaddr(port)) = value; |
165 | else if (port >= 0x2000) | 124 | else if (port >= 0x2000) |
166 | *port2adr(port) = value; | 125 | *port2adr(port) = value; |
167 | else if (port <= 0x3F1) | 126 | else if (port <= 0x3F1) |
168 | *(volatile unsigned short *)ETHER_IOMAP(port) = value; | 127 | *(volatile unsigned short *)ETHER_IOMAP(port) = value; |
169 | else | 128 | else |
170 | maybebadio(outw, port); | 129 | maybebadio(port); |
171 | } | 130 | } |
172 | 131 | ||
173 | void sh7751systemh_outl(unsigned int value, unsigned long port) | 132 | void sh7751systemh_outl(unsigned int value, unsigned long port) |
174 | { | 133 | { |
175 | if (PXSEG(port)) | 134 | if (PXSEG(port)) |
176 | *(volatile unsigned long *)port = value; | 135 | *(volatile unsigned long *)port = value; |
177 | else if (CHECK_SH7751_PCIIO(port)) | 136 | else if (is_pci_ioaddr(port)) |
178 | *((unsigned long*)PCI_IOMAP(port)) = value; | 137 | *((unsigned long*)pci_ioaddr(port)) = value; |
179 | else | 138 | else |
180 | maybebadio(outl, port); | 139 | maybebadio(port); |
181 | } | 140 | } |
182 | 141 | ||
183 | void sh7751systemh_insb(unsigned long port, void *addr, unsigned long count) | 142 | void sh7751systemh_insb(unsigned long port, void *addr, unsigned long count) |
@@ -194,7 +153,7 @@ void sh7751systemh_insw(unsigned long port, void *addr, unsigned long count) | |||
194 | 153 | ||
195 | void sh7751systemh_insl(unsigned long port, void *addr, unsigned long count) | 154 | void sh7751systemh_insl(unsigned long port, void *addr, unsigned long count) |
196 | { | 155 | { |
197 | maybebadio(insl, port); | 156 | maybebadio(port); |
198 | } | 157 | } |
199 | 158 | ||
200 | void sh7751systemh_outsb(unsigned long port, const void *addr, unsigned long count) | 159 | void sh7751systemh_outsb(unsigned long port, const void *addr, unsigned long count) |
@@ -211,73 +170,5 @@ void sh7751systemh_outsw(unsigned long port, const void *addr, unsigned long cou | |||
211 | 170 | ||
212 | void sh7751systemh_outsl(unsigned long port, const void *addr, unsigned long count) | 171 | void sh7751systemh_outsl(unsigned long port, const void *addr, unsigned long count) |
213 | { | 172 | { |
214 | maybebadio(outsw, port); | 173 | maybebadio(port); |
215 | } | ||
216 | |||
217 | /* For read/write calls, just copy generic (pass-thru); PCIMBR is */ | ||
218 | /* already set up. For a larger memory space, these would need to */ | ||
219 | /* reset PCIMBR as needed on a per-call basis... */ | ||
220 | |||
221 | unsigned char sh7751systemh_readb(unsigned long addr) | ||
222 | { | ||
223 | return *(volatile unsigned char*)addr; | ||
224 | } | ||
225 | |||
226 | unsigned short sh7751systemh_readw(unsigned long addr) | ||
227 | { | ||
228 | return *(volatile unsigned short*)addr; | ||
229 | } | ||
230 | |||
231 | unsigned int sh7751systemh_readl(unsigned long addr) | ||
232 | { | ||
233 | return *(volatile unsigned long*)addr; | ||
234 | } | ||
235 | |||
236 | void sh7751systemh_writeb(unsigned char b, unsigned long addr) | ||
237 | { | ||
238 | *(volatile unsigned char*)addr = b; | ||
239 | } | ||
240 | |||
241 | void sh7751systemh_writew(unsigned short b, unsigned long addr) | ||
242 | { | ||
243 | *(volatile unsigned short*)addr = b; | ||
244 | } | ||
245 | |||
246 | void sh7751systemh_writel(unsigned int b, unsigned long addr) | ||
247 | { | ||
248 | *(volatile unsigned long*)addr = b; | ||
249 | } | ||
250 | |||
251 | |||
252 | |||
253 | /* Map ISA bus address to the real address. Only for PCMCIA. */ | ||
254 | |||
255 | /* ISA page descriptor. */ | ||
256 | static __u32 sh_isa_memmap[256]; | ||
257 | |||
258 | #if 0 | ||
259 | static int | ||
260 | sh_isa_mmap(__u32 start, __u32 length, __u32 offset) | ||
261 | { | ||
262 | int idx; | ||
263 | |||
264 | if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000)) | ||
265 | return -1; | ||
266 | |||
267 | idx = start >> 12; | ||
268 | sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff); | ||
269 | printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n", | ||
270 | start, length, offset, idx, sh_isa_memmap[idx]); | ||
271 | return 0; | ||
272 | } | ||
273 | #endif | ||
274 | |||
275 | unsigned long | ||
276 | sh7751systemh_isa_port2addr(unsigned long offset) | ||
277 | { | ||
278 | int idx; | ||
279 | |||
280 | idx = (offset >> 12) & 0xff; | ||
281 | offset &= 0xfff; | ||
282 | return sh_isa_memmap[idx] + offset; | ||
283 | } | 174 | } |
diff --git a/arch/sh/boards/renesas/systemh/irq.c b/arch/sh/boards/renesas/systemh/irq.c index 8372d967f601..8d016dae2333 100644 --- a/arch/sh/boards/renesas/systemh/irq.c +++ b/arch/sh/boards/renesas/systemh/irq.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/hdreg.h> | 15 | #include <linux/hdreg.h> |
16 | #include <linux/ide.h> | 16 | #include <linux/ide.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | #include <asm/mach/7751systemh.h> | 18 | #include <asm/systemh7751.h> |
19 | #include <asm/smc37c93x.h> | 19 | #include <asm/smc37c93x.h> |
20 | 20 | ||
21 | /* address of external interrupt mask register | 21 | /* address of external interrupt mask register |
@@ -57,12 +57,9 @@ static void shutdown_systemh_irq(unsigned int irq) | |||
57 | static void disable_systemh_irq(unsigned int irq) | 57 | static void disable_systemh_irq(unsigned int irq) |
58 | { | 58 | { |
59 | if (systemh_irq_mask_register) { | 59 | if (systemh_irq_mask_register) { |
60 | unsigned long flags; | ||
61 | unsigned long val, mask = 0x01 << 1; | 60 | unsigned long val, mask = 0x01 << 1; |
62 | 61 | ||
63 | /* Clear the "irq"th bit in the mask and set it in the request */ | 62 | /* Clear the "irq"th bit in the mask and set it in the request */ |
64 | local_irq_save(flags); | ||
65 | |||
66 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); | 63 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); |
67 | val &= ~mask; | 64 | val &= ~mask; |
68 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); | 65 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); |
@@ -70,23 +67,18 @@ static void disable_systemh_irq(unsigned int irq) | |||
70 | val = ctrl_inl((unsigned long)systemh_irq_request_register); | 67 | val = ctrl_inl((unsigned long)systemh_irq_request_register); |
71 | val |= mask; | 68 | val |= mask; |
72 | ctrl_outl(val, (unsigned long)systemh_irq_request_register); | 69 | ctrl_outl(val, (unsigned long)systemh_irq_request_register); |
73 | |||
74 | local_irq_restore(flags); | ||
75 | } | 70 | } |
76 | } | 71 | } |
77 | 72 | ||
78 | static void enable_systemh_irq(unsigned int irq) | 73 | static void enable_systemh_irq(unsigned int irq) |
79 | { | 74 | { |
80 | if (systemh_irq_mask_register) { | 75 | if (systemh_irq_mask_register) { |
81 | unsigned long flags; | ||
82 | unsigned long val, mask = 0x01 << 1; | 76 | unsigned long val, mask = 0x01 << 1; |
83 | 77 | ||
84 | /* Set "irq"th bit in the mask register */ | 78 | /* Set "irq"th bit in the mask register */ |
85 | local_irq_save(flags); | ||
86 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); | 79 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); |
87 | val |= mask; | 80 | val |= mask; |
88 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); | 81 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); |
89 | local_irq_restore(flags); | ||
90 | } | 82 | } |
91 | } | 83 | } |
92 | 84 | ||
diff --git a/arch/sh/boards/renesas/systemh/setup.c b/arch/sh/boards/renesas/systemh/setup.c index 826fa3d7669c..a8467bf90c25 100644 --- a/arch/sh/boards/renesas/systemh/setup.c +++ b/arch/sh/boards/renesas/systemh/setup.c | |||
@@ -15,28 +15,21 @@ | |||
15 | * for more details. | 15 | * for more details. |
16 | */ | 16 | */ |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <asm/mach/7751systemh.h> | ||
19 | #include <asm/mach/io.h> | ||
20 | #include <asm/machvec.h> | 18 | #include <asm/machvec.h> |
19 | #include <asm/systemh7751.h> | ||
21 | 20 | ||
22 | extern void make_systemh_irq(unsigned int irq); | 21 | extern void make_systemh_irq(unsigned int irq); |
23 | 22 | ||
24 | const char *get_system_type(void) | ||
25 | { | ||
26 | return "7751 SystemH"; | ||
27 | } | ||
28 | |||
29 | /* | 23 | /* |
30 | * Initialize IRQ setting | 24 | * Initialize IRQ setting |
31 | */ | 25 | */ |
32 | void __init init_7751systemh_IRQ(void) | 26 | static void __init sh7751systemh_init_irq(void) |
33 | { | 27 | { |
34 | /* make_ipr_irq(10, BCR_ILCRD, 1, 0x0f-10); LAN */ | ||
35 | /* make_ipr_irq(14, BCR_ILCRA, 2, 0x0f-4); */ | ||
36 | make_systemh_irq(0xb); /* Ethernet interrupt */ | 28 | make_systemh_irq(0xb); /* Ethernet interrupt */ |
37 | } | 29 | } |
38 | 30 | ||
39 | struct sh_machine_vector mv_7751systemh __initmv = { | 31 | struct sh_machine_vector mv_7751systemh __initmv = { |
32 | .mv_name = "7751 SystemH", | ||
40 | .mv_nr_irqs = 72, | 33 | .mv_nr_irqs = 72, |
41 | 34 | ||
42 | .mv_inb = sh7751systemh_inb, | 35 | .mv_inb = sh7751systemh_inb, |
@@ -60,21 +53,6 @@ struct sh_machine_vector mv_7751systemh __initmv = { | |||
60 | .mv_outsw = sh7751systemh_outsw, | 53 | .mv_outsw = sh7751systemh_outsw, |
61 | .mv_outsl = sh7751systemh_outsl, | 54 | .mv_outsl = sh7751systemh_outsl, |
62 | 55 | ||
63 | .mv_readb = sh7751systemh_readb, | 56 | .mv_init_irq = sh7751system_init_irq, |
64 | .mv_readw = sh7751systemh_readw, | ||
65 | .mv_readl = sh7751systemh_readl, | ||
66 | .mv_writeb = sh7751systemh_writeb, | ||
67 | .mv_writew = sh7751systemh_writew, | ||
68 | .mv_writel = sh7751systemh_writel, | ||
69 | |||
70 | .mv_isa_port2addr = sh7751systemh_isa_port2addr, | ||
71 | |||
72 | .mv_init_irq = init_7751systemh_IRQ, | ||
73 | }; | 57 | }; |
74 | ALIAS_MV(7751systemh) | 58 | ALIAS_MV(7751systemh) |
75 | |||
76 | int __init platform_setup(void) | ||
77 | { | ||
78 | return 0; | ||
79 | } | ||
80 | |||
diff --git a/arch/sh/boards/saturn/setup.c b/arch/sh/boards/saturn/setup.c index bea6c572ad82..a3a37c9aad2e 100644 --- a/arch/sh/boards/saturn/setup.c +++ b/arch/sh/boards/saturn/setup.c | |||
@@ -9,22 +9,17 @@ | |||
9 | */ | 9 | */ |
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | |||
13 | #include <asm/io.h> | 12 | #include <asm/io.h> |
14 | #include <asm/machvec.h> | 13 | #include <asm/machvec.h> |
15 | #include <asm/mach/io.h> | 14 | #include <asm/mach/io.h> |
16 | 15 | ||
17 | extern int saturn_irq_demux(int irq_nr); | 16 | extern int saturn_irq_demux(int irq_nr); |
18 | 17 | ||
19 | const char *get_system_type(void) | ||
20 | { | ||
21 | return "Sega Saturn"; | ||
22 | } | ||
23 | |||
24 | /* | 18 | /* |
25 | * The Machine Vector | 19 | * The Machine Vector |
26 | */ | 20 | */ |
27 | struct sh_machine_vector mv_saturn __initmv = { | 21 | struct sh_machine_vector mv_saturn __initmv = { |
22 | .mv_name = "Sega Saturn", | ||
28 | .mv_nr_irqs = 80, /* Fix this later */ | 23 | .mv_nr_irqs = 80, /* Fix this later */ |
29 | 24 | ||
30 | .mv_isa_port2addr = saturn_isa_port2addr, | 25 | .mv_isa_port2addr = saturn_isa_port2addr, |
@@ -33,11 +28,4 @@ struct sh_machine_vector mv_saturn __initmv = { | |||
33 | .mv_ioremap = saturn_ioremap, | 28 | .mv_ioremap = saturn_ioremap, |
34 | .mv_iounmap = saturn_iounmap, | 29 | .mv_iounmap = saturn_iounmap, |
35 | }; | 30 | }; |
36 | |||
37 | ALIAS_MV(saturn) | 31 | ALIAS_MV(saturn) |
38 | |||
39 | int __init platform_setup(void) | ||
40 | { | ||
41 | return 0; | ||
42 | } | ||
43 | |||
diff --git a/arch/sh/boards/se/7300/io.c b/arch/sh/boards/se/7300/io.c index f449a94ddffd..8a03d7a52a7c 100644 --- a/arch/sh/boards/se/7300/io.c +++ b/arch/sh/boards/se/7300/io.c | |||
@@ -9,8 +9,8 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <asm/mach/se7300.h> | ||
13 | #include <asm/io.h> | 12 | #include <asm/io.h> |
13 | #include <asm/se7300.h> | ||
14 | 14 | ||
15 | #define badio(fn, a) panic("bad i/o operation %s for %08lx.", #fn, a) | 15 | #define badio(fn, a) panic("bad i/o operation %s for %08lx.", #fn, a) |
16 | 16 | ||
@@ -99,6 +99,7 @@ bad_outb(struct iop *p, unsigned char value, unsigned long port) | |||
99 | badio(inw, port); | 99 | badio(inw, port); |
100 | } | 100 | } |
101 | 101 | ||
102 | #ifdef CONFIG_SMC91X | ||
102 | /* MSTLANEX01 LAN at 0xb400:0000 */ | 103 | /* MSTLANEX01 LAN at 0xb400:0000 */ |
103 | static struct iop laniop = { | 104 | static struct iop laniop = { |
104 | .start = 0x300, | 105 | .start = 0x300, |
@@ -110,6 +111,7 @@ static struct iop laniop = { | |||
110 | .outb = simple_outb, | 111 | .outb = simple_outb, |
111 | .outw = simple_outw, | 112 | .outw = simple_outw, |
112 | }; | 113 | }; |
114 | #endif | ||
113 | 115 | ||
114 | /* NE2000 pc card NIC */ | 116 | /* NE2000 pc card NIC */ |
115 | static struct iop neiop = { | 117 | static struct iop neiop = { |
@@ -123,6 +125,7 @@ static struct iop neiop = { | |||
123 | .outw = simple_outw, | 125 | .outw = simple_outw, |
124 | }; | 126 | }; |
125 | 127 | ||
128 | #ifdef CONFIG_IDE | ||
126 | /* CF in CF slot */ | 129 | /* CF in CF slot */ |
127 | static struct iop cfiop = { | 130 | static struct iop cfiop = { |
128 | .base = 0xb0600000, | 131 | .base = 0xb0600000, |
@@ -132,12 +135,13 @@ static struct iop cfiop = { | |||
132 | .outb = pcc_outb, | 135 | .outb = pcc_outb, |
133 | .outw = simple_outw, | 136 | .outw = simple_outw, |
134 | }; | 137 | }; |
138 | #endif | ||
135 | 139 | ||
136 | static __inline__ struct iop * | 140 | static __inline__ struct iop * |
137 | port2iop(unsigned long port) | 141 | port2iop(unsigned long port) |
138 | { | 142 | { |
139 | if (0) ; | 143 | if (0) ; |
140 | #if defined(CONFIG_SMC91111) | 144 | #if defined(CONFIG_SMC91X) |
141 | else if (laniop.check(&laniop, port)) | 145 | else if (laniop.check(&laniop, port)) |
142 | return &laniop; | 146 | return &laniop; |
143 | #endif | 147 | #endif |
diff --git a/arch/sh/boards/se/7300/irq.c b/arch/sh/boards/se/7300/irq.c index 216a78d1a108..ad1034f98a29 100644 --- a/arch/sh/boards/se/7300/irq.c +++ b/arch/sh/boards/se/7300/irq.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
12 | #include <asm/irq.h> | 12 | #include <asm/irq.h> |
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
14 | #include <asm/mach/se7300.h> | 14 | #include <asm/se7300.h> |
15 | 15 | ||
16 | /* | 16 | /* |
17 | * Initialize IRQ setting | 17 | * Initialize IRQ setting |
diff --git a/arch/sh/boards/se/7300/led.c b/arch/sh/boards/se/7300/led.c index ad51f0a9c1e3..4d03bb7774be 100644 --- a/arch/sh/boards/se/7300/led.c +++ b/arch/sh/boards/se/7300/led.c | |||
@@ -12,24 +12,10 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
15 | #include <asm/mach/se7300.h> | 15 | #include <asm/se7300.h> |
16 | |||
17 | static void | ||
18 | mach_led(int position, int value) | ||
19 | { | ||
20 | volatile unsigned short *p = (volatile unsigned short *) PA_LED; | ||
21 | |||
22 | if (value) { | ||
23 | *p |= (1 << 8); | ||
24 | } else { | ||
25 | *p &= ~(1 << 8); | ||
26 | } | ||
27 | } | ||
28 | |||
29 | 16 | ||
30 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ | 17 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ |
31 | void | 18 | void heartbeat_7300se(void) |
32 | heartbeat_7300se(void) | ||
33 | { | 19 | { |
34 | static unsigned int cnt = 0, period = 0; | 20 | static unsigned int cnt = 0, period = 0; |
35 | volatile unsigned short *p = (volatile unsigned short *) PA_LED; | 21 | volatile unsigned short *p = (volatile unsigned short *) PA_LED; |
diff --git a/arch/sh/boards/se/7300/setup.c b/arch/sh/boards/se/7300/setup.c index ebcd98d4c081..6f082a722d42 100644 --- a/arch/sh/boards/se/7300/setup.c +++ b/arch/sh/boards/se/7300/setup.c | |||
@@ -9,23 +9,16 @@ | |||
9 | 9 | ||
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | #include <asm/machvec.h> | 11 | #include <asm/machvec.h> |
12 | #include <asm/machvec_init.h> | 12 | #include <asm/se7300.h> |
13 | #include <asm/mach/io.h> | ||
14 | 13 | ||
15 | void heartbeat_7300se(void); | 14 | void heartbeat_7300se(void); |
16 | void init_7300se_IRQ(void); | 15 | void init_7300se_IRQ(void); |
17 | 16 | ||
18 | const char * | ||
19 | get_system_type(void) | ||
20 | { | ||
21 | return "SolutionEngine 7300"; | ||
22 | } | ||
23 | |||
24 | /* | 17 | /* |
25 | * The Machine Vector | 18 | * The Machine Vector |
26 | */ | 19 | */ |
27 | |||
28 | struct sh_machine_vector mv_7300se __initmv = { | 20 | struct sh_machine_vector mv_7300se __initmv = { |
21 | .mv_name = "SolutionEngine 7300", | ||
29 | .mv_nr_irqs = 109, | 22 | .mv_nr_irqs = 109, |
30 | .mv_inb = sh7300se_inb, | 23 | .mv_inb = sh7300se_inb, |
31 | .mv_inw = sh7300se_inw, | 24 | .mv_inw = sh7300se_inw, |
@@ -53,13 +46,4 @@ struct sh_machine_vector mv_7300se __initmv = { | |||
53 | .mv_heartbeat = heartbeat_7300se, | 46 | .mv_heartbeat = heartbeat_7300se, |
54 | #endif | 47 | #endif |
55 | }; | 48 | }; |
56 | |||
57 | ALIAS_MV(7300se) | 49 | ALIAS_MV(7300se) |
58 | /* | ||
59 | * Initialize the board | ||
60 | */ | ||
61 | void __init | ||
62 | platform_setup(void) | ||
63 | { | ||
64 | |||
65 | } | ||
diff --git a/arch/sh/boards/se/73180/io.c b/arch/sh/boards/se/73180/io.c index 755df5ac4a4e..72715575458b 100644 --- a/arch/sh/boards/se/73180/io.c +++ b/arch/sh/boards/se/73180/io.c | |||
@@ -99,6 +99,7 @@ bad_outb(struct iop *p, unsigned char value, unsigned long port) | |||
99 | badio(inw, port); | 99 | badio(inw, port); |
100 | } | 100 | } |
101 | 101 | ||
102 | #ifdef CONFIG_SMC91X | ||
102 | /* MSTLANEX01 LAN at 0xb400:0000 */ | 103 | /* MSTLANEX01 LAN at 0xb400:0000 */ |
103 | static struct iop laniop = { | 104 | static struct iop laniop = { |
104 | .start = 0x300, | 105 | .start = 0x300, |
@@ -110,6 +111,7 @@ static struct iop laniop = { | |||
110 | .outb = simple_outb, | 111 | .outb = simple_outb, |
111 | .outw = simple_outw, | 112 | .outw = simple_outw, |
112 | }; | 113 | }; |
114 | #endif | ||
113 | 115 | ||
114 | /* NE2000 pc card NIC */ | 116 | /* NE2000 pc card NIC */ |
115 | static struct iop neiop = { | 117 | static struct iop neiop = { |
@@ -123,6 +125,7 @@ static struct iop neiop = { | |||
123 | .outw = simple_outw, | 125 | .outw = simple_outw, |
124 | }; | 126 | }; |
125 | 127 | ||
128 | #ifdef CONFIG_IDE | ||
126 | /* CF in CF slot */ | 129 | /* CF in CF slot */ |
127 | static struct iop cfiop = { | 130 | static struct iop cfiop = { |
128 | .base = 0xb0600000, | 131 | .base = 0xb0600000, |
@@ -132,12 +135,13 @@ static struct iop cfiop = { | |||
132 | .outb = pcc_outb, | 135 | .outb = pcc_outb, |
133 | .outw = simple_outw, | 136 | .outw = simple_outw, |
134 | }; | 137 | }; |
138 | #endif | ||
135 | 139 | ||
136 | static __inline__ struct iop * | 140 | static __inline__ struct iop * |
137 | port2iop(unsigned long port) | 141 | port2iop(unsigned long port) |
138 | { | 142 | { |
139 | if (0) ; | 143 | if (0) ; |
140 | #if defined(CONFIG_SMC91111) | 144 | #if defined(CONFIG_SMC91X) |
141 | else if (laniop.check(&laniop, port)) | 145 | else if (laniop.check(&laniop, port)) |
142 | return &laniop; | 146 | return &laniop; |
143 | #endif | 147 | #endif |
diff --git a/arch/sh/boards/se/73180/irq.c b/arch/sh/boards/se/73180/irq.c index 4344d0ef24aa..2c62b8ea350e 100644 --- a/arch/sh/boards/se/73180/irq.c +++ b/arch/sh/boards/se/73180/irq.c | |||
@@ -7,7 +7,6 @@ | |||
7 | * Modified for SH-Mobile SolutionEngine 73180 Support | 7 | * Modified for SH-Mobile SolutionEngine 73180 Support |
8 | * by YOSHII Takashi <yoshii-takashi@hitachi-ul.co.jp> | 8 | * by YOSHII Takashi <yoshii-takashi@hitachi-ul.co.jp> |
9 | * | 9 | * |
10 | * | ||
11 | */ | 10 | */ |
12 | 11 | ||
13 | #include <linux/init.h> | 12 | #include <linux/init.h> |
@@ -17,14 +16,6 @@ | |||
17 | #include <asm/mach/se73180.h> | 16 | #include <asm/mach/se73180.h> |
18 | 17 | ||
19 | static int | 18 | static int |
20 | intreq2irq(int i) | ||
21 | { | ||
22 | if (i == 5) | ||
23 | return 10; | ||
24 | return 32 + 7 - i; | ||
25 | } | ||
26 | |||
27 | static int | ||
28 | irq2intreq(int irq) | 19 | irq2intreq(int irq) |
29 | { | 20 | { |
30 | if (irq == 10) | 21 | if (irq == 10) |
diff --git a/arch/sh/boards/se/73180/led.c b/arch/sh/boards/se/73180/led.c index 610439fde6ee..4b72e9a3ead9 100644 --- a/arch/sh/boards/se/73180/led.c +++ b/arch/sh/boards/se/73180/led.c | |||
@@ -14,21 +14,8 @@ | |||
14 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
15 | #include <asm/mach/se73180.h> | 15 | #include <asm/mach/se73180.h> |
16 | 16 | ||
17 | static void | ||
18 | mach_led(int position, int value) | ||
19 | { | ||
20 | volatile unsigned short *p = (volatile unsigned short *) PA_LED; | ||
21 | |||
22 | if (value) { | ||
23 | *p |= (1 << LED_SHIFT); | ||
24 | } else { | ||
25 | *p &= ~(1 << LED_SHIFT); | ||
26 | } | ||
27 | } | ||
28 | |||
29 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ | 17 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ |
30 | void | 18 | void heartbeat_73180se(void) |
31 | heartbeat_73180se(void) | ||
32 | { | 19 | { |
33 | static unsigned int cnt = 0, period = 0; | 20 | static unsigned int cnt = 0, period = 0; |
34 | volatile unsigned short *p = (volatile unsigned short *) PA_LED; | 21 | volatile unsigned short *p = (volatile unsigned short *) PA_LED; |
diff --git a/arch/sh/boards/se/73180/setup.c b/arch/sh/boards/se/73180/setup.c index cdb7b5f8d942..b38ef50a160a 100644 --- a/arch/sh/boards/se/73180/setup.c +++ b/arch/sh/boards/se/73180/setup.c | |||
@@ -11,23 +11,17 @@ | |||
11 | 11 | ||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <asm/machvec.h> | 13 | #include <asm/machvec.h> |
14 | #include <asm/machvec_init.h> | 14 | #include <asm/se73180.h> |
15 | #include <asm/mach/io.h> | 15 | #include <asm/irq.h> |
16 | 16 | ||
17 | void heartbeat_73180se(void); | 17 | void heartbeat_73180se(void); |
18 | void init_73180se_IRQ(void); | 18 | void init_73180se_IRQ(void); |
19 | 19 | ||
20 | const char * | ||
21 | get_system_type(void) | ||
22 | { | ||
23 | return "SolutionEngine 73180"; | ||
24 | } | ||
25 | |||
26 | /* | 20 | /* |
27 | * The Machine Vector | 21 | * The Machine Vector |
28 | */ | 22 | */ |
29 | |||
30 | struct sh_machine_vector mv_73180se __initmv = { | 23 | struct sh_machine_vector mv_73180se __initmv = { |
24 | .mv_name = "SolutionEngine 73180", | ||
31 | .mv_nr_irqs = 108, | 25 | .mv_nr_irqs = 108, |
32 | .mv_inb = sh73180se_inb, | 26 | .mv_inb = sh73180se_inb, |
33 | .mv_inw = sh73180se_inw, | 27 | .mv_inw = sh73180se_inw, |
@@ -51,17 +45,9 @@ struct sh_machine_vector mv_73180se __initmv = { | |||
51 | .mv_outsl = sh73180se_outsl, | 45 | .mv_outsl = sh73180se_outsl, |
52 | 46 | ||
53 | .mv_init_irq = init_73180se_IRQ, | 47 | .mv_init_irq = init_73180se_IRQ, |
48 | .mv_irq_demux = shmse_irq_demux, | ||
54 | #ifdef CONFIG_HEARTBEAT | 49 | #ifdef CONFIG_HEARTBEAT |
55 | .mv_heartbeat = heartbeat_73180se, | 50 | .mv_heartbeat = heartbeat_73180se, |
56 | #endif | 51 | #endif |
57 | }; | 52 | }; |
58 | |||
59 | ALIAS_MV(73180se) | 53 | ALIAS_MV(73180se) |
60 | /* | ||
61 | * Initialize the board | ||
62 | */ | ||
63 | void __init | ||
64 | platform_setup(void) | ||
65 | { | ||
66 | |||
67 | } | ||
diff --git a/arch/sh/boards/se/7343/Makefile b/arch/sh/boards/se/7343/Makefile new file mode 100644 index 000000000000..4291069c0b4f --- /dev/null +++ b/arch/sh/boards/se/7343/Makefile | |||
@@ -0,0 +1,7 @@ | |||
1 | # | ||
2 | # Makefile for the 7343 SolutionEngine specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o io.o irq.o | ||
6 | |||
7 | obj-$(CONFIG_HEARTBEAT) += led.o | ||
diff --git a/arch/sh/boards/se/7343/io.c b/arch/sh/boards/se/7343/io.c new file mode 100644 index 000000000000..646661a146ad --- /dev/null +++ b/arch/sh/boards/se/7343/io.c | |||
@@ -0,0 +1,275 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/se/7343/io.c | ||
3 | * | ||
4 | * I/O routine for SH-Mobile3AS 7343 SolutionEngine. | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | #include <linux/config.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <asm/io.h> | ||
11 | #include <asm/mach/se7343.h> | ||
12 | |||
13 | #define badio(fn, a) panic("bad i/o operation %s for %08lx.", #fn, a) | ||
14 | |||
15 | struct iop { | ||
16 | unsigned long start, end; | ||
17 | unsigned long base; | ||
18 | struct iop *(*check) (struct iop * p, unsigned long port); | ||
19 | unsigned char (*inb) (struct iop * p, unsigned long port); | ||
20 | unsigned short (*inw) (struct iop * p, unsigned long port); | ||
21 | void (*outb) (struct iop * p, unsigned char value, unsigned long port); | ||
22 | void (*outw) (struct iop * p, unsigned short value, unsigned long port); | ||
23 | }; | ||
24 | |||
25 | struct iop * | ||
26 | simple_check(struct iop *p, unsigned long port) | ||
27 | { | ||
28 | static int count; | ||
29 | |||
30 | if (count < 100) | ||
31 | count++; | ||
32 | |||
33 | port &= 0xFFFF; | ||
34 | |||
35 | if ((p->start <= port) && (port <= p->end)) | ||
36 | return p; | ||
37 | else | ||
38 | badio(check, port); | ||
39 | } | ||
40 | |||
41 | struct iop * | ||
42 | ide_check(struct iop *p, unsigned long port) | ||
43 | { | ||
44 | if (((0x1f0 <= port) && (port <= 0x1f7)) || (port == 0x3f7)) | ||
45 | return p; | ||
46 | return NULL; | ||
47 | } | ||
48 | |||
49 | unsigned char | ||
50 | simple_inb(struct iop *p, unsigned long port) | ||
51 | { | ||
52 | return *(unsigned char *) (p->base + port); | ||
53 | } | ||
54 | |||
55 | unsigned short | ||
56 | simple_inw(struct iop *p, unsigned long port) | ||
57 | { | ||
58 | return *(unsigned short *) (p->base + port); | ||
59 | } | ||
60 | |||
61 | void | ||
62 | simple_outb(struct iop *p, unsigned char value, unsigned long port) | ||
63 | { | ||
64 | *(unsigned char *) (p->base + port) = value; | ||
65 | } | ||
66 | |||
67 | void | ||
68 | simple_outw(struct iop *p, unsigned short value, unsigned long port) | ||
69 | { | ||
70 | *(unsigned short *) (p->base + port) = value; | ||
71 | } | ||
72 | |||
73 | unsigned char | ||
74 | pcc_inb(struct iop *p, unsigned long port) | ||
75 | { | ||
76 | unsigned long addr = p->base + port + 0x40000; | ||
77 | unsigned long v; | ||
78 | |||
79 | if (port & 1) | ||
80 | addr += 0x00400000; | ||
81 | v = *(volatile unsigned char *) addr; | ||
82 | return v; | ||
83 | } | ||
84 | |||
85 | void | ||
86 | pcc_outb(struct iop *p, unsigned char value, unsigned long port) | ||
87 | { | ||
88 | unsigned long addr = p->base + port + 0x40000; | ||
89 | |||
90 | if (port & 1) | ||
91 | addr += 0x00400000; | ||
92 | *(volatile unsigned char *) addr = value; | ||
93 | } | ||
94 | |||
95 | unsigned char | ||
96 | bad_inb(struct iop *p, unsigned long port) | ||
97 | { | ||
98 | badio(inb, port); | ||
99 | } | ||
100 | |||
101 | void | ||
102 | bad_outb(struct iop *p, unsigned char value, unsigned long port) | ||
103 | { | ||
104 | badio(inw, port); | ||
105 | } | ||
106 | |||
107 | #ifdef CONFIG_SMC91X | ||
108 | /* MSTLANEX01 LAN at 0xb400:0000 */ | ||
109 | static struct iop laniop = { | ||
110 | .start = 0x00, | ||
111 | .end = 0x0F, | ||
112 | .base = 0x04000000, | ||
113 | .check = simple_check, | ||
114 | .inb = simple_inb, | ||
115 | .inw = simple_inw, | ||
116 | .outb = simple_outb, | ||
117 | .outw = simple_outw, | ||
118 | }; | ||
119 | #endif | ||
120 | |||
121 | #ifdef CONFIG_NE2000 | ||
122 | /* NE2000 pc card NIC */ | ||
123 | static struct iop neiop = { | ||
124 | .start = 0x280, | ||
125 | .end = 0x29f, | ||
126 | .base = 0xb0600000 + 0x80, /* soft 0x280 -> hard 0x300 */ | ||
127 | .check = simple_check, | ||
128 | .inb = pcc_inb, | ||
129 | .inw = simple_inw, | ||
130 | .outb = pcc_outb, | ||
131 | .outw = simple_outw, | ||
132 | }; | ||
133 | #endif | ||
134 | |||
135 | #ifdef CONFIG_IDE | ||
136 | /* CF in CF slot */ | ||
137 | static struct iop cfiop = { | ||
138 | .base = 0xb0600000, | ||
139 | .check = ide_check, | ||
140 | .inb = pcc_inb, | ||
141 | .inw = simple_inw, | ||
142 | .outb = pcc_outb, | ||
143 | .outw = simple_outw, | ||
144 | }; | ||
145 | #endif | ||
146 | |||
147 | static __inline__ struct iop * | ||
148 | port2iop(unsigned long port) | ||
149 | { | ||
150 | if (0) ; | ||
151 | #if defined(CONFIG_SMC91X) | ||
152 | else if (laniop.check(&laniop, port)) | ||
153 | return &laniop; | ||
154 | #endif | ||
155 | #if defined(CONFIG_NE2000) | ||
156 | else if (neiop.check(&neiop, port)) | ||
157 | return &neiop; | ||
158 | #endif | ||
159 | #if defined(CONFIG_IDE) | ||
160 | else if (cfiop.check(&cfiop, port)) | ||
161 | return &cfiop; | ||
162 | #endif | ||
163 | else | ||
164 | return NULL; | ||
165 | } | ||
166 | |||
167 | static inline void | ||
168 | delay(void) | ||
169 | { | ||
170 | ctrl_inw(0xac000000); | ||
171 | ctrl_inw(0xac000000); | ||
172 | } | ||
173 | |||
174 | unsigned char | ||
175 | sh7343se_inb(unsigned long port) | ||
176 | { | ||
177 | struct iop *p = port2iop(port); | ||
178 | return (p->inb) (p, port); | ||
179 | } | ||
180 | |||
181 | unsigned char | ||
182 | sh7343se_inb_p(unsigned long port) | ||
183 | { | ||
184 | unsigned char v = sh7343se_inb(port); | ||
185 | delay(); | ||
186 | return v; | ||
187 | } | ||
188 | |||
189 | unsigned short | ||
190 | sh7343se_inw(unsigned long port) | ||
191 | { | ||
192 | struct iop *p = port2iop(port); | ||
193 | return (p->inw) (p, port); | ||
194 | } | ||
195 | |||
196 | unsigned int | ||
197 | sh7343se_inl(unsigned long port) | ||
198 | { | ||
199 | badio(inl, port); | ||
200 | } | ||
201 | |||
202 | void | ||
203 | sh7343se_outb(unsigned char value, unsigned long port) | ||
204 | { | ||
205 | struct iop *p = port2iop(port); | ||
206 | (p->outb) (p, value, port); | ||
207 | } | ||
208 | |||
209 | void | ||
210 | sh7343se_outb_p(unsigned char value, unsigned long port) | ||
211 | { | ||
212 | sh7343se_outb(value, port); | ||
213 | delay(); | ||
214 | } | ||
215 | |||
216 | void | ||
217 | sh7343se_outw(unsigned short value, unsigned long port) | ||
218 | { | ||
219 | struct iop *p = port2iop(port); | ||
220 | (p->outw) (p, value, port); | ||
221 | } | ||
222 | |||
223 | void | ||
224 | sh7343se_outl(unsigned int value, unsigned long port) | ||
225 | { | ||
226 | badio(outl, port); | ||
227 | } | ||
228 | |||
229 | void | ||
230 | sh7343se_insb(unsigned long port, void *addr, unsigned long count) | ||
231 | { | ||
232 | unsigned char *a = addr; | ||
233 | struct iop *p = port2iop(port); | ||
234 | while (count--) | ||
235 | *a++ = (p->inb) (p, port); | ||
236 | } | ||
237 | |||
238 | void | ||
239 | sh7343se_insw(unsigned long port, void *addr, unsigned long count) | ||
240 | { | ||
241 | unsigned short *a = addr; | ||
242 | struct iop *p = port2iop(port); | ||
243 | while (count--) | ||
244 | *a++ = (p->inw) (p, port); | ||
245 | } | ||
246 | |||
247 | void | ||
248 | sh7343se_insl(unsigned long port, void *addr, unsigned long count) | ||
249 | { | ||
250 | badio(insl, port); | ||
251 | } | ||
252 | |||
253 | void | ||
254 | sh7343se_outsb(unsigned long port, const void *addr, unsigned long count) | ||
255 | { | ||
256 | unsigned char *a = (unsigned char *) addr; | ||
257 | struct iop *p = port2iop(port); | ||
258 | while (count--) | ||
259 | (p->outb) (p, *a++, port); | ||
260 | } | ||
261 | |||
262 | void | ||
263 | sh7343se_outsw(unsigned long port, const void *addr, unsigned long count) | ||
264 | { | ||
265 | unsigned short *a = (unsigned short *) addr; | ||
266 | struct iop *p = port2iop(port); | ||
267 | while (count--) | ||
268 | (p->outw) (p, *a++, port); | ||
269 | } | ||
270 | |||
271 | void | ||
272 | sh7343se_outsl(unsigned long port, const void *addr, unsigned long count) | ||
273 | { | ||
274 | badio(outsw, port); | ||
275 | } | ||
diff --git a/arch/sh/boards/se/7343/irq.c b/arch/sh/boards/se/7343/irq.c new file mode 100644 index 000000000000..b41e3d4ea37c --- /dev/null +++ b/arch/sh/boards/se/7343/irq.c | |||
@@ -0,0 +1,193 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/se/7343/irq.c | ||
3 | * | ||
4 | */ | ||
5 | |||
6 | #include <linux/config.h> | ||
7 | #include <linux/init.h> | ||
8 | #include <linux/interrupt.h> | ||
9 | #include <linux/irq.h> | ||
10 | #include <asm/irq.h> | ||
11 | #include <asm/io.h> | ||
12 | #include <asm/mach/se7343.h> | ||
13 | |||
14 | static void | ||
15 | disable_intreq_irq(unsigned int irq) | ||
16 | { | ||
17 | int bit = irq - OFFCHIP_IRQ_BASE; | ||
18 | u16 val; | ||
19 | |||
20 | val = ctrl_inw(PA_CPLD_IMSK); | ||
21 | val |= 1 << bit; | ||
22 | ctrl_outw(val, PA_CPLD_IMSK); | ||
23 | } | ||
24 | |||
25 | static void | ||
26 | enable_intreq_irq(unsigned int irq) | ||
27 | { | ||
28 | int bit = irq - OFFCHIP_IRQ_BASE; | ||
29 | u16 val; | ||
30 | |||
31 | val = ctrl_inw(PA_CPLD_IMSK); | ||
32 | val &= ~(1 << bit); | ||
33 | ctrl_outw(val, PA_CPLD_IMSK); | ||
34 | } | ||
35 | |||
36 | static void | ||
37 | mask_and_ack_intreq_irq(unsigned int irq) | ||
38 | { | ||
39 | disable_intreq_irq(irq); | ||
40 | } | ||
41 | |||
42 | static unsigned int | ||
43 | startup_intreq_irq(unsigned int irq) | ||
44 | { | ||
45 | enable_intreq_irq(irq); | ||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | static void | ||
50 | shutdown_intreq_irq(unsigned int irq) | ||
51 | { | ||
52 | disable_intreq_irq(irq); | ||
53 | } | ||
54 | |||
55 | static void | ||
56 | end_intreq_irq(unsigned int irq) | ||
57 | { | ||
58 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
59 | enable_intreq_irq(irq); | ||
60 | } | ||
61 | |||
62 | static struct hw_interrupt_type intreq_irq_type = { | ||
63 | .typename = "FPGA-IRQ", | ||
64 | .startup = startup_intreq_irq, | ||
65 | .shutdown = shutdown_intreq_irq, | ||
66 | .enable = enable_intreq_irq, | ||
67 | .disable = disable_intreq_irq, | ||
68 | .ack = mask_and_ack_intreq_irq, | ||
69 | .end = end_intreq_irq | ||
70 | }; | ||
71 | |||
72 | static void | ||
73 | make_intreq_irq(unsigned int irq) | ||
74 | { | ||
75 | disable_irq_nosync(irq); | ||
76 | irq_desc[irq].handler = &intreq_irq_type; | ||
77 | disable_intreq_irq(irq); | ||
78 | } | ||
79 | |||
80 | int | ||
81 | shmse_irq_demux(int irq) | ||
82 | { | ||
83 | int bit; | ||
84 | volatile u16 val; | ||
85 | |||
86 | if (irq == IRQ5_IRQ) { | ||
87 | /* Read status Register */ | ||
88 | val = ctrl_inw(PA_CPLD_ST); | ||
89 | bit = ffs(val); | ||
90 | if (bit != 0) | ||
91 | return OFFCHIP_IRQ_BASE + bit - 1; | ||
92 | } | ||
93 | return irq; | ||
94 | } | ||
95 | |||
96 | /* IRQ5 is multiplexed between the following sources: | ||
97 | * 1. PC Card socket | ||
98 | * 2. Extension slot | ||
99 | * 3. USB Controller | ||
100 | * 4. Serial Controller | ||
101 | * | ||
102 | * We configure IRQ5 as a cascade IRQ. | ||
103 | */ | ||
104 | static struct irqaction irq5 = { no_action, 0, CPU_MASK_NONE, "IRQ5-cascade", | ||
105 | NULL, NULL}; | ||
106 | |||
107 | /* | ||
108 | * Initialize IRQ setting | ||
109 | */ | ||
110 | void __init | ||
111 | init_7343se_IRQ(void) | ||
112 | { | ||
113 | /* Setup Multiplexed interrupts */ | ||
114 | ctrl_outw(8, PA_CPLD_MODESET); /* Set all CPLD interrupts to active | ||
115 | * low. | ||
116 | */ | ||
117 | /* Mask all CPLD controller interrupts */ | ||
118 | ctrl_outw(0x0fff, PA_CPLD_IMSK); | ||
119 | |||
120 | /* PC Card interrupts */ | ||
121 | make_intreq_irq(PC_IRQ0); | ||
122 | make_intreq_irq(PC_IRQ1); | ||
123 | make_intreq_irq(PC_IRQ2); | ||
124 | make_intreq_irq(PC_IRQ3); | ||
125 | |||
126 | /* Extension Slot Interrupts */ | ||
127 | make_intreq_irq(EXT_IRQ0); | ||
128 | make_intreq_irq(EXT_IRQ1); | ||
129 | make_intreq_irq(EXT_IRQ2); | ||
130 | make_intreq_irq(EXT_IRQ3); | ||
131 | |||
132 | /* USB Controller interrupts */ | ||
133 | make_intreq_irq(USB_IRQ0); | ||
134 | make_intreq_irq(USB_IRQ1); | ||
135 | |||
136 | /* Serial Controller interrupts */ | ||
137 | make_intreq_irq(UART_IRQ0); | ||
138 | make_intreq_irq(UART_IRQ1); | ||
139 | |||
140 | /* Setup all external interrupts to be active low */ | ||
141 | ctrl_outw(0xaaaa, INTC_ICR1); | ||
142 | |||
143 | make_ipr_irq(IRQ5_IRQ, IRQ5_IPR_ADDR+2, IRQ5_IPR_POS, IRQ5_PRIORITY); | ||
144 | setup_irq(IRQ5_IRQ, &irq5); | ||
145 | /* Set port control to use IRQ5 */ | ||
146 | *(u16 *)0xA4050108 &= ~0xc; | ||
147 | |||
148 | make_ipr_irq(SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY); | ||
149 | make_ipr_irq(VPU_IRQ, VPU_IPR_ADDR, VPU_IPR_POS, 8); | ||
150 | |||
151 | ctrl_outb(0x0f, INTC_IMCR5); /* enable SCIF IRQ */ | ||
152 | |||
153 | make_ipr_irq(DMTE0_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
154 | make_ipr_irq(DMTE1_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
155 | make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
156 | make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
157 | make_ipr_irq(DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
158 | make_ipr_irq(DMTE5_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
159 | |||
160 | /* I2C block */ | ||
161 | make_ipr_irq(IIC0_ALI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY); | ||
162 | make_ipr_irq(IIC0_TACKI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, | ||
163 | IIC0_PRIORITY); | ||
164 | make_ipr_irq(IIC0_WAITI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, | ||
165 | IIC0_PRIORITY); | ||
166 | make_ipr_irq(IIC0_DTEI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY); | ||
167 | |||
168 | make_ipr_irq(IIC1_ALI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY); | ||
169 | make_ipr_irq(IIC1_TACKI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, | ||
170 | IIC1_PRIORITY); | ||
171 | make_ipr_irq(IIC1_WAITI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, | ||
172 | IIC1_PRIORITY); | ||
173 | make_ipr_irq(IIC1_DTEI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY); | ||
174 | |||
175 | /* SIOF */ | ||
176 | make_ipr_irq(SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY); | ||
177 | |||
178 | /* SIU */ | ||
179 | make_ipr_irq(SIU_IRQ, SIU_IPR_ADDR, SIU_IPR_POS, SIU_PRIORITY); | ||
180 | |||
181 | /* VIO interrupt */ | ||
182 | make_ipr_irq(CEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
183 | make_ipr_irq(BEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
184 | make_ipr_irq(VEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
185 | |||
186 | /*MFI interrupt*/ | ||
187 | |||
188 | make_ipr_irq(MFI_IRQ, MFI_IPR_ADDR, MFI_IPR_POS, MFI_PRIORITY); | ||
189 | |||
190 | /* LCD controller */ | ||
191 | make_ipr_irq(LCDC_IRQ, LCDC_IPR_ADDR, LCDC_IPR_POS, LCDC_PRIORITY); | ||
192 | ctrl_outw(0x2000, PA_MRSHPC + 0x0c); /* mrshpc irq enable */ | ||
193 | } | ||
diff --git a/arch/sh/boards/se/7343/led.c b/arch/sh/boards/se/7343/led.c new file mode 100644 index 000000000000..6a439cf83e46 --- /dev/null +++ b/arch/sh/boards/se/7343/led.c | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/se/7343/led.c | ||
3 | * | ||
4 | */ | ||
5 | |||
6 | #include <linux/config.h> | ||
7 | #include <linux/sched.h> | ||
8 | #include <asm/mach/se7343.h> | ||
9 | |||
10 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ | ||
11 | void heartbeat_7343se(void) | ||
12 | { | ||
13 | static unsigned int cnt = 0, period = 0; | ||
14 | volatile unsigned short *p = (volatile unsigned short *) PA_LED; | ||
15 | static unsigned bit = 0, up = 1; | ||
16 | |||
17 | cnt += 1; | ||
18 | if (cnt < period) { | ||
19 | return; | ||
20 | } | ||
21 | |||
22 | cnt = 0; | ||
23 | |||
24 | /* Go through the points (roughly!): | ||
25 | * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110 | ||
26 | */ | ||
27 | period = 110 - ((300 << FSHIFT) / ((avenrun[0] / 5) + (3 << FSHIFT))); | ||
28 | |||
29 | if (up) { | ||
30 | if (bit == 7) { | ||
31 | bit--; | ||
32 | up = 0; | ||
33 | } else { | ||
34 | bit++; | ||
35 | } | ||
36 | } else { | ||
37 | if (bit == 0) { | ||
38 | bit++; | ||
39 | up = 1; | ||
40 | } else { | ||
41 | bit--; | ||
42 | } | ||
43 | } | ||
44 | *p = 1 << (bit + LED_SHIFT); | ||
45 | |||
46 | } | ||
diff --git a/arch/sh/boards/se/7343/setup.c b/arch/sh/boards/se/7343/setup.c new file mode 100644 index 000000000000..787322291fb3 --- /dev/null +++ b/arch/sh/boards/se/7343/setup.c | |||
@@ -0,0 +1,84 @@ | |||
1 | #include <linux/config.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/platform_device.h> | ||
4 | #include <asm/machvec.h> | ||
5 | #include <asm/mach/se7343.h> | ||
6 | #include <asm/irq.h> | ||
7 | |||
8 | void heartbeat_7343se(void); | ||
9 | void init_7343se_IRQ(void); | ||
10 | |||
11 | static struct resource smc91x_resources[] = { | ||
12 | [0] = { | ||
13 | .start = 0x10000000, | ||
14 | .end = 0x1000000F, | ||
15 | .flags = IORESOURCE_MEM, | ||
16 | }, | ||
17 | [1] = { | ||
18 | /* | ||
19 | * shared with other devices via externel | ||
20 | * interrupt controller in FPGA... | ||
21 | */ | ||
22 | .start = EXT_IRQ2, | ||
23 | .end = EXT_IRQ2, | ||
24 | .flags = IORESOURCE_IRQ, | ||
25 | }, | ||
26 | }; | ||
27 | |||
28 | static struct platform_device smc91x_device = { | ||
29 | .name = "smc91x", | ||
30 | .id = 0, | ||
31 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
32 | .resource = smc91x_resources, | ||
33 | }; | ||
34 | |||
35 | static struct platform_device *smc91x_platform_devices[] __initdata = { | ||
36 | &smc91x_device, | ||
37 | }; | ||
38 | |||
39 | static int __init sh7343se_devices_setup(void) | ||
40 | { | ||
41 | return platform_add_devices(smc91x_platform_devices, | ||
42 | ARRAY_SIZE(smc91x_platform_devices)); | ||
43 | } | ||
44 | |||
45 | static void __init sh7343se_setup(char **cmdline_p) | ||
46 | { | ||
47 | device_initcall(sh7343se_devices_setup); | ||
48 | } | ||
49 | |||
50 | /* | ||
51 | * The Machine Vector | ||
52 | */ | ||
53 | struct sh_machine_vector mv_7343se __initmv = { | ||
54 | .mv_name = "SolutionEngine 7343", | ||
55 | .mv_setup = sh7343se_setup, | ||
56 | .mv_nr_irqs = 108, | ||
57 | .mv_inb = sh7343se_inb, | ||
58 | .mv_inw = sh7343se_inw, | ||
59 | .mv_inl = sh7343se_inl, | ||
60 | .mv_outb = sh7343se_outb, | ||
61 | .mv_outw = sh7343se_outw, | ||
62 | .mv_outl = sh7343se_outl, | ||
63 | |||
64 | .mv_inb_p = sh7343se_inb_p, | ||
65 | .mv_inw_p = sh7343se_inw, | ||
66 | .mv_inl_p = sh7343se_inl, | ||
67 | .mv_outb_p = sh7343se_outb_p, | ||
68 | .mv_outw_p = sh7343se_outw, | ||
69 | .mv_outl_p = sh7343se_outl, | ||
70 | |||
71 | .mv_insb = sh7343se_insb, | ||
72 | .mv_insw = sh7343se_insw, | ||
73 | .mv_insl = sh7343se_insl, | ||
74 | .mv_outsb = sh7343se_outsb, | ||
75 | .mv_outsw = sh7343se_outsw, | ||
76 | .mv_outsl = sh7343se_outsl, | ||
77 | |||
78 | .mv_init_irq = init_7343se_IRQ, | ||
79 | .mv_irq_demux = shmse_irq_demux, | ||
80 | #ifdef CONFIG_HEARTBEAT | ||
81 | .mv_heartbeat = heartbeat_7343se, | ||
82 | #endif | ||
83 | }; | ||
84 | ALIAS_MV(7343se) | ||
diff --git a/arch/sh/boards/se/770x/Makefile b/arch/sh/boards/se/770x/Makefile index be89a73cc418..9a5035f80ec0 100644 --- a/arch/sh/boards/se/770x/Makefile +++ b/arch/sh/boards/se/770x/Makefile | |||
@@ -2,5 +2,5 @@ | |||
2 | # Makefile for the 770x SolutionEngine specific parts of the kernel | 2 | # Makefile for the 770x SolutionEngine specific parts of the kernel |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := mach.o setup.o io.o irq.o led.o | 5 | obj-y := setup.o io.o irq.o |
6 | 6 | obj-$(CONFIG_HEARTBEAT) += led.o | |
diff --git a/arch/sh/boards/se/770x/io.c b/arch/sh/boards/se/770x/io.c index 9a39ee963143..9941949331ab 100644 --- a/arch/sh/boards/se/770x/io.c +++ b/arch/sh/boards/se/770x/io.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: io.c,v 1.5 2004/02/22 23:08:43 kkojima Exp $ | 1 | /* $Id: io.c,v 1.7 2006/02/05 21:55:29 lethal Exp $ |
2 | * | 2 | * |
3 | * linux/arch/sh/kernel/io_se.c | 3 | * linux/arch/sh/kernel/io_se.c |
4 | * | 4 | * |
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
14 | #include <asm/se/se.h> | 14 | #include <asm/se.h> |
15 | 15 | ||
16 | /* SH pcmcia io window base, start and end. */ | 16 | /* SH pcmcia io window base, start and end. */ |
17 | int sh_pcic_io_wbase = 0xb8400000; | 17 | int sh_pcic_io_wbase = 0xb8400000; |
@@ -20,11 +20,6 @@ int sh_pcic_io_stop; | |||
20 | int sh_pcic_io_type; | 20 | int sh_pcic_io_type; |
21 | int sh_pcic_io_dummy; | 21 | int sh_pcic_io_dummy; |
22 | 22 | ||
23 | static inline void delay(void) | ||
24 | { | ||
25 | ctrl_inw(0xa0000000); | ||
26 | } | ||
27 | |||
28 | /* MS7750 requires special versions of in*, out* routines, since | 23 | /* MS7750 requires special versions of in*, out* routines, since |
29 | PC-like io ports are located at upper half byte of 16-bit word which | 24 | PC-like io ports are located at upper half byte of 16-bit word which |
30 | can be accessed only with 16-bit wide. */ | 25 | can be accessed only with 16-bit wide. */ |
@@ -52,10 +47,6 @@ shifted_port(unsigned long port) | |||
52 | return 1; | 47 | return 1; |
53 | } | 48 | } |
54 | 49 | ||
55 | #define maybebadio(name,port) \ | ||
56 | printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ | ||
57 | #name, (port), (__u32) __builtin_return_address(0)) | ||
58 | |||
59 | unsigned char se_inb(unsigned long port) | 50 | unsigned char se_inb(unsigned long port) |
60 | { | 51 | { |
61 | if (sh_pcic_io_start <= port && port <= sh_pcic_io_stop) | 52 | if (sh_pcic_io_start <= port && port <= sh_pcic_io_stop) |
@@ -76,7 +67,7 @@ unsigned char se_inb_p(unsigned long port) | |||
76 | v = (*port2adr(port) >> 8); | 67 | v = (*port2adr(port) >> 8); |
77 | else | 68 | else |
78 | v = (*port2adr(port))&0xff; | 69 | v = (*port2adr(port))&0xff; |
79 | delay(); | 70 | ctrl_delay(); |
80 | return v; | 71 | return v; |
81 | } | 72 | } |
82 | 73 | ||
@@ -86,13 +77,13 @@ unsigned short se_inw(unsigned long port) | |||
86 | (sh_pcic_io_start <= port && port <= sh_pcic_io_stop)) | 77 | (sh_pcic_io_start <= port && port <= sh_pcic_io_stop)) |
87 | return *port2adr(port); | 78 | return *port2adr(port); |
88 | else | 79 | else |
89 | maybebadio(inw, port); | 80 | maybebadio(port); |
90 | return 0; | 81 | return 0; |
91 | } | 82 | } |
92 | 83 | ||
93 | unsigned int se_inl(unsigned long port) | 84 | unsigned int se_inl(unsigned long port) |
94 | { | 85 | { |
95 | maybebadio(inl, port); | 86 | maybebadio(port); |
96 | return 0; | 87 | return 0; |
97 | } | 88 | } |
98 | 89 | ||
@@ -114,7 +105,7 @@ void se_outb_p(unsigned char value, unsigned long port) | |||
114 | *(port2adr(port)) = value << 8; | 105 | *(port2adr(port)) = value << 8; |
115 | else | 106 | else |
116 | *(port2adr(port)) = value; | 107 | *(port2adr(port)) = value; |
117 | delay(); | 108 | ctrl_delay(); |
118 | } | 109 | } |
119 | 110 | ||
120 | void se_outw(unsigned short value, unsigned long port) | 111 | void se_outw(unsigned short value, unsigned long port) |
@@ -123,12 +114,12 @@ void se_outw(unsigned short value, unsigned long port) | |||
123 | (sh_pcic_io_start <= port && port <= sh_pcic_io_stop)) | 114 | (sh_pcic_io_start <= port && port <= sh_pcic_io_stop)) |
124 | *port2adr(port) = value; | 115 | *port2adr(port) = value; |
125 | else | 116 | else |
126 | maybebadio(outw, port); | 117 | maybebadio(port); |
127 | } | 118 | } |
128 | 119 | ||
129 | void se_outl(unsigned int value, unsigned long port) | 120 | void se_outl(unsigned int value, unsigned long port) |
130 | { | 121 | { |
131 | maybebadio(outl, port); | 122 | maybebadio(port); |
132 | } | 123 | } |
133 | 124 | ||
134 | void se_insb(unsigned long port, void *addr, unsigned long count) | 125 | void se_insb(unsigned long port, void *addr, unsigned long count) |
@@ -159,7 +150,7 @@ void se_insw(unsigned long port, void *addr, unsigned long count) | |||
159 | 150 | ||
160 | void se_insl(unsigned long port, void *addr, unsigned long count) | 151 | void se_insl(unsigned long port, void *addr, unsigned long count) |
161 | { | 152 | { |
162 | maybebadio(insl, port); | 153 | maybebadio(port); |
163 | } | 154 | } |
164 | 155 | ||
165 | void se_outsb(unsigned long port, const void *addr, unsigned long count) | 156 | void se_outsb(unsigned long port, const void *addr, unsigned long count) |
@@ -190,37 +181,5 @@ void se_outsw(unsigned long port, const void *addr, unsigned long count) | |||
190 | 181 | ||
191 | void se_outsl(unsigned long port, const void *addr, unsigned long count) | 182 | void se_outsl(unsigned long port, const void *addr, unsigned long count) |
192 | { | 183 | { |
193 | maybebadio(outsw, port); | 184 | maybebadio(port); |
194 | } | ||
195 | |||
196 | /* Map ISA bus address to the real address. Only for PCMCIA. */ | ||
197 | |||
198 | /* ISA page descriptor. */ | ||
199 | static __u32 sh_isa_memmap[256]; | ||
200 | |||
201 | static int | ||
202 | sh_isa_mmap(__u32 start, __u32 length, __u32 offset) | ||
203 | { | ||
204 | int idx; | ||
205 | |||
206 | if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000)) | ||
207 | return -1; | ||
208 | |||
209 | idx = start >> 12; | ||
210 | sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff); | ||
211 | #if 0 | ||
212 | printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n", | ||
213 | start, length, offset, idx, sh_isa_memmap[idx]); | ||
214 | #endif | ||
215 | return 0; | ||
216 | } | ||
217 | |||
218 | unsigned long | ||
219 | se_isa_port2addr(unsigned long offset) | ||
220 | { | ||
221 | int idx; | ||
222 | |||
223 | idx = (offset >> 12) & 0xff; | ||
224 | offset &= 0xfff; | ||
225 | return sh_isa_memmap[idx] + offset; | ||
226 | } | 185 | } |
diff --git a/arch/sh/boards/se/770x/irq.c b/arch/sh/boards/se/770x/irq.c index 3e558716ce10..cff6700bbafd 100644 --- a/arch/sh/boards/se/770x/irq.c +++ b/arch/sh/boards/se/770x/irq.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
12 | #include <asm/irq.h> | 12 | #include <asm/irq.h> |
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
14 | #include <asm/se/se.h> | 14 | #include <asm/se.h> |
15 | 15 | ||
16 | /* | 16 | /* |
17 | * Initialize IRQ setting | 17 | * Initialize IRQ setting |
diff --git a/arch/sh/boards/se/770x/led.c b/arch/sh/boards/se/770x/led.c index 3cddbda025fc..daf7b1ee786a 100644 --- a/arch/sh/boards/se/770x/led.c +++ b/arch/sh/boards/se/770x/led.c | |||
@@ -9,22 +9,8 @@ | |||
9 | * This file contains Solution Engine specific LED code. | 9 | * This file contains Solution Engine specific LED code. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <asm/se/se.h> | ||
13 | |||
14 | static void mach_led(int position, int value) | ||
15 | { | ||
16 | volatile unsigned short* p = (volatile unsigned short*)PA_LED; | ||
17 | |||
18 | if (value) { | ||
19 | *p |= (1<<8); | ||
20 | } else { | ||
21 | *p &= ~(1<<8); | ||
22 | } | ||
23 | } | ||
24 | |||
25 | #ifdef CONFIG_HEARTBEAT | ||
26 | |||
27 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
13 | #include <asm/se.h> | ||
28 | 14 | ||
29 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ | 15 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ |
30 | void heartbeat_se(void) | 16 | void heartbeat_se(void) |
@@ -64,4 +50,3 @@ void heartbeat_se(void) | |||
64 | *p = 1<<(bit+8); | 50 | *p = 1<<(bit+8); |
65 | 51 | ||
66 | } | 52 | } |
67 | #endif /* CONFIG_HEARTBEAT */ | ||
diff --git a/arch/sh/boards/se/770x/mach.c b/arch/sh/boards/se/770x/mach.c deleted file mode 100644 index 6ec07bd3dcf1..000000000000 --- a/arch/sh/boards/se/770x/mach.c +++ /dev/null | |||
@@ -1,67 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/kernel/mach_se.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com) | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * Machine vector for the Hitachi SolutionEngine | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/machvec.h> | ||
15 | #include <asm/rtc.h> | ||
16 | #include <asm/machvec_init.h> | ||
17 | |||
18 | #include <asm/se/io.h> | ||
19 | |||
20 | void heartbeat_se(void); | ||
21 | void setup_se(void); | ||
22 | void init_se_IRQ(void); | ||
23 | |||
24 | /* | ||
25 | * The Machine Vector | ||
26 | */ | ||
27 | |||
28 | struct sh_machine_vector mv_se __initmv = { | ||
29 | #if defined(CONFIG_CPU_SH4) | ||
30 | .mv_nr_irqs = 48, | ||
31 | #elif defined(CONFIG_CPU_SUBTYPE_SH7708) | ||
32 | .mv_nr_irqs = 32, | ||
33 | #elif defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
34 | .mv_nr_irqs = 61, | ||
35 | #elif defined(CONFIG_CPU_SUBTYPE_SH7705) | ||
36 | .mv_nr_irqs = 86, | ||
37 | #endif | ||
38 | |||
39 | .mv_inb = se_inb, | ||
40 | .mv_inw = se_inw, | ||
41 | .mv_inl = se_inl, | ||
42 | .mv_outb = se_outb, | ||
43 | .mv_outw = se_outw, | ||
44 | .mv_outl = se_outl, | ||
45 | |||
46 | .mv_inb_p = se_inb_p, | ||
47 | .mv_inw_p = se_inw, | ||
48 | .mv_inl_p = se_inl, | ||
49 | .mv_outb_p = se_outb_p, | ||
50 | .mv_outw_p = se_outw, | ||
51 | .mv_outl_p = se_outl, | ||
52 | |||
53 | .mv_insb = se_insb, | ||
54 | .mv_insw = se_insw, | ||
55 | .mv_insl = se_insl, | ||
56 | .mv_outsb = se_outsb, | ||
57 | .mv_outsw = se_outsw, | ||
58 | .mv_outsl = se_outsl, | ||
59 | |||
60 | .mv_isa_port2addr = se_isa_port2addr, | ||
61 | |||
62 | .mv_init_irq = init_se_IRQ, | ||
63 | #ifdef CONFIG_HEARTBEAT | ||
64 | .mv_heartbeat = heartbeat_se, | ||
65 | #endif | ||
66 | }; | ||
67 | ALIAS_MV(se) | ||
diff --git a/arch/sh/boards/se/770x/setup.c b/arch/sh/boards/se/770x/setup.c index 7d1a071727cc..f3f82b7c8217 100644 --- a/arch/sh/boards/se/770x/setup.c +++ b/arch/sh/boards/se/770x/setup.c | |||
@@ -7,15 +7,17 @@ | |||
7 | * Hitachi SolutionEngine Support. | 7 | * Hitachi SolutionEngine Support. |
8 | * | 8 | * |
9 | */ | 9 | */ |
10 | |||
11 | #include <linux/init.h> | 10 | #include <linux/init.h> |
12 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
13 | |||
14 | #include <linux/hdreg.h> | 12 | #include <linux/hdreg.h> |
15 | #include <linux/ide.h> | 13 | #include <linux/ide.h> |
16 | #include <asm/io.h> | 14 | #include <asm/io.h> |
17 | #include <asm/se/se.h> | 15 | #include <asm/se.h> |
18 | #include <asm/se/smc37c93x.h> | 16 | #include <asm/smc37c93x.h> |
17 | #include <asm/machvec.h> | ||
18 | |||
19 | void heartbeat_se(void); | ||
20 | void init_se_IRQ(void); | ||
19 | 21 | ||
20 | /* | 22 | /* |
21 | * Configure the Super I/O chip | 23 | * Configure the Super I/O chip |
@@ -26,7 +28,8 @@ static void __init smsc_config(int index, int data) | |||
26 | outb_p(data, DATA_PORT); | 28 | outb_p(data, DATA_PORT); |
27 | } | 29 | } |
28 | 30 | ||
29 | static void __init init_smsc(void) | 31 | /* XXX: Another candidate for a more generic cchip machine vector */ |
32 | static void __init smsc_setup(char **cmdline_p) | ||
30 | { | 33 | { |
31 | outb_p(CONFIG_ENTER, CONFIG_PORT); | 34 | outb_p(CONFIG_ENTER, CONFIG_PORT); |
32 | outb_p(CONFIG_ENTER, CONFIG_PORT); | 35 | outb_p(CONFIG_ENTER, CONFIG_PORT); |
@@ -69,16 +72,46 @@ static void __init init_smsc(void) | |||
69 | outb_p(CONFIG_EXIT, CONFIG_PORT); | 72 | outb_p(CONFIG_EXIT, CONFIG_PORT); |
70 | } | 73 | } |
71 | 74 | ||
72 | const char *get_system_type(void) | ||
73 | { | ||
74 | return "SolutionEngine"; | ||
75 | } | ||
76 | |||
77 | /* | 75 | /* |
78 | * Initialize the board | 76 | * The Machine Vector |
79 | */ | 77 | */ |
80 | void __init platform_setup(void) | 78 | struct sh_machine_vector mv_se __initmv = { |
81 | { | 79 | .mv_name = "SolutionEngine", |
82 | init_smsc(); | 80 | .mv_setup = smsc_setup, |
83 | /* XXX: RTC setting comes here */ | 81 | #if defined(CONFIG_CPU_SH4) |
84 | } | 82 | .mv_nr_irqs = 48, |
83 | #elif defined(CONFIG_CPU_SUBTYPE_SH7708) | ||
84 | .mv_nr_irqs = 32, | ||
85 | #elif defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
86 | .mv_nr_irqs = 61, | ||
87 | #elif defined(CONFIG_CPU_SUBTYPE_SH7705) | ||
88 | .mv_nr_irqs = 86, | ||
89 | #endif | ||
90 | |||
91 | .mv_inb = se_inb, | ||
92 | .mv_inw = se_inw, | ||
93 | .mv_inl = se_inl, | ||
94 | .mv_outb = se_outb, | ||
95 | .mv_outw = se_outw, | ||
96 | .mv_outl = se_outl, | ||
97 | |||
98 | .mv_inb_p = se_inb_p, | ||
99 | .mv_inw_p = se_inw, | ||
100 | .mv_inl_p = se_inl, | ||
101 | .mv_outb_p = se_outb_p, | ||
102 | .mv_outw_p = se_outw, | ||
103 | .mv_outl_p = se_outl, | ||
104 | |||
105 | .mv_insb = se_insb, | ||
106 | .mv_insw = se_insw, | ||
107 | .mv_insl = se_insl, | ||
108 | .mv_outsb = se_outsb, | ||
109 | .mv_outsw = se_outsw, | ||
110 | .mv_outsl = se_outsl, | ||
111 | |||
112 | .mv_init_irq = init_se_IRQ, | ||
113 | #ifdef CONFIG_HEARTBEAT | ||
114 | .mv_heartbeat = heartbeat_se, | ||
115 | #endif | ||
116 | }; | ||
117 | ALIAS_MV(se) | ||
diff --git a/arch/sh/boards/se/7751/Makefile b/arch/sh/boards/se/7751/Makefile index ce7ca247f84d..188900c48321 100644 --- a/arch/sh/boards/se/7751/Makefile +++ b/arch/sh/boards/se/7751/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the 7751 SolutionEngine specific parts of the kernel | 2 | # Makefile for the 7751 SolutionEngine specific parts of the kernel |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := mach.o setup.o io.o irq.o led.o | 5 | obj-y := setup.o io.o irq.o |
6 | 6 | ||
7 | obj-$(CONFIG_PCI) += pci.o | 7 | obj-$(CONFIG_PCI) += pci.o |
8 | 8 | obj-$(CONFIG_HEARTBEAT) += led.o | |
diff --git a/arch/sh/boards/se/7751/io.c b/arch/sh/boards/se/7751/io.c index 99041b269261..e8d846cec89d 100644 --- a/arch/sh/boards/se/7751/io.c +++ b/arch/sh/boards/se/7751/io.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/io_7751se.c | ||
3 | * | ||
4 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel | 2 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel |
5 | * Based largely on io_se.c. | 3 | * Based largely on io_se.c. |
6 | * | 4 | * |
@@ -10,96 +8,21 @@ | |||
10 | * placeholder code from io_se.c left in with the | 8 | * placeholder code from io_se.c left in with the |
11 | * expectation of later SuperIO and PCMCIA access. | 9 | * expectation of later SuperIO and PCMCIA access. |
12 | */ | 10 | */ |
13 | |||
14 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
15 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <linux/pci.h> | ||
16 | #include <asm/io.h> | 14 | #include <asm/io.h> |
17 | #include <asm/se7751/se7751.h> | 15 | #include <asm/se7751.h> |
18 | #include <asm/addrspace.h> | 16 | #include <asm/addrspace.h> |
19 | 17 | ||
20 | #include <linux/pci.h> | 18 | static inline volatile u16 *port2adr(unsigned int port) |
21 | #include "../../../drivers/pci/pci-sh7751.h" | ||
22 | |||
23 | #if 0 | ||
24 | /****************************************************************** | ||
25 | * Variables from io_se.c, related to PCMCIA (not PCI); we're not | ||
26 | * compiling them in, and have removed references from functions | ||
27 | * which follow. [Many checked for IO ports in the range bounded | ||
28 | * by sh_pcic_io_start/stop, and used sh_pcic_io_wbase as offset. | ||
29 | * As start/stop are uninitialized, only port 0x0 would match?] | ||
30 | * When used, remember to adjust names to avoid clash with io_se? | ||
31 | *****************************************************************/ | ||
32 | /* SH pcmcia io window base, start and end. */ | ||
33 | int sh_pcic_io_wbase = 0xb8400000; | ||
34 | int sh_pcic_io_start; | ||
35 | int sh_pcic_io_stop; | ||
36 | int sh_pcic_io_type; | ||
37 | int sh_pcic_io_dummy; | ||
38 | /*************************************************************/ | ||
39 | #endif | ||
40 | |||
41 | /* | ||
42 | * The 7751 Solution Engine uses the built-in PCI controller (PCIC) | ||
43 | * of the 7751 processor, and has a SuperIO accessible via the PCI. | ||
44 | * The board also includes a PCMCIA controller on its memory bus, | ||
45 | * like the other Solution Engine boards. | ||
46 | */ | ||
47 | |||
48 | #define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR) | ||
49 | #define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR) | ||
50 | #define PCI_IO_AREA SH7751_PCI_IO_BASE | ||
51 | #define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE | ||
52 | |||
53 | #define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK)) | ||
54 | |||
55 | #define maybebadio(name,port) \ | ||
56 | printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ | ||
57 | #name, (port), (__u32) __builtin_return_address(0)) | ||
58 | |||
59 | static inline void delay(void) | ||
60 | { | ||
61 | ctrl_inw(0xa0000000); | ||
62 | } | ||
63 | |||
64 | static inline volatile __u16 * | ||
65 | port2adr(unsigned int port) | ||
66 | { | 19 | { |
67 | if (port >= 0x2000) | 20 | if (port >= 0x2000) |
68 | return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000)); | 21 | return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000)); |
69 | #if 0 | 22 | maybebadio((unsigned long)port); |
70 | else | ||
71 | return (volatile __u16 *) (PA_SUPERIO + (port << 1)); | ||
72 | #endif | ||
73 | maybebadio(name,(unsigned long)port); | ||
74 | return (volatile __u16*)port; | 23 | return (volatile __u16*)port; |
75 | } | 24 | } |
76 | 25 | ||
77 | #if 0 | ||
78 | /* The 7751 Solution Engine seems to have everything hooked */ | ||
79 | /* up pretty normally (nothing on high-bytes only...) so this */ | ||
80 | /* shouldn't be needed */ | ||
81 | static inline int | ||
82 | shifted_port(unsigned long port) | ||
83 | { | ||
84 | /* For IDE registers, value is not shifted */ | ||
85 | if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6) | ||
86 | return 0; | ||
87 | else | ||
88 | return 1; | ||
89 | } | ||
90 | #endif | ||
91 | |||
92 | /* In case someone configures the kernel w/o PCI support: in that */ | ||
93 | /* scenario, don't ever bother to check for PCI-window addresses */ | ||
94 | |||
95 | /* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */ | ||
96 | #if defined(CONFIG_PCI) | ||
97 | #define CHECK_SH7751_PCIIO(port) \ | ||
98 | ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE))) | ||
99 | #else | ||
100 | #define CHECK_SH7751_PCIIO(port) (0) | ||
101 | #endif | ||
102 | |||
103 | /* | 26 | /* |
104 | * General outline: remap really low stuff [eventually] to SuperIO, | 27 | * General outline: remap really low stuff [eventually] to SuperIO, |
105 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) | 28 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) |
@@ -111,10 +34,10 @@ unsigned char sh7751se_inb(unsigned long port) | |||
111 | { | 34 | { |
112 | if (PXSEG(port)) | 35 | if (PXSEG(port)) |
113 | return *(volatile unsigned char *)port; | 36 | return *(volatile unsigned char *)port; |
114 | else if (CHECK_SH7751_PCIIO(port)) | 37 | else if (is_pci_ioaddr(port)) |
115 | return *(volatile unsigned char *)PCI_IOMAP(port); | 38 | return *(volatile unsigned char *)pci_ioaddr(port); |
116 | else | 39 | else |
117 | return (*port2adr(port))&0xff; | 40 | return (*port2adr(port)) & 0xff; |
118 | } | 41 | } |
119 | 42 | ||
120 | unsigned char sh7751se_inb_p(unsigned long port) | 43 | unsigned char sh7751se_inb_p(unsigned long port) |
@@ -123,11 +46,11 @@ unsigned char sh7751se_inb_p(unsigned long port) | |||
123 | 46 | ||
124 | if (PXSEG(port)) | 47 | if (PXSEG(port)) |
125 | v = *(volatile unsigned char *)port; | 48 | v = *(volatile unsigned char *)port; |
126 | else if (CHECK_SH7751_PCIIO(port)) | 49 | else if (is_pci_ioaddr(port)) |
127 | v = *(volatile unsigned char *)PCI_IOMAP(port); | 50 | v = *(volatile unsigned char *)pci_ioaddr(port); |
128 | else | 51 | else |
129 | v = (*port2adr(port))&0xff; | 52 | v = (*port2adr(port)) & 0xff; |
130 | delay(); | 53 | ctrl_delay(); |
131 | return v; | 54 | return v; |
132 | } | 55 | } |
133 | 56 | ||
@@ -135,12 +58,12 @@ unsigned short sh7751se_inw(unsigned long port) | |||
135 | { | 58 | { |
136 | if (PXSEG(port)) | 59 | if (PXSEG(port)) |
137 | return *(volatile unsigned short *)port; | 60 | return *(volatile unsigned short *)port; |
138 | else if (CHECK_SH7751_PCIIO(port)) | 61 | else if (is_pci_ioaddr(port)) |
139 | return *(volatile unsigned short *)PCI_IOMAP(port); | 62 | return *(volatile unsigned short *)pci_ioaddr(port); |
140 | else if (port >= 0x2000) | 63 | else if (port >= 0x2000) |
141 | return *port2adr(port); | 64 | return *port2adr(port); |
142 | else | 65 | else |
143 | maybebadio(inw, port); | 66 | maybebadio(port); |
144 | return 0; | 67 | return 0; |
145 | } | 68 | } |
146 | 69 | ||
@@ -148,12 +71,12 @@ unsigned int sh7751se_inl(unsigned long port) | |||
148 | { | 71 | { |
149 | if (PXSEG(port)) | 72 | if (PXSEG(port)) |
150 | return *(volatile unsigned long *)port; | 73 | return *(volatile unsigned long *)port; |
151 | else if (CHECK_SH7751_PCIIO(port)) | 74 | else if (is_pci_ioaddr(port)) |
152 | return *(volatile unsigned int *)PCI_IOMAP(port); | 75 | return *(volatile unsigned int *)pci_ioaddr(port); |
153 | else if (port >= 0x2000) | 76 | else if (port >= 0x2000) |
154 | return *port2adr(port); | 77 | return *port2adr(port); |
155 | else | 78 | else |
156 | maybebadio(inl, port); | 79 | maybebadio(port); |
157 | return 0; | 80 | return 0; |
158 | } | 81 | } |
159 | 82 | ||
@@ -162,8 +85,8 @@ void sh7751se_outb(unsigned char value, unsigned long port) | |||
162 | 85 | ||
163 | if (PXSEG(port)) | 86 | if (PXSEG(port)) |
164 | *(volatile unsigned char *)port = value; | 87 | *(volatile unsigned char *)port = value; |
165 | else if (CHECK_SH7751_PCIIO(port)) | 88 | else if (is_pci_ioaddr(port)) |
166 | *((unsigned char*)PCI_IOMAP(port)) = value; | 89 | *((unsigned char*)pci_ioaddr(port)) = value; |
167 | else | 90 | else |
168 | *(port2adr(port)) = value; | 91 | *(port2adr(port)) = value; |
169 | } | 92 | } |
@@ -172,73 +95,41 @@ void sh7751se_outb_p(unsigned char value, unsigned long port) | |||
172 | { | 95 | { |
173 | if (PXSEG(port)) | 96 | if (PXSEG(port)) |
174 | *(volatile unsigned char *)port = value; | 97 | *(volatile unsigned char *)port = value; |
175 | else if (CHECK_SH7751_PCIIO(port)) | 98 | else if (is_pci_ioaddr(port)) |
176 | *((unsigned char*)PCI_IOMAP(port)) = value; | 99 | *((unsigned char*)pci_ioaddr(port)) = value; |
177 | else | 100 | else |
178 | *(port2adr(port)) = value; | 101 | *(port2adr(port)) = value; |
179 | delay(); | 102 | ctrl_delay(); |
180 | } | 103 | } |
181 | 104 | ||
182 | void sh7751se_outw(unsigned short value, unsigned long port) | 105 | void sh7751se_outw(unsigned short value, unsigned long port) |
183 | { | 106 | { |
184 | if (PXSEG(port)) | 107 | if (PXSEG(port)) |
185 | *(volatile unsigned short *)port = value; | 108 | *(volatile unsigned short *)port = value; |
186 | else if (CHECK_SH7751_PCIIO(port)) | 109 | else if (is_pci_ioaddr(port)) |
187 | *((unsigned short *)PCI_IOMAP(port)) = value; | 110 | *((unsigned short *)pci_ioaddr(port)) = value; |
188 | else if (port >= 0x2000) | 111 | else if (port >= 0x2000) |
189 | *port2adr(port) = value; | 112 | *port2adr(port) = value; |
190 | else | 113 | else |
191 | maybebadio(outw, port); | 114 | maybebadio(port); |
192 | } | 115 | } |
193 | 116 | ||
194 | void sh7751se_outl(unsigned int value, unsigned long port) | 117 | void sh7751se_outl(unsigned int value, unsigned long port) |
195 | { | 118 | { |
196 | if (PXSEG(port)) | 119 | if (PXSEG(port)) |
197 | *(volatile unsigned long *)port = value; | 120 | *(volatile unsigned long *)port = value; |
198 | else if (CHECK_SH7751_PCIIO(port)) | 121 | else if (is_pci_ioaddr(port)) |
199 | *((unsigned long*)PCI_IOMAP(port)) = value; | 122 | *((unsigned long*)pci_ioaddr(port)) = value; |
200 | else | 123 | else |
201 | maybebadio(outl, port); | 124 | maybebadio(port); |
202 | } | 125 | } |
203 | 126 | ||
204 | void sh7751se_insl(unsigned long port, void *addr, unsigned long count) | 127 | void sh7751se_insl(unsigned long port, void *addr, unsigned long count) |
205 | { | 128 | { |
206 | maybebadio(insl, port); | 129 | maybebadio(port); |
207 | } | 130 | } |
208 | 131 | ||
209 | void sh7751se_outsl(unsigned long port, const void *addr, unsigned long count) | 132 | void sh7751se_outsl(unsigned long port, const void *addr, unsigned long count) |
210 | { | 133 | { |
211 | maybebadio(outsw, port); | 134 | maybebadio(port); |
212 | } | ||
213 | |||
214 | /* Map ISA bus address to the real address. Only for PCMCIA. */ | ||
215 | |||
216 | /* ISA page descriptor. */ | ||
217 | static __u32 sh_isa_memmap[256]; | ||
218 | |||
219 | #if 0 | ||
220 | static int | ||
221 | sh_isa_mmap(__u32 start, __u32 length, __u32 offset) | ||
222 | { | ||
223 | int idx; | ||
224 | |||
225 | if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000)) | ||
226 | return -1; | ||
227 | |||
228 | idx = start >> 12; | ||
229 | sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff); | ||
230 | printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n", | ||
231 | start, length, offset, idx, sh_isa_memmap[idx]); | ||
232 | return 0; | ||
233 | } | ||
234 | #endif | ||
235 | |||
236 | unsigned long | ||
237 | sh7751se_isa_port2addr(unsigned long offset) | ||
238 | { | ||
239 | int idx; | ||
240 | |||
241 | idx = (offset >> 12) & 0xff; | ||
242 | offset &= 0xfff; | ||
243 | return sh_isa_memmap[idx] + offset; | ||
244 | } | 135 | } |
diff --git a/arch/sh/boards/se/7751/irq.c b/arch/sh/boards/se/7751/irq.c index bf6c023615df..c607b0a48479 100644 --- a/arch/sh/boards/se/7751/irq.c +++ b/arch/sh/boards/se/7751/irq.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
15 | #include <asm/se7751/se7751.h> | 15 | #include <asm/se7751.h> |
16 | 16 | ||
17 | /* | 17 | /* |
18 | * Initialize IRQ setting | 18 | * Initialize IRQ setting |
diff --git a/arch/sh/boards/se/7751/led.c b/arch/sh/boards/se/7751/led.c index a878726d3c7c..ff0355dea81b 100644 --- a/arch/sh/boards/se/7751/led.c +++ b/arch/sh/boards/se/7751/led.c | |||
@@ -8,23 +8,8 @@ | |||
8 | * | 8 | * |
9 | * This file contains Solution Engine specific LED code. | 9 | * This file contains Solution Engine specific LED code. |
10 | */ | 10 | */ |
11 | |||
12 | #include <asm/se7751/se7751.h> | ||
13 | |||
14 | static void mach_led(int position, int value) | ||
15 | { | ||
16 | volatile unsigned short* p = (volatile unsigned short*)PA_LED; | ||
17 | |||
18 | if (value) { | ||
19 | *p |= (1<<8); | ||
20 | } else { | ||
21 | *p &= ~(1<<8); | ||
22 | } | ||
23 | } | ||
24 | |||
25 | #ifdef CONFIG_HEARTBEAT | ||
26 | |||
27 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
12 | #include <asm/se7751.h> | ||
28 | 13 | ||
29 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ | 14 | /* Cycle the LED's in the clasic Knightrider/Sun pattern */ |
30 | void heartbeat_7751se(void) | 15 | void heartbeat_7751se(void) |
@@ -64,4 +49,3 @@ void heartbeat_7751se(void) | |||
64 | *p = 1<<(bit+8); | 49 | *p = 1<<(bit+8); |
65 | 50 | ||
66 | } | 51 | } |
67 | #endif /* CONFIG_HEARTBEAT */ | ||
diff --git a/arch/sh/boards/se/7751/mach.c b/arch/sh/boards/se/7751/mach.c deleted file mode 100644 index 62d8d3e62590..000000000000 --- a/arch/sh/boards/se/7751/mach.c +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/kernel/mach_7751se.c | ||
3 | * | ||
4 | * Minor tweak of mach_se.c file to reference 7751se-specific items. | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * Machine vector for the Hitachi 7751 SolutionEngine | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/machvec.h> | ||
15 | #include <asm/rtc.h> | ||
16 | #include <asm/machvec_init.h> | ||
17 | |||
18 | #include <asm/se7751/io.h> | ||
19 | |||
20 | void heartbeat_7751se(void); | ||
21 | void init_7751se_IRQ(void); | ||
22 | |||
23 | /* | ||
24 | * The Machine Vector | ||
25 | */ | ||
26 | |||
27 | struct sh_machine_vector mv_7751se __initmv = { | ||
28 | .mv_nr_irqs = 72, | ||
29 | |||
30 | .mv_inb = sh7751se_inb, | ||
31 | .mv_inw = sh7751se_inw, | ||
32 | .mv_inl = sh7751se_inl, | ||
33 | .mv_outb = sh7751se_outb, | ||
34 | .mv_outw = sh7751se_outw, | ||
35 | .mv_outl = sh7751se_outl, | ||
36 | |||
37 | .mv_inb_p = sh7751se_inb_p, | ||
38 | .mv_inw_p = sh7751se_inw, | ||
39 | .mv_inl_p = sh7751se_inl, | ||
40 | .mv_outb_p = sh7751se_outb_p, | ||
41 | .mv_outw_p = sh7751se_outw, | ||
42 | .mv_outl_p = sh7751se_outl, | ||
43 | |||
44 | .mv_insl = sh7751se_insl, | ||
45 | .mv_outsl = sh7751se_outsl, | ||
46 | |||
47 | .mv_isa_port2addr = sh7751se_isa_port2addr, | ||
48 | |||
49 | .mv_init_irq = init_7751se_IRQ, | ||
50 | #ifdef CONFIG_HEARTBEAT | ||
51 | .mv_heartbeat = heartbeat_7751se, | ||
52 | #endif | ||
53 | }; | ||
54 | ALIAS_MV(7751se) | ||
diff --git a/arch/sh/boards/se/7751/setup.c b/arch/sh/boards/se/7751/setup.c index 48dc5aee67d4..73e826310ba8 100644 --- a/arch/sh/boards/se/7751/setup.c +++ b/arch/sh/boards/se/7751/setup.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/setup_7751se.c | 2 | * linux/arch/sh/kernel/setup_7751se.c |
3 | * | 3 | * |
4 | * Copyright (C) 2000 Kazumoto Kojima | 4 | * Copyright (C) 2000 Kazumoto Kojima |
@@ -11,78 +11,15 @@ | |||
11 | 11 | ||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | |||
15 | #include <linux/hdreg.h> | ||
16 | #include <linux/ide.h> | 14 | #include <linux/ide.h> |
17 | #include <asm/io.h> | 15 | #include <asm/io.h> |
18 | #include <asm/se7751/se7751.h> | 16 | #include <asm/se7751.h> |
19 | 17 | ||
20 | #ifdef CONFIG_SH_KGDB | 18 | void heartbeat_7751se(void); |
21 | #include <asm/kgdb.h> | 19 | void init_7751se_IRQ(void); |
22 | #endif | ||
23 | |||
24 | /* | ||
25 | * Configure the Super I/O chip | ||
26 | */ | ||
27 | #if 0 | ||
28 | /* Leftover code from regular Solution Engine, for reference. */ | ||
29 | /* The SH7751 Solution Engine has a different SuperIO. */ | ||
30 | static void __init smsc_config(int index, int data) | ||
31 | { | ||
32 | outb_p(index, INDEX_PORT); | ||
33 | outb_p(data, DATA_PORT); | ||
34 | } | ||
35 | |||
36 | static void __init init_smsc(void) | ||
37 | { | ||
38 | outb_p(CONFIG_ENTER, CONFIG_PORT); | ||
39 | outb_p(CONFIG_ENTER, CONFIG_PORT); | ||
40 | |||
41 | /* FDC */ | ||
42 | smsc_config(CURRENT_LDN_INDEX, LDN_FDC); | ||
43 | smsc_config(ACTIVATE_INDEX, 0x01); | ||
44 | smsc_config(IRQ_SELECT_INDEX, 6); /* IRQ6 */ | ||
45 | |||
46 | /* IDE1 */ | ||
47 | smsc_config(CURRENT_LDN_INDEX, LDN_IDE1); | ||
48 | smsc_config(ACTIVATE_INDEX, 0x01); | ||
49 | smsc_config(IRQ_SELECT_INDEX, 14); /* IRQ14 */ | ||
50 | |||
51 | /* AUXIO (GPIO): to use IDE1 */ | ||
52 | smsc_config(CURRENT_LDN_INDEX, LDN_AUXIO); | ||
53 | smsc_config(GPIO46_INDEX, 0x00); /* nIOROP */ | ||
54 | smsc_config(GPIO47_INDEX, 0x00); /* nIOWOP */ | ||
55 | |||
56 | /* COM1 */ | ||
57 | smsc_config(CURRENT_LDN_INDEX, LDN_COM1); | ||
58 | smsc_config(ACTIVATE_INDEX, 0x01); | ||
59 | smsc_config(IO_BASE_HI_INDEX, 0x03); | ||
60 | smsc_config(IO_BASE_LO_INDEX, 0xf8); | ||
61 | smsc_config(IRQ_SELECT_INDEX, 4); /* IRQ4 */ | ||
62 | |||
63 | /* COM2 */ | ||
64 | smsc_config(CURRENT_LDN_INDEX, LDN_COM2); | ||
65 | smsc_config(ACTIVATE_INDEX, 0x01); | ||
66 | smsc_config(IO_BASE_HI_INDEX, 0x02); | ||
67 | smsc_config(IO_BASE_LO_INDEX, 0xf8); | ||
68 | smsc_config(IRQ_SELECT_INDEX, 3); /* IRQ3 */ | ||
69 | |||
70 | /* RTC */ | ||
71 | smsc_config(CURRENT_LDN_INDEX, LDN_RTC); | ||
72 | smsc_config(ACTIVATE_INDEX, 0x01); | ||
73 | smsc_config(IRQ_SELECT_INDEX, 8); /* IRQ8 */ | ||
74 | |||
75 | /* XXX: PARPORT, KBD, and MOUSE will come here... */ | ||
76 | outb_p(CONFIG_EXIT, CONFIG_PORT); | ||
77 | } | ||
78 | #endif | ||
79 | |||
80 | const char *get_system_type(void) | ||
81 | { | ||
82 | return "7751 SolutionEngine"; | ||
83 | } | ||
84 | 20 | ||
85 | #ifdef CONFIG_SH_KGDB | 21 | #ifdef CONFIG_SH_KGDB |
22 | #include <asm/kgdb.h> | ||
86 | static int kgdb_uart_setup(void); | 23 | static int kgdb_uart_setup(void); |
87 | static struct kgdb_sermap kgdb_uart_sermap = | 24 | static struct kgdb_sermap kgdb_uart_sermap = |
88 | { "ttyS", 0, kgdb_uart_setup, NULL }; | 25 | { "ttyS", 0, kgdb_uart_setup, NULL }; |
@@ -91,7 +28,7 @@ static struct kgdb_sermap kgdb_uart_sermap = | |||
91 | /* | 28 | /* |
92 | * Initialize the board | 29 | * Initialize the board |
93 | */ | 30 | */ |
94 | void __init platform_setup(void) | 31 | static void __init sh7751se_setup(char **cmdline_p) |
95 | { | 32 | { |
96 | /* Call init_smsc() replacement to set up SuperIO. */ | 33 | /* Call init_smsc() replacement to set up SuperIO. */ |
97 | /* XXX: RTC setting comes here */ | 34 | /* XXX: RTC setting comes here */ |
@@ -225,3 +162,37 @@ static int kgdb_uart_setup(void) | |||
225 | return 0; | 162 | return 0; |
226 | } | 163 | } |
227 | #endif /* CONFIG_SH_KGDB */ | 164 | #endif /* CONFIG_SH_KGDB */ |
165 | |||
166 | |||
167 | /* | ||
168 | * The Machine Vector | ||
169 | */ | ||
170 | |||
171 | struct sh_machine_vector mv_7751se __initmv = { | ||
172 | .mv_name = "7751 SolutionEngine", | ||
173 | .mv_setup = sh7751se_setup, | ||
174 | .mv_nr_irqs = 72, | ||
175 | |||
176 | .mv_inb = sh7751se_inb, | ||
177 | .mv_inw = sh7751se_inw, | ||
178 | .mv_inl = sh7751se_inl, | ||
179 | .mv_outb = sh7751se_outb, | ||
180 | .mv_outw = sh7751se_outw, | ||
181 | .mv_outl = sh7751se_outl, | ||
182 | |||
183 | .mv_inb_p = sh7751se_inb_p, | ||
184 | .mv_inw_p = sh7751se_inw, | ||
185 | .mv_inl_p = sh7751se_inl, | ||
186 | .mv_outb_p = sh7751se_outb_p, | ||
187 | .mv_outw_p = sh7751se_outw, | ||
188 | .mv_outl_p = sh7751se_outl, | ||
189 | |||
190 | .mv_insl = sh7751se_insl, | ||
191 | .mv_outsl = sh7751se_outsl, | ||
192 | |||
193 | .mv_init_irq = init_7751se_IRQ, | ||
194 | #ifdef CONFIG_HEARTBEAT | ||
195 | .mv_heartbeat = heartbeat_7751se, | ||
196 | #endif | ||
197 | }; | ||
198 | ALIAS_MV(7751se) | ||
diff --git a/arch/sh/boards/sh03/rtc.c b/arch/sh/boards/sh03/rtc.c index d609863cfe53..0a9266bb51c5 100644 --- a/arch/sh/boards/sh03/rtc.c +++ b/arch/sh/boards/sh03/rtc.c | |||
@@ -10,9 +10,10 @@ | |||
10 | #include <linux/sched.h> | 10 | #include <linux/sched.h> |
11 | #include <linux/time.h> | 11 | #include <linux/time.h> |
12 | #include <linux/bcd.h> | 12 | #include <linux/bcd.h> |
13 | #include <asm/io.h> | ||
14 | #include <linux/rtc.h> | 13 | #include <linux/rtc.h> |
15 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
15 | #include <asm/io.h> | ||
16 | #include <asm/rtc.h> | ||
16 | 17 | ||
17 | #define RTC_BASE 0xb0000000 | 18 | #define RTC_BASE 0xb0000000 |
18 | #define RTC_SEC1 (RTC_BASE + 0) | 19 | #define RTC_SEC1 (RTC_BASE + 0) |
@@ -34,8 +35,6 @@ | |||
34 | #define RTC_BUSY 1 | 35 | #define RTC_BUSY 1 |
35 | #define RTC_STOP 2 | 36 | #define RTC_STOP 2 |
36 | 37 | ||
37 | extern void (*rtc_get_time)(struct timespec *); | ||
38 | extern int (*rtc_set_time)(const time_t); | ||
39 | extern spinlock_t rtc_lock; | 38 | extern spinlock_t rtc_lock; |
40 | 39 | ||
41 | unsigned long get_cmos_time(void) | 40 | unsigned long get_cmos_time(void) |
@@ -128,6 +127,6 @@ int sh03_rtc_settimeofday(const time_t secs) | |||
128 | 127 | ||
129 | void sh03_time_init(void) | 128 | void sh03_time_init(void) |
130 | { | 129 | { |
131 | rtc_get_time = sh03_rtc_gettimeofday; | 130 | rtc_sh_get_time = sh03_rtc_gettimeofday; |
132 | rtc_set_time = sh03_rtc_settimeofday; | 131 | rtc_sh_set_time = sh03_rtc_settimeofday; |
133 | } | 132 | } |
diff --git a/arch/sh/boards/sh03/setup.c b/arch/sh/boards/sh03/setup.c index 60290f8f289c..6c310587ddfe 100644 --- a/arch/sh/boards/sh03/setup.c +++ b/arch/sh/boards/sh03/setup.c | |||
@@ -7,22 +7,13 @@ | |||
7 | 7 | ||
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <linux/irq.h> | 9 | #include <linux/irq.h> |
10 | #include <linux/hdreg.h> | ||
11 | #include <linux/ide.h> | ||
12 | #include <asm/io.h> | 10 | #include <asm/io.h> |
11 | #include <asm/rtc.h> | ||
13 | #include <asm/sh03/io.h> | 12 | #include <asm/sh03/io.h> |
14 | #include <asm/sh03/sh03.h> | 13 | #include <asm/sh03/sh03.h> |
15 | #include <asm/addrspace.h> | 14 | #include <asm/addrspace.h> |
16 | #include "../../drivers/pci/pci-sh7751.h" | ||
17 | 15 | ||
18 | extern void (*board_time_init)(void); | 16 | static void __init init_sh03_IRQ(void) |
19 | |||
20 | const char *get_system_type(void) | ||
21 | { | ||
22 | return "Interface CTP/PCI-SH03)"; | ||
23 | } | ||
24 | |||
25 | void init_sh03_IRQ(void) | ||
26 | { | 17 | { |
27 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | 18 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); |
28 | 19 | ||
@@ -34,38 +25,34 @@ void init_sh03_IRQ(void) | |||
34 | 25 | ||
35 | extern void *cf_io_base; | 26 | extern void *cf_io_base; |
36 | 27 | ||
37 | unsigned long sh03_isa_port2addr(unsigned long port) | 28 | static void __iomem *sh03_ioport_map(unsigned long port, unsigned int size) |
38 | { | 29 | { |
39 | if (PXSEG(port)) | 30 | if (PXSEG(port)) |
40 | return port; | 31 | return (void __iomem *)port; |
41 | /* CompactFlash (IDE) */ | 32 | /* CompactFlash (IDE) */ |
42 | if (((port >= 0x1f0) && (port <= 0x1f7)) || (port == 0x3f6)) { | 33 | if (((port >= 0x1f0) && (port <= 0x1f7)) || (port == 0x3f6)) |
43 | return (unsigned long)cf_io_base + port; | 34 | return (void __iomem *)((unsigned long)cf_io_base + port); |
44 | } | 35 | |
45 | return port + SH7751_PCI_IO_BASE; | 36 | return (void __iomem *)(port + PCI_IO_BASE); |
46 | } | 37 | } |
47 | 38 | ||
48 | /* | 39 | /* arch/sh/boards/sh03/rtc.c */ |
49 | * The Machine Vector | 40 | void sh03_time_init(void); |
50 | */ | 41 | |
42 | static void __init sh03_setup(char **cmdline_p) | ||
43 | { | ||
44 | board_time_init = sh03_time_init; | ||
45 | } | ||
51 | 46 | ||
52 | struct sh_machine_vector mv_sh03 __initmv = { | 47 | struct sh_machine_vector mv_sh03 __initmv = { |
48 | .mv_name = "Interface (CTP/PCI-SH03)", | ||
49 | .mv_setup = sh03_setup, | ||
53 | .mv_nr_irqs = 48, | 50 | .mv_nr_irqs = 48, |
54 | .mv_isa_port2addr = sh03_isa_port2addr, | 51 | .mv_ioport_map = sh03_ioport_map, |
55 | .mv_init_irq = init_sh03_IRQ, | 52 | .mv_init_irq = init_sh03_IRQ, |
56 | 53 | ||
57 | #ifdef CONFIG_HEARTBEAT | 54 | #ifdef CONFIG_HEARTBEAT |
58 | .mv_heartbeat = heartbeat_sh03, | 55 | .mv_heartbeat = heartbeat_sh03, |
59 | #endif | 56 | #endif |
60 | }; | 57 | }; |
61 | |||
62 | ALIAS_MV(sh03) | 58 | ALIAS_MV(sh03) |
63 | |||
64 | /* arch/sh/boards/sh03/rtc.c */ | ||
65 | void sh03_time_init(void); | ||
66 | |||
67 | int __init platform_setup(void) | ||
68 | { | ||
69 | board_time_init = sh03_time_init; | ||
70 | return 0; | ||
71 | } | ||
diff --git a/arch/sh/boards/sh2000/Makefile b/arch/sh/boards/sh2000/Makefile deleted file mode 100644 index 05d390c3599c..000000000000 --- a/arch/sh/boards/sh2000/Makefile +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the SH2000 specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o | ||
6 | |||
diff --git a/arch/sh/boards/sh2000/setup.c b/arch/sh/boards/sh2000/setup.c deleted file mode 100644 index 2fe6a11765e9..000000000000 --- a/arch/sh/boards/sh2000/setup.c +++ /dev/null | |||
@@ -1,70 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/kernel/setup_sh2000.c | ||
3 | * | ||
4 | * Copyright (C) 2001 SUGIOKA Tochinobu | ||
5 | * | ||
6 | * SH-2000 Support. | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #include <linux/init.h> | ||
11 | #include <linux/irq.h> | ||
12 | |||
13 | #include <asm/io.h> | ||
14 | #include <asm/machvec.h> | ||
15 | #include <asm/mach/sh2000.h> | ||
16 | |||
17 | #define CF_CIS_BASE 0xb4200000 | ||
18 | |||
19 | #define PORT_PECR 0xa4000108 | ||
20 | #define PORT_PHCR 0xa400010E | ||
21 | #define PORT_ICR1 0xa4000010 | ||
22 | #define PORT_IRR0 0xa4000004 | ||
23 | |||
24 | #define IDE_OFFSET 0xb6200000 | ||
25 | #define NIC_OFFSET 0xb6000000 | ||
26 | #define EXTBUS_OFFSET 0xba000000 | ||
27 | |||
28 | |||
29 | const char *get_system_type(void) | ||
30 | { | ||
31 | return "sh2000"; | ||
32 | } | ||
33 | |||
34 | static unsigned long sh2000_isa_port2addr(unsigned long offset) | ||
35 | { | ||
36 | if((offset & ~7) == 0x1f0 || offset == 0x3f6) | ||
37 | return IDE_OFFSET + offset; | ||
38 | else if((offset & ~0x1f) == 0x300) | ||
39 | return NIC_OFFSET + offset; | ||
40 | return EXTBUS_OFFSET + offset; | ||
41 | } | ||
42 | |||
43 | /* | ||
44 | * The Machine Vector | ||
45 | */ | ||
46 | struct sh_machine_vector mv_sh2000 __initmv = { | ||
47 | .mv_nr_irqs = 80, | ||
48 | .mv_isa_port2addr = sh2000_isa_port2addr, | ||
49 | }; | ||
50 | ALIAS_MV(sh2000) | ||
51 | |||
52 | /* | ||
53 | * Initialize the board | ||
54 | */ | ||
55 | int __init platform_setup(void) | ||
56 | { | ||
57 | /* XXX: RTC setting comes here */ | ||
58 | |||
59 | /* These should be done by BIOS/IPL ... */ | ||
60 | /* Enable nCE2A, nCE2B output */ | ||
61 | ctrl_outw(ctrl_inw(PORT_PECR) & ~0xf00, PORT_PECR); | ||
62 | /* Enable the Compact Flash card, and set the level interrupt */ | ||
63 | ctrl_outw(0x0042, CF_CIS_BASE+0x0200); | ||
64 | /* Enable interrupt */ | ||
65 | ctrl_outw(ctrl_inw(PORT_PHCR) & ~0x03f3, PORT_PHCR); | ||
66 | ctrl_outw(1, PORT_ICR1); | ||
67 | ctrl_outw(ctrl_inw(PORT_IRR0) & ~0xff3f, PORT_IRR0); | ||
68 | printk(KERN_INFO "SH-2000 Setup...done\n"); | ||
69 | return 0; | ||
70 | } | ||
diff --git a/arch/sh/boards/shmin/Makefile b/arch/sh/boards/shmin/Makefile new file mode 100644 index 000000000000..3190cc72430e --- /dev/null +++ b/arch/sh/boards/shmin/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # | ||
2 | # Makefile for the SHMIN board. | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o | ||
diff --git a/arch/sh/boards/shmin/setup.c b/arch/sh/boards/shmin/setup.c new file mode 100644 index 000000000000..2f0c19706cf9 --- /dev/null +++ b/arch/sh/boards/shmin/setup.c | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * arch/sh/boards/shmin/setup.c | ||
3 | * | ||
4 | * Copyright (C) 2006 Takashi YOSHII | ||
5 | * | ||
6 | * SHMIN Support. | ||
7 | */ | ||
8 | #include <linux/init.h> | ||
9 | #include <asm/machvec.h> | ||
10 | #include <asm/shmin/shmin.h> | ||
11 | #include <asm/clock.h> | ||
12 | #include <asm/irq.h> | ||
13 | #include <asm/io.h> | ||
14 | |||
15 | #define PFC_PHCR 0xa400010e | ||
16 | |||
17 | static void __init init_shmin_irq(void) | ||
18 | { | ||
19 | ctrl_outw(0x2a00, PFC_PHCR); // IRQ0-3=IRQ | ||
20 | ctrl_outw(0x0aaa, INTC_ICR1); // IRQ0-3=IRQ-mode,Low-active. | ||
21 | } | ||
22 | |||
23 | static void __iomem *shmin_ioport_map(unsigned long port, unsigned int size) | ||
24 | { | ||
25 | static int dummy; | ||
26 | |||
27 | if ((port & ~0x1f) == SHMIN_NE_BASE) | ||
28 | return (void __iomem *)(SHMIN_IO_BASE + port); | ||
29 | |||
30 | dummy = 0; | ||
31 | |||
32 | return &dummy; | ||
33 | |||
34 | } | ||
35 | |||
36 | struct sh_machine_vector mv_shmin __initmv = { | ||
37 | .mv_name = "SHMIN", | ||
38 | .mv_init_irq = init_shmin_irq, | ||
39 | .mv_ioport_map = shmin_ioport_map, | ||
40 | }; | ||
41 | ALIAS_MV(shmin) | ||
diff --git a/arch/sh/boards/snapgear/io.c b/arch/sh/boards/snapgear/io.c index e2eb78fc381d..0f4824264557 100644 --- a/arch/sh/boards/snapgear/io.c +++ b/arch/sh/boards/snapgear/io.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/io_7751se.c | ||
3 | * | ||
4 | * Copyright (C) 2002 David McCullough <davidm@snapgear.com> | 2 | * Copyright (C) 2002 David McCullough <davidm@snapgear.com> |
5 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel | 3 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel |
6 | * Based largely on io_se.c. | 4 | * Based largely on io_se.c. |
@@ -11,67 +9,22 @@ | |||
11 | * placeholder code from io_se.c left in with the | 9 | * placeholder code from io_se.c left in with the |
12 | * expectation of later SuperIO and PCMCIA access. | 10 | * expectation of later SuperIO and PCMCIA access. |
13 | */ | 11 | */ |
14 | |||
15 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
16 | #include <linux/types.h> | 13 | #include <linux/types.h> |
17 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
18 | #include <asm/io.h> | 15 | #include <asm/io.h> |
19 | #include <asm/addrspace.h> | 16 | #include <asm/addrspace.h> |
20 | 17 | ||
21 | #include <asm/pci.h> | ||
22 | #include "../../drivers/pci/pci-sh7751.h" | ||
23 | |||
24 | #ifdef CONFIG_SH_SECUREEDGE5410 | 18 | #ifdef CONFIG_SH_SECUREEDGE5410 |
25 | unsigned short secureedge5410_ioport; | 19 | unsigned short secureedge5410_ioport; |
26 | #endif | 20 | #endif |
27 | 21 | ||
28 | /* | ||
29 | * The SnapGear uses the built-in PCI controller (PCIC) | ||
30 | * of the 7751 processor | ||
31 | */ | ||
32 | |||
33 | #define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR) | ||
34 | #define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR) | ||
35 | #define PCI_IO_AREA SH7751_PCI_IO_BASE | ||
36 | #define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE | ||
37 | |||
38 | |||
39 | #define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK)) | ||
40 | |||
41 | |||
42 | #define maybebadio(name,port) \ | ||
43 | printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ | ||
44 | #name, (port), (__u32) __builtin_return_address(0)) | ||
45 | |||
46 | |||
47 | static inline void delay(void) | ||
48 | { | ||
49 | ctrl_inw(0xa0000000); | ||
50 | } | ||
51 | |||
52 | |||
53 | static inline volatile __u16 *port2adr(unsigned int port) | 22 | static inline volatile __u16 *port2adr(unsigned int port) |
54 | { | 23 | { |
55 | #if 0 | 24 | maybebadio((unsigned long)port); |
56 | if (port >= 0x2000) | ||
57 | return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000)); | ||
58 | #endif | ||
59 | maybebadio(name,(unsigned long)port); | ||
60 | return (volatile __u16*)port; | 25 | return (volatile __u16*)port; |
61 | } | 26 | } |
62 | 27 | ||
63 | |||
64 | /* In case someone configures the kernel w/o PCI support: in that */ | ||
65 | /* scenario, don't ever bother to check for PCI-window addresses */ | ||
66 | |||
67 | /* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */ | ||
68 | #if defined(CONFIG_PCI) | ||
69 | #define CHECK_SH7751_PCIIO(port) \ | ||
70 | ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE))) | ||
71 | #else | ||
72 | #define CHECK_SH7751_PCIIO(port) (0) | ||
73 | #endif | ||
74 | |||
75 | /* | 28 | /* |
76 | * General outline: remap really low stuff [eventually] to SuperIO, | 29 | * General outline: remap really low stuff [eventually] to SuperIO, |
77 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) | 30 | * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) |
@@ -79,148 +32,106 @@ static inline volatile __u16 *port2adr(unsigned int port) | |||
79 | * should be way beyond the window, and is used w/o translation for | 32 | * should be way beyond the window, and is used w/o translation for |
80 | * compatibility. | 33 | * compatibility. |
81 | */ | 34 | */ |
82 | |||
83 | unsigned char snapgear_inb(unsigned long port) | 35 | unsigned char snapgear_inb(unsigned long port) |
84 | { | 36 | { |
85 | if (PXSEG(port)) | 37 | if (PXSEG(port)) |
86 | return *(volatile unsigned char *)port; | 38 | return *(volatile unsigned char *)port; |
87 | else if (CHECK_SH7751_PCIIO(port)) | 39 | else if (is_pci_ioaddr(port)) |
88 | return *(volatile unsigned char *)PCI_IOMAP(port); | 40 | return *(volatile unsigned char *)pci_ioaddr(port); |
89 | else | 41 | else |
90 | return (*port2adr(port))&0xff; | 42 | return (*port2adr(port)) & 0xff; |
91 | } | 43 | } |
92 | 44 | ||
93 | |||
94 | unsigned char snapgear_inb_p(unsigned long port) | 45 | unsigned char snapgear_inb_p(unsigned long port) |
95 | { | 46 | { |
96 | unsigned char v; | 47 | unsigned char v; |
97 | 48 | ||
98 | if (PXSEG(port)) | 49 | if (PXSEG(port)) |
99 | v = *(volatile unsigned char *)port; | 50 | v = *(volatile unsigned char *)port; |
100 | else if (CHECK_SH7751_PCIIO(port)) | 51 | else if (is_pci_ioaddr(port)) |
101 | v = *(volatile unsigned char *)PCI_IOMAP(port); | 52 | v = *(volatile unsigned char *)pci_ioaddr(port); |
102 | else | 53 | else |
103 | v = (*port2adr(port))&0xff; | 54 | v = (*port2adr(port))&0xff; |
104 | delay(); | 55 | ctrl_delay(); |
105 | return v; | 56 | return v; |
106 | } | 57 | } |
107 | 58 | ||
108 | |||
109 | unsigned short snapgear_inw(unsigned long port) | 59 | unsigned short snapgear_inw(unsigned long port) |
110 | { | 60 | { |
111 | if (PXSEG(port)) | 61 | if (PXSEG(port)) |
112 | return *(volatile unsigned short *)port; | 62 | return *(volatile unsigned short *)port; |
113 | else if (CHECK_SH7751_PCIIO(port)) | 63 | else if (is_pci_ioaddr(port)) |
114 | return *(volatile unsigned short *)PCI_IOMAP(port); | 64 | return *(volatile unsigned short *)pci_ioaddr(port); |
115 | else if (port >= 0x2000) | 65 | else if (port >= 0x2000) |
116 | return *port2adr(port); | 66 | return *port2adr(port); |
117 | else | 67 | else |
118 | maybebadio(inw, port); | 68 | maybebadio(port); |
119 | return 0; | 69 | return 0; |
120 | } | 70 | } |
121 | 71 | ||
122 | |||
123 | unsigned int snapgear_inl(unsigned long port) | 72 | unsigned int snapgear_inl(unsigned long port) |
124 | { | 73 | { |
125 | if (PXSEG(port)) | 74 | if (PXSEG(port)) |
126 | return *(volatile unsigned long *)port; | 75 | return *(volatile unsigned long *)port; |
127 | else if (CHECK_SH7751_PCIIO(port)) | 76 | else if (is_pci_ioaddr(port)) |
128 | return *(volatile unsigned int *)PCI_IOMAP(port); | 77 | return *(volatile unsigned int *)pci_ioaddr(port); |
129 | else if (port >= 0x2000) | 78 | else if (port >= 0x2000) |
130 | return *port2adr(port); | 79 | return *port2adr(port); |
131 | else | 80 | else |
132 | maybebadio(inl, port); | 81 | maybebadio(port); |
133 | return 0; | 82 | return 0; |
134 | } | 83 | } |
135 | 84 | ||
136 | |||
137 | void snapgear_outb(unsigned char value, unsigned long port) | 85 | void snapgear_outb(unsigned char value, unsigned long port) |
138 | { | 86 | { |
139 | 87 | ||
140 | if (PXSEG(port)) | 88 | if (PXSEG(port)) |
141 | *(volatile unsigned char *)port = value; | 89 | *(volatile unsigned char *)port = value; |
142 | else if (CHECK_SH7751_PCIIO(port)) | 90 | else if (is_pci_ioaddr(port)) |
143 | *((unsigned char*)PCI_IOMAP(port)) = value; | 91 | *((unsigned char*)pci_ioaddr(port)) = value; |
144 | else | 92 | else |
145 | *(port2adr(port)) = value; | 93 | *(port2adr(port)) = value; |
146 | } | 94 | } |
147 | 95 | ||
148 | |||
149 | void snapgear_outb_p(unsigned char value, unsigned long port) | 96 | void snapgear_outb_p(unsigned char value, unsigned long port) |
150 | { | 97 | { |
151 | if (PXSEG(port)) | 98 | if (PXSEG(port)) |
152 | *(volatile unsigned char *)port = value; | 99 | *(volatile unsigned char *)port = value; |
153 | else if (CHECK_SH7751_PCIIO(port)) | 100 | else if (is_pci_ioaddr(port)) |
154 | *((unsigned char*)PCI_IOMAP(port)) = value; | 101 | *((unsigned char*)pci_ioaddr(port)) = value; |
155 | else | 102 | else |
156 | *(port2adr(port)) = value; | 103 | *(port2adr(port)) = value; |
157 | delay(); | 104 | ctrl_delay(); |
158 | } | 105 | } |
159 | 106 | ||
160 | |||
161 | void snapgear_outw(unsigned short value, unsigned long port) | 107 | void snapgear_outw(unsigned short value, unsigned long port) |
162 | { | 108 | { |
163 | if (PXSEG(port)) | 109 | if (PXSEG(port)) |
164 | *(volatile unsigned short *)port = value; | 110 | *(volatile unsigned short *)port = value; |
165 | else if (CHECK_SH7751_PCIIO(port)) | 111 | else if (is_pci_ioaddr(port)) |
166 | *((unsigned short *)PCI_IOMAP(port)) = value; | 112 | *((unsigned short *)pci_ioaddr(port)) = value; |
167 | else if (port >= 0x2000) | 113 | else if (port >= 0x2000) |
168 | *port2adr(port) = value; | 114 | *port2adr(port) = value; |
169 | else | 115 | else |
170 | maybebadio(outw, port); | 116 | maybebadio(port); |
171 | } | 117 | } |
172 | 118 | ||
173 | |||
174 | void snapgear_outl(unsigned int value, unsigned long port) | 119 | void snapgear_outl(unsigned int value, unsigned long port) |
175 | { | 120 | { |
176 | if (PXSEG(port)) | 121 | if (PXSEG(port)) |
177 | *(volatile unsigned long *)port = value; | 122 | *(volatile unsigned long *)port = value; |
178 | else if (CHECK_SH7751_PCIIO(port)) | 123 | else if (is_pci_ioaddr(port)) |
179 | *((unsigned long*)PCI_IOMAP(port)) = value; | 124 | *((unsigned long*)pci_ioaddr(port)) = value; |
180 | else | 125 | else |
181 | maybebadio(outl, port); | 126 | maybebadio(port); |
182 | } | 127 | } |
183 | 128 | ||
184 | void snapgear_insl(unsigned long port, void *addr, unsigned long count) | 129 | void snapgear_insl(unsigned long port, void *addr, unsigned long count) |
185 | { | 130 | { |
186 | maybebadio(insl, port); | 131 | maybebadio(port); |
187 | } | 132 | } |
188 | 133 | ||
189 | void snapgear_outsl(unsigned long port, const void *addr, unsigned long count) | 134 | void snapgear_outsl(unsigned long port, const void *addr, unsigned long count) |
190 | { | 135 | { |
191 | maybebadio(outsw, port); | 136 | maybebadio(port); |
192 | } | ||
193 | |||
194 | /* Map ISA bus address to the real address. Only for PCMCIA. */ | ||
195 | |||
196 | |||
197 | /* ISA page descriptor. */ | ||
198 | static __u32 sh_isa_memmap[256]; | ||
199 | |||
200 | |||
201 | #if 0 | ||
202 | static int sh_isa_mmap(__u32 start, __u32 length, __u32 offset) | ||
203 | { | ||
204 | int idx; | ||
205 | |||
206 | if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000)) | ||
207 | return -1; | ||
208 | |||
209 | idx = start >> 12; | ||
210 | sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff); | ||
211 | #if 0 | ||
212 | printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n", | ||
213 | start, length, offset, idx, sh_isa_memmap[idx]); | ||
214 | #endif | ||
215 | return 0; | ||
216 | } | ||
217 | #endif | ||
218 | |||
219 | unsigned long snapgear_isa_port2addr(unsigned long offset) | ||
220 | { | ||
221 | int idx; | ||
222 | |||
223 | idx = (offset >> 12) & 0xff; | ||
224 | offset &= 0xfff; | ||
225 | return sh_isa_memmap[idx] + offset; | ||
226 | } | 137 | } |
diff --git a/arch/sh/boards/snapgear/rtc.c b/arch/sh/boards/snapgear/rtc.c index b71e009da35c..1659fdd6695a 100644 --- a/arch/sh/boards/snapgear/rtc.c +++ b/arch/sh/boards/snapgear/rtc.c | |||
@@ -17,14 +17,9 @@ | |||
17 | #include <linux/time.h> | 17 | #include <linux/time.h> |
18 | #include <linux/rtc.h> | 18 | #include <linux/rtc.h> |
19 | #include <linux/mc146818rtc.h> | 19 | #include <linux/mc146818rtc.h> |
20 | |||
21 | #include <asm/io.h> | 20 | #include <asm/io.h> |
22 | #include <asm/rtc.h> | ||
23 | #include <asm/mc146818rtc.h> | ||
24 | |||
25 | /****************************************************************************/ | ||
26 | 21 | ||
27 | static int use_ds1302 = 0; | 22 | static int use_ds1302; |
28 | 23 | ||
29 | /****************************************************************************/ | 24 | /****************************************************************************/ |
30 | /* | 25 | /* |
@@ -82,10 +77,6 @@ static unsigned int ds1302_readbyte(unsigned int addr) | |||
82 | unsigned int val; | 77 | unsigned int val; |
83 | unsigned long flags; | 78 | unsigned long flags; |
84 | 79 | ||
85 | #if 0 | ||
86 | printk("SnapGear RTC: ds1302_readbyte(addr=%x)\n", addr); | ||
87 | #endif | ||
88 | |||
89 | local_irq_save(flags); | 80 | local_irq_save(flags); |
90 | set_dirp(get_dirp() | RTC_RESET | RTC_IODATA | RTC_SCLK); | 81 | set_dirp(get_dirp() | RTC_RESET | RTC_IODATA | RTC_SCLK); |
91 | set_dp(get_dp() & ~(RTC_RESET | RTC_IODATA | RTC_SCLK)); | 82 | set_dp(get_dp() & ~(RTC_RESET | RTC_IODATA | RTC_SCLK)); |
@@ -104,10 +95,6 @@ static void ds1302_writebyte(unsigned int addr, unsigned int val) | |||
104 | { | 95 | { |
105 | unsigned long flags; | 96 | unsigned long flags; |
106 | 97 | ||
107 | #if 0 | ||
108 | printk("SnapGear RTC: ds1302_writebyte(addr=%x)\n", addr); | ||
109 | #endif | ||
110 | |||
111 | local_irq_save(flags); | 98 | local_irq_save(flags); |
112 | set_dirp(get_dirp() | RTC_RESET | RTC_IODATA | RTC_SCLK); | 99 | set_dirp(get_dirp() | RTC_RESET | RTC_IODATA | RTC_SCLK); |
113 | set_dp(get_dp() & ~(RTC_RESET | RTC_IODATA | RTC_SCLK)); | 100 | set_dp(get_dp() & ~(RTC_RESET | RTC_IODATA | RTC_SCLK)); |
@@ -168,11 +155,8 @@ void __init secureedge5410_rtc_init(void) | |||
168 | } | 155 | } |
169 | 156 | ||
170 | if (use_ds1302) { | 157 | if (use_ds1302) { |
171 | rtc_get_time = snapgear_rtc_gettimeofday; | 158 | rtc_sh_get_time = snapgear_rtc_gettimeofday; |
172 | rtc_set_time = snapgear_rtc_settimeofday; | 159 | rtc_sh_set_time = snapgear_rtc_settimeofday; |
173 | } else { | ||
174 | rtc_get_time = sh_rtc_gettimeofday; | ||
175 | rtc_set_time = sh_rtc_settimeofday; | ||
176 | } | 160 | } |
177 | 161 | ||
178 | printk("SnapGear RTC: using %s rtc.\n", use_ds1302 ? "ds1302" : "internal"); | 162 | printk("SnapGear RTC: using %s rtc.\n", use_ds1302 ? "ds1302" : "internal"); |
@@ -187,10 +171,8 @@ void snapgear_rtc_gettimeofday(struct timespec *ts) | |||
187 | { | 171 | { |
188 | unsigned int sec, min, hr, day, mon, yr; | 172 | unsigned int sec, min, hr, day, mon, yr; |
189 | 173 | ||
190 | if (!use_ds1302) { | 174 | if (!use_ds1302) |
191 | sh_rtc_gettimeofday(ts); | ||
192 | return; | 175 | return; |
193 | } | ||
194 | 176 | ||
195 | sec = bcd2int(ds1302_readbyte(RTC_ADDR_SEC)); | 177 | sec = bcd2int(ds1302_readbyte(RTC_ADDR_SEC)); |
196 | min = bcd2int(ds1302_readbyte(RTC_ADDR_MIN)); | 178 | min = bcd2int(ds1302_readbyte(RTC_ADDR_MIN)); |
@@ -231,7 +213,7 @@ int snapgear_rtc_settimeofday(const time_t secs) | |||
231 | unsigned long nowtime; | 213 | unsigned long nowtime; |
232 | 214 | ||
233 | if (!use_ds1302) | 215 | if (!use_ds1302) |
234 | return sh_rtc_settimeofday(secs); | 216 | return 0; |
235 | 217 | ||
236 | /* | 218 | /* |
237 | * This is called direct from the kernel timer handling code. | 219 | * This is called direct from the kernel timer handling code. |
@@ -240,10 +222,6 @@ int snapgear_rtc_settimeofday(const time_t secs) | |||
240 | 222 | ||
241 | nowtime = secs; | 223 | nowtime = secs; |
242 | 224 | ||
243 | #if 1 | ||
244 | printk("SnapGear RTC: snapgear_rtc_settimeofday(nowtime=%ld)\n", nowtime); | ||
245 | #endif | ||
246 | |||
247 | /* STOP RTC */ | 225 | /* STOP RTC */ |
248 | ds1302_writebyte(RTC_ADDR_SEC, ds1302_readbyte(RTC_ADDR_SEC) | 0x80); | 226 | ds1302_writebyte(RTC_ADDR_SEC, ds1302_readbyte(RTC_ADDR_SEC) | 0x80); |
249 | 227 | ||
@@ -329,5 +307,3 @@ void secureedge5410_cmos_write(unsigned char val, int addr) | |||
329 | default: break; | 307 | default: break; |
330 | } | 308 | } |
331 | } | 309 | } |
332 | |||
333 | /****************************************************************************/ | ||
diff --git a/arch/sh/boards/snapgear/setup.c b/arch/sh/boards/snapgear/setup.c index f1f7c70c9402..f5e98c56b530 100644 --- a/arch/sh/boards/snapgear/setup.c +++ b/arch/sh/boards/snapgear/setup.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /****************************************************************************/ | 1 | /* |
2 | /* | ||
3 | * linux/arch/sh/boards/snapgear/setup.c | 2 | * linux/arch/sh/boards/snapgear/setup.c |
4 | * | 3 | * |
5 | * Copyright (C) 2002 David McCullough <davidm@snapgear.com> | 4 | * Copyright (C) 2002 David McCullough <davidm@snapgear.com> |
@@ -12,8 +11,6 @@ | |||
12 | * Modified for 7751 Solution Engine by | 11 | * Modified for 7751 Solution Engine by |
13 | * Ian da Silva and Jeremy Siegel, 2001. | 12 | * Ian da Silva and Jeremy Siegel, 2001. |
14 | */ | 13 | */ |
15 | /****************************************************************************/ | ||
16 | |||
17 | #include <linux/init.h> | 14 | #include <linux/init.h> |
18 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
19 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
@@ -21,14 +18,13 @@ | |||
21 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
22 | #include <linux/module.h> | 19 | #include <linux/module.h> |
23 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
24 | |||
25 | #include <asm/machvec.h> | 21 | #include <asm/machvec.h> |
26 | #include <asm/mach/io.h> | 22 | #include <asm/snapgear.h> |
27 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
28 | #include <asm/io.h> | 24 | #include <asm/io.h> |
25 | #include <asm/rtc.h> | ||
29 | #include <asm/cpu/timer.h> | 26 | #include <asm/cpu/timer.h> |
30 | 27 | ||
31 | extern void (*board_time_init)(void); | ||
32 | extern void secureedge5410_rtc_init(void); | 28 | extern void secureedge5410_rtc_init(void); |
33 | extern void pcibios_init(void); | 29 | extern void pcibios_init(void); |
34 | 30 | ||
@@ -85,101 +81,20 @@ static void __init init_snapgear_IRQ(void) | |||
85 | make_ipr_irq(IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); | 81 | make_ipr_irq(IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); |
86 | } | 82 | } |
87 | 83 | ||
88 | /****************************************************************************/ | ||
89 | /* | ||
90 | * Fast poll interrupt simulator. | ||
91 | */ | ||
92 | |||
93 | /* | 84 | /* |
94 | * Leave all of the fast timer/fast poll stuff commented out for now, since | 85 | * Initialize the board |
95 | * it's not clear whether it actually works or not. Since it wasn't being used | ||
96 | * at all in 2.4, we'll assume it's not sane for 2.6 either.. -- PFM | ||
97 | */ | ||
98 | #if 0 | ||
99 | #define FAST_POLL 1000 | ||
100 | //#define FAST_POLL_INTR | ||
101 | |||
102 | #define FASTTIMER_IRQ 17 | ||
103 | #define FASTTIMER_IPR_ADDR INTC_IPRA | ||
104 | #define FASTTIMER_IPR_POS 2 | ||
105 | #define FASTTIMER_PRIORITY 3 | ||
106 | |||
107 | #ifdef FAST_POLL_INTR | ||
108 | #define TMU1_TCR_INIT 0x0020 | ||
109 | #else | ||
110 | #define TMU1_TCR_INIT 0 | ||
111 | #endif | ||
112 | #define TMU_TSTR_INIT 1 | ||
113 | #define TMU1_TCR_CALIB 0x0000 | ||
114 | |||
115 | |||
116 | #ifdef FAST_POLL_INTR | ||
117 | static void fast_timer_irq(int irq, void *dev_instance, struct pt_regs *regs) | ||
118 | { | ||
119 | unsigned long timer_status; | ||
120 | timer_status = ctrl_inw(TMU1_TCR); | ||
121 | timer_status &= ~0x100; | ||
122 | ctrl_outw(timer_status, TMU1_TCR); | ||
123 | } | ||
124 | #endif | ||
125 | |||
126 | /* | ||
127 | * return the current ticks on the fast timer | ||
128 | */ | ||
129 | |||
130 | unsigned long fast_timer_count(void) | ||
131 | { | ||
132 | return(ctrl_inl(TMU1_TCNT)); | ||
133 | } | ||
134 | |||
135 | /* | ||
136 | * setup a fast timer for profiling etc etc | ||
137 | */ | 86 | */ |
138 | 87 | static void __init snapgear_setup(char **cmdline_p) | |
139 | static void setup_fast_timer() | ||
140 | { | ||
141 | unsigned long interval; | ||
142 | |||
143 | #ifdef FAST_POLL_INTR | ||
144 | interval = (current_cpu_data.module_clock/4 + FAST_POLL/2) / FAST_POLL; | ||
145 | |||
146 | make_ipr_irq(FASTTIMER_IRQ, FASTTIMER_IPR_ADDR, FASTTIMER_IPR_POS, | ||
147 | FASTTIMER_PRIORITY); | ||
148 | |||
149 | printk("SnapGear: %dHz fast timer on IRQ %d\n",FAST_POLL,FASTTIMER_IRQ); | ||
150 | |||
151 | if (request_irq(FASTTIMER_IRQ, fast_timer_irq, 0, "SnapGear fast timer", | ||
152 | NULL) != 0) | ||
153 | printk("%s(%d): request_irq() failed?\n", __FILE__, __LINE__); | ||
154 | #else | ||
155 | printk("SnapGear: fast timer running\n",FAST_POLL,FASTTIMER_IRQ); | ||
156 | interval = 0xffffffff; | ||
157 | #endif | ||
158 | |||
159 | ctrl_outb(ctrl_inb(TMU_TSTR) & ~0x2, TMU_TSTR); /* disable timer 1 */ | ||
160 | ctrl_outw(TMU1_TCR_INIT, TMU1_TCR); | ||
161 | ctrl_outl(interval, TMU1_TCOR); | ||
162 | ctrl_outl(interval, TMU1_TCNT); | ||
163 | ctrl_outb(ctrl_inb(TMU_TSTR) | 0x2, TMU_TSTR); /* enable timer 1 */ | ||
164 | |||
165 | printk("Timer count 1 = 0x%x\n", fast_timer_count()); | ||
166 | udelay(1000); | ||
167 | printk("Timer count 2 = 0x%x\n", fast_timer_count()); | ||
168 | } | ||
169 | #endif | ||
170 | |||
171 | /****************************************************************************/ | ||
172 | |||
173 | const char *get_system_type(void) | ||
174 | { | 88 | { |
175 | return "SnapGear SecureEdge5410"; | 89 | board_time_init = secureedge5410_rtc_init; |
176 | } | 90 | } |
177 | 91 | ||
178 | /* | 92 | /* |
179 | * The Machine Vector | 93 | * The Machine Vector |
180 | */ | 94 | */ |
181 | |||
182 | struct sh_machine_vector mv_snapgear __initmv = { | 95 | struct sh_machine_vector mv_snapgear __initmv = { |
96 | .mv_name = "SnapGear SecureEdge5410", | ||
97 | .mv_setup = snapgear_setup, | ||
183 | .mv_nr_irqs = 72, | 98 | .mv_nr_irqs = 72, |
184 | 99 | ||
185 | .mv_inb = snapgear_inb, | 100 | .mv_inb = snapgear_inb, |
@@ -196,20 +111,6 @@ struct sh_machine_vector mv_snapgear __initmv = { | |||
196 | .mv_outw_p = snapgear_outw, | 111 | .mv_outw_p = snapgear_outw, |
197 | .mv_outl_p = snapgear_outl, | 112 | .mv_outl_p = snapgear_outl, |
198 | 113 | ||
199 | .mv_isa_port2addr = snapgear_isa_port2addr, | ||
200 | |||
201 | .mv_init_irq = init_snapgear_IRQ, | 114 | .mv_init_irq = init_snapgear_IRQ, |
202 | }; | 115 | }; |
203 | ALIAS_MV(snapgear) | 116 | ALIAS_MV(snapgear) |
204 | |||
205 | /* | ||
206 | * Initialize the board | ||
207 | */ | ||
208 | |||
209 | int __init platform_setup(void) | ||
210 | { | ||
211 | board_time_init = secureedge5410_rtc_init; | ||
212 | |||
213 | return 0; | ||
214 | } | ||
215 | |||
diff --git a/arch/sh/boards/superh/microdev/irq.c b/arch/sh/boards/superh/microdev/irq.c index 236398fbc083..8c64baa30364 100644 --- a/arch/sh/boards/superh/microdev/irq.c +++ b/arch/sh/boards/superh/microdev/irq.c | |||
@@ -11,14 +11,12 @@ | |||
11 | 11 | ||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | |||
15 | #include <asm/system.h> | 14 | #include <asm/system.h> |
16 | #include <asm/io.h> | 15 | #include <asm/io.h> |
17 | #include <asm/microdev.h> | 16 | #include <asm/microdev.h> |
18 | 17 | ||
19 | #define NUM_EXTERNAL_IRQS 16 /* IRL0 .. IRL15 */ | 18 | #define NUM_EXTERNAL_IRQS 16 /* IRL0 .. IRL15 */ |
20 | 19 | ||
21 | |||
22 | static const struct { | 20 | static const struct { |
23 | unsigned char fpgaIrq; | 21 | unsigned char fpgaIrq; |
24 | unsigned char mapped; | 22 | unsigned char mapped; |
@@ -93,53 +91,42 @@ static struct hw_interrupt_type microdev_irq_type = { | |||
93 | 91 | ||
94 | static void disable_microdev_irq(unsigned int irq) | 92 | static void disable_microdev_irq(unsigned int irq) |
95 | { | 93 | { |
96 | unsigned int flags; | ||
97 | unsigned int fpgaIrq; | 94 | unsigned int fpgaIrq; |
98 | 95 | ||
99 | if (irq >= NUM_EXTERNAL_IRQS) return; | 96 | if (irq >= NUM_EXTERNAL_IRQS) |
100 | if (!fpgaIrqTable[irq].mapped) return; | 97 | return; |
98 | if (!fpgaIrqTable[irq].mapped) | ||
99 | return; | ||
101 | 100 | ||
102 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; | 101 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; |
103 | 102 | ||
104 | /* disable interrupts */ | 103 | /* disable interupts on the FPGA INTC register */ |
105 | local_irq_save(flags); | ||
106 | |||
107 | /* disable interupts on the FPGA INTC register */ | ||
108 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTDSB_REG); | 104 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTDSB_REG); |
109 | |||
110 | /* restore interrupts */ | ||
111 | local_irq_restore(flags); | ||
112 | } | 105 | } |
113 | 106 | ||
114 | static void enable_microdev_irq(unsigned int irq) | 107 | static void enable_microdev_irq(unsigned int irq) |
115 | { | 108 | { |
116 | unsigned long priorityReg, priorities, pri; | 109 | unsigned long priorityReg, priorities, pri; |
117 | unsigned int flags; | ||
118 | unsigned int fpgaIrq; | 110 | unsigned int fpgaIrq; |
119 | 111 | ||
120 | 112 | if (unlikely(irq >= NUM_EXTERNAL_IRQS)) | |
121 | if (irq >= NUM_EXTERNAL_IRQS) return; | 113 | return; |
122 | if (!fpgaIrqTable[irq].mapped) return; | 114 | if (unlikely(!fpgaIrqTable[irq].mapped)) |
115 | return; | ||
123 | 116 | ||
124 | pri = 15 - irq; | 117 | pri = 15 - irq; |
125 | 118 | ||
126 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; | 119 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; |
127 | priorityReg = MICRODEV_FPGA_INTPRI_REG(fpgaIrq); | 120 | priorityReg = MICRODEV_FPGA_INTPRI_REG(fpgaIrq); |
128 | 121 | ||
129 | /* disable interrupts */ | 122 | /* set priority for the interrupt */ |
130 | local_irq_save(flags); | ||
131 | |||
132 | /* set priority for the interrupt */ | ||
133 | priorities = ctrl_inl(priorityReg); | 123 | priorities = ctrl_inl(priorityReg); |
134 | priorities &= ~MICRODEV_FPGA_INTPRI_MASK(fpgaIrq); | 124 | priorities &= ~MICRODEV_FPGA_INTPRI_MASK(fpgaIrq); |
135 | priorities |= MICRODEV_FPGA_INTPRI_LEVEL(fpgaIrq, pri); | 125 | priorities |= MICRODEV_FPGA_INTPRI_LEVEL(fpgaIrq, pri); |
136 | ctrl_outl(priorities, priorityReg); | 126 | ctrl_outl(priorities, priorityReg); |
137 | 127 | ||
138 | /* enable interupts on the FPGA INTC register */ | 128 | /* enable interupts on the FPGA INTC register */ |
139 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTENB_REG); | 129 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTENB_REG); |
140 | |||
141 | /* restore interrupts */ | ||
142 | local_irq_restore(flags); | ||
143 | } | 130 | } |
144 | 131 | ||
145 | /* This functions sets the desired irq handler to be a MicroDev type */ | 132 | /* This functions sets the desired irq handler to be a MicroDev type */ |
@@ -158,9 +145,7 @@ static void mask_and_ack_microdev(unsigned int irq) | |||
158 | static void end_microdev_irq(unsigned int irq) | 145 | static void end_microdev_irq(unsigned int irq) |
159 | { | 146 | { |
160 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | 147 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) |
161 | { | ||
162 | enable_microdev_irq(irq); | 148 | enable_microdev_irq(irq); |
163 | } | ||
164 | } | 149 | } |
165 | 150 | ||
166 | extern void __init init_microdev_irq(void) | 151 | extern void __init init_microdev_irq(void) |
@@ -171,9 +156,7 @@ extern void __init init_microdev_irq(void) | |||
171 | ctrl_outl(~0ul, MICRODEV_FPGA_INTDSB_REG); | 156 | ctrl_outl(~0ul, MICRODEV_FPGA_INTDSB_REG); |
172 | 157 | ||
173 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) | 158 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) |
174 | { | ||
175 | make_microdev_irq(i); | 159 | make_microdev_irq(i); |
176 | } | ||
177 | } | 160 | } |
178 | 161 | ||
179 | extern void microdev_print_fpga_intc_status(void) | 162 | extern void microdev_print_fpga_intc_status(void) |
diff --git a/arch/sh/boards/superh/microdev/setup.c b/arch/sh/boards/superh/microdev/setup.c index 61b402a3f5d7..031c814e6e76 100644 --- a/arch/sh/boards/superh/microdev/setup.c +++ b/arch/sh/boards/superh/microdev/setup.c | |||
@@ -10,7 +10,6 @@ | |||
10 | * May be copied or modified under the terms of the GNU General Public | 10 | * May be copied or modified under the terms of the GNU General Public |
11 | * License. See linux/COPYING for more information. | 11 | * License. See linux/COPYING for more information. |
12 | */ | 12 | */ |
13 | |||
14 | #include <linux/init.h> | 13 | #include <linux/init.h> |
15 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
16 | #include <linux/ioport.h> | 15 | #include <linux/ioport.h> |
@@ -21,41 +20,6 @@ | |||
21 | 20 | ||
22 | extern void microdev_heartbeat(void); | 21 | extern void microdev_heartbeat(void); |
23 | 22 | ||
24 | /* | ||
25 | * The Machine Vector | ||
26 | */ | ||
27 | |||
28 | struct sh_machine_vector mv_sh4202_microdev __initmv = { | ||
29 | .mv_nr_irqs = 72, /* QQQ need to check this - use the MACRO */ | ||
30 | |||
31 | .mv_inb = microdev_inb, | ||
32 | .mv_inw = microdev_inw, | ||
33 | .mv_inl = microdev_inl, | ||
34 | .mv_outb = microdev_outb, | ||
35 | .mv_outw = microdev_outw, | ||
36 | .mv_outl = microdev_outl, | ||
37 | |||
38 | .mv_inb_p = microdev_inb_p, | ||
39 | .mv_inw_p = microdev_inw_p, | ||
40 | .mv_inl_p = microdev_inl_p, | ||
41 | .mv_outb_p = microdev_outb_p, | ||
42 | .mv_outw_p = microdev_outw_p, | ||
43 | .mv_outl_p = microdev_outl_p, | ||
44 | |||
45 | .mv_insb = microdev_insb, | ||
46 | .mv_insw = microdev_insw, | ||
47 | .mv_insl = microdev_insl, | ||
48 | .mv_outsb = microdev_outsb, | ||
49 | .mv_outsw = microdev_outsw, | ||
50 | .mv_outsl = microdev_outsl, | ||
51 | |||
52 | .mv_init_irq = init_microdev_irq, | ||
53 | |||
54 | #ifdef CONFIG_HEARTBEAT | ||
55 | .mv_heartbeat = microdev_heartbeat, | ||
56 | #endif | ||
57 | }; | ||
58 | ALIAS_MV(sh4202_microdev) | ||
59 | 23 | ||
60 | /****************************************************************************/ | 24 | /****************************************************************************/ |
61 | 25 | ||
@@ -113,11 +77,6 @@ ALIAS_MV(sh4202_microdev) | |||
113 | /* assume a Keyboard Controller is present */ | 77 | /* assume a Keyboard Controller is present */ |
114 | int microdev_kbd_controller_present = 1; | 78 | int microdev_kbd_controller_present = 1; |
115 | 79 | ||
116 | const char *get_system_type(void) | ||
117 | { | ||
118 | return "SH4-202 MicroDev"; | ||
119 | } | ||
120 | |||
121 | static struct resource smc91x_resources[] = { | 80 | static struct resource smc91x_resources[] = { |
122 | [0] = { | 81 | [0] = { |
123 | .start = 0x300, | 82 | .start = 0x300, |
@@ -291,25 +250,9 @@ static int __init microdev_devices_setup(void) | |||
291 | return platform_add_devices(microdev_devices, ARRAY_SIZE(microdev_devices)); | 250 | return platform_add_devices(microdev_devices, ARRAY_SIZE(microdev_devices)); |
292 | } | 251 | } |
293 | 252 | ||
294 | __initcall(microdev_devices_setup); | 253 | /* |
295 | 254 | * Setup for the SMSC FDC37C93xAPM | |
296 | void __init platform_setup(void) | 255 | */ |
297 | { | ||
298 | int * const fpgaRevisionRegister = (int*)(MICRODEV_FPGA_GP_BASE + 0x8ul); | ||
299 | const int fpgaRevision = *fpgaRevisionRegister; | ||
300 | int * const CacheControlRegister = (int*)CCR; | ||
301 | |||
302 | printk("SuperH %s board (FPGA rev: 0x%0x, CCR: 0x%0x)\n", | ||
303 | get_system_type(), fpgaRevision, *CacheControlRegister); | ||
304 | } | ||
305 | |||
306 | |||
307 | /****************************************************************************/ | ||
308 | |||
309 | |||
310 | /* | ||
311 | * Setup for the SMSC FDC37C93xAPM | ||
312 | */ | ||
313 | static int __init smsc_superio_setup(void) | 256 | static int __init smsc_superio_setup(void) |
314 | { | 257 | { |
315 | 258 | ||
@@ -412,8 +355,52 @@ static int __init smsc_superio_setup(void) | |||
412 | return 0; | 355 | return 0; |
413 | } | 356 | } |
414 | 357 | ||
358 | static void __init microdev_setup(char **cmdline_p) | ||
359 | { | ||
360 | int * const fpgaRevisionRegister = (int*)(MICRODEV_FPGA_GP_BASE + 0x8ul); | ||
361 | const int fpgaRevision = *fpgaRevisionRegister; | ||
362 | int * const CacheControlRegister = (int*)CCR; | ||
363 | |||
364 | device_initcall(microdev_devices_setup); | ||
365 | device_initcall(smsc_superio_setup); | ||
415 | 366 | ||
416 | /* This is grotty, but, because kernel is always referenced on the link line | 367 | printk("SuperH %s board (FPGA rev: 0x%0x, CCR: 0x%0x)\n", |
417 | * before any devices, this is safe. | 368 | get_system_type(), fpgaRevision, *CacheControlRegister); |
369 | } | ||
370 | |||
371 | /* | ||
372 | * The Machine Vector | ||
418 | */ | 373 | */ |
419 | __initcall(smsc_superio_setup); | 374 | struct sh_machine_vector mv_sh4202_microdev __initmv = { |
375 | .mv_name = "SH4-202 MicroDev", | ||
376 | .mv_setup = microdev_setup, | ||
377 | .mv_nr_irqs = 72, /* QQQ need to check this - use the MACRO */ | ||
378 | |||
379 | .mv_inb = microdev_inb, | ||
380 | .mv_inw = microdev_inw, | ||
381 | .mv_inl = microdev_inl, | ||
382 | .mv_outb = microdev_outb, | ||
383 | .mv_outw = microdev_outw, | ||
384 | .mv_outl = microdev_outl, | ||
385 | |||
386 | .mv_inb_p = microdev_inb_p, | ||
387 | .mv_inw_p = microdev_inw_p, | ||
388 | .mv_inl_p = microdev_inl_p, | ||
389 | .mv_outb_p = microdev_outb_p, | ||
390 | .mv_outw_p = microdev_outw_p, | ||
391 | .mv_outl_p = microdev_outl_p, | ||
392 | |||
393 | .mv_insb = microdev_insb, | ||
394 | .mv_insw = microdev_insw, | ||
395 | .mv_insl = microdev_insl, | ||
396 | .mv_outsb = microdev_outsb, | ||
397 | .mv_outsw = microdev_outsw, | ||
398 | .mv_outsl = microdev_outsl, | ||
399 | |||
400 | .mv_init_irq = init_microdev_irq, | ||
401 | |||
402 | #ifdef CONFIG_HEARTBEAT | ||
403 | .mv_heartbeat = microdev_heartbeat, | ||
404 | #endif | ||
405 | }; | ||
406 | ALIAS_MV(sh4202_microdev) | ||
diff --git a/arch/sh/boards/titan/Makefile b/arch/sh/boards/titan/Makefile new file mode 100644 index 000000000000..08d753700062 --- /dev/null +++ b/arch/sh/boards/titan/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # | ||
2 | # Makefile for the Nimble Microsystems TITAN specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o io.o | ||
diff --git a/arch/sh/boards/titan/io.c b/arch/sh/boards/titan/io.c new file mode 100644 index 000000000000..4730c1dd697d --- /dev/null +++ b/arch/sh/boards/titan/io.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /* | ||
2 | * I/O routines for Titan | ||
3 | */ | ||
4 | #include <linux/pci.h> | ||
5 | #include <asm/machvec.h> | ||
6 | #include <asm/addrspace.h> | ||
7 | #include <asm/titan.h> | ||
8 | #include <asm/io.h> | ||
9 | |||
10 | static inline unsigned int port2adr(unsigned int port) | ||
11 | { | ||
12 | maybebadio((unsigned long)port); | ||
13 | return port; | ||
14 | } | ||
15 | |||
16 | u8 titan_inb(unsigned long port) | ||
17 | { | ||
18 | if (PXSEG(port)) | ||
19 | return ctrl_inb(port); | ||
20 | else if (is_pci_ioaddr(port)) | ||
21 | return ctrl_inb(pci_ioaddr(port)); | ||
22 | return ctrl_inw(port2adr(port)) & 0xff; | ||
23 | } | ||
24 | |||
25 | u8 titan_inb_p(unsigned long port) | ||
26 | { | ||
27 | u8 v; | ||
28 | |||
29 | if (PXSEG(port)) | ||
30 | v = ctrl_inb(port); | ||
31 | else if (is_pci_ioaddr(port)) | ||
32 | v = ctrl_inb(pci_ioaddr(port)); | ||
33 | else | ||
34 | v = ctrl_inw(port2adr(port)) & 0xff; | ||
35 | ctrl_delay(); | ||
36 | return v; | ||
37 | } | ||
38 | |||
39 | u16 titan_inw(unsigned long port) | ||
40 | { | ||
41 | if (PXSEG(port)) | ||
42 | return ctrl_inw(port); | ||
43 | else if (is_pci_ioaddr(port)) | ||
44 | return ctrl_inw(pci_ioaddr(port)); | ||
45 | else if (port >= 0x2000) | ||
46 | return ctrl_inw(port2adr(port)); | ||
47 | else | ||
48 | maybebadio(port); | ||
49 | return 0; | ||
50 | } | ||
51 | |||
52 | u32 titan_inl(unsigned long port) | ||
53 | { | ||
54 | if (PXSEG(port)) | ||
55 | return ctrl_inl(port); | ||
56 | else if (is_pci_ioaddr(port)) | ||
57 | return ctrl_inl(pci_ioaddr(port)); | ||
58 | else if (port >= 0x2000) | ||
59 | return ctrl_inw(port2adr(port)); | ||
60 | else | ||
61 | maybebadio(port); | ||
62 | return 0; | ||
63 | } | ||
64 | |||
65 | void titan_outb(u8 value, unsigned long port) | ||
66 | { | ||
67 | if (PXSEG(port)) | ||
68 | ctrl_outb(value, port); | ||
69 | else if (is_pci_ioaddr(port)) | ||
70 | ctrl_outb(value, pci_ioaddr(port)); | ||
71 | else | ||
72 | ctrl_outw(value, port2adr(port)); | ||
73 | } | ||
74 | |||
75 | void titan_outb_p(u8 value, unsigned long port) | ||
76 | { | ||
77 | if (PXSEG(port)) | ||
78 | ctrl_outb(value, port); | ||
79 | else if (is_pci_ioaddr(port)) | ||
80 | ctrl_outb(value, pci_ioaddr(port)); | ||
81 | else | ||
82 | ctrl_outw(value, port2adr(port)); | ||
83 | ctrl_delay(); | ||
84 | } | ||
85 | |||
86 | void titan_outw(u16 value, unsigned long port) | ||
87 | { | ||
88 | if (PXSEG(port)) | ||
89 | ctrl_outw(value, port); | ||
90 | else if (is_pci_ioaddr(port)) | ||
91 | ctrl_outw(value, pci_ioaddr(port)); | ||
92 | else if (port >= 0x2000) | ||
93 | ctrl_outw(value, port2adr(port)); | ||
94 | else | ||
95 | maybebadio(port); | ||
96 | } | ||
97 | |||
98 | void titan_outl(u32 value, unsigned long port) | ||
99 | { | ||
100 | if (PXSEG(port)) | ||
101 | ctrl_outl(value, port); | ||
102 | else if (is_pci_ioaddr(port)) | ||
103 | ctrl_outl(value, pci_ioaddr(port)); | ||
104 | else | ||
105 | maybebadio(port); | ||
106 | } | ||
107 | |||
108 | void titan_insl(unsigned long port, void *dst, unsigned long count) | ||
109 | { | ||
110 | maybebadio(port); | ||
111 | } | ||
112 | |||
113 | void titan_outsl(unsigned long port, const void *src, unsigned long count) | ||
114 | { | ||
115 | maybebadio(port); | ||
116 | } | ||
117 | |||
118 | void __iomem *titan_ioport_map(unsigned long port, unsigned int size) | ||
119 | { | ||
120 | if (PXSEG(port) || is_pci_memaddr(port)) | ||
121 | return (void __iomem *)port; | ||
122 | else if (is_pci_ioaddr(port)) | ||
123 | return (void __iomem *)pci_ioaddr(port); | ||
124 | |||
125 | return (void __iomem *)port2adr(port); | ||
126 | } | ||
diff --git a/arch/sh/boards/titan/setup.c b/arch/sh/boards/titan/setup.c new file mode 100644 index 000000000000..52b66d8b8d2a --- /dev/null +++ b/arch/sh/boards/titan/setup.c | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * Setup for Titan | ||
3 | */ | ||
4 | |||
5 | #include <linux/init.h> | ||
6 | #include <asm/irq.h> | ||
7 | #include <asm/titan.h> | ||
8 | #include <asm/io.h> | ||
9 | |||
10 | extern void __init pcibios_init_platform(void); | ||
11 | |||
12 | static void __init init_titan_irq(void) | ||
13 | { | ||
14 | /* enable individual interrupt mode for externals */ | ||
15 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | ||
16 | |||
17 | make_ipr_irq( TITAN_IRQ_WAN, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY); /* PCIRQ0 */ | ||
18 | make_ipr_irq( TITAN_IRQ_LAN, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY); /* PCIRQ1 */ | ||
19 | make_ipr_irq( TITAN_IRQ_MPCIA, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY); /* PCIRQ2 */ | ||
20 | make_ipr_irq( TITAN_IRQ_USB, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); /* PCIRQ3 */ | ||
21 | } | ||
22 | |||
23 | struct sh_machine_vector mv_titan __initmv = { | ||
24 | .mv_name = "Titan", | ||
25 | |||
26 | .mv_inb = titan_inb, | ||
27 | .mv_inw = titan_inw, | ||
28 | .mv_inl = titan_inl, | ||
29 | .mv_outb = titan_outb, | ||
30 | .mv_outw = titan_outw, | ||
31 | .mv_outl = titan_outl, | ||
32 | |||
33 | .mv_inb_p = titan_inb_p, | ||
34 | .mv_inw_p = titan_inw, | ||
35 | .mv_inl_p = titan_inl, | ||
36 | .mv_outb_p = titan_outb_p, | ||
37 | .mv_outw_p = titan_outw, | ||
38 | .mv_outl_p = titan_outl, | ||
39 | |||
40 | .mv_insl = titan_insl, | ||
41 | .mv_outsl = titan_outsl, | ||
42 | |||
43 | .mv_ioport_map = titan_ioport_map, | ||
44 | |||
45 | .mv_init_irq = init_titan_irq, | ||
46 | .mv_init_pci = pcibios_init_platform, | ||
47 | }; | ||
48 | ALIAS_MV(titan) | ||
diff --git a/arch/sh/boards/unknown/setup.c b/arch/sh/boards/unknown/setup.c index c5e4ed10876b..1c941370a2e3 100644 --- a/arch/sh/boards/unknown/setup.c +++ b/arch/sh/boards/unknown/setup.c | |||
@@ -14,19 +14,8 @@ | |||
14 | */ | 14 | */ |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <asm/machvec.h> | 16 | #include <asm/machvec.h> |
17 | #include <asm/irq.h> | ||
18 | 17 | ||
19 | struct sh_machine_vector mv_unknown __initmv = { | 18 | struct sh_machine_vector mv_unknown __initmv = { |
20 | .mv_nr_irqs = NR_IRQS, | 19 | .mv_name = "Unknown", |
21 | }; | 20 | }; |
22 | ALIAS_MV(unknown) | 21 | ALIAS_MV(unknown) |
23 | |||
24 | const char *get_system_type(void) | ||
25 | { | ||
26 | return "Unknown"; | ||
27 | } | ||
28 | |||
29 | void __init platform_setup(void) | ||
30 | { | ||
31 | } | ||
32 | |||
diff --git a/arch/sh/boot/compressed/Makefile b/arch/sh/boot/compressed/Makefile index 75a6876bf6c6..e5f443790079 100644 --- a/arch/sh/boot/compressed/Makefile +++ b/arch/sh/boot/compressed/Makefile | |||
@@ -18,13 +18,20 @@ endif | |||
18 | # Assign dummy values if these 2 variables are not defined, | 18 | # Assign dummy values if these 2 variables are not defined, |
19 | # in order to suppress error message. | 19 | # in order to suppress error message. |
20 | # | 20 | # |
21 | CONFIG_PAGE_OFFSET ?= 0x80000000 | ||
21 | CONFIG_MEMORY_START ?= 0x0c000000 | 22 | CONFIG_MEMORY_START ?= 0x0c000000 |
22 | CONFIG_BOOT_LINK_OFFSET ?= 0x00800000 | 23 | CONFIG_BOOT_LINK_OFFSET ?= 0x00800000 |
23 | IMAGE_OFFSET := $(shell printf "0x%8x" $$[0x80000000+$(CONFIG_MEMORY_START)+$(CONFIG_BOOT_LINK_OFFSET)]) | 24 | |
25 | IMAGE_OFFSET := $(shell printf "0x%08x" $$[$(CONFIG_PAGE_OFFSET) + \ | ||
26 | $(CONFIG_MEMORY_START) + \ | ||
27 | $(CONFIG_BOOT_LINK_OFFSET)]) | ||
28 | |||
29 | LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) | ||
24 | 30 | ||
25 | LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup -T $(obj)/../../kernel/vmlinux.lds | 31 | LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup -T $(obj)/../../kernel/vmlinux.lds |
26 | 32 | ||
27 | $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o FORCE | 33 | |
34 | $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE | ||
28 | $(call if_changed,ld) | 35 | $(call if_changed,ld) |
29 | @: | 36 | @: |
30 | 37 | ||
diff --git a/arch/sh/cchips/Kconfig b/arch/sh/cchips/Kconfig index 155d139884c3..0582ca8346b6 100644 --- a/arch/sh/cchips/Kconfig +++ b/arch/sh/cchips/Kconfig | |||
@@ -65,6 +65,11 @@ config HD64461_IRQ | |||
65 | 65 | ||
66 | Do not change this unless you know what you are doing. | 66 | Do not change this unless you know what you are doing. |
67 | 67 | ||
68 | config HD64461_IOBASE | ||
69 | hex "HD64461 start address" | ||
70 | depends on HD64461 | ||
71 | default "0xb0000000" | ||
72 | |||
68 | config HD64461_ENABLER | 73 | config HD64461_ENABLER |
69 | bool "HD64461 PCMCIA enabler" | 74 | bool "HD64461 PCMCIA enabler" |
70 | depends on HD64461 | 75 | depends on HD64461 |
@@ -73,7 +78,6 @@ config HD64461_ENABLER | |||
73 | via the HD64461 companion chip. | 78 | via the HD64461 companion chip. |
74 | Otherwise, say N. | 79 | Otherwise, say N. |
75 | 80 | ||
76 | |||
77 | config HD64465_IOBASE | 81 | config HD64465_IOBASE |
78 | hex "HD64465 start address" | 82 | hex "HD64465 start address" |
79 | depends on HD64465 | 83 | depends on HD64465 |
diff --git a/arch/sh/cchips/hd6446x/hd64461/io.c b/arch/sh/cchips/hd6446x/hd64461/io.c index ac3062671db7..7909a1b7b512 100644 --- a/arch/sh/cchips/hd6446x/hd64461/io.c +++ b/arch/sh/cchips/hd6446x/hd64461/io.c | |||
@@ -1,11 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: io.c,v 1.6 2004/03/16 00:07:50 lethal Exp $ | ||
3 | * Copyright (C) 2000 YAEGASHI Takeshi | 2 | * Copyright (C) 2000 YAEGASHI Takeshi |
4 | * Typical I/O routines for HD64461 system. | 3 | * Typical I/O routines for HD64461 system. |
5 | */ | 4 | */ |
6 | 5 | ||
7 | #include <asm/io.h> | 6 | #include <asm/io.h> |
8 | #include <asm/hd64461/hd64461.h> | 7 | #include <asm/hd64461.h> |
9 | 8 | ||
10 | #define MEM_BASE (CONFIG_HD64461_IOBASE - HD64461_STBCR) | 9 | #define MEM_BASE (CONFIG_HD64461_IOBASE - HD64461_STBCR) |
11 | 10 | ||
@@ -54,11 +53,6 @@ static __inline__ unsigned long PORT2ADDR(unsigned long port) | |||
54 | return 0xa0000000 + (port & 0x1fffffff); | 53 | return 0xa0000000 + (port & 0x1fffffff); |
55 | } | 54 | } |
56 | 55 | ||
57 | static inline void delay(void) | ||
58 | { | ||
59 | ctrl_inw(0xa0000000); | ||
60 | } | ||
61 | |||
62 | unsigned char hd64461_inb(unsigned long port) | 56 | unsigned char hd64461_inb(unsigned long port) |
63 | { | 57 | { |
64 | return *(volatile unsigned char*)PORT2ADDR(port); | 58 | return *(volatile unsigned char*)PORT2ADDR(port); |
@@ -67,7 +61,7 @@ unsigned char hd64461_inb(unsigned long port) | |||
67 | unsigned char hd64461_inb_p(unsigned long port) | 61 | unsigned char hd64461_inb_p(unsigned long port) |
68 | { | 62 | { |
69 | unsigned long v = *(volatile unsigned char*)PORT2ADDR(port); | 63 | unsigned long v = *(volatile unsigned char*)PORT2ADDR(port); |
70 | delay(); | 64 | ctrl_delay(); |
71 | return v; | 65 | return v; |
72 | } | 66 | } |
73 | 67 | ||
@@ -89,7 +83,7 @@ void hd64461_outb(unsigned char b, unsigned long port) | |||
89 | void hd64461_outb_p(unsigned char b, unsigned long port) | 83 | void hd64461_outb_p(unsigned char b, unsigned long port) |
90 | { | 84 | { |
91 | *(volatile unsigned char*)PORT2ADDR(port) = b; | 85 | *(volatile unsigned char*)PORT2ADDR(port) = b; |
92 | delay(); | 86 | ctrl_delay(); |
93 | } | 87 | } |
94 | 88 | ||
95 | void hd64461_outw(unsigned short b, unsigned long port) | 89 | void hd64461_outw(unsigned short b, unsigned long port) |
@@ -144,13 +138,13 @@ void hd64461_outsl(unsigned long port, const void *buffer, unsigned long count) | |||
144 | while(count--) *addr=*buf++; | 138 | while(count--) *addr=*buf++; |
145 | } | 139 | } |
146 | 140 | ||
147 | unsigned short hd64461_readw(unsigned long addr) | 141 | unsigned short hd64461_readw(void __iomem *addr) |
148 | { | 142 | { |
149 | return *(volatile unsigned short*)(MEM_BASE+addr); | 143 | return ctrl_inw(MEM_BASE+(unsigned long __force)addr); |
150 | } | 144 | } |
151 | 145 | ||
152 | void hd64461_writew(unsigned short b, unsigned long addr) | 146 | void hd64461_writew(unsigned short b, void __iomem *addr) |
153 | { | 147 | { |
154 | *(volatile unsigned short*)(MEM_BASE+addr) = b; | 148 | ctrl_outw(b, MEM_BASE+(unsigned long __force)addr); |
155 | } | 149 | } |
156 | 150 | ||
diff --git a/arch/sh/cchips/hd6446x/hd64461/setup.c b/arch/sh/cchips/hd6446x/hd64461/setup.c index ad126016720f..38f1e8171a3a 100644 --- a/arch/sh/cchips/hd6446x/hd64461/setup.c +++ b/arch/sh/cchips/hd6446x/hd64461/setup.c | |||
@@ -11,36 +11,28 @@ | |||
11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | |||
15 | #include <asm/io.h> | 14 | #include <asm/io.h> |
16 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
17 | 16 | #include <asm/hd64461.h> | |
18 | #include <asm/hd64461/hd64461.h> | ||
19 | 17 | ||
20 | static void disable_hd64461_irq(unsigned int irq) | 18 | static void disable_hd64461_irq(unsigned int irq) |
21 | { | 19 | { |
22 | unsigned long flags; | ||
23 | unsigned short nimr; | 20 | unsigned short nimr; |
24 | unsigned short mask = 1 << (irq - HD64461_IRQBASE); | 21 | unsigned short mask = 1 << (irq - HD64461_IRQBASE); |
25 | 22 | ||
26 | local_irq_save(flags); | ||
27 | nimr = inw(HD64461_NIMR); | 23 | nimr = inw(HD64461_NIMR); |
28 | nimr |= mask; | 24 | nimr |= mask; |
29 | outw(nimr, HD64461_NIMR); | 25 | outw(nimr, HD64461_NIMR); |
30 | local_irq_restore(flags); | ||
31 | } | 26 | } |
32 | 27 | ||
33 | static void enable_hd64461_irq(unsigned int irq) | 28 | static void enable_hd64461_irq(unsigned int irq) |
34 | { | 29 | { |
35 | unsigned long flags; | ||
36 | unsigned short nimr; | 30 | unsigned short nimr; |
37 | unsigned short mask = 1 << (irq - HD64461_IRQBASE); | 31 | unsigned short mask = 1 << (irq - HD64461_IRQBASE); |
38 | 32 | ||
39 | local_irq_save(flags); | ||
40 | nimr = inw(HD64461_NIMR); | 33 | nimr = inw(HD64461_NIMR); |
41 | nimr &= ~mask; | 34 | nimr &= ~mask; |
42 | outw(nimr, HD64461_NIMR); | 35 | outw(nimr, HD64461_NIMR); |
43 | local_irq_restore(flags); | ||
44 | } | 36 | } |
45 | 37 | ||
46 | static void mask_and_ack_hd64461(unsigned int irq) | 38 | static void mask_and_ack_hd64461(unsigned int irq) |
diff --git a/arch/sh/cchips/hd6446x/hd64465/setup.c b/arch/sh/cchips/hd6446x/hd64465/setup.c index d2b2851bc44b..30573d3e1966 100644 --- a/arch/sh/cchips/hd6446x/hd64465/setup.c +++ b/arch/sh/cchips/hd6446x/hd64465/setup.c | |||
@@ -25,31 +25,25 @@ | |||
25 | 25 | ||
26 | static void disable_hd64465_irq(unsigned int irq) | 26 | static void disable_hd64465_irq(unsigned int irq) |
27 | { | 27 | { |
28 | unsigned long flags; | ||
29 | unsigned short nimr; | 28 | unsigned short nimr; |
30 | unsigned short mask = 1 << (irq - HD64465_IRQ_BASE); | 29 | unsigned short mask = 1 << (irq - HD64465_IRQ_BASE); |
31 | 30 | ||
32 | pr_debug("disable_hd64465_irq(%d): mask=%x\n", irq, mask); | 31 | pr_debug("disable_hd64465_irq(%d): mask=%x\n", irq, mask); |
33 | local_irq_save(flags); | ||
34 | nimr = inw(HD64465_REG_NIMR); | 32 | nimr = inw(HD64465_REG_NIMR); |
35 | nimr |= mask; | 33 | nimr |= mask; |
36 | outw(nimr, HD64465_REG_NIMR); | 34 | outw(nimr, HD64465_REG_NIMR); |
37 | local_irq_restore(flags); | ||
38 | } | 35 | } |
39 | 36 | ||
40 | 37 | ||
41 | static void enable_hd64465_irq(unsigned int irq) | 38 | static void enable_hd64465_irq(unsigned int irq) |
42 | { | 39 | { |
43 | unsigned long flags; | ||
44 | unsigned short nimr; | 40 | unsigned short nimr; |
45 | unsigned short mask = 1 << (irq - HD64465_IRQ_BASE); | 41 | unsigned short mask = 1 << (irq - HD64465_IRQ_BASE); |
46 | 42 | ||
47 | pr_debug("enable_hd64465_irq(%d): mask=%x\n", irq, mask); | 43 | pr_debug("enable_hd64465_irq(%d): mask=%x\n", irq, mask); |
48 | local_irq_save(flags); | ||
49 | nimr = inw(HD64465_REG_NIMR); | 44 | nimr = inw(HD64465_REG_NIMR); |
50 | nimr &= ~mask; | 45 | nimr &= ~mask; |
51 | outw(nimr, HD64465_REG_NIMR); | 46 | outw(nimr, HD64465_REG_NIMR); |
52 | local_irq_restore(flags); | ||
53 | } | 47 | } |
54 | 48 | ||
55 | 49 | ||
diff --git a/arch/sh/cchips/voyagergx/irq.c b/arch/sh/cchips/voyagergx/irq.c index 0dc1fb8f9687..392c8b12ce36 100644 --- a/arch/sh/cchips/voyagergx/irq.c +++ b/arch/sh/cchips/voyagergx/irq.c | |||
@@ -32,37 +32,30 @@ | |||
32 | 32 | ||
33 | #include <asm/io.h> | 33 | #include <asm/io.h> |
34 | #include <asm/irq.h> | 34 | #include <asm/irq.h> |
35 | #include <asm/rts7751r2d/rts7751r2d.h> | 35 | #include <asm/voyagergx.h> |
36 | #include <asm/rts7751r2d/voyagergx_reg.h> | ||
37 | 36 | ||
38 | static void disable_voyagergx_irq(unsigned int irq) | 37 | static void disable_voyagergx_irq(unsigned int irq) |
39 | { | 38 | { |
40 | unsigned long flags, val; | 39 | unsigned long val; |
41 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); | 40 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); |
42 | 41 | ||
43 | pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask); | 42 | pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask); |
44 | local_irq_save(flags); | ||
45 | val = inl(VOYAGER_INT_MASK); | 43 | val = inl(VOYAGER_INT_MASK); |
46 | val &= ~mask; | 44 | val &= ~mask; |
47 | outl(val, VOYAGER_INT_MASK); | 45 | outl(val, VOYAGER_INT_MASK); |
48 | local_irq_restore(flags); | ||
49 | } | 46 | } |
50 | 47 | ||
51 | |||
52 | static void enable_voyagergx_irq(unsigned int irq) | 48 | static void enable_voyagergx_irq(unsigned int irq) |
53 | { | 49 | { |
54 | unsigned long flags, val; | 50 | unsigned long val; |
55 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); | 51 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); |
56 | 52 | ||
57 | pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask); | 53 | pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask); |
58 | local_irq_save(flags); | ||
59 | val = inl(VOYAGER_INT_MASK); | 54 | val = inl(VOYAGER_INT_MASK); |
60 | val |= mask; | 55 | val |= mask; |
61 | outl(val, VOYAGER_INT_MASK); | 56 | outl(val, VOYAGER_INT_MASK); |
62 | local_irq_restore(flags); | ||
63 | } | 57 | } |
64 | 58 | ||
65 | |||
66 | static void mask_and_ack_voyagergx(unsigned int irq) | 59 | static void mask_and_ack_voyagergx(unsigned int irq) |
67 | { | 60 | { |
68 | disable_voyagergx_irq(irq); | 61 | disable_voyagergx_irq(irq); |
@@ -95,7 +88,8 @@ static struct hw_interrupt_type voyagergx_irq_type = { | |||
95 | .end = end_voyagergx_irq, | 88 | .end = end_voyagergx_irq, |
96 | }; | 89 | }; |
97 | 90 | ||
98 | static irqreturn_t voyagergx_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 91 | static irqreturn_t voyagergx_interrupt(int irq, void *dev_id, |
92 | struct pt_regs *regs) | ||
99 | { | 93 | { |
100 | printk(KERN_INFO | 94 | printk(KERN_INFO |
101 | "VoyagerGX: spurious interrupt, status: 0x%x\n", | 95 | "VoyagerGX: spurious interrupt, status: 0x%x\n", |
@@ -103,9 +97,6 @@ static irqreturn_t voyagergx_interrupt(int irq, void *dev_id, struct pt_regs *re | |||
103 | return IRQ_HANDLED; | 97 | return IRQ_HANDLED; |
104 | } | 98 | } |
105 | 99 | ||
106 | |||
107 | /*====================================================*/ | ||
108 | |||
109 | static struct { | 100 | static struct { |
110 | int (*func)(int, void *); | 101 | int (*func)(int, void *); |
111 | void *dev; | 102 | void *dev; |
diff --git a/arch/sh/cchips/voyagergx/setup.c b/arch/sh/cchips/voyagergx/setup.c index 139ca88ac9e6..66b2fedd7ad9 100644 --- a/arch/sh/cchips/voyagergx/setup.c +++ b/arch/sh/cchips/voyagergx/setup.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <asm/io.h> | 15 | #include <asm/io.h> |
16 | #include <asm/rts7751r2d/voyagergx_reg.h> | 16 | #include <asm/voyagergx.h> |
17 | 17 | ||
18 | static int __init setup_voyagergx(void) | 18 | static int __init setup_voyagergx(void) |
19 | { | 19 | { |
diff --git a/arch/sh/configs/landisk_defconfig b/arch/sh/configs/landisk_defconfig new file mode 100644 index 000000000000..6b43316d03cf --- /dev/null +++ b/arch/sh/configs/landisk_defconfig | |||
@@ -0,0 +1,1373 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.13-sh | ||
4 | # Sun Sep 11 13:00:46 2005 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_UID16=y | ||
8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
12 | CONFIG_GENERIC_IOMAP=y | ||
13 | |||
14 | # | ||
15 | # Code maturity level options | ||
16 | # | ||
17 | CONFIG_EXPERIMENTAL=y | ||
18 | CONFIG_CLEAN_COMPILE=y | ||
19 | CONFIG_BROKEN_ON_SMP=y | ||
20 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
21 | |||
22 | # | ||
23 | # General setup | ||
24 | # | ||
25 | CONFIG_LOCALVERSION="" | ||
26 | CONFIG_LOCALVERSION_AUTO=y | ||
27 | CONFIG_SWAP=y | ||
28 | CONFIG_SYSVIPC=y | ||
29 | # CONFIG_POSIX_MQUEUE is not set | ||
30 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
31 | CONFIG_SYSCTL=y | ||
32 | # CONFIG_AUDIT is not set | ||
33 | CONFIG_HOTPLUG=y | ||
34 | CONFIG_KOBJECT_UEVENT=y | ||
35 | # CONFIG_IKCONFIG is not set | ||
36 | CONFIG_INITRAMFS_SOURCE="" | ||
37 | # CONFIG_EMBEDDED is not set | ||
38 | CONFIG_KALLSYMS=y | ||
39 | CONFIG_KALLSYMS_EXTRA_PASS=y | ||
40 | CONFIG_PRINTK=y | ||
41 | CONFIG_BUG=y | ||
42 | CONFIG_BASE_FULL=y | ||
43 | CONFIG_FUTEX=y | ||
44 | CONFIG_EPOLL=y | ||
45 | CONFIG_SHMEM=y | ||
46 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
47 | CONFIG_CC_ALIGN_LABELS=0 | ||
48 | CONFIG_CC_ALIGN_LOOPS=0 | ||
49 | CONFIG_CC_ALIGN_JUMPS=0 | ||
50 | # CONFIG_TINY_SHMEM is not set | ||
51 | CONFIG_BASE_SMALL=0 | ||
52 | |||
53 | # | ||
54 | # Loadable module support | ||
55 | # | ||
56 | CONFIG_MODULES=y | ||
57 | CONFIG_MODULE_UNLOAD=y | ||
58 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
59 | CONFIG_OBSOLETE_MODPARM=y | ||
60 | # CONFIG_MODVERSIONS is not set | ||
61 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
62 | CONFIG_KMOD=y | ||
63 | |||
64 | # | ||
65 | # System type | ||
66 | # | ||
67 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
68 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
69 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
70 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
71 | # CONFIG_SH_7751_SYSTEMH is not set | ||
72 | # CONFIG_SH_STB1_HARP is not set | ||
73 | # CONFIG_SH_STB1_OVERDRIVE is not set | ||
74 | # CONFIG_SH_HP6XX is not set | ||
75 | # CONFIG_SH_CQREEK is not set | ||
76 | # CONFIG_SH_DMIDA is not set | ||
77 | # CONFIG_SH_EC3104 is not set | ||
78 | # CONFIG_SH_SATURN is not set | ||
79 | # CONFIG_SH_DREAMCAST is not set | ||
80 | # CONFIG_SH_CAT68701 is not set | ||
81 | # CONFIG_SH_BIGSUR is not set | ||
82 | # CONFIG_SH_SH2000 is not set | ||
83 | # CONFIG_SH_ADX is not set | ||
84 | # CONFIG_SH_MPC1211 is not set | ||
85 | # CONFIG_SH_SH03 is not set | ||
86 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
87 | # CONFIG_SH_HS7751RVOIP is not set | ||
88 | # CONFIG_SH_RTS7751R2D is not set | ||
89 | # CONFIG_SH_EDOSK7705 is not set | ||
90 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
91 | CONFIG_SH_LANDISK=y | ||
92 | # CONFIG_SH_TITAN is not set | ||
93 | # CONFIG_SH_UNKNOWN is not set | ||
94 | |||
95 | # | ||
96 | # Processor selection | ||
97 | # | ||
98 | CONFIG_CPU_SH4=y | ||
99 | |||
100 | # | ||
101 | # SH-2 Processor Support | ||
102 | # | ||
103 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
104 | |||
105 | # | ||
106 | # SH-3 Processor Support | ||
107 | # | ||
108 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
109 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
110 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
111 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
112 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
113 | |||
114 | # | ||
115 | # SH-4 Processor Support | ||
116 | # | ||
117 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
118 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
119 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
120 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
121 | CONFIG_CPU_SUBTYPE_SH7751=y | ||
122 | CONFIG_CPU_SUBTYPE_SH7751R=y | ||
123 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
124 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
125 | |||
126 | # | ||
127 | # ST40 Processor Support | ||
128 | # | ||
129 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
130 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
131 | |||
132 | # | ||
133 | # SH-4A Processor Support | ||
134 | # | ||
135 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
136 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
137 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
138 | |||
139 | # | ||
140 | # Memory management options | ||
141 | # | ||
142 | CONFIG_MMU=y | ||
143 | CONFIG_SELECT_MEMORY_MODEL=y | ||
144 | CONFIG_FLATMEM_MANUAL=y | ||
145 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
146 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
147 | CONFIG_FLATMEM=y | ||
148 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
149 | # CONFIG_SPARSEMEM_STATIC is not set | ||
150 | |||
151 | # | ||
152 | # Cache configuration | ||
153 | # | ||
154 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
155 | # CONFIG_SH_WRITETHROUGH is not set | ||
156 | # CONFIG_SH_OCRAM is not set | ||
157 | CONFIG_MEMORY_START=0x0c000000 | ||
158 | CONFIG_MEMORY_SIZE=0x04000000 | ||
159 | |||
160 | # | ||
161 | # Processor features | ||
162 | # | ||
163 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
164 | CONFIG_SH_FPU=y | ||
165 | # CONFIG_SH_STORE_QUEUES is not set | ||
166 | |||
167 | # | ||
168 | # Timer support | ||
169 | # | ||
170 | CONFIG_SH_TMU=y | ||
171 | CONFIG_SH_PCLK_FREQ_BOOL=y | ||
172 | CONFIG_SH_PCLK_FREQ=33333333 | ||
173 | |||
174 | # | ||
175 | # CPU Frequency scaling | ||
176 | # | ||
177 | # CONFIG_CPU_FREQ is not set | ||
178 | |||
179 | # | ||
180 | # DMA support | ||
181 | # | ||
182 | CONFIG_SH_DMA=y | ||
183 | CONFIG_NR_ONCHIP_DMA_CHANNELS=4 | ||
184 | # CONFIG_NR_DMA_CHANNELS_BOOL is not set | ||
185 | |||
186 | # | ||
187 | # Companion Chips | ||
188 | # | ||
189 | # CONFIG_HD6446X_SERIES is not set | ||
190 | CONFIG_HEARTBEAT=y | ||
191 | |||
192 | # | ||
193 | # Kernel features | ||
194 | # | ||
195 | CONFIG_KEXEC=y | ||
196 | # CONFIG_PREEMPT is not set | ||
197 | # CONFIG_SMP is not set | ||
198 | |||
199 | # | ||
200 | # Boot options | ||
201 | # | ||
202 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
203 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
204 | # CONFIG_UBC_WAKEUP is not set | ||
205 | # CONFIG_CMDLINE_BOOL is not set | ||
206 | |||
207 | # | ||
208 | # Bus options | ||
209 | # | ||
210 | CONFIG_ISA=y | ||
211 | CONFIG_PCI=y | ||
212 | CONFIG_SH_PCIDMA_NONCOHERENT=y | ||
213 | CONFIG_PCI_AUTO=y | ||
214 | CONFIG_PCI_AUTO_UPDATE_RESOURCES=y | ||
215 | CONFIG_PCI_LEGACY_PROC=y | ||
216 | |||
217 | # | ||
218 | # PCCARD (PCMCIA/CardBus) support | ||
219 | # | ||
220 | CONFIG_PCCARD=y | ||
221 | # CONFIG_PCMCIA_DEBUG is not set | ||
222 | CONFIG_PCMCIA=y | ||
223 | CONFIG_PCMCIA_LOAD_CIS=y | ||
224 | CONFIG_PCMCIA_IOCTL=y | ||
225 | CONFIG_CARDBUS=y | ||
226 | |||
227 | # | ||
228 | # PC-card bridges | ||
229 | # | ||
230 | CONFIG_YENTA=y | ||
231 | # CONFIG_PD6729 is not set | ||
232 | # CONFIG_I82092 is not set | ||
233 | # CONFIG_I82365 is not set | ||
234 | # CONFIG_TCIC is not set | ||
235 | CONFIG_PCMCIA_PROBE=y | ||
236 | CONFIG_PCCARD_NONSTATIC=y | ||
237 | |||
238 | # | ||
239 | # PCI Hotplug Support | ||
240 | # | ||
241 | # CONFIG_HOTPLUG_PCI is not set | ||
242 | |||
243 | # | ||
244 | # Executable file formats | ||
245 | # | ||
246 | CONFIG_BINFMT_ELF=y | ||
247 | # CONFIG_BINFMT_FLAT is not set | ||
248 | # CONFIG_BINFMT_MISC is not set | ||
249 | |||
250 | # | ||
251 | # Networking | ||
252 | # | ||
253 | CONFIG_NET=y | ||
254 | |||
255 | # | ||
256 | # Networking options | ||
257 | # | ||
258 | CONFIG_PACKET=y | ||
259 | # CONFIG_PACKET_MMAP is not set | ||
260 | CONFIG_UNIX=y | ||
261 | # CONFIG_NET_KEY is not set | ||
262 | CONFIG_INET=y | ||
263 | # CONFIG_IP_MULTICAST is not set | ||
264 | CONFIG_IP_ADVANCED_ROUTER=y | ||
265 | CONFIG_ASK_IP_FIB_HASH=y | ||
266 | # CONFIG_IP_FIB_TRIE is not set | ||
267 | CONFIG_IP_FIB_HASH=y | ||
268 | # CONFIG_IP_MULTIPLE_TABLES is not set | ||
269 | # CONFIG_IP_ROUTE_MULTIPATH is not set | ||
270 | # CONFIG_IP_ROUTE_VERBOSE is not set | ||
271 | CONFIG_IP_PNP=y | ||
272 | # CONFIG_IP_PNP_DHCP is not set | ||
273 | # CONFIG_IP_PNP_BOOTP is not set | ||
274 | # CONFIG_IP_PNP_RARP is not set | ||
275 | # CONFIG_NET_IPIP is not set | ||
276 | # CONFIG_NET_IPGRE is not set | ||
277 | # CONFIG_ARPD is not set | ||
278 | # CONFIG_SYN_COOKIES is not set | ||
279 | # CONFIG_INET_AH is not set | ||
280 | # CONFIG_INET_ESP is not set | ||
281 | # CONFIG_INET_IPCOMP is not set | ||
282 | # CONFIG_INET_TUNNEL is not set | ||
283 | CONFIG_INET_DIAG=y | ||
284 | CONFIG_INET_TCP_DIAG=y | ||
285 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
286 | CONFIG_TCP_CONG_BIC=y | ||
287 | |||
288 | # | ||
289 | # IP: Virtual Server Configuration | ||
290 | # | ||
291 | # CONFIG_IP_VS is not set | ||
292 | # CONFIG_IPV6 is not set | ||
293 | CONFIG_NETFILTER=y | ||
294 | # CONFIG_NETFILTER_DEBUG is not set | ||
295 | # CONFIG_NETFILTER_NETLINK is not set | ||
296 | |||
297 | # | ||
298 | # IP: Netfilter Configuration | ||
299 | # | ||
300 | CONFIG_IP_NF_CONNTRACK=m | ||
301 | CONFIG_IP_NF_CT_ACCT=y | ||
302 | CONFIG_IP_NF_CONNTRACK_MARK=y | ||
303 | # CONFIG_IP_NF_CONNTRACK_EVENTS is not set | ||
304 | # CONFIG_IP_NF_CT_PROTO_SCTP is not set | ||
305 | CONFIG_IP_NF_FTP=m | ||
306 | CONFIG_IP_NF_IRC=m | ||
307 | # CONFIG_IP_NF_NETBIOS_NS is not set | ||
308 | CONFIG_IP_NF_TFTP=m | ||
309 | CONFIG_IP_NF_AMANDA=m | ||
310 | # CONFIG_IP_NF_PPTP is not set | ||
311 | CONFIG_IP_NF_QUEUE=m | ||
312 | CONFIG_IP_NF_IPTABLES=m | ||
313 | CONFIG_IP_NF_MATCH_LIMIT=m | ||
314 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
315 | CONFIG_IP_NF_MATCH_MAC=m | ||
316 | CONFIG_IP_NF_MATCH_PKTTYPE=m | ||
317 | CONFIG_IP_NF_MATCH_MARK=m | ||
318 | CONFIG_IP_NF_MATCH_MULTIPORT=m | ||
319 | CONFIG_IP_NF_MATCH_TOS=m | ||
320 | CONFIG_IP_NF_MATCH_RECENT=m | ||
321 | CONFIG_IP_NF_MATCH_ECN=m | ||
322 | CONFIG_IP_NF_MATCH_DSCP=m | ||
323 | CONFIG_IP_NF_MATCH_AH_ESP=m | ||
324 | CONFIG_IP_NF_MATCH_LENGTH=m | ||
325 | CONFIG_IP_NF_MATCH_TTL=m | ||
326 | CONFIG_IP_NF_MATCH_TCPMSS=m | ||
327 | CONFIG_IP_NF_MATCH_HELPER=m | ||
328 | CONFIG_IP_NF_MATCH_STATE=m | ||
329 | CONFIG_IP_NF_MATCH_CONNTRACK=m | ||
330 | CONFIG_IP_NF_MATCH_OWNER=m | ||
331 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
332 | CONFIG_IP_NF_MATCH_REALM=m | ||
333 | CONFIG_IP_NF_MATCH_SCTP=m | ||
334 | # CONFIG_IP_NF_MATCH_DCCP is not set | ||
335 | CONFIG_IP_NF_MATCH_COMMENT=m | ||
336 | CONFIG_IP_NF_MATCH_CONNMARK=m | ||
337 | # CONFIG_IP_NF_MATCH_CONNBYTES is not set | ||
338 | CONFIG_IP_NF_MATCH_HASHLIMIT=m | ||
339 | # CONFIG_IP_NF_MATCH_STRING is not set | ||
340 | CONFIG_IP_NF_FILTER=m | ||
341 | CONFIG_IP_NF_TARGET_REJECT=m | ||
342 | CONFIG_IP_NF_TARGET_LOG=m | ||
343 | CONFIG_IP_NF_TARGET_ULOG=m | ||
344 | CONFIG_IP_NF_TARGET_TCPMSS=m | ||
345 | # CONFIG_IP_NF_TARGET_NFQUEUE is not set | ||
346 | CONFIG_IP_NF_NAT=m | ||
347 | CONFIG_IP_NF_NAT_NEEDED=y | ||
348 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
349 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
350 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
351 | CONFIG_IP_NF_TARGET_SAME=m | ||
352 | # CONFIG_IP_NF_NAT_SNMP_BASIC is not set | ||
353 | CONFIG_IP_NF_NAT_IRC=m | ||
354 | CONFIG_IP_NF_NAT_FTP=m | ||
355 | CONFIG_IP_NF_NAT_TFTP=m | ||
356 | CONFIG_IP_NF_NAT_AMANDA=m | ||
357 | CONFIG_IP_NF_MANGLE=m | ||
358 | CONFIG_IP_NF_TARGET_TOS=m | ||
359 | CONFIG_IP_NF_TARGET_ECN=m | ||
360 | CONFIG_IP_NF_TARGET_DSCP=m | ||
361 | CONFIG_IP_NF_TARGET_MARK=m | ||
362 | CONFIG_IP_NF_TARGET_CLASSIFY=m | ||
363 | # CONFIG_IP_NF_TARGET_TTL is not set | ||
364 | CONFIG_IP_NF_TARGET_CONNMARK=m | ||
365 | # CONFIG_IP_NF_TARGET_CLUSTERIP is not set | ||
366 | CONFIG_IP_NF_RAW=m | ||
367 | CONFIG_IP_NF_TARGET_NOTRACK=m | ||
368 | CONFIG_IP_NF_ARPTABLES=m | ||
369 | CONFIG_IP_NF_ARPFILTER=m | ||
370 | CONFIG_IP_NF_ARP_MANGLE=m | ||
371 | |||
372 | # | ||
373 | # DCCP Configuration (EXPERIMENTAL) | ||
374 | # | ||
375 | # CONFIG_IP_DCCP is not set | ||
376 | |||
377 | # | ||
378 | # SCTP Configuration (EXPERIMENTAL) | ||
379 | # | ||
380 | # CONFIG_IP_SCTP is not set | ||
381 | # CONFIG_ATM is not set | ||
382 | # CONFIG_BRIDGE is not set | ||
383 | # CONFIG_VLAN_8021Q is not set | ||
384 | # CONFIG_DECNET is not set | ||
385 | CONFIG_LLC=m | ||
386 | # CONFIG_LLC2 is not set | ||
387 | # CONFIG_IPX is not set | ||
388 | CONFIG_ATALK=m | ||
389 | # CONFIG_DEV_APPLETALK is not set | ||
390 | # CONFIG_X25 is not set | ||
391 | # CONFIG_LAPB is not set | ||
392 | # CONFIG_NET_DIVERT is not set | ||
393 | # CONFIG_ECONET is not set | ||
394 | # CONFIG_WAN_ROUTER is not set | ||
395 | # CONFIG_NET_SCHED is not set | ||
396 | CONFIG_NET_CLS_ROUTE=y | ||
397 | |||
398 | # | ||
399 | # Network testing | ||
400 | # | ||
401 | # CONFIG_NET_PKTGEN is not set | ||
402 | # CONFIG_HAMRADIO is not set | ||
403 | # CONFIG_IRDA is not set | ||
404 | # CONFIG_BT is not set | ||
405 | # CONFIG_IEEE80211 is not set | ||
406 | |||
407 | # | ||
408 | # Device Drivers | ||
409 | # | ||
410 | |||
411 | # | ||
412 | # Generic Driver Options | ||
413 | # | ||
414 | CONFIG_STANDALONE=y | ||
415 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
416 | CONFIG_FW_LOADER=y | ||
417 | |||
418 | # | ||
419 | # Connector - unified userspace <-> kernelspace linker | ||
420 | # | ||
421 | # CONFIG_CONNECTOR is not set | ||
422 | |||
423 | # | ||
424 | # Memory Technology Devices (MTD) | ||
425 | # | ||
426 | # CONFIG_MTD is not set | ||
427 | |||
428 | # | ||
429 | # Parallel port support | ||
430 | # | ||
431 | # CONFIG_PARPORT is not set | ||
432 | |||
433 | # | ||
434 | # Plug and Play support | ||
435 | # | ||
436 | # CONFIG_PNP is not set | ||
437 | |||
438 | # | ||
439 | # Block devices | ||
440 | # | ||
441 | # CONFIG_BLK_CPQ_DA is not set | ||
442 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
443 | # CONFIG_BLK_DEV_DAC960 is not set | ||
444 | # CONFIG_BLK_DEV_UMEM is not set | ||
445 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
446 | CONFIG_BLK_DEV_LOOP=y | ||
447 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
448 | # CONFIG_BLK_DEV_NBD is not set | ||
449 | # CONFIG_BLK_DEV_SX8 is not set | ||
450 | # CONFIG_BLK_DEV_UB is not set | ||
451 | CONFIG_BLK_DEV_RAM=y | ||
452 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
453 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
454 | # CONFIG_BLK_DEV_INITRD is not set | ||
455 | # CONFIG_LBD is not set | ||
456 | # CONFIG_CDROM_PKTCDVD is not set | ||
457 | |||
458 | # | ||
459 | # IO Schedulers | ||
460 | # | ||
461 | CONFIG_IOSCHED_NOOP=y | ||
462 | CONFIG_IOSCHED_AS=y | ||
463 | CONFIG_IOSCHED_DEADLINE=y | ||
464 | CONFIG_IOSCHED_CFQ=y | ||
465 | # CONFIG_ATA_OVER_ETH is not set | ||
466 | |||
467 | # | ||
468 | # ATA/ATAPI/MFM/RLL support | ||
469 | # | ||
470 | CONFIG_IDE=y | ||
471 | CONFIG_IDE_MAX_HWIFS=4 | ||
472 | CONFIG_BLK_DEV_IDE=y | ||
473 | |||
474 | # | ||
475 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
476 | # | ||
477 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
478 | CONFIG_BLK_DEV_IDEDISK=y | ||
479 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
480 | # CONFIG_BLK_DEV_IDECS is not set | ||
481 | CONFIG_BLK_DEV_IDECD=y | ||
482 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
483 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
484 | CONFIG_BLK_DEV_IDESCSI=y | ||
485 | # CONFIG_IDE_TASK_IOCTL is not set | ||
486 | |||
487 | # | ||
488 | # IDE chipset support/bugfixes | ||
489 | # | ||
490 | CONFIG_IDE_GENERIC=y | ||
491 | CONFIG_BLK_DEV_IDEPCI=y | ||
492 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
493 | CONFIG_BLK_DEV_OFFBOARD=y | ||
494 | CONFIG_BLK_DEV_GENERIC=y | ||
495 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
496 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
497 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | ||
498 | CONFIG_IDEDMA_PCI_AUTO=y | ||
499 | CONFIG_IDEDMA_ONLYDISK=y | ||
500 | CONFIG_BLK_DEV_AEC62XX=y | ||
501 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
502 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
503 | # CONFIG_BLK_DEV_CMD64X is not set | ||
504 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
505 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
506 | # CONFIG_BLK_DEV_CS5520 is not set | ||
507 | # CONFIG_BLK_DEV_CS5530 is not set | ||
508 | # CONFIG_BLK_DEV_HPT34X is not set | ||
509 | # CONFIG_BLK_DEV_HPT366 is not set | ||
510 | # CONFIG_BLK_DEV_SC1200 is not set | ||
511 | # CONFIG_BLK_DEV_PIIX is not set | ||
512 | # CONFIG_BLK_DEV_IT821X is not set | ||
513 | # CONFIG_BLK_DEV_NS87415 is not set | ||
514 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
515 | # CONFIG_BLK_DEV_PDC202XX_NEW is not set | ||
516 | # CONFIG_BLK_DEV_SVWKS is not set | ||
517 | # CONFIG_BLK_DEV_SIIMAGE is not set | ||
518 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
519 | # CONFIG_BLK_DEV_TRM290 is not set | ||
520 | # CONFIG_BLK_DEV_VIA82CXXX is not set | ||
521 | CONFIG_IDE_SH=y | ||
522 | # CONFIG_IDE_ARM is not set | ||
523 | # CONFIG_IDE_CHIPSETS is not set | ||
524 | CONFIG_BLK_DEV_IDEDMA=y | ||
525 | # CONFIG_IDEDMA_IVB is not set | ||
526 | CONFIG_IDEDMA_AUTO=y | ||
527 | # CONFIG_BLK_DEV_HD is not set | ||
528 | |||
529 | # | ||
530 | # SCSI device support | ||
531 | # | ||
532 | # CONFIG_RAID_ATTRS is not set | ||
533 | CONFIG_SCSI=y | ||
534 | CONFIG_SCSI_PROC_FS=y | ||
535 | |||
536 | # | ||
537 | # SCSI support type (disk, tape, CD-ROM) | ||
538 | # | ||
539 | CONFIG_BLK_DEV_SD=y | ||
540 | # CONFIG_CHR_DEV_ST is not set | ||
541 | # CONFIG_CHR_DEV_OSST is not set | ||
542 | # CONFIG_BLK_DEV_SR is not set | ||
543 | # CONFIG_CHR_DEV_SG is not set | ||
544 | # CONFIG_CHR_DEV_SCH is not set | ||
545 | |||
546 | # | ||
547 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
548 | # | ||
549 | CONFIG_SCSI_MULTI_LUN=y | ||
550 | # CONFIG_SCSI_CONSTANTS is not set | ||
551 | # CONFIG_SCSI_LOGGING is not set | ||
552 | |||
553 | # | ||
554 | # SCSI Transport Attributes | ||
555 | # | ||
556 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
557 | # CONFIG_SCSI_FC_ATTRS is not set | ||
558 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
559 | # CONFIG_SCSI_SAS_ATTRS is not set | ||
560 | |||
561 | # | ||
562 | # SCSI low-level drivers | ||
563 | # | ||
564 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
565 | # CONFIG_SCSI_3W_9XXX is not set | ||
566 | # CONFIG_SCSI_ACARD is not set | ||
567 | # CONFIG_SCSI_AHA152X is not set | ||
568 | # CONFIG_SCSI_AACRAID is not set | ||
569 | # CONFIG_SCSI_AIC7XXX is not set | ||
570 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
571 | # CONFIG_SCSI_AIC79XX is not set | ||
572 | # CONFIG_SCSI_DPT_I2O is not set | ||
573 | # CONFIG_SCSI_IN2000 is not set | ||
574 | # CONFIG_MEGARAID_NEWGEN is not set | ||
575 | # CONFIG_MEGARAID_LEGACY is not set | ||
576 | # CONFIG_MEGARAID_SAS is not set | ||
577 | # CONFIG_SCSI_SATA is not set | ||
578 | # CONFIG_SCSI_DMX3191D is not set | ||
579 | # CONFIG_SCSI_DTC3280 is not set | ||
580 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
581 | # CONFIG_SCSI_GENERIC_NCR5380 is not set | ||
582 | # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set | ||
583 | # CONFIG_SCSI_IPS is not set | ||
584 | # CONFIG_SCSI_INITIO is not set | ||
585 | # CONFIG_SCSI_INIA100 is not set | ||
586 | # CONFIG_SCSI_NCR53C406A is not set | ||
587 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
588 | # CONFIG_SCSI_IPR is not set | ||
589 | # CONFIG_SCSI_PAS16 is not set | ||
590 | # CONFIG_SCSI_PSI240I is not set | ||
591 | # CONFIG_SCSI_QLOGIC_FAS is not set | ||
592 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
593 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
594 | CONFIG_SCSI_QLA2XXX=y | ||
595 | # CONFIG_SCSI_QLA21XX is not set | ||
596 | # CONFIG_SCSI_QLA22XX is not set | ||
597 | # CONFIG_SCSI_QLA2300 is not set | ||
598 | # CONFIG_SCSI_QLA2322 is not set | ||
599 | # CONFIG_SCSI_QLA6312 is not set | ||
600 | # CONFIG_SCSI_QLA24XX is not set | ||
601 | # CONFIG_SCSI_LPFC is not set | ||
602 | # CONFIG_SCSI_SYM53C416 is not set | ||
603 | # CONFIG_SCSI_DC395x is not set | ||
604 | # CONFIG_SCSI_DC390T is not set | ||
605 | # CONFIG_SCSI_T128 is not set | ||
606 | # CONFIG_SCSI_NSP32 is not set | ||
607 | # CONFIG_SCSI_DEBUG is not set | ||
608 | |||
609 | # | ||
610 | # PCMCIA SCSI adapter support | ||
611 | # | ||
612 | # CONFIG_PCMCIA_AHA152X is not set | ||
613 | # CONFIG_PCMCIA_FDOMAIN is not set | ||
614 | # CONFIG_PCMCIA_NINJA_SCSI is not set | ||
615 | # CONFIG_PCMCIA_QLOGIC is not set | ||
616 | # CONFIG_PCMCIA_SYM53C500 is not set | ||
617 | |||
618 | # | ||
619 | # Old CD-ROM drivers (not SCSI, not IDE) | ||
620 | # | ||
621 | # CONFIG_CD_NO_IDESCSI is not set | ||
622 | |||
623 | # | ||
624 | # Multi-device support (RAID and LVM) | ||
625 | # | ||
626 | CONFIG_MD=y | ||
627 | CONFIG_BLK_DEV_MD=m | ||
628 | CONFIG_MD_LINEAR=m | ||
629 | CONFIG_MD_RAID0=m | ||
630 | CONFIG_MD_RAID1=m | ||
631 | # CONFIG_MD_RAID10 is not set | ||
632 | # CONFIG_MD_RAID5 is not set | ||
633 | # CONFIG_MD_RAID6 is not set | ||
634 | # CONFIG_MD_MULTIPATH is not set | ||
635 | # CONFIG_MD_FAULTY is not set | ||
636 | # CONFIG_BLK_DEV_DM is not set | ||
637 | |||
638 | # | ||
639 | # Fusion MPT device support | ||
640 | # | ||
641 | # CONFIG_FUSION is not set | ||
642 | # CONFIG_FUSION_SPI is not set | ||
643 | # CONFIG_FUSION_FC is not set | ||
644 | # CONFIG_FUSION_SAS is not set | ||
645 | |||
646 | # | ||
647 | # IEEE 1394 (FireWire) support | ||
648 | # | ||
649 | # CONFIG_IEEE1394 is not set | ||
650 | |||
651 | # | ||
652 | # I2O device support | ||
653 | # | ||
654 | # CONFIG_I2O is not set | ||
655 | |||
656 | # | ||
657 | # Network device support | ||
658 | # | ||
659 | CONFIG_NETDEVICES=y | ||
660 | # CONFIG_DUMMY is not set | ||
661 | # CONFIG_BONDING is not set | ||
662 | # CONFIG_EQUALIZER is not set | ||
663 | CONFIG_TUN=m | ||
664 | |||
665 | # | ||
666 | # ARCnet devices | ||
667 | # | ||
668 | # CONFIG_ARCNET is not set | ||
669 | |||
670 | # | ||
671 | # PHY device support | ||
672 | # | ||
673 | # CONFIG_PHYLIB is not set | ||
674 | |||
675 | # | ||
676 | # Ethernet (10 or 100Mbit) | ||
677 | # | ||
678 | CONFIG_NET_ETHERNET=y | ||
679 | CONFIG_MII=y | ||
680 | # CONFIG_STNIC is not set | ||
681 | # CONFIG_HAPPYMEAL is not set | ||
682 | # CONFIG_SUNGEM is not set | ||
683 | # CONFIG_CASSINI is not set | ||
684 | # CONFIG_NET_VENDOR_3COM is not set | ||
685 | # CONFIG_NET_VENDOR_SMC is not set | ||
686 | # CONFIG_SMC91X is not set | ||
687 | # CONFIG_NET_VENDOR_RACAL is not set | ||
688 | |||
689 | # | ||
690 | # Tulip family network device support | ||
691 | # | ||
692 | # CONFIG_NET_TULIP is not set | ||
693 | # CONFIG_AT1700 is not set | ||
694 | # CONFIG_DEPCA is not set | ||
695 | # CONFIG_HP100 is not set | ||
696 | # CONFIG_NET_ISA is not set | ||
697 | # CONFIG_NE2000 is not set | ||
698 | CONFIG_NET_PCI=y | ||
699 | # CONFIG_PCNET32 is not set | ||
700 | # CONFIG_AMD8111_ETH is not set | ||
701 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
702 | # CONFIG_AC3200 is not set | ||
703 | # CONFIG_APRICOT is not set | ||
704 | # CONFIG_B44 is not set | ||
705 | # CONFIG_FORCEDETH is not set | ||
706 | # CONFIG_CS89x0 is not set | ||
707 | # CONFIG_DGRS is not set | ||
708 | # CONFIG_EEPRO100 is not set | ||
709 | # CONFIG_E100 is not set | ||
710 | # CONFIG_FEALNX is not set | ||
711 | # CONFIG_NATSEMI is not set | ||
712 | # CONFIG_NE2K_PCI is not set | ||
713 | CONFIG_8139CP=y | ||
714 | # CONFIG_8139TOO is not set | ||
715 | # CONFIG_SIS900 is not set | ||
716 | # CONFIG_EPIC100 is not set | ||
717 | # CONFIG_SUNDANCE is not set | ||
718 | # CONFIG_TLAN is not set | ||
719 | # CONFIG_VIA_RHINE is not set | ||
720 | |||
721 | # | ||
722 | # Ethernet (1000 Mbit) | ||
723 | # | ||
724 | # CONFIG_ACENIC is not set | ||
725 | # CONFIG_DL2K is not set | ||
726 | # CONFIG_E1000 is not set | ||
727 | # CONFIG_NS83820 is not set | ||
728 | # CONFIG_HAMACHI is not set | ||
729 | # CONFIG_YELLOWFIN is not set | ||
730 | # CONFIG_R8169 is not set | ||
731 | # CONFIG_SIS190 is not set | ||
732 | # CONFIG_SKGE is not set | ||
733 | # CONFIG_SK98LIN is not set | ||
734 | # CONFIG_VIA_VELOCITY is not set | ||
735 | # CONFIG_TIGON3 is not set | ||
736 | # CONFIG_BNX2 is not set | ||
737 | |||
738 | # | ||
739 | # Ethernet (10000 Mbit) | ||
740 | # | ||
741 | # CONFIG_CHELSIO_T1 is not set | ||
742 | # CONFIG_IXGB is not set | ||
743 | # CONFIG_S2IO is not set | ||
744 | |||
745 | # | ||
746 | # Token Ring devices | ||
747 | # | ||
748 | # CONFIG_TR is not set | ||
749 | |||
750 | # | ||
751 | # Wireless LAN (non-hamradio) | ||
752 | # | ||
753 | # CONFIG_NET_RADIO is not set | ||
754 | |||
755 | # | ||
756 | # PCMCIA network device support | ||
757 | # | ||
758 | # CONFIG_NET_PCMCIA is not set | ||
759 | |||
760 | # | ||
761 | # Wan interfaces | ||
762 | # | ||
763 | # CONFIG_WAN is not set | ||
764 | # CONFIG_FDDI is not set | ||
765 | # CONFIG_HIPPI is not set | ||
766 | # CONFIG_PPP is not set | ||
767 | # CONFIG_SLIP is not set | ||
768 | # CONFIG_NET_FC is not set | ||
769 | # CONFIG_SHAPER is not set | ||
770 | # CONFIG_NETCONSOLE is not set | ||
771 | # CONFIG_NETPOLL is not set | ||
772 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
773 | |||
774 | # | ||
775 | # ISDN subsystem | ||
776 | # | ||
777 | # CONFIG_ISDN is not set | ||
778 | |||
779 | # | ||
780 | # Telephony Support | ||
781 | # | ||
782 | # CONFIG_PHONE is not set | ||
783 | |||
784 | # | ||
785 | # Input device support | ||
786 | # | ||
787 | CONFIG_INPUT=y | ||
788 | |||
789 | # | ||
790 | # Userland interfaces | ||
791 | # | ||
792 | CONFIG_INPUT_MOUSEDEV=y | ||
793 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
794 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
795 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
796 | # CONFIG_INPUT_JOYDEV is not set | ||
797 | # CONFIG_INPUT_TSDEV is not set | ||
798 | # CONFIG_INPUT_EVDEV is not set | ||
799 | # CONFIG_INPUT_EVBUG is not set | ||
800 | |||
801 | # | ||
802 | # Input Device Drivers | ||
803 | # | ||
804 | # CONFIG_INPUT_KEYBOARD is not set | ||
805 | # CONFIG_INPUT_MOUSE is not set | ||
806 | # CONFIG_INPUT_JOYSTICK is not set | ||
807 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
808 | # CONFIG_INPUT_MISC is not set | ||
809 | |||
810 | # | ||
811 | # Hardware I/O ports | ||
812 | # | ||
813 | # CONFIG_SERIO is not set | ||
814 | # CONFIG_GAMEPORT is not set | ||
815 | |||
816 | # | ||
817 | # Character devices | ||
818 | # | ||
819 | CONFIG_VT=y | ||
820 | CONFIG_VT_CONSOLE=y | ||
821 | CONFIG_HW_CONSOLE=y | ||
822 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
823 | |||
824 | # | ||
825 | # Serial drivers | ||
826 | # | ||
827 | # CONFIG_SERIAL_8250 is not set | ||
828 | |||
829 | # | ||
830 | # Non-8250 serial port support | ||
831 | # | ||
832 | CONFIG_SERIAL_SH_SCI=y | ||
833 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
834 | CONFIG_SERIAL_CORE=y | ||
835 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
836 | # CONFIG_SERIAL_JSM is not set | ||
837 | CONFIG_UNIX98_PTYS=y | ||
838 | CONFIG_LEGACY_PTYS=y | ||
839 | CONFIG_LEGACY_PTY_COUNT=256 | ||
840 | |||
841 | # | ||
842 | # IPMI | ||
843 | # | ||
844 | # CONFIG_IPMI_HANDLER is not set | ||
845 | |||
846 | # | ||
847 | # Watchdog Cards | ||
848 | # | ||
849 | # CONFIG_WATCHDOG is not set | ||
850 | # CONFIG_RTC is not set | ||
851 | CONFIG_RS5C313_RTC=y | ||
852 | # CONFIG_GEN_RTC is not set | ||
853 | # CONFIG_DTLK is not set | ||
854 | # CONFIG_R3964 is not set | ||
855 | # CONFIG_APPLICOM is not set | ||
856 | |||
857 | # | ||
858 | # Ftape, the floppy tape device driver | ||
859 | # | ||
860 | # CONFIG_DRM is not set | ||
861 | |||
862 | # | ||
863 | # PCMCIA character devices | ||
864 | # | ||
865 | # CONFIG_SYNCLINK_CS is not set | ||
866 | # CONFIG_RAW_DRIVER is not set | ||
867 | |||
868 | # | ||
869 | # TPM devices | ||
870 | # | ||
871 | # CONFIG_TCG_TPM is not set | ||
872 | |||
873 | # | ||
874 | # I2C support | ||
875 | # | ||
876 | # CONFIG_I2C is not set | ||
877 | |||
878 | # | ||
879 | # Dallas's 1-wire bus | ||
880 | # | ||
881 | # CONFIG_W1 is not set | ||
882 | |||
883 | # | ||
884 | # Hardware Monitoring support | ||
885 | # | ||
886 | CONFIG_HWMON=y | ||
887 | # CONFIG_HWMON_VID is not set | ||
888 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
889 | |||
890 | # | ||
891 | # Misc devices | ||
892 | # | ||
893 | |||
894 | # | ||
895 | # Multimedia Capabilities Port drivers | ||
896 | # | ||
897 | |||
898 | # | ||
899 | # Multimedia devices | ||
900 | # | ||
901 | CONFIG_VIDEO_DEV=m | ||
902 | |||
903 | # | ||
904 | # Video For Linux | ||
905 | # | ||
906 | |||
907 | # | ||
908 | # Video Adapters | ||
909 | # | ||
910 | # CONFIG_VIDEO_PMS is not set | ||
911 | # CONFIG_VIDEO_CPIA is not set | ||
912 | # CONFIG_VIDEO_STRADIS is not set | ||
913 | # CONFIG_VIDEO_MXB is not set | ||
914 | # CONFIG_VIDEO_DPC is not set | ||
915 | # CONFIG_VIDEO_HEXIUM_ORION is not set | ||
916 | # CONFIG_VIDEO_HEXIUM_GEMINI is not set | ||
917 | |||
918 | # | ||
919 | # Radio Adapters | ||
920 | # | ||
921 | # CONFIG_RADIO_CADET is not set | ||
922 | # CONFIG_RADIO_RTRACK is not set | ||
923 | # CONFIG_RADIO_RTRACK2 is not set | ||
924 | # CONFIG_RADIO_AZTECH is not set | ||
925 | # CONFIG_RADIO_GEMTEK is not set | ||
926 | # CONFIG_RADIO_GEMTEK_PCI is not set | ||
927 | # CONFIG_RADIO_MAXIRADIO is not set | ||
928 | # CONFIG_RADIO_MAESTRO is not set | ||
929 | # CONFIG_RADIO_SF16FMI is not set | ||
930 | # CONFIG_RADIO_SF16FMR2 is not set | ||
931 | # CONFIG_RADIO_TERRATEC is not set | ||
932 | # CONFIG_RADIO_TRUST is not set | ||
933 | # CONFIG_RADIO_TYPHOON is not set | ||
934 | # CONFIG_RADIO_ZOLTRIX is not set | ||
935 | |||
936 | # | ||
937 | # Digital Video Broadcasting Devices | ||
938 | # | ||
939 | # CONFIG_DVB is not set | ||
940 | |||
941 | # | ||
942 | # Graphics support | ||
943 | # | ||
944 | # CONFIG_FB is not set | ||
945 | |||
946 | # | ||
947 | # Console display driver support | ||
948 | # | ||
949 | # CONFIG_MDA_CONSOLE is not set | ||
950 | CONFIG_DUMMY_CONSOLE=y | ||
951 | CONFIG_FONT_8x16=y | ||
952 | |||
953 | # | ||
954 | # Sound | ||
955 | # | ||
956 | CONFIG_SOUND=m | ||
957 | |||
958 | # | ||
959 | # Advanced Linux Sound Architecture | ||
960 | # | ||
961 | # CONFIG_SND is not set | ||
962 | |||
963 | # | ||
964 | # Open Sound System | ||
965 | # | ||
966 | CONFIG_SOUND_PRIME=m | ||
967 | # CONFIG_SOUND_BT878 is not set | ||
968 | # CONFIG_SOUND_CMPCI is not set | ||
969 | # CONFIG_SOUND_EMU10K1 is not set | ||
970 | # CONFIG_SOUND_FUSION is not set | ||
971 | # CONFIG_SOUND_CS4281 is not set | ||
972 | # CONFIG_SOUND_ES1370 is not set | ||
973 | # CONFIG_SOUND_ES1371 is not set | ||
974 | # CONFIG_SOUND_ESSSOLO1 is not set | ||
975 | # CONFIG_SOUND_MAESTRO is not set | ||
976 | # CONFIG_SOUND_MAESTRO3 is not set | ||
977 | # CONFIG_SOUND_ICH is not set | ||
978 | # CONFIG_SOUND_SONICVIBES is not set | ||
979 | # CONFIG_SOUND_TRIDENT is not set | ||
980 | # CONFIG_SOUND_MSNDCLAS is not set | ||
981 | # CONFIG_SOUND_MSNDPIN is not set | ||
982 | # CONFIG_SOUND_VIA82CXXX is not set | ||
983 | # CONFIG_SOUND_ALI5455 is not set | ||
984 | # CONFIG_SOUND_FORTE is not set | ||
985 | # CONFIG_SOUND_RME96XX is not set | ||
986 | # CONFIG_SOUND_AD1980 is not set | ||
987 | |||
988 | # | ||
989 | # USB support | ||
990 | # | ||
991 | CONFIG_USB_ARCH_HAS_HCD=y | ||
992 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
993 | CONFIG_USB=y | ||
994 | # CONFIG_USB_DEBUG is not set | ||
995 | |||
996 | # | ||
997 | # Miscellaneous USB options | ||
998 | # | ||
999 | CONFIG_USB_DEVICEFS=y | ||
1000 | # CONFIG_USB_BANDWIDTH is not set | ||
1001 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
1002 | # CONFIG_USB_OTG is not set | ||
1003 | |||
1004 | # | ||
1005 | # USB Host Controller Drivers | ||
1006 | # | ||
1007 | CONFIG_USB_EHCI_HCD=y | ||
1008 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | ||
1009 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | ||
1010 | # CONFIG_USB_ISP116X_HCD is not set | ||
1011 | CONFIG_USB_OHCI_HCD=y | ||
1012 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | ||
1013 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
1014 | # CONFIG_USB_UHCI_HCD is not set | ||
1015 | # CONFIG_USB_SL811_HCD is not set | ||
1016 | |||
1017 | # | ||
1018 | # USB Device Class drivers | ||
1019 | # | ||
1020 | CONFIG_OBSOLETE_OSS_USB_DRIVER=y | ||
1021 | CONFIG_USB_AUDIO=m | ||
1022 | # CONFIG_USB_BLUETOOTH_TTY is not set | ||
1023 | CONFIG_USB_MIDI=m | ||
1024 | # CONFIG_USB_ACM is not set | ||
1025 | CONFIG_USB_PRINTER=m | ||
1026 | |||
1027 | # | ||
1028 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
1029 | # | ||
1030 | CONFIG_USB_STORAGE=m | ||
1031 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
1032 | CONFIG_USB_STORAGE_DATAFAB=y | ||
1033 | CONFIG_USB_STORAGE_FREECOM=y | ||
1034 | CONFIG_USB_STORAGE_ISD200=y | ||
1035 | CONFIG_USB_STORAGE_DPCM=y | ||
1036 | # CONFIG_USB_STORAGE_USBAT is not set | ||
1037 | CONFIG_USB_STORAGE_SDDR09=y | ||
1038 | CONFIG_USB_STORAGE_SDDR55=y | ||
1039 | CONFIG_USB_STORAGE_JUMPSHOT=y | ||
1040 | |||
1041 | # | ||
1042 | # USB Input Devices | ||
1043 | # | ||
1044 | CONFIG_USB_HID=m | ||
1045 | CONFIG_USB_HIDINPUT=y | ||
1046 | # CONFIG_HID_FF is not set | ||
1047 | # CONFIG_USB_HIDDEV is not set | ||
1048 | |||
1049 | # | ||
1050 | # USB HID Boot Protocol drivers | ||
1051 | # | ||
1052 | # CONFIG_USB_KBD is not set | ||
1053 | # CONFIG_USB_MOUSE is not set | ||
1054 | # CONFIG_USB_AIPTEK is not set | ||
1055 | # CONFIG_USB_WACOM is not set | ||
1056 | # CONFIG_USB_ACECAD is not set | ||
1057 | # CONFIG_USB_KBTAB is not set | ||
1058 | # CONFIG_USB_POWERMATE is not set | ||
1059 | # CONFIG_USB_MTOUCH is not set | ||
1060 | # CONFIG_USB_ITMTOUCH is not set | ||
1061 | # CONFIG_USB_EGALAX is not set | ||
1062 | # CONFIG_USB_YEALINK is not set | ||
1063 | # CONFIG_USB_XPAD is not set | ||
1064 | # CONFIG_USB_ATI_REMOTE is not set | ||
1065 | # CONFIG_USB_KEYSPAN_REMOTE is not set | ||
1066 | # CONFIG_USB_APPLETOUCH is not set | ||
1067 | |||
1068 | # | ||
1069 | # USB Imaging devices | ||
1070 | # | ||
1071 | # CONFIG_USB_MDC800 is not set | ||
1072 | # CONFIG_USB_MICROTEK is not set | ||
1073 | |||
1074 | # | ||
1075 | # USB Multimedia devices | ||
1076 | # | ||
1077 | CONFIG_USB_DABUSB=m | ||
1078 | CONFIG_USB_VICAM=m | ||
1079 | CONFIG_USB_DSBR=m | ||
1080 | CONFIG_USB_IBMCAM=m | ||
1081 | CONFIG_USB_KONICAWC=m | ||
1082 | CONFIG_USB_OV511=m | ||
1083 | CONFIG_USB_SE401=m | ||
1084 | CONFIG_USB_SN9C102=m | ||
1085 | CONFIG_USB_STV680=m | ||
1086 | CONFIG_USB_PWC=m | ||
1087 | |||
1088 | # | ||
1089 | # USB Network Adapters | ||
1090 | # | ||
1091 | # CONFIG_USB_CATC is not set | ||
1092 | # CONFIG_USB_KAWETH is not set | ||
1093 | CONFIG_USB_PEGASUS=m | ||
1094 | CONFIG_USB_RTL8150=m | ||
1095 | # CONFIG_USB_USBNET is not set | ||
1096 | CONFIG_USB_MON=y | ||
1097 | |||
1098 | # | ||
1099 | # USB port drivers | ||
1100 | # | ||
1101 | |||
1102 | # | ||
1103 | # USB Serial Converter support | ||
1104 | # | ||
1105 | CONFIG_USB_SERIAL=m | ||
1106 | # CONFIG_USB_SERIAL_GENERIC is not set | ||
1107 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
1108 | # CONFIG_USB_SERIAL_BELKIN is not set | ||
1109 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
1110 | # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set | ||
1111 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
1112 | # CONFIG_USB_SERIAL_CYPRESS_M8 is not set | ||
1113 | # CONFIG_USB_SERIAL_EMPEG is not set | ||
1114 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
1115 | # CONFIG_USB_SERIAL_VISOR is not set | ||
1116 | # CONFIG_USB_SERIAL_IPAQ is not set | ||
1117 | # CONFIG_USB_SERIAL_IR is not set | ||
1118 | # CONFIG_USB_SERIAL_EDGEPORT is not set | ||
1119 | # CONFIG_USB_SERIAL_EDGEPORT_TI is not set | ||
1120 | # CONFIG_USB_SERIAL_GARMIN is not set | ||
1121 | # CONFIG_USB_SERIAL_IPW is not set | ||
1122 | # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set | ||
1123 | # CONFIG_USB_SERIAL_KEYSPAN is not set | ||
1124 | # CONFIG_USB_SERIAL_KLSI is not set | ||
1125 | # CONFIG_USB_SERIAL_KOBIL_SCT is not set | ||
1126 | # CONFIG_USB_SERIAL_MCT_U232 is not set | ||
1127 | CONFIG_USB_SERIAL_PL2303=m | ||
1128 | # CONFIG_USB_SERIAL_HP4X is not set | ||
1129 | # CONFIG_USB_SERIAL_SAFE is not set | ||
1130 | # CONFIG_USB_SERIAL_TI is not set | ||
1131 | # CONFIG_USB_SERIAL_CYBERJACK is not set | ||
1132 | # CONFIG_USB_SERIAL_XIRCOM is not set | ||
1133 | # CONFIG_USB_SERIAL_OPTION is not set | ||
1134 | # CONFIG_USB_SERIAL_OMNINET is not set | ||
1135 | |||
1136 | # | ||
1137 | # USB Miscellaneous drivers | ||
1138 | # | ||
1139 | CONFIG_USB_EMI62=m | ||
1140 | CONFIG_USB_EMI26=m | ||
1141 | # CONFIG_USB_AUERSWALD is not set | ||
1142 | # CONFIG_USB_RIO500 is not set | ||
1143 | # CONFIG_USB_LEGOTOWER is not set | ||
1144 | # CONFIG_USB_LCD is not set | ||
1145 | # CONFIG_USB_LED is not set | ||
1146 | # CONFIG_USB_CYTHERM is not set | ||
1147 | # CONFIG_USB_PHIDGETKIT is not set | ||
1148 | # CONFIG_USB_PHIDGETSERVO is not set | ||
1149 | # CONFIG_USB_IDMOUSE is not set | ||
1150 | CONFIG_USB_SISUSBVGA=m | ||
1151 | CONFIG_USB_SISUSBVGA_CON=y | ||
1152 | # CONFIG_USB_LD is not set | ||
1153 | # CONFIG_USB_TEST is not set | ||
1154 | |||
1155 | # | ||
1156 | # USB DSL modem support | ||
1157 | # | ||
1158 | |||
1159 | # | ||
1160 | # USB Gadget Support | ||
1161 | # | ||
1162 | # CONFIG_USB_GADGET is not set | ||
1163 | |||
1164 | # | ||
1165 | # MMC/SD Card support | ||
1166 | # | ||
1167 | # CONFIG_MMC is not set | ||
1168 | |||
1169 | # | ||
1170 | # InfiniBand support | ||
1171 | # | ||
1172 | # CONFIG_INFINIBAND is not set | ||
1173 | |||
1174 | # | ||
1175 | # SN Devices | ||
1176 | # | ||
1177 | |||
1178 | # | ||
1179 | # File systems | ||
1180 | # | ||
1181 | CONFIG_EXT2_FS=y | ||
1182 | # CONFIG_EXT2_FS_XATTR is not set | ||
1183 | # CONFIG_EXT2_FS_XIP is not set | ||
1184 | CONFIG_EXT3_FS=y | ||
1185 | CONFIG_EXT3_FS_XATTR=y | ||
1186 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1187 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1188 | CONFIG_JBD=y | ||
1189 | # CONFIG_JBD_DEBUG is not set | ||
1190 | CONFIG_FS_MBCACHE=y | ||
1191 | CONFIG_REISERFS_FS=y | ||
1192 | # CONFIG_REISERFS_CHECK is not set | ||
1193 | # CONFIG_REISERFS_PROC_INFO is not set | ||
1194 | # CONFIG_REISERFS_FS_XATTR is not set | ||
1195 | # CONFIG_JFS_FS is not set | ||
1196 | # CONFIG_FS_POSIX_ACL is not set | ||
1197 | # CONFIG_XFS_FS is not set | ||
1198 | # CONFIG_MINIX_FS is not set | ||
1199 | CONFIG_ROMFS_FS=y | ||
1200 | CONFIG_INOTIFY=y | ||
1201 | # CONFIG_QUOTA is not set | ||
1202 | CONFIG_DNOTIFY=y | ||
1203 | # CONFIG_AUTOFS_FS is not set | ||
1204 | # CONFIG_AUTOFS4_FS is not set | ||
1205 | # CONFIG_FUSE_FS is not set | ||
1206 | |||
1207 | # | ||
1208 | # CD-ROM/DVD Filesystems | ||
1209 | # | ||
1210 | CONFIG_ISO9660_FS=m | ||
1211 | # CONFIG_JOLIET is not set | ||
1212 | # CONFIG_ZISOFS is not set | ||
1213 | # CONFIG_UDF_FS is not set | ||
1214 | |||
1215 | # | ||
1216 | # DOS/FAT/NT Filesystems | ||
1217 | # | ||
1218 | CONFIG_FAT_FS=y | ||
1219 | CONFIG_MSDOS_FS=y | ||
1220 | CONFIG_VFAT_FS=y | ||
1221 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1222 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1223 | CONFIG_NTFS_FS=m | ||
1224 | # CONFIG_NTFS_DEBUG is not set | ||
1225 | CONFIG_NTFS_RW=y | ||
1226 | |||
1227 | # | ||
1228 | # Pseudo filesystems | ||
1229 | # | ||
1230 | CONFIG_PROC_FS=y | ||
1231 | # CONFIG_PROC_KCORE is not set | ||
1232 | CONFIG_SYSFS=y | ||
1233 | CONFIG_TMPFS=y | ||
1234 | # CONFIG_HUGETLBFS is not set | ||
1235 | # CONFIG_HUGETLB_PAGE is not set | ||
1236 | CONFIG_RAMFS=y | ||
1237 | # CONFIG_RELAYFS_FS is not set | ||
1238 | |||
1239 | # | ||
1240 | # Miscellaneous filesystems | ||
1241 | # | ||
1242 | # CONFIG_ADFS_FS is not set | ||
1243 | # CONFIG_AFFS_FS is not set | ||
1244 | # CONFIG_HFS_FS is not set | ||
1245 | # CONFIG_HFSPLUS_FS is not set | ||
1246 | # CONFIG_BEFS_FS is not set | ||
1247 | # CONFIG_BFS_FS is not set | ||
1248 | # CONFIG_EFS_FS is not set | ||
1249 | # CONFIG_CRAMFS is not set | ||
1250 | # CONFIG_VXFS_FS is not set | ||
1251 | # CONFIG_HPFS_FS is not set | ||
1252 | # CONFIG_QNX4FS_FS is not set | ||
1253 | # CONFIG_SYSV_FS is not set | ||
1254 | CONFIG_UFS_FS=m | ||
1255 | CONFIG_UFS_FS_WRITE=y | ||
1256 | |||
1257 | # | ||
1258 | # Network File Systems | ||
1259 | # | ||
1260 | CONFIG_NFS_FS=m | ||
1261 | CONFIG_NFS_V3=y | ||
1262 | # CONFIG_NFS_V3_ACL is not set | ||
1263 | # CONFIG_NFS_V4 is not set | ||
1264 | # CONFIG_NFS_DIRECTIO is not set | ||
1265 | CONFIG_NFSD=m | ||
1266 | CONFIG_NFSD_V3=y | ||
1267 | # CONFIG_NFSD_V3_ACL is not set | ||
1268 | # CONFIG_NFSD_V4 is not set | ||
1269 | CONFIG_NFSD_TCP=y | ||
1270 | CONFIG_LOCKD=m | ||
1271 | CONFIG_LOCKD_V4=y | ||
1272 | CONFIG_EXPORTFS=m | ||
1273 | CONFIG_NFS_COMMON=y | ||
1274 | CONFIG_SUNRPC=m | ||
1275 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
1276 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1277 | CONFIG_SMB_FS=m | ||
1278 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
1279 | # CONFIG_CIFS is not set | ||
1280 | # CONFIG_NCP_FS is not set | ||
1281 | # CONFIG_CODA_FS is not set | ||
1282 | # CONFIG_AFS_FS is not set | ||
1283 | # CONFIG_9P_FS is not set | ||
1284 | |||
1285 | # | ||
1286 | # Partition Types | ||
1287 | # | ||
1288 | # CONFIG_PARTITION_ADVANCED is not set | ||
1289 | CONFIG_MSDOS_PARTITION=y | ||
1290 | |||
1291 | # | ||
1292 | # Native Language Support | ||
1293 | # | ||
1294 | CONFIG_NLS=y | ||
1295 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1296 | CONFIG_NLS_CODEPAGE_437=y | ||
1297 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1298 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1299 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1300 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1301 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1302 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1303 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1304 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1305 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1306 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1307 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1308 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1309 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1310 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1311 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1312 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1313 | CONFIG_NLS_CODEPAGE_932=y | ||
1314 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1315 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1316 | # CONFIG_NLS_ISO8859_8 is not set | ||
1317 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1318 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1319 | # CONFIG_NLS_ASCII is not set | ||
1320 | # CONFIG_NLS_ISO8859_1 is not set | ||
1321 | # CONFIG_NLS_ISO8859_2 is not set | ||
1322 | # CONFIG_NLS_ISO8859_3 is not set | ||
1323 | # CONFIG_NLS_ISO8859_4 is not set | ||
1324 | # CONFIG_NLS_ISO8859_5 is not set | ||
1325 | # CONFIG_NLS_ISO8859_6 is not set | ||
1326 | # CONFIG_NLS_ISO8859_7 is not set | ||
1327 | # CONFIG_NLS_ISO8859_9 is not set | ||
1328 | # CONFIG_NLS_ISO8859_13 is not set | ||
1329 | # CONFIG_NLS_ISO8859_14 is not set | ||
1330 | # CONFIG_NLS_ISO8859_15 is not set | ||
1331 | # CONFIG_NLS_KOI8_R is not set | ||
1332 | # CONFIG_NLS_KOI8_U is not set | ||
1333 | # CONFIG_NLS_UTF8 is not set | ||
1334 | |||
1335 | # | ||
1336 | # Profiling support | ||
1337 | # | ||
1338 | # CONFIG_PROFILING is not set | ||
1339 | |||
1340 | # | ||
1341 | # Kernel hacking | ||
1342 | # | ||
1343 | # CONFIG_PRINTK_TIME is not set | ||
1344 | # CONFIG_DEBUG_KERNEL is not set | ||
1345 | CONFIG_LOG_BUF_SHIFT=14 | ||
1346 | # CONFIG_FRAME_POINTER is not set | ||
1347 | CONFIG_SH_STANDARD_BIOS=y | ||
1348 | # CONFIG_EARLY_SCIF_CONSOLE is not set | ||
1349 | # CONFIG_EARLY_PRINTK is not set | ||
1350 | # CONFIG_KGDB is not set | ||
1351 | |||
1352 | # | ||
1353 | # Security options | ||
1354 | # | ||
1355 | # CONFIG_KEYS is not set | ||
1356 | # CONFIG_SECURITY is not set | ||
1357 | |||
1358 | # | ||
1359 | # Cryptographic options | ||
1360 | # | ||
1361 | # CONFIG_CRYPTO is not set | ||
1362 | |||
1363 | # | ||
1364 | # Hardware crypto devices | ||
1365 | # | ||
1366 | |||
1367 | # | ||
1368 | # Library routines | ||
1369 | # | ||
1370 | # CONFIG_CRC_CCITT is not set | ||
1371 | # CONFIG_CRC16 is not set | ||
1372 | CONFIG_CRC32=y | ||
1373 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/sh/configs/r7780rp_defconfig b/arch/sh/configs/r7780rp_defconfig new file mode 100644 index 000000000000..d597fc571549 --- /dev/null +++ b/arch/sh/configs/r7780rp_defconfig | |||
@@ -0,0 +1,1099 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.15-sh | ||
4 | # Sat Jan 7 19:47:53 2006 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_UID16=y | ||
8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
12 | |||
13 | # | ||
14 | # Code maturity level options | ||
15 | # | ||
16 | CONFIG_EXPERIMENTAL=y | ||
17 | CONFIG_CLEAN_COMPILE=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | CONFIG_LOCK_KERNEL=y | ||
20 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
21 | |||
22 | # | ||
23 | # General setup | ||
24 | # | ||
25 | CONFIG_LOCALVERSION="" | ||
26 | CONFIG_LOCALVERSION_AUTO=y | ||
27 | CONFIG_SWAP=y | ||
28 | CONFIG_SYSVIPC=y | ||
29 | # CONFIG_POSIX_MQUEUE is not set | ||
30 | CONFIG_BSD_PROCESS_ACCT=y | ||
31 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
32 | CONFIG_SYSCTL=y | ||
33 | # CONFIG_AUDIT is not set | ||
34 | CONFIG_HOTPLUG=y | ||
35 | CONFIG_KOBJECT_UEVENT=y | ||
36 | CONFIG_IKCONFIG=y | ||
37 | CONFIG_IKCONFIG_PROC=y | ||
38 | CONFIG_INITRAMFS_SOURCE="" | ||
39 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
40 | CONFIG_EMBEDDED=y | ||
41 | CONFIG_KALLSYMS=y | ||
42 | # CONFIG_KALLSYMS_ALL is not set | ||
43 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
44 | CONFIG_PRINTK=y | ||
45 | CONFIG_BUG=y | ||
46 | CONFIG_BASE_FULL=y | ||
47 | # CONFIG_FUTEX is not set | ||
48 | # CONFIG_EPOLL is not set | ||
49 | CONFIG_SHMEM=y | ||
50 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
51 | CONFIG_CC_ALIGN_LABELS=0 | ||
52 | CONFIG_CC_ALIGN_LOOPS=0 | ||
53 | CONFIG_CC_ALIGN_JUMPS=0 | ||
54 | # CONFIG_TINY_SHMEM is not set | ||
55 | CONFIG_BASE_SMALL=0 | ||
56 | |||
57 | # | ||
58 | # Loadable module support | ||
59 | # | ||
60 | CONFIG_MODULES=y | ||
61 | CONFIG_MODULE_UNLOAD=y | ||
62 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
63 | CONFIG_OBSOLETE_MODPARM=y | ||
64 | # CONFIG_MODVERSIONS is not set | ||
65 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
66 | CONFIG_KMOD=y | ||
67 | |||
68 | # | ||
69 | # Block layer | ||
70 | # | ||
71 | # CONFIG_LBD is not set | ||
72 | |||
73 | # | ||
74 | # IO Schedulers | ||
75 | # | ||
76 | CONFIG_IOSCHED_NOOP=y | ||
77 | # CONFIG_IOSCHED_AS is not set | ||
78 | # CONFIG_IOSCHED_DEADLINE is not set | ||
79 | # CONFIG_IOSCHED_CFQ is not set | ||
80 | # CONFIG_DEFAULT_AS is not set | ||
81 | # CONFIG_DEFAULT_DEADLINE is not set | ||
82 | # CONFIG_DEFAULT_CFQ is not set | ||
83 | CONFIG_DEFAULT_NOOP=y | ||
84 | CONFIG_DEFAULT_IOSCHED="noop" | ||
85 | |||
86 | # | ||
87 | # System type | ||
88 | # | ||
89 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
90 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
91 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
92 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
93 | # CONFIG_SH_7751_SYSTEMH is not set | ||
94 | # CONFIG_SH_STB1_HARP is not set | ||
95 | # CONFIG_SH_STB1_OVERDRIVE is not set | ||
96 | # CONFIG_SH_HP6XX is not set | ||
97 | # CONFIG_SH_CQREEK is not set | ||
98 | # CONFIG_SH_DMIDA is not set | ||
99 | # CONFIG_SH_EC3104 is not set | ||
100 | # CONFIG_SH_SATURN is not set | ||
101 | # CONFIG_SH_DREAMCAST is not set | ||
102 | # CONFIG_SH_CAT68701 is not set | ||
103 | # CONFIG_SH_BIGSUR is not set | ||
104 | # CONFIG_SH_SH2000 is not set | ||
105 | # CONFIG_SH_ADX is not set | ||
106 | # CONFIG_SH_MPC1211 is not set | ||
107 | # CONFIG_SH_SH03 is not set | ||
108 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
109 | # CONFIG_SH_HS7751RVOIP is not set | ||
110 | # CONFIG_SH_RTS7751R2D is not set | ||
111 | # CONFIG_SH_R77703DRP is not set | ||
112 | CONFIG_SH_R7780RP=y | ||
113 | # CONFIG_SH_EDOSK7705 is not set | ||
114 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
115 | # CONFIG_SH_LANDISK is not set | ||
116 | # CONFIG_SH_TITAN is not set | ||
117 | # CONFIG_SH_UNKNOWN is not set | ||
118 | |||
119 | # | ||
120 | # Processor selection | ||
121 | # | ||
122 | CONFIG_CPU_SH4=y | ||
123 | CONFIG_CPU_SH4A=y | ||
124 | |||
125 | # | ||
126 | # SH-2 Processor Support | ||
127 | # | ||
128 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
129 | |||
130 | # | ||
131 | # SH-3 Processor Support | ||
132 | # | ||
133 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
134 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
135 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
136 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
137 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
138 | |||
139 | # | ||
140 | # SH-4 Processor Support | ||
141 | # | ||
142 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
143 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
144 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
145 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
146 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
147 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
148 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
149 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
150 | |||
151 | # | ||
152 | # ST40 Processor Support | ||
153 | # | ||
154 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
156 | |||
157 | # | ||
158 | # SH-4A Processor Support | ||
159 | # | ||
160 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
161 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
162 | CONFIG_CPU_SUBTYPE_SH7780=y | ||
163 | |||
164 | # | ||
165 | # Memory management options | ||
166 | # | ||
167 | CONFIG_MMU=y | ||
168 | CONFIG_32BIT=y | ||
169 | CONFIG_HUGETLB_PAGE_SIZE_64K=y | ||
170 | # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set | ||
171 | CONFIG_SELECT_MEMORY_MODEL=y | ||
172 | CONFIG_FLATMEM_MANUAL=y | ||
173 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
174 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
175 | CONFIG_FLATMEM=y | ||
176 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
177 | # CONFIG_SPARSEMEM_STATIC is not set | ||
178 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
179 | |||
180 | # | ||
181 | # Cache configuration | ||
182 | # | ||
183 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
184 | # CONFIG_SH_WRITETHROUGH is not set | ||
185 | # CONFIG_SH_OCRAM is not set | ||
186 | CONFIG_MEMORY_START=0x08000000 | ||
187 | CONFIG_MEMORY_SIZE=0x08000000 | ||
188 | |||
189 | # | ||
190 | # Processor features | ||
191 | # | ||
192 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
193 | CONFIG_SH_FPU=y | ||
194 | CONFIG_SH_STORE_QUEUES=y | ||
195 | |||
196 | # | ||
197 | # Timer support | ||
198 | # | ||
199 | CONFIG_SH_TMU=y | ||
200 | CONFIG_SH_PCLK_FREQ_BOOL=y | ||
201 | CONFIG_SH_PCLK_FREQ=32000000 | ||
202 | |||
203 | # | ||
204 | # CPU Frequency scaling | ||
205 | # | ||
206 | # CONFIG_CPU_FREQ is not set | ||
207 | |||
208 | # | ||
209 | # DMA support | ||
210 | # | ||
211 | CONFIG_SH_DMA=y | ||
212 | CONFIG_NR_ONCHIP_DMA_CHANNELS=6 | ||
213 | # CONFIG_NR_DMA_CHANNELS_BOOL is not set | ||
214 | |||
215 | # | ||
216 | # Companion Chips | ||
217 | # | ||
218 | # CONFIG_HD6446X_SERIES is not set | ||
219 | |||
220 | # | ||
221 | # Kernel features | ||
222 | # | ||
223 | # CONFIG_KEXEC is not set | ||
224 | CONFIG_PREEMPT=y | ||
225 | # CONFIG_SMP is not set | ||
226 | CONFIG_CPU_HAS_INTEVT=y | ||
227 | CONFIG_CPU_HAS_INTC2_IRQ=y | ||
228 | |||
229 | # | ||
230 | # Boot options | ||
231 | # | ||
232 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
233 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
234 | # CONFIG_UBC_WAKEUP is not set | ||
235 | CONFIG_CMDLINE_BOOL=y | ||
236 | CONFIG_CMDLINE="mem=128M console=ttySC0,115200 root=/dev/hda1" | ||
237 | |||
238 | # | ||
239 | # Bus options | ||
240 | # | ||
241 | CONFIG_PCI=y | ||
242 | CONFIG_SH_PCIDMA_NONCOHERENT=y | ||
243 | CONFIG_PCI_AUTO=y | ||
244 | CONFIG_PCI_AUTO_UPDATE_RESOURCES=y | ||
245 | CONFIG_PCI_LEGACY_PROC=y | ||
246 | # CONFIG_PCI_DEBUG is not set | ||
247 | |||
248 | # | ||
249 | # PCCARD (PCMCIA/CardBus) support | ||
250 | # | ||
251 | # CONFIG_PCCARD is not set | ||
252 | |||
253 | # | ||
254 | # PCI Hotplug Support | ||
255 | # | ||
256 | CONFIG_HOTPLUG_PCI=y | ||
257 | # CONFIG_HOTPLUG_PCI_FAKE is not set | ||
258 | # CONFIG_HOTPLUG_PCI_CPCI is not set | ||
259 | # CONFIG_HOTPLUG_PCI_SHPC is not set | ||
260 | |||
261 | # | ||
262 | # Executable file formats | ||
263 | # | ||
264 | CONFIG_BINFMT_ELF=y | ||
265 | # CONFIG_BINFMT_FLAT is not set | ||
266 | # CONFIG_BINFMT_MISC is not set | ||
267 | |||
268 | # | ||
269 | # Networking | ||
270 | # | ||
271 | CONFIG_NET=y | ||
272 | |||
273 | # | ||
274 | # Networking options | ||
275 | # | ||
276 | CONFIG_PACKET=y | ||
277 | # CONFIG_PACKET_MMAP is not set | ||
278 | CONFIG_UNIX=y | ||
279 | # CONFIG_NET_KEY is not set | ||
280 | CONFIG_INET=y | ||
281 | # CONFIG_IP_MULTICAST is not set | ||
282 | CONFIG_IP_ADVANCED_ROUTER=y | ||
283 | CONFIG_ASK_IP_FIB_HASH=y | ||
284 | # CONFIG_IP_FIB_TRIE is not set | ||
285 | CONFIG_IP_FIB_HASH=y | ||
286 | # CONFIG_IP_MULTIPLE_TABLES is not set | ||
287 | # CONFIG_IP_ROUTE_MULTIPATH is not set | ||
288 | # CONFIG_IP_ROUTE_VERBOSE is not set | ||
289 | CONFIG_IP_PNP=y | ||
290 | CONFIG_IP_PNP_DHCP=y | ||
291 | # CONFIG_IP_PNP_BOOTP is not set | ||
292 | # CONFIG_IP_PNP_RARP is not set | ||
293 | # CONFIG_NET_IPIP is not set | ||
294 | # CONFIG_NET_IPGRE is not set | ||
295 | # CONFIG_ARPD is not set | ||
296 | # CONFIG_SYN_COOKIES is not set | ||
297 | # CONFIG_INET_AH is not set | ||
298 | # CONFIG_INET_ESP is not set | ||
299 | # CONFIG_INET_IPCOMP is not set | ||
300 | # CONFIG_INET_TUNNEL is not set | ||
301 | CONFIG_INET_DIAG=y | ||
302 | CONFIG_INET_TCP_DIAG=y | ||
303 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
304 | CONFIG_TCP_CONG_BIC=y | ||
305 | # CONFIG_IPV6 is not set | ||
306 | # CONFIG_NETFILTER is not set | ||
307 | |||
308 | # | ||
309 | # DCCP Configuration (EXPERIMENTAL) | ||
310 | # | ||
311 | # CONFIG_IP_DCCP is not set | ||
312 | |||
313 | # | ||
314 | # SCTP Configuration (EXPERIMENTAL) | ||
315 | # | ||
316 | # CONFIG_IP_SCTP is not set | ||
317 | # CONFIG_ATM is not set | ||
318 | CONFIG_BRIDGE=m | ||
319 | # CONFIG_VLAN_8021Q is not set | ||
320 | # CONFIG_DECNET is not set | ||
321 | # CONFIG_LLC2 is not set | ||
322 | # CONFIG_IPX is not set | ||
323 | # CONFIG_ATALK is not set | ||
324 | # CONFIG_X25 is not set | ||
325 | # CONFIG_LAPB is not set | ||
326 | # CONFIG_NET_DIVERT is not set | ||
327 | # CONFIG_ECONET is not set | ||
328 | # CONFIG_WAN_ROUTER is not set | ||
329 | |||
330 | # | ||
331 | # QoS and/or fair queueing | ||
332 | # | ||
333 | # CONFIG_NET_SCHED is not set | ||
334 | |||
335 | # | ||
336 | # Network testing | ||
337 | # | ||
338 | # CONFIG_NET_PKTGEN is not set | ||
339 | # CONFIG_HAMRADIO is not set | ||
340 | # CONFIG_IRDA is not set | ||
341 | # CONFIG_BT is not set | ||
342 | # CONFIG_IEEE80211 is not set | ||
343 | |||
344 | # | ||
345 | # Device Drivers | ||
346 | # | ||
347 | |||
348 | # | ||
349 | # Generic Driver Options | ||
350 | # | ||
351 | CONFIG_STANDALONE=y | ||
352 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
353 | CONFIG_FW_LOADER=m | ||
354 | # CONFIG_DEBUG_DRIVER is not set | ||
355 | |||
356 | # | ||
357 | # Connector - unified userspace <-> kernelspace linker | ||
358 | # | ||
359 | # CONFIG_CONNECTOR is not set | ||
360 | |||
361 | # | ||
362 | # Memory Technology Devices (MTD) | ||
363 | # | ||
364 | # CONFIG_MTD is not set | ||
365 | |||
366 | # | ||
367 | # Parallel port support | ||
368 | # | ||
369 | # CONFIG_PARPORT is not set | ||
370 | |||
371 | # | ||
372 | # Plug and Play support | ||
373 | # | ||
374 | |||
375 | # | ||
376 | # Block devices | ||
377 | # | ||
378 | # CONFIG_BLK_CPQ_DA is not set | ||
379 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
380 | # CONFIG_BLK_DEV_DAC960 is not set | ||
381 | # CONFIG_BLK_DEV_UMEM is not set | ||
382 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
383 | # CONFIG_BLK_DEV_LOOP is not set | ||
384 | # CONFIG_BLK_DEV_NBD is not set | ||
385 | # CONFIG_BLK_DEV_SX8 is not set | ||
386 | CONFIG_BLK_DEV_RAM=y | ||
387 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
388 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
389 | # CONFIG_BLK_DEV_INITRD is not set | ||
390 | # CONFIG_CDROM_PKTCDVD is not set | ||
391 | # CONFIG_ATA_OVER_ETH is not set | ||
392 | |||
393 | # | ||
394 | # ATA/ATAPI/MFM/RLL support | ||
395 | # | ||
396 | CONFIG_IDE=m | ||
397 | CONFIG_IDE_MAX_HWIFS=4 | ||
398 | CONFIG_BLK_DEV_IDE=m | ||
399 | |||
400 | # | ||
401 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
402 | # | ||
403 | CONFIG_BLK_DEV_IDE_SATA=y | ||
404 | CONFIG_BLK_DEV_IDEDISK=m | ||
405 | CONFIG_IDEDISK_MULTI_MODE=y | ||
406 | # CONFIG_BLK_DEV_IDECD is not set | ||
407 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
408 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
409 | CONFIG_BLK_DEV_IDESCSI=m | ||
410 | # CONFIG_IDE_TASK_IOCTL is not set | ||
411 | |||
412 | # | ||
413 | # IDE chipset support/bugfixes | ||
414 | # | ||
415 | CONFIG_IDE_GENERIC=m | ||
416 | CONFIG_BLK_DEV_IDEPCI=y | ||
417 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
418 | # CONFIG_BLK_DEV_OFFBOARD is not set | ||
419 | CONFIG_BLK_DEV_GENERIC=m | ||
420 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
421 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
422 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | ||
423 | CONFIG_IDEDMA_PCI_AUTO=y | ||
424 | # CONFIG_IDEDMA_ONLYDISK is not set | ||
425 | CONFIG_BLK_DEV_AEC62XX=m | ||
426 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
427 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
428 | # CONFIG_BLK_DEV_CMD64X is not set | ||
429 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
430 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
431 | # CONFIG_BLK_DEV_CS5520 is not set | ||
432 | # CONFIG_BLK_DEV_CS5530 is not set | ||
433 | # CONFIG_BLK_DEV_HPT34X is not set | ||
434 | # CONFIG_BLK_DEV_HPT366 is not set | ||
435 | # CONFIG_BLK_DEV_SC1200 is not set | ||
436 | # CONFIG_BLK_DEV_PIIX is not set | ||
437 | # CONFIG_BLK_DEV_IT821X is not set | ||
438 | # CONFIG_BLK_DEV_NS87415 is not set | ||
439 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
440 | CONFIG_BLK_DEV_PDC202XX_NEW=m | ||
441 | # CONFIG_PDC202XX_FORCE is not set | ||
442 | # CONFIG_BLK_DEV_SVWKS is not set | ||
443 | CONFIG_BLK_DEV_SIIMAGE=m | ||
444 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
445 | # CONFIG_BLK_DEV_TRM290 is not set | ||
446 | # CONFIG_BLK_DEV_VIA82CXXX is not set | ||
447 | CONFIG_IDE_SH=y | ||
448 | # CONFIG_IDE_ARM is not set | ||
449 | CONFIG_BLK_DEV_IDEDMA=y | ||
450 | # CONFIG_IDEDMA_IVB is not set | ||
451 | CONFIG_IDEDMA_AUTO=y | ||
452 | # CONFIG_BLK_DEV_HD is not set | ||
453 | |||
454 | # | ||
455 | # SCSI device support | ||
456 | # | ||
457 | # CONFIG_RAID_ATTRS is not set | ||
458 | CONFIG_SCSI=m | ||
459 | CONFIG_SCSI_PROC_FS=y | ||
460 | |||
461 | # | ||
462 | # SCSI support type (disk, tape, CD-ROM) | ||
463 | # | ||
464 | CONFIG_BLK_DEV_SD=m | ||
465 | # CONFIG_CHR_DEV_ST is not set | ||
466 | # CONFIG_CHR_DEV_OSST is not set | ||
467 | # CONFIG_BLK_DEV_SR is not set | ||
468 | CONFIG_CHR_DEV_SG=m | ||
469 | # CONFIG_CHR_DEV_SCH is not set | ||
470 | |||
471 | # | ||
472 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
473 | # | ||
474 | # CONFIG_SCSI_MULTI_LUN is not set | ||
475 | # CONFIG_SCSI_CONSTANTS is not set | ||
476 | # CONFIG_SCSI_LOGGING is not set | ||
477 | |||
478 | # | ||
479 | # SCSI Transport Attributes | ||
480 | # | ||
481 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
482 | # CONFIG_SCSI_FC_ATTRS is not set | ||
483 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
484 | # CONFIG_SCSI_SAS_ATTRS is not set | ||
485 | |||
486 | # | ||
487 | # SCSI low-level drivers | ||
488 | # | ||
489 | # CONFIG_ISCSI_TCP is not set | ||
490 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
491 | # CONFIG_SCSI_3W_9XXX is not set | ||
492 | # CONFIG_SCSI_ACARD is not set | ||
493 | # CONFIG_SCSI_AACRAID is not set | ||
494 | # CONFIG_SCSI_AIC7XXX is not set | ||
495 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
496 | # CONFIG_SCSI_AIC79XX is not set | ||
497 | # CONFIG_SCSI_DPT_I2O is not set | ||
498 | # CONFIG_MEGARAID_NEWGEN is not set | ||
499 | # CONFIG_MEGARAID_LEGACY is not set | ||
500 | # CONFIG_MEGARAID_SAS is not set | ||
501 | # CONFIG_SCSI_SATA is not set | ||
502 | # CONFIG_SCSI_DMX3191D is not set | ||
503 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
504 | # CONFIG_SCSI_IPS is not set | ||
505 | # CONFIG_SCSI_INITIO is not set | ||
506 | # CONFIG_SCSI_INIA100 is not set | ||
507 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
508 | # CONFIG_SCSI_IPR is not set | ||
509 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
510 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
511 | CONFIG_SCSI_QLA2XXX=m | ||
512 | # CONFIG_SCSI_QLA21XX is not set | ||
513 | # CONFIG_SCSI_QLA22XX is not set | ||
514 | # CONFIG_SCSI_QLA2300 is not set | ||
515 | # CONFIG_SCSI_QLA2322 is not set | ||
516 | # CONFIG_SCSI_QLA6312 is not set | ||
517 | # CONFIG_SCSI_QLA24XX is not set | ||
518 | # CONFIG_SCSI_LPFC is not set | ||
519 | # CONFIG_SCSI_DC395x is not set | ||
520 | # CONFIG_SCSI_DC390T is not set | ||
521 | # CONFIG_SCSI_NSP32 is not set | ||
522 | # CONFIG_SCSI_DEBUG is not set | ||
523 | |||
524 | # | ||
525 | # Multi-device support (RAID and LVM) | ||
526 | # | ||
527 | # CONFIG_MD is not set | ||
528 | |||
529 | # | ||
530 | # Fusion MPT device support | ||
531 | # | ||
532 | # CONFIG_FUSION is not set | ||
533 | # CONFIG_FUSION_SPI is not set | ||
534 | # CONFIG_FUSION_FC is not set | ||
535 | # CONFIG_FUSION_SAS is not set | ||
536 | |||
537 | # | ||
538 | # IEEE 1394 (FireWire) support | ||
539 | # | ||
540 | # CONFIG_IEEE1394 is not set | ||
541 | |||
542 | # | ||
543 | # I2O device support | ||
544 | # | ||
545 | # CONFIG_I2O is not set | ||
546 | |||
547 | # | ||
548 | # Network device support | ||
549 | # | ||
550 | CONFIG_NETDEVICES=y | ||
551 | # CONFIG_DUMMY is not set | ||
552 | # CONFIG_BONDING is not set | ||
553 | # CONFIG_EQUALIZER is not set | ||
554 | # CONFIG_TUN is not set | ||
555 | |||
556 | # | ||
557 | # ARCnet devices | ||
558 | # | ||
559 | # CONFIG_ARCNET is not set | ||
560 | |||
561 | # | ||
562 | # PHY device support | ||
563 | # | ||
564 | # CONFIG_PHYLIB is not set | ||
565 | |||
566 | # | ||
567 | # Ethernet (10 or 100Mbit) | ||
568 | # | ||
569 | CONFIG_NET_ETHERNET=y | ||
570 | CONFIG_MII=y | ||
571 | # CONFIG_STNIC is not set | ||
572 | # CONFIG_HAPPYMEAL is not set | ||
573 | # CONFIG_SUNGEM is not set | ||
574 | # CONFIG_CASSINI is not set | ||
575 | # CONFIG_NET_VENDOR_3COM is not set | ||
576 | # CONFIG_SMC91X is not set | ||
577 | |||
578 | # | ||
579 | # Tulip family network device support | ||
580 | # | ||
581 | # CONFIG_NET_TULIP is not set | ||
582 | # CONFIG_HP100 is not set | ||
583 | CONFIG_NE2000=y | ||
584 | CONFIG_NET_PCI=y | ||
585 | CONFIG_PCNET32=m | ||
586 | # CONFIG_AMD8111_ETH is not set | ||
587 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
588 | # CONFIG_B44 is not set | ||
589 | # CONFIG_FORCEDETH is not set | ||
590 | # CONFIG_DGRS is not set | ||
591 | # CONFIG_EEPRO100 is not set | ||
592 | # CONFIG_E100 is not set | ||
593 | # CONFIG_FEALNX is not set | ||
594 | # CONFIG_NATSEMI is not set | ||
595 | # CONFIG_NE2K_PCI is not set | ||
596 | CONFIG_8139CP=m | ||
597 | CONFIG_8139TOO=m | ||
598 | # CONFIG_8139TOO_PIO is not set | ||
599 | # CONFIG_8139TOO_TUNE_TWISTER is not set | ||
600 | CONFIG_8139TOO_8129=y | ||
601 | # CONFIG_8139_OLD_RX_RESET is not set | ||
602 | # CONFIG_SIS900 is not set | ||
603 | # CONFIG_EPIC100 is not set | ||
604 | # CONFIG_SUNDANCE is not set | ||
605 | # CONFIG_TLAN is not set | ||
606 | CONFIG_VIA_RHINE=m | ||
607 | CONFIG_VIA_RHINE_MMIO=y | ||
608 | |||
609 | # | ||
610 | # Ethernet (1000 Mbit) | ||
611 | # | ||
612 | # CONFIG_ACENIC is not set | ||
613 | # CONFIG_DL2K is not set | ||
614 | CONFIG_E1000=m | ||
615 | # CONFIG_E1000_NAPI is not set | ||
616 | # CONFIG_NS83820 is not set | ||
617 | # CONFIG_HAMACHI is not set | ||
618 | # CONFIG_YELLOWFIN is not set | ||
619 | CONFIG_R8169=y | ||
620 | # CONFIG_R8169_NAPI is not set | ||
621 | # CONFIG_SIS190 is not set | ||
622 | # CONFIG_SKGE is not set | ||
623 | # CONFIG_SK98LIN is not set | ||
624 | # CONFIG_VIA_VELOCITY is not set | ||
625 | # CONFIG_TIGON3 is not set | ||
626 | # CONFIG_BNX2 is not set | ||
627 | |||
628 | # | ||
629 | # Ethernet (10000 Mbit) | ||
630 | # | ||
631 | # CONFIG_CHELSIO_T1 is not set | ||
632 | # CONFIG_IXGB is not set | ||
633 | # CONFIG_S2IO is not set | ||
634 | |||
635 | # | ||
636 | # Token Ring devices | ||
637 | # | ||
638 | # CONFIG_TR is not set | ||
639 | |||
640 | # | ||
641 | # Wireless LAN (non-hamradio) | ||
642 | # | ||
643 | CONFIG_NET_RADIO=y | ||
644 | |||
645 | # | ||
646 | # Obsolete Wireless cards support (pre-802.11) | ||
647 | # | ||
648 | # CONFIG_STRIP is not set | ||
649 | |||
650 | # | ||
651 | # Wireless 802.11b ISA/PCI cards support | ||
652 | # | ||
653 | CONFIG_HERMES=m | ||
654 | # CONFIG_PLX_HERMES is not set | ||
655 | # CONFIG_TMD_HERMES is not set | ||
656 | # CONFIG_NORTEL_HERMES is not set | ||
657 | # CONFIG_PCI_HERMES is not set | ||
658 | # CONFIG_ATMEL is not set | ||
659 | |||
660 | # | ||
661 | # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support | ||
662 | # | ||
663 | CONFIG_PRISM54=m | ||
664 | # CONFIG_HOSTAP is not set | ||
665 | CONFIG_NET_WIRELESS=y | ||
666 | |||
667 | # | ||
668 | # Wan interfaces | ||
669 | # | ||
670 | # CONFIG_WAN is not set | ||
671 | # CONFIG_FDDI is not set | ||
672 | # CONFIG_HIPPI is not set | ||
673 | # CONFIG_PPP is not set | ||
674 | # CONFIG_SLIP is not set | ||
675 | # CONFIG_NET_FC is not set | ||
676 | # CONFIG_SHAPER is not set | ||
677 | # CONFIG_NETCONSOLE is not set | ||
678 | # CONFIG_NETPOLL is not set | ||
679 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
680 | |||
681 | # | ||
682 | # ISDN subsystem | ||
683 | # | ||
684 | # CONFIG_ISDN is not set | ||
685 | |||
686 | # | ||
687 | # Telephony Support | ||
688 | # | ||
689 | # CONFIG_PHONE is not set | ||
690 | |||
691 | # | ||
692 | # Input device support | ||
693 | # | ||
694 | CONFIG_INPUT=y | ||
695 | |||
696 | # | ||
697 | # Userland interfaces | ||
698 | # | ||
699 | CONFIG_INPUT_MOUSEDEV=y | ||
700 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
701 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
702 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
703 | # CONFIG_INPUT_JOYDEV is not set | ||
704 | # CONFIG_INPUT_TSDEV is not set | ||
705 | # CONFIG_INPUT_EVDEV is not set | ||
706 | # CONFIG_INPUT_EVBUG is not set | ||
707 | |||
708 | # | ||
709 | # Input Device Drivers | ||
710 | # | ||
711 | CONFIG_INPUT_KEYBOARD=y | ||
712 | CONFIG_KEYBOARD_ATKBD=y | ||
713 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
714 | # CONFIG_KEYBOARD_LKKBD is not set | ||
715 | # CONFIG_KEYBOARD_XTKBD is not set | ||
716 | # CONFIG_KEYBOARD_NEWTON is not set | ||
717 | # CONFIG_INPUT_MOUSE is not set | ||
718 | # CONFIG_INPUT_JOYSTICK is not set | ||
719 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
720 | # CONFIG_INPUT_MISC is not set | ||
721 | |||
722 | # | ||
723 | # Hardware I/O ports | ||
724 | # | ||
725 | CONFIG_SERIO=y | ||
726 | # CONFIG_SERIO_I8042 is not set | ||
727 | # CONFIG_SERIO_SERPORT is not set | ||
728 | # CONFIG_SERIO_PCIPS2 is not set | ||
729 | CONFIG_SERIO_LIBPS2=y | ||
730 | # CONFIG_SERIO_RAW is not set | ||
731 | # CONFIG_GAMEPORT is not set | ||
732 | |||
733 | # | ||
734 | # Character devices | ||
735 | # | ||
736 | # CONFIG_VT is not set | ||
737 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
738 | |||
739 | # | ||
740 | # Serial drivers | ||
741 | # | ||
742 | # CONFIG_SERIAL_8250 is not set | ||
743 | |||
744 | # | ||
745 | # Non-8250 serial port support | ||
746 | # | ||
747 | CONFIG_SERIAL_SH_SCI=y | ||
748 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
749 | CONFIG_SERIAL_CORE=y | ||
750 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
751 | # CONFIG_SERIAL_JSM is not set | ||
752 | CONFIG_UNIX98_PTYS=y | ||
753 | CONFIG_LEGACY_PTYS=y | ||
754 | CONFIG_LEGACY_PTY_COUNT=256 | ||
755 | |||
756 | # | ||
757 | # IPMI | ||
758 | # | ||
759 | # CONFIG_IPMI_HANDLER is not set | ||
760 | |||
761 | # | ||
762 | # Watchdog Cards | ||
763 | # | ||
764 | # CONFIG_WATCHDOG is not set | ||
765 | # CONFIG_RTC is not set | ||
766 | # CONFIG_GEN_RTC is not set | ||
767 | # CONFIG_DTLK is not set | ||
768 | # CONFIG_R3964 is not set | ||
769 | # CONFIG_APPLICOM is not set | ||
770 | |||
771 | # | ||
772 | # Ftape, the floppy tape device driver | ||
773 | # | ||
774 | # CONFIG_DRM is not set | ||
775 | # CONFIG_RAW_DRIVER is not set | ||
776 | |||
777 | # | ||
778 | # TPM devices | ||
779 | # | ||
780 | # CONFIG_TCG_TPM is not set | ||
781 | # CONFIG_TELCLOCK is not set | ||
782 | |||
783 | # | ||
784 | # I2C support | ||
785 | # | ||
786 | # CONFIG_I2C is not set | ||
787 | |||
788 | # | ||
789 | # Dallas's 1-wire bus | ||
790 | # | ||
791 | # CONFIG_W1 is not set | ||
792 | |||
793 | # | ||
794 | # Hardware Monitoring support | ||
795 | # | ||
796 | CONFIG_HWMON=y | ||
797 | # CONFIG_HWMON_VID is not set | ||
798 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
799 | |||
800 | # | ||
801 | # Misc devices | ||
802 | # | ||
803 | |||
804 | # | ||
805 | # Multimedia Capabilities Port drivers | ||
806 | # | ||
807 | |||
808 | # | ||
809 | # Multimedia devices | ||
810 | # | ||
811 | # CONFIG_VIDEO_DEV is not set | ||
812 | |||
813 | # | ||
814 | # Digital Video Broadcasting Devices | ||
815 | # | ||
816 | # CONFIG_DVB is not set | ||
817 | |||
818 | # | ||
819 | # Graphics support | ||
820 | # | ||
821 | # CONFIG_FB is not set | ||
822 | |||
823 | # | ||
824 | # Sound | ||
825 | # | ||
826 | CONFIG_SOUND=m | ||
827 | |||
828 | # | ||
829 | # Advanced Linux Sound Architecture | ||
830 | # | ||
831 | # CONFIG_SND is not set | ||
832 | |||
833 | # | ||
834 | # Open Sound System | ||
835 | # | ||
836 | CONFIG_SOUND_PRIME=m | ||
837 | # CONFIG_OBSOLETE_OSS_DRIVER is not set | ||
838 | # CONFIG_SOUND_FUSION is not set | ||
839 | # CONFIG_SOUND_ICH is not set | ||
840 | # CONFIG_SOUND_TRIDENT is not set | ||
841 | # CONFIG_SOUND_MSNDCLAS is not set | ||
842 | # CONFIG_SOUND_MSNDPIN is not set | ||
843 | |||
844 | # | ||
845 | # USB support | ||
846 | # | ||
847 | CONFIG_USB_ARCH_HAS_HCD=y | ||
848 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
849 | # CONFIG_USB is not set | ||
850 | |||
851 | # | ||
852 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
853 | # | ||
854 | |||
855 | # | ||
856 | # USB Gadget Support | ||
857 | # | ||
858 | # CONFIG_USB_GADGET is not set | ||
859 | |||
860 | # | ||
861 | # MMC/SD Card support | ||
862 | # | ||
863 | # CONFIG_MMC is not set | ||
864 | |||
865 | # | ||
866 | # InfiniBand support | ||
867 | # | ||
868 | # CONFIG_INFINIBAND is not set | ||
869 | |||
870 | # | ||
871 | # SN Devices | ||
872 | # | ||
873 | |||
874 | # | ||
875 | # File systems | ||
876 | # | ||
877 | CONFIG_EXT2_FS=y | ||
878 | # CONFIG_EXT2_FS_XATTR is not set | ||
879 | # CONFIG_EXT2_FS_XIP is not set | ||
880 | CONFIG_EXT3_FS=y | ||
881 | CONFIG_EXT3_FS_XATTR=y | ||
882 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
883 | # CONFIG_EXT3_FS_SECURITY is not set | ||
884 | CONFIG_JBD=y | ||
885 | # CONFIG_JBD_DEBUG is not set | ||
886 | CONFIG_FS_MBCACHE=y | ||
887 | # CONFIG_REISERFS_FS is not set | ||
888 | # CONFIG_JFS_FS is not set | ||
889 | CONFIG_FS_POSIX_ACL=y | ||
890 | # CONFIG_XFS_FS is not set | ||
891 | CONFIG_MINIX_FS=y | ||
892 | # CONFIG_ROMFS_FS is not set | ||
893 | CONFIG_INOTIFY=y | ||
894 | # CONFIG_QUOTA is not set | ||
895 | CONFIG_DNOTIFY=y | ||
896 | # CONFIG_AUTOFS_FS is not set | ||
897 | # CONFIG_AUTOFS4_FS is not set | ||
898 | # CONFIG_FUSE_FS is not set | ||
899 | |||
900 | # | ||
901 | # CD-ROM/DVD Filesystems | ||
902 | # | ||
903 | # CONFIG_ISO9660_FS is not set | ||
904 | # CONFIG_UDF_FS is not set | ||
905 | |||
906 | # | ||
907 | # DOS/FAT/NT Filesystems | ||
908 | # | ||
909 | CONFIG_FAT_FS=y | ||
910 | CONFIG_MSDOS_FS=y | ||
911 | CONFIG_VFAT_FS=y | ||
912 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
913 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
914 | CONFIG_NTFS_FS=y | ||
915 | # CONFIG_NTFS_DEBUG is not set | ||
916 | CONFIG_NTFS_RW=y | ||
917 | |||
918 | # | ||
919 | # Pseudo filesystems | ||
920 | # | ||
921 | CONFIG_PROC_FS=y | ||
922 | CONFIG_PROC_KCORE=y | ||
923 | CONFIG_SYSFS=y | ||
924 | # CONFIG_TMPFS is not set | ||
925 | CONFIG_HUGETLBFS=y | ||
926 | CONFIG_HUGETLB_PAGE=y | ||
927 | CONFIG_RAMFS=y | ||
928 | # CONFIG_RELAYFS_FS is not set | ||
929 | |||
930 | # | ||
931 | # Miscellaneous filesystems | ||
932 | # | ||
933 | # CONFIG_ADFS_FS is not set | ||
934 | # CONFIG_AFFS_FS is not set | ||
935 | # CONFIG_HFS_FS is not set | ||
936 | # CONFIG_HFSPLUS_FS is not set | ||
937 | # CONFIG_BEFS_FS is not set | ||
938 | # CONFIG_BFS_FS is not set | ||
939 | # CONFIG_EFS_FS is not set | ||
940 | # CONFIG_CRAMFS is not set | ||
941 | # CONFIG_VXFS_FS is not set | ||
942 | # CONFIG_HPFS_FS is not set | ||
943 | # CONFIG_QNX4FS_FS is not set | ||
944 | # CONFIG_SYSV_FS is not set | ||
945 | # CONFIG_UFS_FS is not set | ||
946 | |||
947 | # | ||
948 | # Network File Systems | ||
949 | # | ||
950 | CONFIG_NFS_FS=y | ||
951 | CONFIG_NFS_V3=y | ||
952 | # CONFIG_NFS_V3_ACL is not set | ||
953 | CONFIG_NFS_V4=y | ||
954 | # CONFIG_NFS_DIRECTIO is not set | ||
955 | CONFIG_NFSD=y | ||
956 | CONFIG_NFSD_V3=y | ||
957 | # CONFIG_NFSD_V3_ACL is not set | ||
958 | CONFIG_NFSD_V4=y | ||
959 | CONFIG_NFSD_TCP=y | ||
960 | CONFIG_ROOT_NFS=y | ||
961 | CONFIG_LOCKD=y | ||
962 | CONFIG_LOCKD_V4=y | ||
963 | CONFIG_EXPORTFS=y | ||
964 | CONFIG_NFS_COMMON=y | ||
965 | CONFIG_SUNRPC=y | ||
966 | CONFIG_SUNRPC_GSS=y | ||
967 | CONFIG_RPCSEC_GSS_KRB5=y | ||
968 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
969 | # CONFIG_SMB_FS is not set | ||
970 | # CONFIG_CIFS is not set | ||
971 | # CONFIG_NCP_FS is not set | ||
972 | # CONFIG_CODA_FS is not set | ||
973 | # CONFIG_AFS_FS is not set | ||
974 | # CONFIG_9P_FS is not set | ||
975 | |||
976 | # | ||
977 | # Partition Types | ||
978 | # | ||
979 | # CONFIG_PARTITION_ADVANCED is not set | ||
980 | CONFIG_MSDOS_PARTITION=y | ||
981 | |||
982 | # | ||
983 | # Native Language Support | ||
984 | # | ||
985 | CONFIG_NLS=y | ||
986 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
987 | CONFIG_NLS_CODEPAGE_437=y | ||
988 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
989 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
990 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
991 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
992 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
993 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
994 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
995 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
996 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
997 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
998 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
999 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1000 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1001 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1002 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1003 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1004 | CONFIG_NLS_CODEPAGE_932=y | ||
1005 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1006 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1007 | # CONFIG_NLS_ISO8859_8 is not set | ||
1008 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1009 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1010 | # CONFIG_NLS_ASCII is not set | ||
1011 | CONFIG_NLS_ISO8859_1=y | ||
1012 | # CONFIG_NLS_ISO8859_2 is not set | ||
1013 | # CONFIG_NLS_ISO8859_3 is not set | ||
1014 | # CONFIG_NLS_ISO8859_4 is not set | ||
1015 | # CONFIG_NLS_ISO8859_5 is not set | ||
1016 | # CONFIG_NLS_ISO8859_6 is not set | ||
1017 | # CONFIG_NLS_ISO8859_7 is not set | ||
1018 | # CONFIG_NLS_ISO8859_9 is not set | ||
1019 | # CONFIG_NLS_ISO8859_13 is not set | ||
1020 | # CONFIG_NLS_ISO8859_14 is not set | ||
1021 | # CONFIG_NLS_ISO8859_15 is not set | ||
1022 | # CONFIG_NLS_KOI8_R is not set | ||
1023 | # CONFIG_NLS_KOI8_U is not set | ||
1024 | # CONFIG_NLS_UTF8 is not set | ||
1025 | |||
1026 | # | ||
1027 | # Profiling support | ||
1028 | # | ||
1029 | # CONFIG_PROFILING is not set | ||
1030 | |||
1031 | # | ||
1032 | # Kernel hacking | ||
1033 | # | ||
1034 | # CONFIG_PRINTK_TIME is not set | ||
1035 | CONFIG_DEBUG_KERNEL=y | ||
1036 | # CONFIG_MAGIC_SYSRQ is not set | ||
1037 | CONFIG_LOG_BUF_SHIFT=14 | ||
1038 | CONFIG_DETECT_SOFTLOCKUP=y | ||
1039 | # CONFIG_SCHEDSTATS is not set | ||
1040 | # CONFIG_DEBUG_SLAB is not set | ||
1041 | CONFIG_DEBUG_PREEMPT=y | ||
1042 | CONFIG_DEBUG_SPINLOCK=y | ||
1043 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1044 | # CONFIG_DEBUG_KOBJECT is not set | ||
1045 | # CONFIG_DEBUG_INFO is not set | ||
1046 | CONFIG_DEBUG_FS=y | ||
1047 | # CONFIG_DEBUG_VM is not set | ||
1048 | CONFIG_FRAME_POINTER=y | ||
1049 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1050 | # CONFIG_SH_STANDARD_BIOS is not set | ||
1051 | # CONFIG_EARLY_SCIF_CONSOLE is not set | ||
1052 | # CONFIG_KGDB is not set | ||
1053 | |||
1054 | # | ||
1055 | # Security options | ||
1056 | # | ||
1057 | # CONFIG_KEYS is not set | ||
1058 | # CONFIG_SECURITY is not set | ||
1059 | |||
1060 | # | ||
1061 | # Cryptographic options | ||
1062 | # | ||
1063 | CONFIG_CRYPTO=y | ||
1064 | CONFIG_CRYPTO_HMAC=y | ||
1065 | # CONFIG_CRYPTO_NULL is not set | ||
1066 | # CONFIG_CRYPTO_MD4 is not set | ||
1067 | CONFIG_CRYPTO_MD5=y | ||
1068 | # CONFIG_CRYPTO_SHA1 is not set | ||
1069 | # CONFIG_CRYPTO_SHA256 is not set | ||
1070 | # CONFIG_CRYPTO_SHA512 is not set | ||
1071 | # CONFIG_CRYPTO_WP512 is not set | ||
1072 | # CONFIG_CRYPTO_TGR192 is not set | ||
1073 | CONFIG_CRYPTO_DES=y | ||
1074 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1075 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1076 | # CONFIG_CRYPTO_SERPENT is not set | ||
1077 | # CONFIG_CRYPTO_AES is not set | ||
1078 | # CONFIG_CRYPTO_CAST5 is not set | ||
1079 | # CONFIG_CRYPTO_CAST6 is not set | ||
1080 | # CONFIG_CRYPTO_TEA is not set | ||
1081 | # CONFIG_CRYPTO_ARC4 is not set | ||
1082 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1083 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1084 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1085 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1086 | # CONFIG_CRYPTO_CRC32C is not set | ||
1087 | # CONFIG_CRYPTO_TEST is not set | ||
1088 | |||
1089 | # | ||
1090 | # Hardware crypto devices | ||
1091 | # | ||
1092 | |||
1093 | # | ||
1094 | # Library routines | ||
1095 | # | ||
1096 | # CONFIG_CRC_CCITT is not set | ||
1097 | # CONFIG_CRC16 is not set | ||
1098 | CONFIG_CRC32=y | ||
1099 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/sh/configs/se73180_defconfig b/arch/sh/configs/se73180_defconfig index d217e44c89a6..fe19feb95ca9 100644 --- a/arch/sh/configs/se73180_defconfig +++ b/arch/sh/configs/se73180_defconfig | |||
@@ -78,6 +78,7 @@ CONFIG_SH_73180_SOLUTION_ENGINE=y | |||
78 | # CONFIG_SH_SECUREEDGE5410 is not set | 78 | # CONFIG_SH_SECUREEDGE5410 is not set |
79 | # CONFIG_SH_HS7751RVOIP is not set | 79 | # CONFIG_SH_HS7751RVOIP is not set |
80 | # CONFIG_SH_RTS7751R2D is not set | 80 | # CONFIG_SH_RTS7751R2D is not set |
81 | # CONFIG_SH_R7780RP is not set | ||
81 | # CONFIG_SH_EDOSK7705 is not set | 82 | # CONFIG_SH_EDOSK7705 is not set |
82 | # CONFIG_SH_SH4202_MICRODEV is not set | 83 | # CONFIG_SH_SH4202_MICRODEV is not set |
83 | # CONFIG_SH_UNKNOWN is not set | 84 | # CONFIG_SH_UNKNOWN is not set |
diff --git a/arch/sh/configs/se7343_defconfig b/arch/sh/configs/se7343_defconfig new file mode 100644 index 000000000000..948e507b52be --- /dev/null +++ b/arch/sh/configs/se7343_defconfig | |||
@@ -0,0 +1,997 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.17 | ||
4 | # Mon Aug 7 20:14:44 2006 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
8 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
9 | CONFIG_GENERIC_HWEIGHT=y | ||
10 | CONFIG_GENERIC_HARDIRQS=y | ||
11 | CONFIG_GENERIC_IRQ_PROBE=y | ||
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
13 | |||
14 | # | ||
15 | # Code maturity level options | ||
16 | # | ||
17 | CONFIG_EXPERIMENTAL=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
20 | |||
21 | # | ||
22 | # General setup | ||
23 | # | ||
24 | CONFIG_LOCALVERSION="" | ||
25 | CONFIG_LOCALVERSION_AUTO=y | ||
26 | # CONFIG_SWAP is not set | ||
27 | CONFIG_SYSVIPC=y | ||
28 | CONFIG_POSIX_MQUEUE=y | ||
29 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
30 | CONFIG_SYSCTL=y | ||
31 | # CONFIG_AUDIT is not set | ||
32 | # CONFIG_IKCONFIG is not set | ||
33 | # CONFIG_RELAY is not set | ||
34 | CONFIG_INITRAMFS_SOURCE="" | ||
35 | CONFIG_UID16=y | ||
36 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
37 | CONFIG_EMBEDDED=y | ||
38 | CONFIG_KALLSYMS=y | ||
39 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
40 | CONFIG_HOTPLUG=y | ||
41 | CONFIG_PRINTK=y | ||
42 | CONFIG_BUG=y | ||
43 | CONFIG_ELF_CORE=y | ||
44 | CONFIG_BASE_FULL=y | ||
45 | # CONFIG_FUTEX is not set | ||
46 | # CONFIG_EPOLL is not set | ||
47 | # CONFIG_SHMEM is not set | ||
48 | CONFIG_SLAB=y | ||
49 | CONFIG_TINY_SHMEM=y | ||
50 | CONFIG_BASE_SMALL=0 | ||
51 | # CONFIG_SLOB is not set | ||
52 | CONFIG_OBSOLETE_INTERMODULE=y | ||
53 | |||
54 | # | ||
55 | # Loadable module support | ||
56 | # | ||
57 | CONFIG_MODULES=y | ||
58 | CONFIG_MODULE_UNLOAD=y | ||
59 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
60 | # CONFIG_MODVERSIONS is not set | ||
61 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
62 | # CONFIG_KMOD is not set | ||
63 | |||
64 | # | ||
65 | # Block layer | ||
66 | # | ||
67 | # CONFIG_LBD is not set | ||
68 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
69 | # CONFIG_LSF is not set | ||
70 | |||
71 | # | ||
72 | # IO Schedulers | ||
73 | # | ||
74 | CONFIG_IOSCHED_NOOP=y | ||
75 | # CONFIG_IOSCHED_AS is not set | ||
76 | CONFIG_IOSCHED_DEADLINE=y | ||
77 | # CONFIG_IOSCHED_CFQ is not set | ||
78 | # CONFIG_DEFAULT_AS is not set | ||
79 | CONFIG_DEFAULT_DEADLINE=y | ||
80 | # CONFIG_DEFAULT_CFQ is not set | ||
81 | # CONFIG_DEFAULT_NOOP is not set | ||
82 | CONFIG_DEFAULT_IOSCHED="deadline" | ||
83 | |||
84 | # | ||
85 | # System type | ||
86 | # | ||
87 | CONFIG_SOLUTION_ENGINE=y | ||
88 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
89 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
90 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
91 | CONFIG_SH_7343_SOLUTION_ENGINE=y | ||
92 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
93 | # CONFIG_SH_7751_SYSTEMH is not set | ||
94 | # CONFIG_SH_HP6XX is not set | ||
95 | # CONFIG_SH_EC3104 is not set | ||
96 | # CONFIG_SH_SATURN is not set | ||
97 | # CONFIG_SH_DREAMCAST is not set | ||
98 | # CONFIG_SH_BIGSUR is not set | ||
99 | # CONFIG_SH_MPC1211 is not set | ||
100 | # CONFIG_SH_SH03 is not set | ||
101 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
102 | # CONFIG_SH_HS7751RVOIP is not set | ||
103 | # CONFIG_SH_7710VOIPGW is not set | ||
104 | # CONFIG_SH_RTS7751R2D is not set | ||
105 | # CONFIG_SH_R7780RP is not set | ||
106 | # CONFIG_SH_EDOSK7705 is not set | ||
107 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
108 | # CONFIG_SH_LANDISK is not set | ||
109 | # CONFIG_SH_TITAN is not set | ||
110 | # CONFIG_SH_SHMIN is not set | ||
111 | # CONFIG_SH_UNKNOWN is not set | ||
112 | |||
113 | # | ||
114 | # Processor selection | ||
115 | # | ||
116 | CONFIG_CPU_SH4=y | ||
117 | CONFIG_CPU_SH4A=y | ||
118 | |||
119 | # | ||
120 | # SH-2 Processor Support | ||
121 | # | ||
122 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
123 | |||
124 | # | ||
125 | # SH-3 Processor Support | ||
126 | # | ||
127 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
128 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
129 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | ||
130 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
131 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
132 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
133 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | ||
134 | |||
135 | # | ||
136 | # SH-4 Processor Support | ||
137 | # | ||
138 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
139 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
140 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
141 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
142 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
143 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
144 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
145 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
146 | |||
147 | # | ||
148 | # ST40 Processor Support | ||
149 | # | ||
150 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
151 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
152 | |||
153 | # | ||
154 | # SH-4A Processor Support | ||
155 | # | ||
156 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
157 | CONFIG_CPU_SUBTYPE_SH7343=y | ||
158 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
159 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
160 | |||
161 | # | ||
162 | # Memory management options | ||
163 | # | ||
164 | CONFIG_MMU=y | ||
165 | CONFIG_PAGE_OFFSET=0x80000000 | ||
166 | CONFIG_MEMORY_START=0x0c000000 | ||
167 | CONFIG_MEMORY_SIZE=0x01000000 | ||
168 | CONFIG_32BIT=y | ||
169 | CONFIG_SELECT_MEMORY_MODEL=y | ||
170 | CONFIG_FLATMEM_MANUAL=y | ||
171 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
172 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
173 | CONFIG_FLATMEM=y | ||
174 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
175 | # CONFIG_SPARSEMEM_STATIC is not set | ||
176 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
177 | |||
178 | # | ||
179 | # Cache configuration | ||
180 | # | ||
181 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
182 | # CONFIG_SH_WRITETHROUGH is not set | ||
183 | # CONFIG_SH_OCRAM is not set | ||
184 | |||
185 | # | ||
186 | # Processor features | ||
187 | # | ||
188 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
189 | # CONFIG_SH_FPU is not set | ||
190 | # CONFIG_SH_FPU_EMU is not set | ||
191 | CONFIG_SH_DSP=y | ||
192 | # CONFIG_SH_STORE_QUEUES is not set | ||
193 | CONFIG_CPU_HAS_INTEVT=y | ||
194 | CONFIG_CPU_HAS_SR_RB=y | ||
195 | |||
196 | # | ||
197 | # Timer support | ||
198 | # | ||
199 | CONFIG_SH_TMU=y | ||
200 | CONFIG_SH_PCLK_FREQ=27000000 | ||
201 | |||
202 | # | ||
203 | # CPU Frequency scaling | ||
204 | # | ||
205 | # CONFIG_CPU_FREQ is not set | ||
206 | |||
207 | # | ||
208 | # DMA support | ||
209 | # | ||
210 | # CONFIG_SH_DMA is not set | ||
211 | |||
212 | # | ||
213 | # Companion Chips | ||
214 | # | ||
215 | # CONFIG_HD6446X_SERIES is not set | ||
216 | CONFIG_HEARTBEAT=y | ||
217 | |||
218 | # | ||
219 | # Kernel features | ||
220 | # | ||
221 | # CONFIG_HZ_100 is not set | ||
222 | CONFIG_HZ_250=y | ||
223 | # CONFIG_HZ_1000 is not set | ||
224 | CONFIG_HZ=250 | ||
225 | # CONFIG_KEXEC is not set | ||
226 | # CONFIG_SMP is not set | ||
227 | CONFIG_PREEMPT_NONE=y | ||
228 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
229 | # CONFIG_PREEMPT is not set | ||
230 | |||
231 | # | ||
232 | # Boot options | ||
233 | # | ||
234 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
235 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
236 | # CONFIG_UBC_WAKEUP is not set | ||
237 | # CONFIG_CMDLINE_BOOL is not set | ||
238 | |||
239 | # | ||
240 | # Bus options | ||
241 | # | ||
242 | # CONFIG_PCI is not set | ||
243 | |||
244 | # | ||
245 | # PCCARD (PCMCIA/CardBus) support | ||
246 | # | ||
247 | # CONFIG_PCCARD is not set | ||
248 | |||
249 | # | ||
250 | # PCI Hotplug Support | ||
251 | # | ||
252 | |||
253 | # | ||
254 | # Executable file formats | ||
255 | # | ||
256 | CONFIG_BINFMT_ELF=y | ||
257 | # CONFIG_BINFMT_FLAT is not set | ||
258 | # CONFIG_BINFMT_MISC is not set | ||
259 | |||
260 | # | ||
261 | # Power management options (EXPERIMENTAL) | ||
262 | # | ||
263 | # CONFIG_PM is not set | ||
264 | |||
265 | # | ||
266 | # Networking | ||
267 | # | ||
268 | CONFIG_NET=y | ||
269 | |||
270 | # | ||
271 | # Networking options | ||
272 | # | ||
273 | # CONFIG_NETDEBUG is not set | ||
274 | CONFIG_PACKET=y | ||
275 | CONFIG_PACKET_MMAP=y | ||
276 | CONFIG_UNIX=y | ||
277 | # CONFIG_NET_KEY is not set | ||
278 | CONFIG_INET=y | ||
279 | # CONFIG_IP_MULTICAST is not set | ||
280 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
281 | CONFIG_IP_FIB_HASH=y | ||
282 | CONFIG_IP_PNP=y | ||
283 | CONFIG_IP_PNP_DHCP=y | ||
284 | # CONFIG_IP_PNP_BOOTP is not set | ||
285 | # CONFIG_IP_PNP_RARP is not set | ||
286 | # CONFIG_NET_IPIP is not set | ||
287 | # CONFIG_NET_IPGRE is not set | ||
288 | # CONFIG_ARPD is not set | ||
289 | CONFIG_SYN_COOKIES=y | ||
290 | # CONFIG_INET_AH is not set | ||
291 | # CONFIG_INET_ESP is not set | ||
292 | # CONFIG_INET_IPCOMP is not set | ||
293 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
294 | # CONFIG_INET_TUNNEL is not set | ||
295 | # CONFIG_INET_DIAG is not set | ||
296 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
297 | CONFIG_TCP_CONG_BIC=y | ||
298 | # CONFIG_IPV6 is not set | ||
299 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
300 | # CONFIG_INET6_TUNNEL is not set | ||
301 | # CONFIG_NETFILTER is not set | ||
302 | |||
303 | # | ||
304 | # DCCP Configuration (EXPERIMENTAL) | ||
305 | # | ||
306 | # CONFIG_IP_DCCP is not set | ||
307 | |||
308 | # | ||
309 | # SCTP Configuration (EXPERIMENTAL) | ||
310 | # | ||
311 | # CONFIG_IP_SCTP is not set | ||
312 | |||
313 | # | ||
314 | # TIPC Configuration (EXPERIMENTAL) | ||
315 | # | ||
316 | # CONFIG_TIPC is not set | ||
317 | # CONFIG_ATM is not set | ||
318 | # CONFIG_BRIDGE is not set | ||
319 | # CONFIG_VLAN_8021Q is not set | ||
320 | # CONFIG_DECNET is not set | ||
321 | # CONFIG_LLC2 is not set | ||
322 | # CONFIG_IPX is not set | ||
323 | # CONFIG_ATALK is not set | ||
324 | # CONFIG_X25 is not set | ||
325 | # CONFIG_LAPB is not set | ||
326 | # CONFIG_NET_DIVERT is not set | ||
327 | # CONFIG_ECONET is not set | ||
328 | # CONFIG_WAN_ROUTER is not set | ||
329 | |||
330 | # | ||
331 | # QoS and/or fair queueing | ||
332 | # | ||
333 | # CONFIG_NET_SCHED is not set | ||
334 | |||
335 | # | ||
336 | # Network testing | ||
337 | # | ||
338 | # CONFIG_NET_PKTGEN is not set | ||
339 | # CONFIG_HAMRADIO is not set | ||
340 | # CONFIG_IRDA is not set | ||
341 | # CONFIG_BT is not set | ||
342 | # CONFIG_IEEE80211 is not set | ||
343 | |||
344 | # | ||
345 | # Device Drivers | ||
346 | # | ||
347 | |||
348 | # | ||
349 | # Generic Driver Options | ||
350 | # | ||
351 | CONFIG_STANDALONE=y | ||
352 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
353 | CONFIG_FW_LOADER=y | ||
354 | |||
355 | # | ||
356 | # Connector - unified userspace <-> kernelspace linker | ||
357 | # | ||
358 | # CONFIG_CONNECTOR is not set | ||
359 | |||
360 | # | ||
361 | # Memory Technology Devices (MTD) | ||
362 | # | ||
363 | CONFIG_MTD=y | ||
364 | # CONFIG_MTD_DEBUG is not set | ||
365 | CONFIG_MTD_CONCAT=y | ||
366 | CONFIG_MTD_PARTITIONS=y | ||
367 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
368 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
369 | |||
370 | # | ||
371 | # User Modules And Translation Layers | ||
372 | # | ||
373 | CONFIG_MTD_CHAR=y | ||
374 | CONFIG_MTD_BLOCK=y | ||
375 | # CONFIG_FTL is not set | ||
376 | # CONFIG_NFTL is not set | ||
377 | # CONFIG_INFTL is not set | ||
378 | # CONFIG_RFD_FTL is not set | ||
379 | |||
380 | # | ||
381 | # RAM/ROM/Flash chip drivers | ||
382 | # | ||
383 | CONFIG_MTD_CFI=y | ||
384 | # CONFIG_MTD_JEDECPROBE is not set | ||
385 | CONFIG_MTD_GEN_PROBE=y | ||
386 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
387 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
388 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
389 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
390 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
391 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
392 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
393 | CONFIG_MTD_CFI_I1=y | ||
394 | CONFIG_MTD_CFI_I2=y | ||
395 | # CONFIG_MTD_CFI_I4 is not set | ||
396 | # CONFIG_MTD_CFI_I8 is not set | ||
397 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
398 | CONFIG_MTD_CFI_AMDSTD=y | ||
399 | # CONFIG_MTD_CFI_STAA is not set | ||
400 | CONFIG_MTD_CFI_UTIL=y | ||
401 | CONFIG_MTD_RAM=y | ||
402 | # CONFIG_MTD_ROM is not set | ||
403 | # CONFIG_MTD_ABSENT is not set | ||
404 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
405 | |||
406 | # | ||
407 | # Mapping drivers for chip access | ||
408 | # | ||
409 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
410 | # CONFIG_MTD_PHYSMAP is not set | ||
411 | # CONFIG_MTD_SOLUTIONENGINE is not set | ||
412 | # CONFIG_MTD_PLATRAM is not set | ||
413 | |||
414 | # | ||
415 | # Self-contained MTD device drivers | ||
416 | # | ||
417 | # CONFIG_MTD_SLRAM is not set | ||
418 | # CONFIG_MTD_PHRAM is not set | ||
419 | # CONFIG_MTD_MTDRAM is not set | ||
420 | # CONFIG_MTD_BLOCK2MTD is not set | ||
421 | |||
422 | # | ||
423 | # Disk-On-Chip Device Drivers | ||
424 | # | ||
425 | # CONFIG_MTD_DOC2000 is not set | ||
426 | # CONFIG_MTD_DOC2001 is not set | ||
427 | # CONFIG_MTD_DOC2001PLUS is not set | ||
428 | |||
429 | # | ||
430 | # NAND Flash Device Drivers | ||
431 | # | ||
432 | # CONFIG_MTD_NAND is not set | ||
433 | |||
434 | # | ||
435 | # OneNAND Flash Device Drivers | ||
436 | # | ||
437 | # CONFIG_MTD_ONENAND is not set | ||
438 | |||
439 | # | ||
440 | # Parallel port support | ||
441 | # | ||
442 | # CONFIG_PARPORT is not set | ||
443 | |||
444 | # | ||
445 | # Plug and Play support | ||
446 | # | ||
447 | |||
448 | # | ||
449 | # Block devices | ||
450 | # | ||
451 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
452 | # CONFIG_BLK_DEV_LOOP is not set | ||
453 | # CONFIG_BLK_DEV_NBD is not set | ||
454 | # CONFIG_BLK_DEV_RAM is not set | ||
455 | # CONFIG_BLK_DEV_INITRD is not set | ||
456 | # CONFIG_CDROM_PKTCDVD is not set | ||
457 | # CONFIG_ATA_OVER_ETH is not set | ||
458 | |||
459 | # | ||
460 | # ATA/ATAPI/MFM/RLL support | ||
461 | # | ||
462 | # CONFIG_IDE is not set | ||
463 | |||
464 | # | ||
465 | # SCSI device support | ||
466 | # | ||
467 | # CONFIG_RAID_ATTRS is not set | ||
468 | # CONFIG_SCSI is not set | ||
469 | |||
470 | # | ||
471 | # Multi-device support (RAID and LVM) | ||
472 | # | ||
473 | # CONFIG_MD is not set | ||
474 | |||
475 | # | ||
476 | # Fusion MPT device support | ||
477 | # | ||
478 | # CONFIG_FUSION is not set | ||
479 | |||
480 | # | ||
481 | # IEEE 1394 (FireWire) support | ||
482 | # | ||
483 | |||
484 | # | ||
485 | # I2O device support | ||
486 | # | ||
487 | |||
488 | # | ||
489 | # Network device support | ||
490 | # | ||
491 | CONFIG_NETDEVICES=y | ||
492 | # CONFIG_DUMMY is not set | ||
493 | # CONFIG_BONDING is not set | ||
494 | # CONFIG_EQUALIZER is not set | ||
495 | # CONFIG_TUN is not set | ||
496 | |||
497 | # | ||
498 | # PHY device support | ||
499 | # | ||
500 | # CONFIG_PHYLIB is not set | ||
501 | |||
502 | # | ||
503 | # Ethernet (10 or 100Mbit) | ||
504 | # | ||
505 | CONFIG_NET_ETHERNET=y | ||
506 | CONFIG_MII=y | ||
507 | # CONFIG_STNIC is not set | ||
508 | CONFIG_SMC91X=y | ||
509 | # CONFIG_NE2000 is not set | ||
510 | |||
511 | # | ||
512 | # Ethernet (1000 Mbit) | ||
513 | # | ||
514 | |||
515 | # | ||
516 | # Ethernet (10000 Mbit) | ||
517 | # | ||
518 | |||
519 | # | ||
520 | # Token Ring devices | ||
521 | # | ||
522 | |||
523 | # | ||
524 | # Wireless LAN (non-hamradio) | ||
525 | # | ||
526 | # CONFIG_NET_RADIO is not set | ||
527 | |||
528 | # | ||
529 | # Wan interfaces | ||
530 | # | ||
531 | # CONFIG_WAN is not set | ||
532 | # CONFIG_PPP is not set | ||
533 | # CONFIG_SLIP is not set | ||
534 | # CONFIG_SHAPER is not set | ||
535 | # CONFIG_NETCONSOLE is not set | ||
536 | # CONFIG_NETPOLL is not set | ||
537 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
538 | |||
539 | # | ||
540 | # ISDN subsystem | ||
541 | # | ||
542 | # CONFIG_ISDN is not set | ||
543 | |||
544 | # | ||
545 | # Telephony Support | ||
546 | # | ||
547 | # CONFIG_PHONE is not set | ||
548 | |||
549 | # | ||
550 | # Input device support | ||
551 | # | ||
552 | CONFIG_INPUT=y | ||
553 | |||
554 | # | ||
555 | # Userland interfaces | ||
556 | # | ||
557 | # CONFIG_INPUT_MOUSEDEV is not set | ||
558 | # CONFIG_INPUT_JOYDEV is not set | ||
559 | # CONFIG_INPUT_TSDEV is not set | ||
560 | # CONFIG_INPUT_EVDEV is not set | ||
561 | # CONFIG_INPUT_EVBUG is not set | ||
562 | |||
563 | # | ||
564 | # Input Device Drivers | ||
565 | # | ||
566 | # CONFIG_INPUT_KEYBOARD is not set | ||
567 | # CONFIG_INPUT_MOUSE is not set | ||
568 | # CONFIG_INPUT_JOYSTICK is not set | ||
569 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
570 | # CONFIG_INPUT_MISC is not set | ||
571 | |||
572 | # | ||
573 | # Hardware I/O ports | ||
574 | # | ||
575 | # CONFIG_SERIO is not set | ||
576 | # CONFIG_GAMEPORT is not set | ||
577 | |||
578 | # | ||
579 | # Character devices | ||
580 | # | ||
581 | CONFIG_VT=y | ||
582 | CONFIG_VT_CONSOLE=y | ||
583 | CONFIG_HW_CONSOLE=y | ||
584 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
585 | |||
586 | # | ||
587 | # Serial drivers | ||
588 | # | ||
589 | # CONFIG_SERIAL_8250 is not set | ||
590 | |||
591 | # | ||
592 | # Non-8250 serial port support | ||
593 | # | ||
594 | CONFIG_SERIAL_SH_SCI=y | ||
595 | CONFIG_SERIAL_SH_SCI_NR_UARTS=2 | ||
596 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
597 | CONFIG_SERIAL_CORE=y | ||
598 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
599 | # CONFIG_UNIX98_PTYS is not set | ||
600 | CONFIG_LEGACY_PTYS=y | ||
601 | CONFIG_LEGACY_PTY_COUNT=256 | ||
602 | |||
603 | # | ||
604 | # IPMI | ||
605 | # | ||
606 | # CONFIG_IPMI_HANDLER is not set | ||
607 | |||
608 | # | ||
609 | # Watchdog Cards | ||
610 | # | ||
611 | # CONFIG_WATCHDOG is not set | ||
612 | # CONFIG_RTC is not set | ||
613 | # CONFIG_GEN_RTC is not set | ||
614 | # CONFIG_DTLK is not set | ||
615 | # CONFIG_R3964 is not set | ||
616 | |||
617 | # | ||
618 | # Ftape, the floppy tape device driver | ||
619 | # | ||
620 | # CONFIG_RAW_DRIVER is not set | ||
621 | |||
622 | # | ||
623 | # TPM devices | ||
624 | # | ||
625 | # CONFIG_TCG_TPM is not set | ||
626 | # CONFIG_TELCLOCK is not set | ||
627 | |||
628 | # | ||
629 | # I2C support | ||
630 | # | ||
631 | CONFIG_I2C=y | ||
632 | CONFIG_I2C_CHARDEV=y | ||
633 | |||
634 | # | ||
635 | # I2C Algorithms | ||
636 | # | ||
637 | # CONFIG_I2C_ALGOBIT is not set | ||
638 | # CONFIG_I2C_ALGOPCF is not set | ||
639 | # CONFIG_I2C_ALGOPCA is not set | ||
640 | |||
641 | # | ||
642 | # I2C Hardware Bus support | ||
643 | # | ||
644 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
645 | # CONFIG_I2C_STUB is not set | ||
646 | # CONFIG_I2C_PCA_ISA is not set | ||
647 | CONFIG_I2C_SH7343=y | ||
648 | |||
649 | # | ||
650 | # Miscellaneous I2C Chip support | ||
651 | # | ||
652 | # CONFIG_SENSORS_DS1337 is not set | ||
653 | # CONFIG_SENSORS_DS1374 is not set | ||
654 | # CONFIG_SENSORS_EEPROM is not set | ||
655 | # CONFIG_SENSORS_PCF8574 is not set | ||
656 | # CONFIG_SENSORS_PCA9539 is not set | ||
657 | # CONFIG_SENSORS_PCF8591 is not set | ||
658 | # CONFIG_SENSORS_MAX6875 is not set | ||
659 | # CONFIG_I2C_DEBUG_CORE is not set | ||
660 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
661 | # CONFIG_I2C_DEBUG_BUS is not set | ||
662 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
663 | |||
664 | # | ||
665 | # SPI support | ||
666 | # | ||
667 | # CONFIG_SPI is not set | ||
668 | # CONFIG_SPI_MASTER is not set | ||
669 | |||
670 | # | ||
671 | # Dallas's 1-wire bus | ||
672 | # | ||
673 | # CONFIG_W1 is not set | ||
674 | |||
675 | # | ||
676 | # Hardware Monitoring support | ||
677 | # | ||
678 | # CONFIG_HWMON is not set | ||
679 | # CONFIG_HWMON_VID is not set | ||
680 | |||
681 | # | ||
682 | # Misc devices | ||
683 | # | ||
684 | |||
685 | # | ||
686 | # Multimedia devices | ||
687 | # | ||
688 | CONFIG_VIDEO_DEV=y | ||
689 | CONFIG_VIDEO_V4L1=y | ||
690 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
691 | CONFIG_VIDEO_V4L2=y | ||
692 | |||
693 | # | ||
694 | # Video Capture Adapters | ||
695 | # | ||
696 | |||
697 | # | ||
698 | # Video Capture Adapters | ||
699 | # | ||
700 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
701 | # CONFIG_VIDEO_VIVI is not set | ||
702 | # CONFIG_VIDEO_CPIA is not set | ||
703 | # CONFIG_VIDEO_SAA5246A is not set | ||
704 | # CONFIG_VIDEO_SAA5249 is not set | ||
705 | # CONFIG_TUNER_3036 is not set | ||
706 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
707 | |||
708 | # | ||
709 | # Encoders and Decoders | ||
710 | # | ||
711 | # CONFIG_VIDEO_MSP3400 is not set | ||
712 | # CONFIG_VIDEO_CS53L32A is not set | ||
713 | # CONFIG_VIDEO_WM8775 is not set | ||
714 | # CONFIG_VIDEO_WM8739 is not set | ||
715 | # CONFIG_VIDEO_CX25840 is not set | ||
716 | # CONFIG_VIDEO_SAA711X is not set | ||
717 | # CONFIG_VIDEO_SAA7127 is not set | ||
718 | # CONFIG_VIDEO_UPD64031A is not set | ||
719 | # CONFIG_VIDEO_UPD64083 is not set | ||
720 | |||
721 | # | ||
722 | # Radio Adapters | ||
723 | # | ||
724 | # CONFIG_RADIO_MAESTRO is not set | ||
725 | |||
726 | # | ||
727 | # Digital Video Broadcasting Devices | ||
728 | # | ||
729 | # CONFIG_DVB is not set | ||
730 | |||
731 | # | ||
732 | # Graphics support | ||
733 | # | ||
734 | CONFIG_FB=y | ||
735 | # CONFIG_FB_CFB_FILLRECT is not set | ||
736 | # CONFIG_FB_CFB_COPYAREA is not set | ||
737 | # CONFIG_FB_CFB_IMAGEBLIT is not set | ||
738 | # CONFIG_FB_MACMODES is not set | ||
739 | CONFIG_FB_FIRMWARE_EDID=y | ||
740 | # CONFIG_FB_MODE_HELPERS is not set | ||
741 | # CONFIG_FB_TILEBLITTING is not set | ||
742 | # CONFIG_FB_EPSON1355 is not set | ||
743 | # CONFIG_FB_S1D13XXX is not set | ||
744 | # CONFIG_FB_VIRTUAL is not set | ||
745 | |||
746 | # | ||
747 | # Console display driver support | ||
748 | # | ||
749 | CONFIG_DUMMY_CONSOLE=y | ||
750 | # CONFIG_FRAMEBUFFER_CONSOLE is not set | ||
751 | |||
752 | # | ||
753 | # Logo configuration | ||
754 | # | ||
755 | # CONFIG_LOGO is not set | ||
756 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
757 | |||
758 | # | ||
759 | # Sound | ||
760 | # | ||
761 | CONFIG_SOUND=y | ||
762 | |||
763 | # | ||
764 | # Advanced Linux Sound Architecture | ||
765 | # | ||
766 | CONFIG_SND=y | ||
767 | CONFIG_SND_TIMER=y | ||
768 | CONFIG_SND_PCM=y | ||
769 | CONFIG_SND_SEQUENCER=y | ||
770 | # CONFIG_SND_SEQ_DUMMY is not set | ||
771 | CONFIG_SND_OSSEMUL=y | ||
772 | # CONFIG_SND_MIXER_OSS is not set | ||
773 | CONFIG_SND_PCM_OSS=y | ||
774 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
775 | # CONFIG_SND_SEQUENCER_OSS is not set | ||
776 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
777 | CONFIG_SND_SUPPORT_OLD_API=y | ||
778 | CONFIG_SND_VERBOSE_PROCFS=y | ||
779 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
780 | # CONFIG_SND_DEBUG is not set | ||
781 | |||
782 | # | ||
783 | # Generic devices | ||
784 | # | ||
785 | # CONFIG_SND_DUMMY is not set | ||
786 | # CONFIG_SND_VIRMIDI is not set | ||
787 | # CONFIG_SND_MTPAV is not set | ||
788 | # CONFIG_SND_SERIAL_U16550 is not set | ||
789 | # CONFIG_SND_MPU401 is not set | ||
790 | |||
791 | # | ||
792 | # SuperH devices | ||
793 | # | ||
794 | CONFIG_SH7343_SIU=m | ||
795 | CONFIG_AK4537_CODEC=y | ||
796 | |||
797 | # | ||
798 | # Open Sound System | ||
799 | # | ||
800 | # CONFIG_SOUND_PRIME is not set | ||
801 | |||
802 | # | ||
803 | # USB support | ||
804 | # | ||
805 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
806 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
807 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
808 | |||
809 | # | ||
810 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
811 | # | ||
812 | |||
813 | # | ||
814 | # USB Gadget Support | ||
815 | # | ||
816 | # CONFIG_USB_GADGET is not set | ||
817 | |||
818 | # | ||
819 | # MMC/SD Card support | ||
820 | # | ||
821 | # CONFIG_MMC is not set | ||
822 | |||
823 | # | ||
824 | # LED devices | ||
825 | # | ||
826 | # CONFIG_NEW_LEDS is not set | ||
827 | |||
828 | # | ||
829 | # LED drivers | ||
830 | # | ||
831 | |||
832 | # | ||
833 | # LED Triggers | ||
834 | # | ||
835 | |||
836 | # | ||
837 | # InfiniBand support | ||
838 | # | ||
839 | |||
840 | # | ||
841 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
842 | # | ||
843 | |||
844 | # | ||
845 | # Real Time Clock | ||
846 | # | ||
847 | # CONFIG_RTC_CLASS is not set | ||
848 | |||
849 | # | ||
850 | # File systems | ||
851 | # | ||
852 | # CONFIG_EXT2_FS is not set | ||
853 | # CONFIG_EXT3_FS is not set | ||
854 | # CONFIG_REISERFS_FS is not set | ||
855 | # CONFIG_JFS_FS is not set | ||
856 | # CONFIG_FS_POSIX_ACL is not set | ||
857 | # CONFIG_XFS_FS is not set | ||
858 | # CONFIG_OCFS2_FS is not set | ||
859 | # CONFIG_MINIX_FS is not set | ||
860 | # CONFIG_ROMFS_FS is not set | ||
861 | # CONFIG_INOTIFY is not set | ||
862 | # CONFIG_QUOTA is not set | ||
863 | # CONFIG_DNOTIFY is not set | ||
864 | # CONFIG_AUTOFS_FS is not set | ||
865 | # CONFIG_AUTOFS4_FS is not set | ||
866 | # CONFIG_FUSE_FS is not set | ||
867 | |||
868 | # | ||
869 | # CD-ROM/DVD Filesystems | ||
870 | # | ||
871 | # CONFIG_ISO9660_FS is not set | ||
872 | # CONFIG_UDF_FS is not set | ||
873 | |||
874 | # | ||
875 | # DOS/FAT/NT Filesystems | ||
876 | # | ||
877 | # CONFIG_MSDOS_FS is not set | ||
878 | # CONFIG_VFAT_FS is not set | ||
879 | # CONFIG_NTFS_FS is not set | ||
880 | |||
881 | # | ||
882 | # Pseudo filesystems | ||
883 | # | ||
884 | CONFIG_PROC_FS=y | ||
885 | # CONFIG_PROC_KCORE is not set | ||
886 | CONFIG_SYSFS=y | ||
887 | CONFIG_TMPFS=y | ||
888 | # CONFIG_HUGETLBFS is not set | ||
889 | # CONFIG_HUGETLB_PAGE is not set | ||
890 | CONFIG_RAMFS=y | ||
891 | # CONFIG_CONFIGFS_FS is not set | ||
892 | |||
893 | # | ||
894 | # Miscellaneous filesystems | ||
895 | # | ||
896 | # CONFIG_ADFS_FS is not set | ||
897 | # CONFIG_AFFS_FS is not set | ||
898 | # CONFIG_HFS_FS is not set | ||
899 | # CONFIG_HFSPLUS_FS is not set | ||
900 | # CONFIG_BEFS_FS is not set | ||
901 | # CONFIG_BFS_FS is not set | ||
902 | # CONFIG_EFS_FS is not set | ||
903 | # CONFIG_JFFS_FS is not set | ||
904 | CONFIG_JFFS2_FS=y | ||
905 | CONFIG_JFFS2_FS_DEBUG=0 | ||
906 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
907 | # CONFIG_JFFS2_SUMMARY is not set | ||
908 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
909 | CONFIG_JFFS2_ZLIB=y | ||
910 | CONFIG_JFFS2_RTIME=y | ||
911 | # CONFIG_JFFS2_RUBIN is not set | ||
912 | # CONFIG_CRAMFS is not set | ||
913 | # CONFIG_VXFS_FS is not set | ||
914 | # CONFIG_HPFS_FS is not set | ||
915 | # CONFIG_QNX4FS_FS is not set | ||
916 | # CONFIG_SYSV_FS is not set | ||
917 | # CONFIG_UFS_FS is not set | ||
918 | |||
919 | # | ||
920 | # Network File Systems | ||
921 | # | ||
922 | CONFIG_NFS_FS=y | ||
923 | CONFIG_NFS_V3=y | ||
924 | # CONFIG_NFS_V3_ACL is not set | ||
925 | # CONFIG_NFS_V4 is not set | ||
926 | # CONFIG_NFS_DIRECTIO is not set | ||
927 | CONFIG_NFSD=y | ||
928 | # CONFIG_NFSD_V3 is not set | ||
929 | # CONFIG_NFSD_TCP is not set | ||
930 | CONFIG_ROOT_NFS=y | ||
931 | CONFIG_LOCKD=y | ||
932 | CONFIG_LOCKD_V4=y | ||
933 | CONFIG_EXPORTFS=y | ||
934 | CONFIG_NFS_COMMON=y | ||
935 | CONFIG_SUNRPC=y | ||
936 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
937 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
938 | # CONFIG_SMB_FS is not set | ||
939 | # CONFIG_CIFS is not set | ||
940 | # CONFIG_NCP_FS is not set | ||
941 | # CONFIG_CODA_FS is not set | ||
942 | # CONFIG_AFS_FS is not set | ||
943 | # CONFIG_9P_FS is not set | ||
944 | |||
945 | # | ||
946 | # Partition Types | ||
947 | # | ||
948 | # CONFIG_PARTITION_ADVANCED is not set | ||
949 | CONFIG_MSDOS_PARTITION=y | ||
950 | |||
951 | # | ||
952 | # Native Language Support | ||
953 | # | ||
954 | # CONFIG_NLS is not set | ||
955 | |||
956 | # | ||
957 | # Profiling support | ||
958 | # | ||
959 | # CONFIG_PROFILING is not set | ||
960 | |||
961 | # | ||
962 | # Kernel hacking | ||
963 | # | ||
964 | # CONFIG_PRINTK_TIME is not set | ||
965 | # CONFIG_MAGIC_SYSRQ is not set | ||
966 | # CONFIG_DEBUG_KERNEL is not set | ||
967 | CONFIG_LOG_BUF_SHIFT=14 | ||
968 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
969 | # CONFIG_DEBUG_FS is not set | ||
970 | # CONFIG_SH_STANDARD_BIOS is not set | ||
971 | # CONFIG_EARLY_SCIF_CONSOLE is not set | ||
972 | # CONFIG_KGDB is not set | ||
973 | |||
974 | # | ||
975 | # Security options | ||
976 | # | ||
977 | # CONFIG_KEYS is not set | ||
978 | # CONFIG_SECURITY is not set | ||
979 | |||
980 | # | ||
981 | # Cryptographic options | ||
982 | # | ||
983 | # CONFIG_CRYPTO is not set | ||
984 | |||
985 | # | ||
986 | # Hardware crypto devices | ||
987 | # | ||
988 | |||
989 | # | ||
990 | # Library routines | ||
991 | # | ||
992 | # CONFIG_CRC_CCITT is not set | ||
993 | # CONFIG_CRC16 is not set | ||
994 | CONFIG_CRC32=y | ||
995 | # CONFIG_LIBCRC32C is not set | ||
996 | CONFIG_ZLIB_INFLATE=y | ||
997 | CONFIG_ZLIB_DEFLATE=y | ||
diff --git a/arch/sh/configs/sh7710voipgw_defconfig b/arch/sh/configs/sh7710voipgw_defconfig new file mode 100644 index 000000000000..ec9a3034daa5 --- /dev/null +++ b/arch/sh/configs/sh7710voipgw_defconfig | |||
@@ -0,0 +1,913 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.17 | ||
4 | # Mon Aug 7 17:07:06 2006 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
8 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
9 | CONFIG_GENERIC_HWEIGHT=y | ||
10 | CONFIG_GENERIC_HARDIRQS=y | ||
11 | CONFIG_GENERIC_IRQ_PROBE=y | ||
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
13 | |||
14 | # | ||
15 | # Code maturity level options | ||
16 | # | ||
17 | CONFIG_EXPERIMENTAL=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
20 | |||
21 | # | ||
22 | # General setup | ||
23 | # | ||
24 | CONFIG_LOCALVERSION="" | ||
25 | CONFIG_LOCALVERSION_AUTO=y | ||
26 | # CONFIG_SWAP is not set | ||
27 | CONFIG_SYSVIPC=y | ||
28 | CONFIG_POSIX_MQUEUE=y | ||
29 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
30 | CONFIG_SYSCTL=y | ||
31 | # CONFIG_AUDIT is not set | ||
32 | # CONFIG_IKCONFIG is not set | ||
33 | # CONFIG_RELAY is not set | ||
34 | CONFIG_INITRAMFS_SOURCE="" | ||
35 | CONFIG_UID16=y | ||
36 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
37 | CONFIG_EMBEDDED=y | ||
38 | CONFIG_KALLSYMS=y | ||
39 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
40 | CONFIG_HOTPLUG=y | ||
41 | CONFIG_PRINTK=y | ||
42 | CONFIG_BUG=y | ||
43 | CONFIG_ELF_CORE=y | ||
44 | CONFIG_BASE_FULL=y | ||
45 | # CONFIG_FUTEX is not set | ||
46 | # CONFIG_EPOLL is not set | ||
47 | # CONFIG_SHMEM is not set | ||
48 | CONFIG_SLAB=y | ||
49 | CONFIG_TINY_SHMEM=y | ||
50 | CONFIG_BASE_SMALL=0 | ||
51 | # CONFIG_SLOB is not set | ||
52 | CONFIG_OBSOLETE_INTERMODULE=y | ||
53 | |||
54 | # | ||
55 | # Loadable module support | ||
56 | # | ||
57 | CONFIG_MODULES=y | ||
58 | CONFIG_MODULE_UNLOAD=y | ||
59 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
60 | # CONFIG_MODVERSIONS is not set | ||
61 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
62 | # CONFIG_KMOD is not set | ||
63 | |||
64 | # | ||
65 | # Block layer | ||
66 | # | ||
67 | # CONFIG_LBD is not set | ||
68 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
69 | # CONFIG_LSF is not set | ||
70 | |||
71 | # | ||
72 | # IO Schedulers | ||
73 | # | ||
74 | CONFIG_IOSCHED_NOOP=y | ||
75 | # CONFIG_IOSCHED_AS is not set | ||
76 | CONFIG_IOSCHED_DEADLINE=y | ||
77 | # CONFIG_IOSCHED_CFQ is not set | ||
78 | # CONFIG_DEFAULT_AS is not set | ||
79 | CONFIG_DEFAULT_DEADLINE=y | ||
80 | # CONFIG_DEFAULT_CFQ is not set | ||
81 | # CONFIG_DEFAULT_NOOP is not set | ||
82 | CONFIG_DEFAULT_IOSCHED="deadline" | ||
83 | |||
84 | # | ||
85 | # System type | ||
86 | # | ||
87 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
88 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
89 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
90 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
91 | # CONFIG_SH_7751_SYSTEMH is not set | ||
92 | # CONFIG_SH_HP6XX is not set | ||
93 | # CONFIG_SH_EC3104 is not set | ||
94 | # CONFIG_SH_SATURN is not set | ||
95 | # CONFIG_SH_DREAMCAST is not set | ||
96 | # CONFIG_SH_BIGSUR is not set | ||
97 | # CONFIG_SH_MPC1211 is not set | ||
98 | # CONFIG_SH_SH03 is not set | ||
99 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
100 | # CONFIG_SH_HS7751RVOIP is not set | ||
101 | CONFIG_SH_7710VOIPGW=y | ||
102 | # CONFIG_SH_RTS7751R2D is not set | ||
103 | # CONFIG_SH_R7780RP is not set | ||
104 | # CONFIG_SH_EDOSK7705 is not set | ||
105 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
106 | # CONFIG_SH_LANDISK is not set | ||
107 | # CONFIG_SH_TITAN is not set | ||
108 | # CONFIG_SH_SHMIN is not set | ||
109 | # CONFIG_SH_UNKNOWN is not set | ||
110 | |||
111 | # | ||
112 | # Processor selection | ||
113 | # | ||
114 | CONFIG_CPU_SH3=y | ||
115 | |||
116 | # | ||
117 | # SH-2 Processor Support | ||
118 | # | ||
119 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
120 | |||
121 | # | ||
122 | # SH-3 Processor Support | ||
123 | # | ||
124 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
125 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
126 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | ||
127 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
128 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
129 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
130 | CONFIG_CPU_SUBTYPE_SH7710=y | ||
131 | |||
132 | # | ||
133 | # SH-4 Processor Support | ||
134 | # | ||
135 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
136 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
137 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
138 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
139 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
140 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
141 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
142 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
143 | |||
144 | # | ||
145 | # ST40 Processor Support | ||
146 | # | ||
147 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
148 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
149 | |||
150 | # | ||
151 | # SH-4A Processor Support | ||
152 | # | ||
153 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
154 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
156 | |||
157 | # | ||
158 | # Memory management options | ||
159 | # | ||
160 | CONFIG_MMU=y | ||
161 | CONFIG_PAGE_OFFSET=0x80000000 | ||
162 | CONFIG_MEMORY_START=0x0c000000 | ||
163 | CONFIG_MEMORY_SIZE=0x00800000 | ||
164 | CONFIG_SELECT_MEMORY_MODEL=y | ||
165 | CONFIG_FLATMEM_MANUAL=y | ||
166 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
167 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
168 | CONFIG_FLATMEM=y | ||
169 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
170 | # CONFIG_SPARSEMEM_STATIC is not set | ||
171 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
172 | |||
173 | # | ||
174 | # Cache configuration | ||
175 | # | ||
176 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
177 | # CONFIG_SH_WRITETHROUGH is not set | ||
178 | # CONFIG_SH_OCRAM is not set | ||
179 | |||
180 | # | ||
181 | # Processor features | ||
182 | # | ||
183 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
184 | # CONFIG_SH_FPU_EMU is not set | ||
185 | CONFIG_SH_DSP=y | ||
186 | # CONFIG_SH_ADC is not set | ||
187 | CONFIG_CPU_HAS_INTEVT=y | ||
188 | CONFIG_CPU_HAS_SR_RB=y | ||
189 | |||
190 | # | ||
191 | # Timer support | ||
192 | # | ||
193 | CONFIG_SH_TMU=y | ||
194 | CONFIG_SH_PCLK_FREQ=32768000 | ||
195 | |||
196 | # | ||
197 | # CPU Frequency scaling | ||
198 | # | ||
199 | # CONFIG_CPU_FREQ is not set | ||
200 | |||
201 | # | ||
202 | # DMA support | ||
203 | # | ||
204 | # CONFIG_SH_DMA is not set | ||
205 | |||
206 | # | ||
207 | # Companion Chips | ||
208 | # | ||
209 | # CONFIG_HD6446X_SERIES is not set | ||
210 | |||
211 | # | ||
212 | # Kernel features | ||
213 | # | ||
214 | # CONFIG_HZ_100 is not set | ||
215 | CONFIG_HZ_250=y | ||
216 | # CONFIG_HZ_1000 is not set | ||
217 | CONFIG_HZ=250 | ||
218 | # CONFIG_KEXEC is not set | ||
219 | # CONFIG_PREEMPT is not set | ||
220 | # CONFIG_SMP is not set | ||
221 | CONFIG_PREEMPT_NONE=y | ||
222 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
223 | |||
224 | # | ||
225 | # Boot options | ||
226 | # | ||
227 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
228 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
229 | # CONFIG_UBC_WAKEUP is not set | ||
230 | # CONFIG_CMDLINE_BOOL is not set | ||
231 | |||
232 | # | ||
233 | # Bus options | ||
234 | # | ||
235 | # CONFIG_PCI is not set | ||
236 | |||
237 | # | ||
238 | # PCCARD (PCMCIA/CardBus) support | ||
239 | # | ||
240 | # CONFIG_PCCARD is not set | ||
241 | |||
242 | # | ||
243 | # PCI Hotplug Support | ||
244 | # | ||
245 | |||
246 | # | ||
247 | # Executable file formats | ||
248 | # | ||
249 | CONFIG_BINFMT_ELF=y | ||
250 | # CONFIG_BINFMT_FLAT is not set | ||
251 | # CONFIG_BINFMT_MISC is not set | ||
252 | |||
253 | # | ||
254 | # Power management options (EXPERIMENTAL) | ||
255 | # | ||
256 | # CONFIG_PM is not set | ||
257 | |||
258 | # | ||
259 | # Networking | ||
260 | # | ||
261 | CONFIG_NET=y | ||
262 | |||
263 | # | ||
264 | # Networking options | ||
265 | # | ||
266 | # CONFIG_NETDEBUG is not set | ||
267 | CONFIG_PACKET=y | ||
268 | # CONFIG_PACKET_MMAP is not set | ||
269 | CONFIG_UNIX=y | ||
270 | # CONFIG_NET_KEY is not set | ||
271 | CONFIG_INET=y | ||
272 | # CONFIG_IP_MULTICAST is not set | ||
273 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
274 | CONFIG_IP_FIB_HASH=y | ||
275 | # CONFIG_IP_PNP is not set | ||
276 | # CONFIG_NET_IPIP is not set | ||
277 | # CONFIG_NET_IPGRE is not set | ||
278 | # CONFIG_ARPD is not set | ||
279 | CONFIG_SYN_COOKIES=y | ||
280 | # CONFIG_INET_AH is not set | ||
281 | # CONFIG_INET_ESP is not set | ||
282 | # CONFIG_INET_IPCOMP is not set | ||
283 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
284 | # CONFIG_INET_TUNNEL is not set | ||
285 | # CONFIG_INET_DIAG is not set | ||
286 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
287 | CONFIG_TCP_CONG_BIC=y | ||
288 | |||
289 | # | ||
290 | # IP: Virtual Server Configuration | ||
291 | # | ||
292 | # CONFIG_IP_VS is not set | ||
293 | # CONFIG_IPV6 is not set | ||
294 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
295 | # CONFIG_INET6_TUNNEL is not set | ||
296 | CONFIG_NETFILTER=y | ||
297 | # CONFIG_NETFILTER_DEBUG is not set | ||
298 | |||
299 | # | ||
300 | # Core Netfilter Configuration | ||
301 | # | ||
302 | # CONFIG_NETFILTER_NETLINK is not set | ||
303 | # CONFIG_NETFILTER_XTABLES is not set | ||
304 | |||
305 | # | ||
306 | # IP: Netfilter Configuration | ||
307 | # | ||
308 | CONFIG_IP_NF_CONNTRACK=y | ||
309 | # CONFIG_IP_NF_CT_ACCT is not set | ||
310 | # CONFIG_IP_NF_CONNTRACK_MARK is not set | ||
311 | # CONFIG_IP_NF_CONNTRACK_EVENTS is not set | ||
312 | # CONFIG_IP_NF_CT_PROTO_SCTP is not set | ||
313 | CONFIG_IP_NF_FTP=m | ||
314 | # CONFIG_IP_NF_IRC is not set | ||
315 | # CONFIG_IP_NF_NETBIOS_NS is not set | ||
316 | # CONFIG_IP_NF_TFTP is not set | ||
317 | # CONFIG_IP_NF_AMANDA is not set | ||
318 | CONFIG_IP_NF_PPTP=m | ||
319 | # CONFIG_IP_NF_H323 is not set | ||
320 | # CONFIG_IP_NF_QUEUE is not set | ||
321 | |||
322 | # | ||
323 | # DCCP Configuration (EXPERIMENTAL) | ||
324 | # | ||
325 | # CONFIG_IP_DCCP is not set | ||
326 | |||
327 | # | ||
328 | # SCTP Configuration (EXPERIMENTAL) | ||
329 | # | ||
330 | # CONFIG_IP_SCTP is not set | ||
331 | |||
332 | # | ||
333 | # TIPC Configuration (EXPERIMENTAL) | ||
334 | # | ||
335 | # CONFIG_TIPC is not set | ||
336 | # CONFIG_ATM is not set | ||
337 | # CONFIG_BRIDGE is not set | ||
338 | # CONFIG_VLAN_8021Q is not set | ||
339 | # CONFIG_DECNET is not set | ||
340 | # CONFIG_LLC2 is not set | ||
341 | # CONFIG_IPX is not set | ||
342 | # CONFIG_ATALK is not set | ||
343 | # CONFIG_X25 is not set | ||
344 | # CONFIG_LAPB is not set | ||
345 | # CONFIG_NET_DIVERT is not set | ||
346 | # CONFIG_ECONET is not set | ||
347 | # CONFIG_WAN_ROUTER is not set | ||
348 | |||
349 | # | ||
350 | # QoS and/or fair queueing | ||
351 | # | ||
352 | CONFIG_NET_SCHED=y | ||
353 | CONFIG_NET_SCH_CLK_JIFFIES=y | ||
354 | # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set | ||
355 | # CONFIG_NET_SCH_CLK_CPU is not set | ||
356 | |||
357 | # | ||
358 | # Queueing/Scheduling | ||
359 | # | ||
360 | CONFIG_NET_SCH_CBQ=y | ||
361 | # CONFIG_NET_SCH_HTB is not set | ||
362 | # CONFIG_NET_SCH_HFSC is not set | ||
363 | # CONFIG_NET_SCH_PRIO is not set | ||
364 | # CONFIG_NET_SCH_RED is not set | ||
365 | # CONFIG_NET_SCH_SFQ is not set | ||
366 | # CONFIG_NET_SCH_TEQL is not set | ||
367 | # CONFIG_NET_SCH_TBF is not set | ||
368 | # CONFIG_NET_SCH_GRED is not set | ||
369 | # CONFIG_NET_SCH_DSMARK is not set | ||
370 | # CONFIG_NET_SCH_NETEM is not set | ||
371 | CONFIG_NET_SCH_INGRESS=y | ||
372 | |||
373 | # | ||
374 | # Classification | ||
375 | # | ||
376 | CONFIG_NET_CLS=y | ||
377 | CONFIG_NET_CLS_BASIC=y | ||
378 | CONFIG_NET_CLS_TCINDEX=y | ||
379 | CONFIG_NET_CLS_ROUTE4=y | ||
380 | CONFIG_NET_CLS_ROUTE=y | ||
381 | # CONFIG_NET_CLS_FW is not set | ||
382 | CONFIG_NET_CLS_U32=y | ||
383 | # CONFIG_CLS_U32_PERF is not set | ||
384 | # CONFIG_CLS_U32_MARK is not set | ||
385 | # CONFIG_NET_CLS_RSVP is not set | ||
386 | # CONFIG_NET_CLS_RSVP6 is not set | ||
387 | # CONFIG_NET_EMATCH is not set | ||
388 | # CONFIG_NET_CLS_ACT is not set | ||
389 | CONFIG_NET_CLS_POLICE=y | ||
390 | # CONFIG_NET_CLS_IND is not set | ||
391 | CONFIG_NET_ESTIMATOR=y | ||
392 | |||
393 | # | ||
394 | # Network testing | ||
395 | # | ||
396 | # CONFIG_NET_PKTGEN is not set | ||
397 | # CONFIG_HAMRADIO is not set | ||
398 | # CONFIG_IRDA is not set | ||
399 | # CONFIG_BT is not set | ||
400 | # CONFIG_IEEE80211 is not set | ||
401 | |||
402 | # | ||
403 | # Device Drivers | ||
404 | # | ||
405 | |||
406 | # | ||
407 | # Generic Driver Options | ||
408 | # | ||
409 | CONFIG_STANDALONE=y | ||
410 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
411 | CONFIG_FW_LOADER=y | ||
412 | |||
413 | # | ||
414 | # Connector - unified userspace <-> kernelspace linker | ||
415 | # | ||
416 | # CONFIG_CONNECTOR is not set | ||
417 | |||
418 | # | ||
419 | # Memory Technology Devices (MTD) | ||
420 | # | ||
421 | CONFIG_MTD=y | ||
422 | # CONFIG_MTD_DEBUG is not set | ||
423 | # CONFIG_MTD_CONCAT is not set | ||
424 | CONFIG_MTD_PARTITIONS=y | ||
425 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
426 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
427 | |||
428 | # | ||
429 | # User Modules And Translation Layers | ||
430 | # | ||
431 | CONFIG_MTD_CHAR=y | ||
432 | CONFIG_MTD_BLOCK=y | ||
433 | # CONFIG_FTL is not set | ||
434 | # CONFIG_NFTL is not set | ||
435 | # CONFIG_INFTL is not set | ||
436 | # CONFIG_RFD_FTL is not set | ||
437 | |||
438 | # | ||
439 | # RAM/ROM/Flash chip drivers | ||
440 | # | ||
441 | CONFIG_MTD_CFI=y | ||
442 | # CONFIG_MTD_JEDECPROBE is not set | ||
443 | CONFIG_MTD_GEN_PROBE=y | ||
444 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
445 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
446 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
447 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
448 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
449 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
450 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
451 | CONFIG_MTD_CFI_I1=y | ||
452 | CONFIG_MTD_CFI_I2=y | ||
453 | # CONFIG_MTD_CFI_I4 is not set | ||
454 | # CONFIG_MTD_CFI_I8 is not set | ||
455 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
456 | CONFIG_MTD_CFI_AMDSTD=y | ||
457 | # CONFIG_MTD_CFI_STAA is not set | ||
458 | CONFIG_MTD_CFI_UTIL=y | ||
459 | CONFIG_MTD_RAM=y | ||
460 | # CONFIG_MTD_ROM is not set | ||
461 | # CONFIG_MTD_ABSENT is not set | ||
462 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
463 | |||
464 | # | ||
465 | # Mapping drivers for chip access | ||
466 | # | ||
467 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
468 | # CONFIG_MTD_PHYSMAP is not set | ||
469 | # CONFIG_MTD_SOLUTIONENGINE is not set | ||
470 | CONFIG_MTD_SH7710VOIPGW=y | ||
471 | # CONFIG_MTD_PLATRAM is not set | ||
472 | |||
473 | # | ||
474 | # Self-contained MTD device drivers | ||
475 | # | ||
476 | # CONFIG_MTD_SLRAM is not set | ||
477 | # CONFIG_MTD_PHRAM is not set | ||
478 | # CONFIG_MTD_MTDRAM is not set | ||
479 | # CONFIG_MTD_BLOCK2MTD is not set | ||
480 | |||
481 | # | ||
482 | # Disk-On-Chip Device Drivers | ||
483 | # | ||
484 | # CONFIG_MTD_DOC2000 is not set | ||
485 | # CONFIG_MTD_DOC2001 is not set | ||
486 | # CONFIG_MTD_DOC2001PLUS is not set | ||
487 | |||
488 | # | ||
489 | # NAND Flash Device Drivers | ||
490 | # | ||
491 | # CONFIG_MTD_NAND is not set | ||
492 | |||
493 | # | ||
494 | # OneNAND Flash Device Drivers | ||
495 | # | ||
496 | # CONFIG_MTD_ONENAND is not set | ||
497 | |||
498 | # | ||
499 | # Parallel port support | ||
500 | # | ||
501 | # CONFIG_PARPORT is not set | ||
502 | |||
503 | # | ||
504 | # Plug and Play support | ||
505 | # | ||
506 | |||
507 | # | ||
508 | # Block devices | ||
509 | # | ||
510 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
511 | # CONFIG_BLK_DEV_LOOP is not set | ||
512 | # CONFIG_BLK_DEV_NBD is not set | ||
513 | # CONFIG_BLK_DEV_RAM is not set | ||
514 | # CONFIG_BLK_DEV_INITRD is not set | ||
515 | # CONFIG_CDROM_PKTCDVD is not set | ||
516 | # CONFIG_ATA_OVER_ETH is not set | ||
517 | |||
518 | # | ||
519 | # ATA/ATAPI/MFM/RLL support | ||
520 | # | ||
521 | # CONFIG_IDE is not set | ||
522 | |||
523 | # | ||
524 | # SCSI device support | ||
525 | # | ||
526 | # CONFIG_RAID_ATTRS is not set | ||
527 | # CONFIG_SCSI is not set | ||
528 | |||
529 | # | ||
530 | # Multi-device support (RAID and LVM) | ||
531 | # | ||
532 | # CONFIG_MD is not set | ||
533 | |||
534 | # | ||
535 | # Fusion MPT device support | ||
536 | # | ||
537 | # CONFIG_FUSION is not set | ||
538 | |||
539 | # | ||
540 | # IEEE 1394 (FireWire) support | ||
541 | # | ||
542 | |||
543 | # | ||
544 | # I2O device support | ||
545 | # | ||
546 | |||
547 | # | ||
548 | # Network device support | ||
549 | # | ||
550 | CONFIG_NETDEVICES=y | ||
551 | # CONFIG_DUMMY is not set | ||
552 | # CONFIG_BONDING is not set | ||
553 | # CONFIG_EQUALIZER is not set | ||
554 | # CONFIG_TUN is not set | ||
555 | |||
556 | # | ||
557 | # PHY device support | ||
558 | # | ||
559 | # CONFIG_PHYLIB is not set | ||
560 | |||
561 | # | ||
562 | # Ethernet (10 or 100Mbit) | ||
563 | # | ||
564 | CONFIG_NET_ETHERNET=y | ||
565 | # CONFIG_MII is not set | ||
566 | # CONFIG_STNIC is not set | ||
567 | # CONFIG_SMC91X is not set | ||
568 | # CONFIG_NE2000 is not set | ||
569 | |||
570 | # | ||
571 | # Ethernet (1000 Mbit) | ||
572 | # | ||
573 | |||
574 | # | ||
575 | # Ethernet (10000 Mbit) | ||
576 | # | ||
577 | |||
578 | # | ||
579 | # Token Ring devices | ||
580 | # | ||
581 | |||
582 | # | ||
583 | # Wireless LAN (non-hamradio) | ||
584 | # | ||
585 | # CONFIG_NET_RADIO is not set | ||
586 | |||
587 | # | ||
588 | # Wan interfaces | ||
589 | # | ||
590 | # CONFIG_WAN is not set | ||
591 | # CONFIG_PPP is not set | ||
592 | # CONFIG_SLIP is not set | ||
593 | # CONFIG_SHAPER is not set | ||
594 | # CONFIG_NETCONSOLE is not set | ||
595 | # CONFIG_NETPOLL is not set | ||
596 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
597 | |||
598 | # | ||
599 | # ISDN subsystem | ||
600 | # | ||
601 | # CONFIG_ISDN is not set | ||
602 | |||
603 | # | ||
604 | # Telephony Support | ||
605 | # | ||
606 | CONFIG_PHONE=y | ||
607 | # CONFIG_PHONE_IXJ is not set | ||
608 | |||
609 | # | ||
610 | # Input device support | ||
611 | # | ||
612 | CONFIG_INPUT=y | ||
613 | |||
614 | # | ||
615 | # Userland interfaces | ||
616 | # | ||
617 | # CONFIG_INPUT_MOUSEDEV is not set | ||
618 | # CONFIG_INPUT_JOYDEV is not set | ||
619 | # CONFIG_INPUT_TSDEV is not set | ||
620 | # CONFIG_INPUT_EVDEV is not set | ||
621 | # CONFIG_INPUT_EVBUG is not set | ||
622 | |||
623 | # | ||
624 | # Input Device Drivers | ||
625 | # | ||
626 | # CONFIG_INPUT_KEYBOARD is not set | ||
627 | # CONFIG_INPUT_MOUSE is not set | ||
628 | # CONFIG_INPUT_JOYSTICK is not set | ||
629 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
630 | # CONFIG_INPUT_MISC is not set | ||
631 | |||
632 | # | ||
633 | # Hardware I/O ports | ||
634 | # | ||
635 | # CONFIG_SERIO is not set | ||
636 | # CONFIG_GAMEPORT is not set | ||
637 | |||
638 | # | ||
639 | # Character devices | ||
640 | # | ||
641 | # CONFIG_VT is not set | ||
642 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
643 | |||
644 | # | ||
645 | # Serial drivers | ||
646 | # | ||
647 | # CONFIG_SERIAL_8250 is not set | ||
648 | |||
649 | # | ||
650 | # Non-8250 serial port support | ||
651 | # | ||
652 | CONFIG_SERIAL_SH_SCI=y | ||
653 | CONFIG_SERIAL_SH_SCI_NR_UARTS=2 | ||
654 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
655 | CONFIG_SERIAL_CORE=y | ||
656 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
657 | # CONFIG_UNIX98_PTYS is not set | ||
658 | CONFIG_LEGACY_PTYS=y | ||
659 | CONFIG_LEGACY_PTY_COUNT=256 | ||
660 | |||
661 | # | ||
662 | # IPMI | ||
663 | # | ||
664 | # CONFIG_IPMI_HANDLER is not set | ||
665 | |||
666 | # | ||
667 | # Watchdog Cards | ||
668 | # | ||
669 | # CONFIG_WATCHDOG is not set | ||
670 | # CONFIG_RTC is not set | ||
671 | # CONFIG_GEN_RTC is not set | ||
672 | # CONFIG_DTLK is not set | ||
673 | # CONFIG_R3964 is not set | ||
674 | |||
675 | # | ||
676 | # Ftape, the floppy tape device driver | ||
677 | # | ||
678 | # CONFIG_RAW_DRIVER is not set | ||
679 | |||
680 | # | ||
681 | # TPM devices | ||
682 | # | ||
683 | # CONFIG_TCG_TPM is not set | ||
684 | # CONFIG_TELCLOCK is not set | ||
685 | |||
686 | # | ||
687 | # I2C support | ||
688 | # | ||
689 | # CONFIG_I2C is not set | ||
690 | |||
691 | # | ||
692 | # SPI support | ||
693 | # | ||
694 | # CONFIG_SPI is not set | ||
695 | # CONFIG_SPI_MASTER is not set | ||
696 | |||
697 | # | ||
698 | # Dallas's 1-wire bus | ||
699 | # | ||
700 | # CONFIG_W1 is not set | ||
701 | |||
702 | # | ||
703 | # Hardware Monitoring support | ||
704 | # | ||
705 | # CONFIG_HWMON is not set | ||
706 | # CONFIG_HWMON_VID is not set | ||
707 | |||
708 | # | ||
709 | # Misc devices | ||
710 | # | ||
711 | |||
712 | # | ||
713 | # Multimedia devices | ||
714 | # | ||
715 | # CONFIG_VIDEO_DEV is not set | ||
716 | CONFIG_VIDEO_V4L2=y | ||
717 | |||
718 | # | ||
719 | # Digital Video Broadcasting Devices | ||
720 | # | ||
721 | # CONFIG_DVB is not set | ||
722 | |||
723 | # | ||
724 | # Graphics support | ||
725 | # | ||
726 | # CONFIG_FB is not set | ||
727 | |||
728 | # | ||
729 | # Sound | ||
730 | # | ||
731 | # CONFIG_SOUND is not set | ||
732 | |||
733 | # | ||
734 | # USB support | ||
735 | # | ||
736 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
737 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
738 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
739 | |||
740 | # | ||
741 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
742 | # | ||
743 | |||
744 | # | ||
745 | # USB Gadget Support | ||
746 | # | ||
747 | # CONFIG_USB_GADGET is not set | ||
748 | |||
749 | # | ||
750 | # MMC/SD Card support | ||
751 | # | ||
752 | # CONFIG_MMC is not set | ||
753 | |||
754 | # | ||
755 | # LED devices | ||
756 | # | ||
757 | # CONFIG_NEW_LEDS is not set | ||
758 | |||
759 | # | ||
760 | # LED drivers | ||
761 | # | ||
762 | |||
763 | # | ||
764 | # LED Triggers | ||
765 | # | ||
766 | |||
767 | # | ||
768 | # InfiniBand support | ||
769 | # | ||
770 | |||
771 | # | ||
772 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
773 | # | ||
774 | |||
775 | # | ||
776 | # Real Time Clock | ||
777 | # | ||
778 | # CONFIG_RTC_CLASS is not set | ||
779 | |||
780 | # | ||
781 | # File systems | ||
782 | # | ||
783 | # CONFIG_EXT2_FS is not set | ||
784 | # CONFIG_EXT3_FS is not set | ||
785 | # CONFIG_REISERFS_FS is not set | ||
786 | # CONFIG_JFS_FS is not set | ||
787 | # CONFIG_FS_POSIX_ACL is not set | ||
788 | # CONFIG_XFS_FS is not set | ||
789 | # CONFIG_OCFS2_FS is not set | ||
790 | # CONFIG_MINIX_FS is not set | ||
791 | # CONFIG_ROMFS_FS is not set | ||
792 | # CONFIG_INOTIFY is not set | ||
793 | # CONFIG_QUOTA is not set | ||
794 | # CONFIG_DNOTIFY is not set | ||
795 | # CONFIG_AUTOFS_FS is not set | ||
796 | # CONFIG_AUTOFS4_FS is not set | ||
797 | # CONFIG_FUSE_FS is not set | ||
798 | |||
799 | # | ||
800 | # CD-ROM/DVD Filesystems | ||
801 | # | ||
802 | # CONFIG_ISO9660_FS is not set | ||
803 | # CONFIG_UDF_FS is not set | ||
804 | |||
805 | # | ||
806 | # DOS/FAT/NT Filesystems | ||
807 | # | ||
808 | # CONFIG_MSDOS_FS is not set | ||
809 | # CONFIG_VFAT_FS is not set | ||
810 | # CONFIG_NTFS_FS is not set | ||
811 | |||
812 | # | ||
813 | # Pseudo filesystems | ||
814 | # | ||
815 | CONFIG_PROC_FS=y | ||
816 | # CONFIG_PROC_KCORE is not set | ||
817 | CONFIG_SYSFS=y | ||
818 | CONFIG_TMPFS=y | ||
819 | # CONFIG_HUGETLBFS is not set | ||
820 | # CONFIG_HUGETLB_PAGE is not set | ||
821 | CONFIG_RAMFS=y | ||
822 | # CONFIG_CONFIGFS_FS is not set | ||
823 | |||
824 | # | ||
825 | # Miscellaneous filesystems | ||
826 | # | ||
827 | # CONFIG_ADFS_FS is not set | ||
828 | # CONFIG_AFFS_FS is not set | ||
829 | # CONFIG_HFS_FS is not set | ||
830 | # CONFIG_HFSPLUS_FS is not set | ||
831 | # CONFIG_BEFS_FS is not set | ||
832 | # CONFIG_BFS_FS is not set | ||
833 | # CONFIG_EFS_FS is not set | ||
834 | # CONFIG_JFFS_FS is not set | ||
835 | CONFIG_JFFS2_FS=y | ||
836 | CONFIG_JFFS2_FS_DEBUG=0 | ||
837 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
838 | # CONFIG_JFFS2_SUMMARY is not set | ||
839 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
840 | CONFIG_JFFS2_ZLIB=y | ||
841 | CONFIG_JFFS2_RTIME=y | ||
842 | # CONFIG_JFFS2_RUBIN is not set | ||
843 | # CONFIG_CRAMFS is not set | ||
844 | # CONFIG_VXFS_FS is not set | ||
845 | # CONFIG_HPFS_FS is not set | ||
846 | # CONFIG_QNX4FS_FS is not set | ||
847 | # CONFIG_SYSV_FS is not set | ||
848 | # CONFIG_UFS_FS is not set | ||
849 | |||
850 | # | ||
851 | # Network File Systems | ||
852 | # | ||
853 | # CONFIG_NFS_FS is not set | ||
854 | # CONFIG_NFSD is not set | ||
855 | # CONFIG_SMB_FS is not set | ||
856 | # CONFIG_CIFS is not set | ||
857 | # CONFIG_NCP_FS is not set | ||
858 | # CONFIG_CODA_FS is not set | ||
859 | # CONFIG_AFS_FS is not set | ||
860 | # CONFIG_9P_FS is not set | ||
861 | |||
862 | # | ||
863 | # Partition Types | ||
864 | # | ||
865 | # CONFIG_PARTITION_ADVANCED is not set | ||
866 | CONFIG_MSDOS_PARTITION=y | ||
867 | |||
868 | # | ||
869 | # Native Language Support | ||
870 | # | ||
871 | # CONFIG_NLS is not set | ||
872 | |||
873 | # | ||
874 | # Profiling support | ||
875 | # | ||
876 | # CONFIG_PROFILING is not set | ||
877 | |||
878 | # | ||
879 | # Kernel hacking | ||
880 | # | ||
881 | # CONFIG_PRINTK_TIME is not set | ||
882 | # CONFIG_MAGIC_SYSRQ is not set | ||
883 | # CONFIG_DEBUG_KERNEL is not set | ||
884 | CONFIG_LOG_BUF_SHIFT=14 | ||
885 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
886 | # CONFIG_DEBUG_FS is not set | ||
887 | # CONFIG_SH_STANDARD_BIOS is not set | ||
888 | # CONFIG_KGDB is not set | ||
889 | |||
890 | # | ||
891 | # Security options | ||
892 | # | ||
893 | # CONFIG_KEYS is not set | ||
894 | # CONFIG_SECURITY is not set | ||
895 | |||
896 | # | ||
897 | # Cryptographic options | ||
898 | # | ||
899 | # CONFIG_CRYPTO is not set | ||
900 | |||
901 | # | ||
902 | # Hardware crypto devices | ||
903 | # | ||
904 | |||
905 | # | ||
906 | # Library routines | ||
907 | # | ||
908 | # CONFIG_CRC_CCITT is not set | ||
909 | # CONFIG_CRC16 is not set | ||
910 | CONFIG_CRC32=y | ||
911 | # CONFIG_LIBCRC32C is not set | ||
912 | CONFIG_ZLIB_INFLATE=y | ||
913 | CONFIG_ZLIB_DEFLATE=y | ||
diff --git a/arch/sh/configs/shmin_defconfig b/arch/sh/configs/shmin_defconfig new file mode 100644 index 000000000000..382b3bd3963b --- /dev/null +++ b/arch/sh/configs/shmin_defconfig | |||
@@ -0,0 +1,827 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.17 | ||
4 | # Wed Aug 2 01:45:03 2006 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
8 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
9 | CONFIG_GENERIC_HWEIGHT=y | ||
10 | CONFIG_GENERIC_HARDIRQS=y | ||
11 | CONFIG_GENERIC_IRQ_PROBE=y | ||
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
13 | CONFIG_PTRACE=y | ||
14 | |||
15 | # | ||
16 | # Code maturity level options | ||
17 | # | ||
18 | CONFIG_EXPERIMENTAL=y | ||
19 | CONFIG_BROKEN_ON_SMP=y | ||
20 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
21 | |||
22 | # | ||
23 | # General setup | ||
24 | # | ||
25 | CONFIG_LOCALVERSION="" | ||
26 | CONFIG_LOCALVERSION_AUTO=y | ||
27 | # CONFIG_SWAP is not set | ||
28 | # CONFIG_SYSVIPC is not set | ||
29 | # CONFIG_POSIX_MQUEUE is not set | ||
30 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
31 | # CONFIG_SYSCTL is not set | ||
32 | # CONFIG_AUDIT is not set | ||
33 | # CONFIG_IKCONFIG is not set | ||
34 | # CONFIG_RELAY is not set | ||
35 | CONFIG_INITRAMFS_SOURCE="" | ||
36 | # CONFIG_UID16 is not set | ||
37 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
38 | CONFIG_EMBEDDED=y | ||
39 | # CONFIG_KALLSYMS is not set | ||
40 | # CONFIG_HOTPLUG is not set | ||
41 | CONFIG_PRINTK=y | ||
42 | # CONFIG_BUG is not set | ||
43 | # CONFIG_ELF_CORE is not set | ||
44 | # CONFIG_BASE_FULL is not set | ||
45 | # CONFIG_FUTEX is not set | ||
46 | # CONFIG_EPOLL is not set | ||
47 | # CONFIG_SHMEM is not set | ||
48 | # CONFIG_SLAB is not set | ||
49 | CONFIG_TINY_SHMEM=y | ||
50 | CONFIG_BASE_SMALL=1 | ||
51 | CONFIG_SLOB=y | ||
52 | CONFIG_OBSOLETE_INTERMODULE=y | ||
53 | |||
54 | # | ||
55 | # Loadable module support | ||
56 | # | ||
57 | # CONFIG_MODULES is not set | ||
58 | |||
59 | # | ||
60 | # Block layer | ||
61 | # | ||
62 | # CONFIG_LBD is not set | ||
63 | # CONFIG_LSF is not set | ||
64 | |||
65 | # | ||
66 | # IO Schedulers | ||
67 | # | ||
68 | CONFIG_IOSCHED_NOOP=y | ||
69 | # CONFIG_IOSCHED_AS is not set | ||
70 | # CONFIG_IOSCHED_DEADLINE is not set | ||
71 | # CONFIG_IOSCHED_CFQ is not set | ||
72 | # CONFIG_DEFAULT_AS is not set | ||
73 | # CONFIG_DEFAULT_DEADLINE is not set | ||
74 | # CONFIG_DEFAULT_CFQ is not set | ||
75 | CONFIG_DEFAULT_NOOP=y | ||
76 | CONFIG_DEFAULT_IOSCHED="noop" | ||
77 | |||
78 | # | ||
79 | # System type | ||
80 | # | ||
81 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
82 | # CONFIG_SH_7709_SOLUTION_ENGINE is not set | ||
83 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
84 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
85 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
86 | # CONFIG_SH_7751_SYSTEMH is not set | ||
87 | # CONFIG_SH_STB1_HARP is not set | ||
88 | # CONFIG_SH_STB1_OVERDRIVE is not set | ||
89 | # CONFIG_SH_HP6XX is not set | ||
90 | # CONFIG_SH_CQREEK is not set | ||
91 | # CONFIG_SH_DMIDA is not set | ||
92 | # CONFIG_SH_EC3104 is not set | ||
93 | # CONFIG_SH_SATURN is not set | ||
94 | # CONFIG_SH_DREAMCAST is not set | ||
95 | # CONFIG_SH_CAT68701 is not set | ||
96 | # CONFIG_SH_BIGSUR is not set | ||
97 | # CONFIG_SH_SH2000 is not set | ||
98 | # CONFIG_SH_ADX is not set | ||
99 | # CONFIG_SH_MPC1211 is not set | ||
100 | # CONFIG_SH_SH03 is not set | ||
101 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
102 | # CONFIG_SH_HS7751RVOIP is not set | ||
103 | # CONFIG_SH_RTS7751R2D is not set | ||
104 | # CONFIG_SH_R7780RP is not set | ||
105 | # CONFIG_SH_EDOSK7705 is not set | ||
106 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
107 | # CONFIG_SH_LANDISK is not set | ||
108 | # CONFIG_SH_TITAN is not set | ||
109 | CONFIG_SH_SHMIN=y | ||
110 | # CONFIG_SH_UNKNOWN is not set | ||
111 | |||
112 | # | ||
113 | # Processor selection | ||
114 | # | ||
115 | CONFIG_CPU_SH3=y | ||
116 | |||
117 | # | ||
118 | # SH-2 Processor Support | ||
119 | # | ||
120 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
121 | |||
122 | # | ||
123 | # SH-3 Processor Support | ||
124 | # | ||
125 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
126 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
127 | CONFIG_CPU_SUBTYPE_SH7706=y | ||
128 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
129 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
130 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
131 | |||
132 | # | ||
133 | # SH-4 Processor Support | ||
134 | # | ||
135 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
136 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
137 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
138 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
139 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
140 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
141 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
142 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
143 | |||
144 | # | ||
145 | # ST40 Processor Support | ||
146 | # | ||
147 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
148 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
149 | |||
150 | # | ||
151 | # SH-4A Processor Support | ||
152 | # | ||
153 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
154 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
156 | |||
157 | # | ||
158 | # Memory management options | ||
159 | # | ||
160 | CONFIG_MMU=y | ||
161 | CONFIG_PAGE_OFFSET=0x80000000 | ||
162 | CONFIG_MEMORY_START=0x0c000000 | ||
163 | CONFIG_MEMORY_SIZE=0x00800000 | ||
164 | CONFIG_SELECT_MEMORY_MODEL=y | ||
165 | CONFIG_FLATMEM_MANUAL=y | ||
166 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
167 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
168 | CONFIG_FLATMEM=y | ||
169 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
170 | # CONFIG_SPARSEMEM_STATIC is not set | ||
171 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
172 | |||
173 | # | ||
174 | # Cache configuration | ||
175 | # | ||
176 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
177 | # CONFIG_SH_WRITETHROUGH is not set | ||
178 | # CONFIG_SH_OCRAM is not set | ||
179 | |||
180 | # | ||
181 | # Processor features | ||
182 | # | ||
183 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
184 | # CONFIG_SH_FPU_EMU is not set | ||
185 | # CONFIG_SH_DSP is not set | ||
186 | # CONFIG_SH_ADC is not set | ||
187 | CONFIG_CPU_HAS_INTEVT=y | ||
188 | CONFIG_CPU_HAS_SR_RB=y | ||
189 | |||
190 | # | ||
191 | # Timer support | ||
192 | # | ||
193 | CONFIG_SH_TMU=y | ||
194 | CONFIG_SH_PCLK_FREQ=32000000 | ||
195 | |||
196 | # | ||
197 | # CPU Frequency scaling | ||
198 | # | ||
199 | # CONFIG_CPU_FREQ is not set | ||
200 | |||
201 | # | ||
202 | # DMA support | ||
203 | # | ||
204 | # CONFIG_SH_DMA is not set | ||
205 | |||
206 | # | ||
207 | # Companion Chips | ||
208 | # | ||
209 | # CONFIG_HD6446X_SERIES is not set | ||
210 | |||
211 | # | ||
212 | # Kernel features | ||
213 | # | ||
214 | # CONFIG_KEXEC is not set | ||
215 | # CONFIG_PREEMPT is not set | ||
216 | # CONFIG_SMP is not set | ||
217 | |||
218 | # | ||
219 | # Boot options | ||
220 | # | ||
221 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
222 | CONFIG_BOOT_LINK_OFFSET=0x00210000 | ||
223 | # CONFIG_UBC_WAKEUP is not set | ||
224 | CONFIG_CMDLINE_BOOL=y | ||
225 | CONFIG_CMDLINE="console=ttySC1,115200 root=1f01 mtdparts=phys_mapped_flash:64k(firm)ro,-(sys) netdev=34,0x300,eth0 " | ||
226 | |||
227 | # | ||
228 | # Bus options | ||
229 | # | ||
230 | # CONFIG_PCI is not set | ||
231 | |||
232 | # | ||
233 | # PCCARD (PCMCIA/CardBus) support | ||
234 | # | ||
235 | # CONFIG_PCCARD is not set | ||
236 | |||
237 | # | ||
238 | # PCI Hotplug Support | ||
239 | # | ||
240 | |||
241 | # | ||
242 | # Executable file formats | ||
243 | # | ||
244 | CONFIG_BINFMT_ELF=y | ||
245 | # CONFIG_BINFMT_FLAT is not set | ||
246 | # CONFIG_BINFMT_MISC is not set | ||
247 | |||
248 | # | ||
249 | # Power management options (EXPERIMENTAL) | ||
250 | # | ||
251 | # CONFIG_PM is not set | ||
252 | |||
253 | # | ||
254 | # Networking | ||
255 | # | ||
256 | CONFIG_NET=y | ||
257 | |||
258 | # | ||
259 | # Networking options | ||
260 | # | ||
261 | # CONFIG_NETDEBUG is not set | ||
262 | # CONFIG_PACKET is not set | ||
263 | CONFIG_UNIX=y | ||
264 | # CONFIG_NET_KEY is not set | ||
265 | CONFIG_INET=y | ||
266 | # CONFIG_IP_MULTICAST is not set | ||
267 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
268 | CONFIG_IP_FIB_HASH=y | ||
269 | CONFIG_IP_PNP=y | ||
270 | # CONFIG_IP_PNP_DHCP is not set | ||
271 | # CONFIG_IP_PNP_BOOTP is not set | ||
272 | # CONFIG_IP_PNP_RARP is not set | ||
273 | # CONFIG_NET_IPIP is not set | ||
274 | # CONFIG_NET_IPGRE is not set | ||
275 | # CONFIG_ARPD is not set | ||
276 | # CONFIG_SYN_COOKIES is not set | ||
277 | # CONFIG_INET_AH is not set | ||
278 | # CONFIG_INET_ESP is not set | ||
279 | # CONFIG_INET_IPCOMP is not set | ||
280 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
281 | # CONFIG_INET_TUNNEL is not set | ||
282 | CONFIG_INET_DIAG=y | ||
283 | CONFIG_INET_TCP_DIAG=y | ||
284 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
285 | CONFIG_TCP_CONG_BIC=y | ||
286 | # CONFIG_IPV6 is not set | ||
287 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
288 | # CONFIG_INET6_TUNNEL is not set | ||
289 | # CONFIG_NETFILTER is not set | ||
290 | |||
291 | # | ||
292 | # DCCP Configuration (EXPERIMENTAL) | ||
293 | # | ||
294 | # CONFIG_IP_DCCP is not set | ||
295 | |||
296 | # | ||
297 | # SCTP Configuration (EXPERIMENTAL) | ||
298 | # | ||
299 | # CONFIG_IP_SCTP is not set | ||
300 | |||
301 | # | ||
302 | # TIPC Configuration (EXPERIMENTAL) | ||
303 | # | ||
304 | # CONFIG_TIPC is not set | ||
305 | # CONFIG_ATM is not set | ||
306 | # CONFIG_BRIDGE is not set | ||
307 | # CONFIG_VLAN_8021Q is not set | ||
308 | # CONFIG_DECNET is not set | ||
309 | # CONFIG_LLC2 is not set | ||
310 | # CONFIG_IPX is not set | ||
311 | # CONFIG_ATALK is not set | ||
312 | # CONFIG_X25 is not set | ||
313 | # CONFIG_LAPB is not set | ||
314 | # CONFIG_NET_DIVERT is not set | ||
315 | # CONFIG_ECONET is not set | ||
316 | # CONFIG_WAN_ROUTER is not set | ||
317 | |||
318 | # | ||
319 | # QoS and/or fair queueing | ||
320 | # | ||
321 | # CONFIG_NET_SCHED is not set | ||
322 | |||
323 | # | ||
324 | # Network testing | ||
325 | # | ||
326 | # CONFIG_NET_PKTGEN is not set | ||
327 | # CONFIG_HAMRADIO is not set | ||
328 | # CONFIG_IRDA is not set | ||
329 | # CONFIG_BT is not set | ||
330 | # CONFIG_IEEE80211 is not set | ||
331 | |||
332 | # | ||
333 | # Device Drivers | ||
334 | # | ||
335 | |||
336 | # | ||
337 | # Generic Driver Options | ||
338 | # | ||
339 | CONFIG_STANDALONE=y | ||
340 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
341 | # CONFIG_FW_LOADER is not set | ||
342 | |||
343 | # | ||
344 | # Connector - unified userspace <-> kernelspace linker | ||
345 | # | ||
346 | # CONFIG_CONNECTOR is not set | ||
347 | |||
348 | # | ||
349 | # Memory Technology Devices (MTD) | ||
350 | # | ||
351 | CONFIG_MTD=y | ||
352 | # CONFIG_MTD_DEBUG is not set | ||
353 | # CONFIG_MTD_CONCAT is not set | ||
354 | CONFIG_MTD_PARTITIONS=y | ||
355 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
356 | CONFIG_MTD_CMDLINE_PARTS=y | ||
357 | |||
358 | # | ||
359 | # User Modules And Translation Layers | ||
360 | # | ||
361 | # CONFIG_MTD_CHAR is not set | ||
362 | CONFIG_MTD_BLOCK=y | ||
363 | # CONFIG_FTL is not set | ||
364 | # CONFIG_NFTL is not set | ||
365 | # CONFIG_INFTL is not set | ||
366 | # CONFIG_RFD_FTL is not set | ||
367 | |||
368 | # | ||
369 | # RAM/ROM/Flash chip drivers | ||
370 | # | ||
371 | # CONFIG_MTD_CFI is not set | ||
372 | CONFIG_MTD_JEDECPROBE=y | ||
373 | CONFIG_MTD_GEN_PROBE=y | ||
374 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
375 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
376 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
377 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
378 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
379 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
380 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
381 | CONFIG_MTD_CFI_I1=y | ||
382 | CONFIG_MTD_CFI_I2=y | ||
383 | # CONFIG_MTD_CFI_I4 is not set | ||
384 | # CONFIG_MTD_CFI_I8 is not set | ||
385 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
386 | CONFIG_MTD_CFI_AMDSTD=y | ||
387 | # CONFIG_MTD_CFI_STAA is not set | ||
388 | CONFIG_MTD_CFI_UTIL=y | ||
389 | # CONFIG_MTD_RAM is not set | ||
390 | # CONFIG_MTD_ROM is not set | ||
391 | # CONFIG_MTD_ABSENT is not set | ||
392 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
393 | |||
394 | # | ||
395 | # Mapping drivers for chip access | ||
396 | # | ||
397 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
398 | CONFIG_MTD_PHYSMAP=y | ||
399 | CONFIG_MTD_PHYSMAP_START=0xa0000000 | ||
400 | CONFIG_MTD_PHYSMAP_LEN=0x80000 | ||
401 | CONFIG_MTD_PHYSMAP_BANKWIDTH=1 | ||
402 | # CONFIG_MTD_PLATRAM is not set | ||
403 | |||
404 | # | ||
405 | # Self-contained MTD device drivers | ||
406 | # | ||
407 | # CONFIG_MTD_SLRAM is not set | ||
408 | # CONFIG_MTD_PHRAM is not set | ||
409 | # CONFIG_MTD_MTDRAM is not set | ||
410 | # CONFIG_MTD_BLOCK2MTD is not set | ||
411 | |||
412 | # | ||
413 | # Disk-On-Chip Device Drivers | ||
414 | # | ||
415 | # CONFIG_MTD_DOC2000 is not set | ||
416 | # CONFIG_MTD_DOC2001 is not set | ||
417 | # CONFIG_MTD_DOC2001PLUS is not set | ||
418 | |||
419 | # | ||
420 | # NAND Flash Device Drivers | ||
421 | # | ||
422 | # CONFIG_MTD_NAND is not set | ||
423 | |||
424 | # | ||
425 | # OneNAND Flash Device Drivers | ||
426 | # | ||
427 | # CONFIG_MTD_ONENAND is not set | ||
428 | |||
429 | # | ||
430 | # Parallel port support | ||
431 | # | ||
432 | # CONFIG_PARPORT is not set | ||
433 | |||
434 | # | ||
435 | # Plug and Play support | ||
436 | # | ||
437 | |||
438 | # | ||
439 | # Block devices | ||
440 | # | ||
441 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
442 | CONFIG_BLK_DEV_LOOP=y | ||
443 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
444 | # CONFIG_BLK_DEV_NBD is not set | ||
445 | # CONFIG_BLK_DEV_RAM is not set | ||
446 | # CONFIG_BLK_DEV_INITRD is not set | ||
447 | # CONFIG_CDROM_PKTCDVD is not set | ||
448 | # CONFIG_ATA_OVER_ETH is not set | ||
449 | |||
450 | # | ||
451 | # ATA/ATAPI/MFM/RLL support | ||
452 | # | ||
453 | # CONFIG_IDE is not set | ||
454 | |||
455 | # | ||
456 | # SCSI device support | ||
457 | # | ||
458 | # CONFIG_RAID_ATTRS is not set | ||
459 | # CONFIG_SCSI is not set | ||
460 | |||
461 | # | ||
462 | # Multi-device support (RAID and LVM) | ||
463 | # | ||
464 | # CONFIG_MD is not set | ||
465 | |||
466 | # | ||
467 | # Fusion MPT device support | ||
468 | # | ||
469 | # CONFIG_FUSION is not set | ||
470 | |||
471 | # | ||
472 | # IEEE 1394 (FireWire) support | ||
473 | # | ||
474 | |||
475 | # | ||
476 | # I2O device support | ||
477 | # | ||
478 | |||
479 | # | ||
480 | # Network device support | ||
481 | # | ||
482 | CONFIG_NETDEVICES=y | ||
483 | # CONFIG_DUMMY is not set | ||
484 | # CONFIG_BONDING is not set | ||
485 | # CONFIG_EQUALIZER is not set | ||
486 | # CONFIG_TUN is not set | ||
487 | |||
488 | # | ||
489 | # PHY device support | ||
490 | # | ||
491 | # CONFIG_PHYLIB is not set | ||
492 | |||
493 | # | ||
494 | # Ethernet (10 or 100Mbit) | ||
495 | # | ||
496 | CONFIG_NET_ETHERNET=y | ||
497 | # CONFIG_MII is not set | ||
498 | # CONFIG_STNIC is not set | ||
499 | # CONFIG_SMC91X is not set | ||
500 | CONFIG_NE2000=y | ||
501 | |||
502 | # | ||
503 | # Ethernet (1000 Mbit) | ||
504 | # | ||
505 | |||
506 | # | ||
507 | # Ethernet (10000 Mbit) | ||
508 | # | ||
509 | |||
510 | # | ||
511 | # Token Ring devices | ||
512 | # | ||
513 | |||
514 | # | ||
515 | # Wireless LAN (non-hamradio) | ||
516 | # | ||
517 | # CONFIG_NET_RADIO is not set | ||
518 | |||
519 | # | ||
520 | # Wan interfaces | ||
521 | # | ||
522 | # CONFIG_WAN is not set | ||
523 | # CONFIG_PPP is not set | ||
524 | # CONFIG_SLIP is not set | ||
525 | # CONFIG_SHAPER is not set | ||
526 | # CONFIG_NETCONSOLE is not set | ||
527 | # CONFIG_NETPOLL is not set | ||
528 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
529 | |||
530 | # | ||
531 | # ISDN subsystem | ||
532 | # | ||
533 | # CONFIG_ISDN is not set | ||
534 | |||
535 | # | ||
536 | # Telephony Support | ||
537 | # | ||
538 | # CONFIG_PHONE is not set | ||
539 | |||
540 | # | ||
541 | # Input device support | ||
542 | # | ||
543 | # CONFIG_INPUT is not set | ||
544 | |||
545 | # | ||
546 | # Hardware I/O ports | ||
547 | # | ||
548 | # CONFIG_SERIO is not set | ||
549 | # CONFIG_GAMEPORT is not set | ||
550 | |||
551 | # | ||
552 | # Character devices | ||
553 | # | ||
554 | # CONFIG_VT is not set | ||
555 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
556 | |||
557 | # | ||
558 | # Serial drivers | ||
559 | # | ||
560 | # CONFIG_SERIAL_8250 is not set | ||
561 | |||
562 | # | ||
563 | # Non-8250 serial port support | ||
564 | # | ||
565 | CONFIG_SERIAL_SH_SCI=y | ||
566 | CONFIG_SERIAL_SH_SCI_NR_UARTS=2 | ||
567 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
568 | CONFIG_SERIAL_CORE=y | ||
569 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
570 | CONFIG_UNIX98_PTYS=y | ||
571 | CONFIG_LEGACY_PTYS=y | ||
572 | CONFIG_LEGACY_PTY_COUNT=256 | ||
573 | |||
574 | # | ||
575 | # IPMI | ||
576 | # | ||
577 | # CONFIG_IPMI_HANDLER is not set | ||
578 | |||
579 | # | ||
580 | # Watchdog Cards | ||
581 | # | ||
582 | # CONFIG_WATCHDOG is not set | ||
583 | # CONFIG_RTC is not set | ||
584 | # CONFIG_GEN_RTC is not set | ||
585 | # CONFIG_DTLK is not set | ||
586 | # CONFIG_R3964 is not set | ||
587 | |||
588 | # | ||
589 | # Ftape, the floppy tape device driver | ||
590 | # | ||
591 | # CONFIG_RAW_DRIVER is not set | ||
592 | |||
593 | # | ||
594 | # TPM devices | ||
595 | # | ||
596 | # CONFIG_TCG_TPM is not set | ||
597 | # CONFIG_TELCLOCK is not set | ||
598 | |||
599 | # | ||
600 | # I2C support | ||
601 | # | ||
602 | # CONFIG_I2C is not set | ||
603 | |||
604 | # | ||
605 | # SPI support | ||
606 | # | ||
607 | # CONFIG_SPI is not set | ||
608 | # CONFIG_SPI_MASTER is not set | ||
609 | |||
610 | # | ||
611 | # Dallas's 1-wire bus | ||
612 | # | ||
613 | # CONFIG_W1 is not set | ||
614 | |||
615 | # | ||
616 | # Hardware Monitoring support | ||
617 | # | ||
618 | # CONFIG_HWMON is not set | ||
619 | # CONFIG_HWMON_VID is not set | ||
620 | |||
621 | # | ||
622 | # Misc devices | ||
623 | # | ||
624 | |||
625 | # | ||
626 | # Multimedia devices | ||
627 | # | ||
628 | # CONFIG_VIDEO_DEV is not set | ||
629 | CONFIG_VIDEO_V4L2=y | ||
630 | |||
631 | # | ||
632 | # Digital Video Broadcasting Devices | ||
633 | # | ||
634 | # CONFIG_DVB is not set | ||
635 | |||
636 | # | ||
637 | # Graphics support | ||
638 | # | ||
639 | # CONFIG_FB is not set | ||
640 | |||
641 | # | ||
642 | # Sound | ||
643 | # | ||
644 | # CONFIG_SOUND is not set | ||
645 | |||
646 | # | ||
647 | # USB support | ||
648 | # | ||
649 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
650 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
651 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
652 | |||
653 | # | ||
654 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
655 | # | ||
656 | |||
657 | # | ||
658 | # USB Gadget Support | ||
659 | # | ||
660 | # CONFIG_USB_GADGET is not set | ||
661 | |||
662 | # | ||
663 | # MMC/SD Card support | ||
664 | # | ||
665 | # CONFIG_MMC is not set | ||
666 | |||
667 | # | ||
668 | # LED devices | ||
669 | # | ||
670 | # CONFIG_NEW_LEDS is not set | ||
671 | |||
672 | # | ||
673 | # LED drivers | ||
674 | # | ||
675 | |||
676 | # | ||
677 | # LED Triggers | ||
678 | # | ||
679 | |||
680 | # | ||
681 | # InfiniBand support | ||
682 | # | ||
683 | |||
684 | # | ||
685 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
686 | # | ||
687 | |||
688 | # | ||
689 | # Real Time Clock | ||
690 | # | ||
691 | # CONFIG_RTC_CLASS is not set | ||
692 | |||
693 | # | ||
694 | # File systems | ||
695 | # | ||
696 | # CONFIG_EXT2_FS is not set | ||
697 | # CONFIG_EXT3_FS is not set | ||
698 | # CONFIG_REISERFS_FS is not set | ||
699 | # CONFIG_JFS_FS is not set | ||
700 | # CONFIG_FS_POSIX_ACL is not set | ||
701 | # CONFIG_XFS_FS is not set | ||
702 | # CONFIG_OCFS2_FS is not set | ||
703 | # CONFIG_MINIX_FS is not set | ||
704 | # CONFIG_ROMFS_FS is not set | ||
705 | # CONFIG_INOTIFY is not set | ||
706 | # CONFIG_QUOTA is not set | ||
707 | # CONFIG_DNOTIFY is not set | ||
708 | # CONFIG_AUTOFS_FS is not set | ||
709 | # CONFIG_AUTOFS4_FS is not set | ||
710 | # CONFIG_FUSE_FS is not set | ||
711 | |||
712 | # | ||
713 | # CD-ROM/DVD Filesystems | ||
714 | # | ||
715 | # CONFIG_ISO9660_FS is not set | ||
716 | # CONFIG_UDF_FS is not set | ||
717 | |||
718 | # | ||
719 | # DOS/FAT/NT Filesystems | ||
720 | # | ||
721 | # CONFIG_MSDOS_FS is not set | ||
722 | # CONFIG_VFAT_FS is not set | ||
723 | # CONFIG_NTFS_FS is not set | ||
724 | |||
725 | # | ||
726 | # Pseudo filesystems | ||
727 | # | ||
728 | CONFIG_PROC_FS=y | ||
729 | # CONFIG_PROC_KCORE is not set | ||
730 | # CONFIG_SYSFS is not set | ||
731 | CONFIG_TMPFS=y | ||
732 | # CONFIG_HUGETLBFS is not set | ||
733 | # CONFIG_HUGETLB_PAGE is not set | ||
734 | CONFIG_RAMFS=y | ||
735 | |||
736 | # | ||
737 | # Miscellaneous filesystems | ||
738 | # | ||
739 | # CONFIG_ADFS_FS is not set | ||
740 | # CONFIG_AFFS_FS is not set | ||
741 | # CONFIG_HFS_FS is not set | ||
742 | # CONFIG_HFSPLUS_FS is not set | ||
743 | # CONFIG_BEFS_FS is not set | ||
744 | # CONFIG_BFS_FS is not set | ||
745 | # CONFIG_EFS_FS is not set | ||
746 | # CONFIG_JFFS_FS is not set | ||
747 | # CONFIG_JFFS2_FS is not set | ||
748 | CONFIG_CRAMFS=y | ||
749 | # CONFIG_VXFS_FS is not set | ||
750 | # CONFIG_HPFS_FS is not set | ||
751 | # CONFIG_QNX4FS_FS is not set | ||
752 | # CONFIG_SYSV_FS is not set | ||
753 | # CONFIG_UFS_FS is not set | ||
754 | |||
755 | # | ||
756 | # Network File Systems | ||
757 | # | ||
758 | CONFIG_NFS_FS=y | ||
759 | CONFIG_NFS_V3=y | ||
760 | # CONFIG_NFS_V3_ACL is not set | ||
761 | # CONFIG_NFS_V4 is not set | ||
762 | # CONFIG_NFS_DIRECTIO is not set | ||
763 | # CONFIG_NFSD is not set | ||
764 | CONFIG_ROOT_NFS=y | ||
765 | CONFIG_LOCKD=y | ||
766 | CONFIG_LOCKD_V4=y | ||
767 | CONFIG_NFS_COMMON=y | ||
768 | CONFIG_SUNRPC=y | ||
769 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
770 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
771 | # CONFIG_SMB_FS is not set | ||
772 | # CONFIG_CIFS is not set | ||
773 | # CONFIG_NCP_FS is not set | ||
774 | # CONFIG_CODA_FS is not set | ||
775 | # CONFIG_AFS_FS is not set | ||
776 | # CONFIG_9P_FS is not set | ||
777 | |||
778 | # | ||
779 | # Partition Types | ||
780 | # | ||
781 | # CONFIG_PARTITION_ADVANCED is not set | ||
782 | CONFIG_MSDOS_PARTITION=y | ||
783 | |||
784 | # | ||
785 | # Native Language Support | ||
786 | # | ||
787 | # CONFIG_NLS is not set | ||
788 | |||
789 | # | ||
790 | # Profiling support | ||
791 | # | ||
792 | # CONFIG_PROFILING is not set | ||
793 | |||
794 | # | ||
795 | # Kernel hacking | ||
796 | # | ||
797 | # CONFIG_PRINTK_TIME is not set | ||
798 | # CONFIG_MAGIC_SYSRQ is not set | ||
799 | # CONFIG_DEBUG_KERNEL is not set | ||
800 | CONFIG_LOG_BUF_SHIFT=14 | ||
801 | # CONFIG_UNWIND_INFO is not set | ||
802 | CONFIG_SH_STANDARD_BIOS=y | ||
803 | CONFIG_EARLY_PRINTK=y | ||
804 | # CONFIG_KGDB is not set | ||
805 | |||
806 | # | ||
807 | # Security options | ||
808 | # | ||
809 | # CONFIG_KEYS is not set | ||
810 | |||
811 | # | ||
812 | # Cryptographic options | ||
813 | # | ||
814 | # CONFIG_CRYPTO is not set | ||
815 | |||
816 | # | ||
817 | # Hardware crypto devices | ||
818 | # | ||
819 | |||
820 | # | ||
821 | # Library routines | ||
822 | # | ||
823 | # CONFIG_CRC_CCITT is not set | ||
824 | # CONFIG_CRC16 is not set | ||
825 | CONFIG_CRC32=y | ||
826 | # CONFIG_LIBCRC32C is not set | ||
827 | CONFIG_ZLIB_INFLATE=y | ||
diff --git a/arch/sh/configs/titan_defconfig b/arch/sh/configs/titan_defconfig new file mode 100644 index 000000000000..1db2904de9e5 --- /dev/null +++ b/arch/sh/configs/titan_defconfig | |||
@@ -0,0 +1,1367 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.14-sh | ||
4 | # Wed Nov 9 00:35:56 2005 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_UID16=y | ||
8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
12 | CONFIG_GENERIC_IOMAP=y | ||
13 | |||
14 | # | ||
15 | # Code maturity level options | ||
16 | # | ||
17 | CONFIG_EXPERIMENTAL=y | ||
18 | CONFIG_CLEAN_COMPILE=y | ||
19 | CONFIG_BROKEN_ON_SMP=y | ||
20 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
21 | |||
22 | # | ||
23 | # General setup | ||
24 | # | ||
25 | CONFIG_LOCALVERSION="" | ||
26 | CONFIG_LOCALVERSION_AUTO=y | ||
27 | CONFIG_SWAP=y | ||
28 | CONFIG_SYSVIPC=y | ||
29 | # CONFIG_POSIX_MQUEUE is not set | ||
30 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
31 | CONFIG_SYSCTL=y | ||
32 | # CONFIG_AUDIT is not set | ||
33 | CONFIG_HOTPLUG=y | ||
34 | CONFIG_KOBJECT_UEVENT=y | ||
35 | CONFIG_IKCONFIG=y | ||
36 | CONFIG_IKCONFIG_PROC=y | ||
37 | CONFIG_INITRAMFS_SOURCE="" | ||
38 | # CONFIG_EMBEDDED is not set | ||
39 | CONFIG_KALLSYMS=y | ||
40 | # CONFIG_KALLSYMS_ALL is not set | ||
41 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
42 | CONFIG_PRINTK=y | ||
43 | CONFIG_BUG=y | ||
44 | CONFIG_BASE_FULL=y | ||
45 | CONFIG_FUTEX=y | ||
46 | CONFIG_EPOLL=y | ||
47 | CONFIG_SHMEM=y | ||
48 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
49 | CONFIG_CC_ALIGN_LABELS=0 | ||
50 | CONFIG_CC_ALIGN_LOOPS=0 | ||
51 | CONFIG_CC_ALIGN_JUMPS=0 | ||
52 | # CONFIG_TINY_SHMEM is not set | ||
53 | CONFIG_BASE_SMALL=0 | ||
54 | |||
55 | # | ||
56 | # Loadable module support | ||
57 | # | ||
58 | CONFIG_MODULES=y | ||
59 | CONFIG_MODULE_UNLOAD=y | ||
60 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
61 | CONFIG_OBSOLETE_MODPARM=y | ||
62 | # CONFIG_MODVERSIONS is not set | ||
63 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
64 | CONFIG_KMOD=y | ||
65 | |||
66 | # | ||
67 | # System type | ||
68 | # | ||
69 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
70 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
71 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
72 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
73 | # CONFIG_SH_7751_SYSTEMH is not set | ||
74 | CONFIG_SH_TITAN=y | ||
75 | # CONFIG_SH_STB1_HARP is not set | ||
76 | # CONFIG_SH_STB1_OVERDRIVE is not set | ||
77 | # CONFIG_SH_HP6XX is not set | ||
78 | # CONFIG_SH_CQREEK is not set | ||
79 | # CONFIG_SH_DMIDA is not set | ||
80 | # CONFIG_SH_EC3104 is not set | ||
81 | # CONFIG_SH_SATURN is not set | ||
82 | # CONFIG_SH_DREAMCAST is not set | ||
83 | # CONFIG_SH_CAT68701 is not set | ||
84 | # CONFIG_SH_BIGSUR is not set | ||
85 | # CONFIG_SH_SH2000 is not set | ||
86 | # CONFIG_SH_ADX is not set | ||
87 | # CONFIG_SH_MPC1211 is not set | ||
88 | # CONFIG_SH_SH03 is not set | ||
89 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
90 | # CONFIG_SH_HS7751RVOIP is not set | ||
91 | # CONFIG_SH_RTS7751R2D is not set | ||
92 | # CONFIG_SH_EDOSK7705 is not set | ||
93 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
94 | # CONFIG_SH_LANDISK is not set | ||
95 | # CONFIG_SH_UNKNOWN is not set | ||
96 | |||
97 | # | ||
98 | # Processor selection | ||
99 | # | ||
100 | CONFIG_CPU_SH4=y | ||
101 | |||
102 | # | ||
103 | # SH-2 Processor Support | ||
104 | # | ||
105 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
106 | |||
107 | # | ||
108 | # SH-3 Processor Support | ||
109 | # | ||
110 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
111 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
112 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
113 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
114 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
115 | |||
116 | # | ||
117 | # SH-4 Processor Support | ||
118 | # | ||
119 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
120 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
121 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
122 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
123 | CONFIG_CPU_SUBTYPE_SH7751=y | ||
124 | CONFIG_CPU_SUBTYPE_SH7751R=y | ||
125 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
126 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
127 | |||
128 | # | ||
129 | # ST40 Processor Support | ||
130 | # | ||
131 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
132 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
133 | |||
134 | # | ||
135 | # SH-4A Processor Support | ||
136 | # | ||
137 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
138 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
139 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
140 | |||
141 | # | ||
142 | # Memory management options | ||
143 | # | ||
144 | CONFIG_MMU=y | ||
145 | CONFIG_SELECT_MEMORY_MODEL=y | ||
146 | CONFIG_FLATMEM_MANUAL=y | ||
147 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
148 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
149 | CONFIG_FLATMEM=y | ||
150 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
151 | # CONFIG_SPARSEMEM_STATIC is not set | ||
152 | |||
153 | # | ||
154 | # Cache configuration | ||
155 | # | ||
156 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
157 | # CONFIG_SH_WRITETHROUGH is not set | ||
158 | # CONFIG_SH_OCRAM is not set | ||
159 | CONFIG_MEMORY_START=0x08030000 | ||
160 | CONFIG_MEMORY_SIZE=0x7fd0000 | ||
161 | |||
162 | # | ||
163 | # Processor features | ||
164 | # | ||
165 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
166 | CONFIG_SH_RTC=y | ||
167 | CONFIG_SH_FPU=y | ||
168 | # CONFIG_SH_STORE_QUEUES is not set | ||
169 | |||
170 | # | ||
171 | # Timer support | ||
172 | # | ||
173 | CONFIG_SH_TMU=y | ||
174 | CONFIG_SH_PCLK_FREQ_BOOL=y | ||
175 | CONFIG_SH_PCLK_FREQ=30000000 | ||
176 | |||
177 | # | ||
178 | # CPU Frequency scaling | ||
179 | # | ||
180 | # CONFIG_CPU_FREQ is not set | ||
181 | |||
182 | # | ||
183 | # DMA support | ||
184 | # | ||
185 | CONFIG_SH_DMA=y | ||
186 | CONFIG_NR_ONCHIP_DMA_CHANNELS=8 | ||
187 | # CONFIG_NR_DMA_CHANNELS_BOOL is not set | ||
188 | |||
189 | # | ||
190 | # Companion Chips | ||
191 | # | ||
192 | # CONFIG_HD6446X_SERIES is not set | ||
193 | |||
194 | # | ||
195 | # Kernel features | ||
196 | # | ||
197 | # CONFIG_KEXEC is not set | ||
198 | # CONFIG_PREEMPT is not set | ||
199 | # CONFIG_SMP is not set | ||
200 | |||
201 | # | ||
202 | # Boot options | ||
203 | # | ||
204 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
205 | CONFIG_BOOT_LINK_OFFSET=0x009e0000 | ||
206 | # CONFIG_UBC_WAKEUP is not set | ||
207 | CONFIG_CMDLINE_BOOL=y | ||
208 | CONFIG_CMDLINE="console=ttySC1,38400N81 root=/dev/nfs ip=:::::eth1:autoconf" | ||
209 | |||
210 | # | ||
211 | # Bus options | ||
212 | # | ||
213 | CONFIG_PCI=y | ||
214 | CONFIG_SH_PCIDMA_NONCOHERENT=y | ||
215 | CONFIG_PCI_AUTO=y | ||
216 | CONFIG_PCI_AUTO_UPDATE_RESOURCES=y | ||
217 | CONFIG_PCI_LEGACY_PROC=y | ||
218 | #CONFIG_PCI_DEBUG is not set | ||
219 | |||
220 | # | ||
221 | # PCCARD (PCMCIA/CardBus) support | ||
222 | # | ||
223 | # CONFIG_PCCARD is not set | ||
224 | |||
225 | # | ||
226 | # PCI Hotplug Support | ||
227 | # | ||
228 | CONFIG_HOTPLUG_PCI=y | ||
229 | # CONFIG_HOTPLUG_PCI_FAKE is not set | ||
230 | # CONFIG_HOTPLUG_PCI_CPCI is not set | ||
231 | # CONFIG_HOTPLUG_PCI_SHPC is not set | ||
232 | |||
233 | # | ||
234 | # Executable file formats | ||
235 | # | ||
236 | CONFIG_BINFMT_ELF=y | ||
237 | # CONFIG_BINFMT_FLAT is not set | ||
238 | # CONFIG_BINFMT_MISC is not set | ||
239 | |||
240 | # | ||
241 | # Networking | ||
242 | # | ||
243 | CONFIG_NET=y | ||
244 | |||
245 | # | ||
246 | # Networking options | ||
247 | # | ||
248 | CONFIG_PACKET=y | ||
249 | CONFIG_PACKET_MMAP=y | ||
250 | CONFIG_UNIX=y | ||
251 | CONFIG_XFRM=y | ||
252 | # CONFIG_XFRM_USER is not set | ||
253 | CONFIG_NET_KEY=y | ||
254 | CONFIG_INET=y | ||
255 | CONFIG_IP_MULTICAST=y | ||
256 | CONFIG_IP_ADVANCED_ROUTER=y | ||
257 | CONFIG_ASK_IP_FIB_HASH=y | ||
258 | # CONFIG_IP_FIB_TRIE is not set | ||
259 | CONFIG_IP_FIB_HASH=y | ||
260 | CONFIG_IP_MULTIPLE_TABLES=y | ||
261 | # CONFIG_IP_ROUTE_FWMARK is not set | ||
262 | CONFIG_IP_ROUTE_MULTIPATH=y | ||
263 | CONFIG_IP_ROUTE_MULTIPATH_CACHED=y | ||
264 | CONFIG_IP_ROUTE_MULTIPATH_RR=m | ||
265 | CONFIG_IP_ROUTE_MULTIPATH_RANDOM=m | ||
266 | CONFIG_IP_ROUTE_MULTIPATH_WRANDOM=m | ||
267 | CONFIG_IP_ROUTE_MULTIPATH_DRR=m | ||
268 | # CONFIG_IP_ROUTE_VERBOSE is not set | ||
269 | CONFIG_IP_PNP=y | ||
270 | CONFIG_IP_PNP_DHCP=y | ||
271 | CONFIG_IP_PNP_BOOTP=y | ||
272 | CONFIG_IP_PNP_RARP=y | ||
273 | CONFIG_NET_IPIP=m | ||
274 | CONFIG_NET_IPGRE=m | ||
275 | CONFIG_NET_IPGRE_BROADCAST=y | ||
276 | CONFIG_IP_MROUTE=y | ||
277 | CONFIG_IP_PIMSM_V1=y | ||
278 | CONFIG_IP_PIMSM_V2=y | ||
279 | # CONFIG_ARPD is not set | ||
280 | CONFIG_SYN_COOKIES=y | ||
281 | CONFIG_INET_AH=m | ||
282 | CONFIG_INET_ESP=m | ||
283 | CONFIG_INET_IPCOMP=m | ||
284 | CONFIG_INET_TUNNEL=m | ||
285 | CONFIG_INET_DIAG=m | ||
286 | CONFIG_INET_TCP_DIAG=m | ||
287 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
288 | CONFIG_TCP_CONG_BIC=y | ||
289 | |||
290 | # | ||
291 | # IP: Virtual Server Configuration | ||
292 | # | ||
293 | # CONFIG_IP_VS is not set | ||
294 | CONFIG_IPV6=m | ||
295 | CONFIG_IPV6_PRIVACY=y | ||
296 | CONFIG_INET6_AH=m | ||
297 | CONFIG_INET6_ESP=m | ||
298 | CONFIG_INET6_IPCOMP=m | ||
299 | CONFIG_INET6_TUNNEL=m | ||
300 | CONFIG_IPV6_TUNNEL=m | ||
301 | CONFIG_NETFILTER=y | ||
302 | # CONFIG_NETFILTER_DEBUG is not set | ||
303 | CONFIG_BRIDGE_NETFILTER=y | ||
304 | CONFIG_NETFILTER_NETLINK=m | ||
305 | CONFIG_NETFILTER_NETLINK_QUEUE=m | ||
306 | CONFIG_NETFILTER_NETLINK_LOG=m | ||
307 | |||
308 | # | ||
309 | # IP: Netfilter Configuration | ||
310 | # | ||
311 | CONFIG_IP_NF_CONNTRACK=m | ||
312 | CONFIG_IP_NF_CT_ACCT=y | ||
313 | CONFIG_IP_NF_CONNTRACK_MARK=y | ||
314 | CONFIG_IP_NF_CONNTRACK_EVENTS=y | ||
315 | CONFIG_IP_NF_CONNTRACK_NETLINK=m | ||
316 | # CONFIG_IP_NF_CT_PROTO_SCTP is not set | ||
317 | CONFIG_IP_NF_FTP=m | ||
318 | CONFIG_IP_NF_IRC=m | ||
319 | CONFIG_IP_NF_NETBIOS_NS=m | ||
320 | CONFIG_IP_NF_TFTP=m | ||
321 | # CONFIG_IP_NF_AMANDA is not set | ||
322 | CONFIG_IP_NF_PPTP=m | ||
323 | CONFIG_IP_NF_QUEUE=m | ||
324 | CONFIG_IP_NF_IPTABLES=m | ||
325 | CONFIG_IP_NF_MATCH_LIMIT=m | ||
326 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
327 | CONFIG_IP_NF_MATCH_MAC=m | ||
328 | CONFIG_IP_NF_MATCH_PKTTYPE=m | ||
329 | CONFIG_IP_NF_MATCH_MARK=m | ||
330 | CONFIG_IP_NF_MATCH_MULTIPORT=m | ||
331 | CONFIG_IP_NF_MATCH_TOS=m | ||
332 | CONFIG_IP_NF_MATCH_RECENT=m | ||
333 | CONFIG_IP_NF_MATCH_ECN=m | ||
334 | CONFIG_IP_NF_MATCH_DSCP=m | ||
335 | CONFIG_IP_NF_MATCH_AH_ESP=m | ||
336 | CONFIG_IP_NF_MATCH_LENGTH=m | ||
337 | CONFIG_IP_NF_MATCH_TTL=m | ||
338 | CONFIG_IP_NF_MATCH_TCPMSS=m | ||
339 | CONFIG_IP_NF_MATCH_HELPER=m | ||
340 | CONFIG_IP_NF_MATCH_STATE=m | ||
341 | CONFIG_IP_NF_MATCH_CONNTRACK=m | ||
342 | CONFIG_IP_NF_MATCH_OWNER=m | ||
343 | # CONFIG_IP_NF_MATCH_PHYSDEV is not set | ||
344 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
345 | CONFIG_IP_NF_MATCH_REALM=m | ||
346 | # CONFIG_IP_NF_MATCH_SCTP is not set | ||
347 | # CONFIG_IP_NF_MATCH_DCCP is not set | ||
348 | CONFIG_IP_NF_MATCH_COMMENT=m | ||
349 | CONFIG_IP_NF_MATCH_CONNMARK=m | ||
350 | CONFIG_IP_NF_MATCH_CONNBYTES=m | ||
351 | CONFIG_IP_NF_MATCH_HASHLIMIT=m | ||
352 | CONFIG_IP_NF_MATCH_STRING=m | ||
353 | CONFIG_IP_NF_FILTER=m | ||
354 | CONFIG_IP_NF_TARGET_REJECT=m | ||
355 | CONFIG_IP_NF_TARGET_LOG=m | ||
356 | CONFIG_IP_NF_TARGET_ULOG=m | ||
357 | CONFIG_IP_NF_TARGET_TCPMSS=m | ||
358 | CONFIG_IP_NF_TARGET_NFQUEUE=m | ||
359 | CONFIG_IP_NF_NAT=m | ||
360 | CONFIG_IP_NF_NAT_NEEDED=y | ||
361 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
362 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
363 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
364 | CONFIG_IP_NF_TARGET_SAME=m | ||
365 | CONFIG_IP_NF_NAT_SNMP_BASIC=m | ||
366 | CONFIG_IP_NF_NAT_IRC=m | ||
367 | CONFIG_IP_NF_NAT_FTP=m | ||
368 | CONFIG_IP_NF_NAT_TFTP=m | ||
369 | CONFIG_IP_NF_NAT_PPTP=m | ||
370 | CONFIG_IP_NF_MANGLE=m | ||
371 | CONFIG_IP_NF_TARGET_TOS=m | ||
372 | CONFIG_IP_NF_TARGET_ECN=m | ||
373 | CONFIG_IP_NF_TARGET_DSCP=m | ||
374 | CONFIG_IP_NF_TARGET_MARK=m | ||
375 | CONFIG_IP_NF_TARGET_CLASSIFY=m | ||
376 | CONFIG_IP_NF_TARGET_TTL=m | ||
377 | CONFIG_IP_NF_TARGET_CONNMARK=m | ||
378 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | ||
379 | CONFIG_IP_NF_RAW=m | ||
380 | CONFIG_IP_NF_TARGET_NOTRACK=m | ||
381 | CONFIG_IP_NF_ARPTABLES=m | ||
382 | CONFIG_IP_NF_ARPFILTER=m | ||
383 | CONFIG_IP_NF_ARP_MANGLE=m | ||
384 | |||
385 | # | ||
386 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
387 | # | ||
388 | CONFIG_IP6_NF_QUEUE=m | ||
389 | CONFIG_IP6_NF_IPTABLES=m | ||
390 | CONFIG_IP6_NF_MATCH_LIMIT=m | ||
391 | CONFIG_IP6_NF_MATCH_MAC=m | ||
392 | CONFIG_IP6_NF_MATCH_RT=m | ||
393 | CONFIG_IP6_NF_MATCH_OPTS=m | ||
394 | CONFIG_IP6_NF_MATCH_FRAG=m | ||
395 | CONFIG_IP6_NF_MATCH_HL=m | ||
396 | CONFIG_IP6_NF_MATCH_MULTIPORT=m | ||
397 | CONFIG_IP6_NF_MATCH_OWNER=m | ||
398 | CONFIG_IP6_NF_MATCH_MARK=m | ||
399 | CONFIG_IP6_NF_MATCH_IPV6HEADER=m | ||
400 | CONFIG_IP6_NF_MATCH_AHESP=m | ||
401 | CONFIG_IP6_NF_MATCH_LENGTH=m | ||
402 | CONFIG_IP6_NF_MATCH_EUI64=m | ||
403 | # CONFIG_IP6_NF_MATCH_PHYSDEV is not set | ||
404 | CONFIG_IP6_NF_FILTER=m | ||
405 | CONFIG_IP6_NF_TARGET_LOG=m | ||
406 | CONFIG_IP6_NF_TARGET_REJECT=m | ||
407 | CONFIG_IP6_NF_TARGET_NFQUEUE=m | ||
408 | CONFIG_IP6_NF_MANGLE=m | ||
409 | CONFIG_IP6_NF_TARGET_MARK=m | ||
410 | CONFIG_IP6_NF_TARGET_HL=m | ||
411 | CONFIG_IP6_NF_RAW=m | ||
412 | |||
413 | # | ||
414 | # Bridge: Netfilter Configuration | ||
415 | # | ||
416 | # CONFIG_BRIDGE_NF_EBTABLES is not set | ||
417 | |||
418 | # | ||
419 | # DCCP Configuration (EXPERIMENTAL) | ||
420 | # | ||
421 | # CONFIG_IP_DCCP is not set | ||
422 | |||
423 | # | ||
424 | # SCTP Configuration (EXPERIMENTAL) | ||
425 | # | ||
426 | # CONFIG_IP_SCTP is not set | ||
427 | # CONFIG_ATM is not set | ||
428 | CONFIG_BRIDGE=m | ||
429 | CONFIG_VLAN_8021Q=m | ||
430 | # CONFIG_DECNET is not set | ||
431 | # CONFIG_LLC2 is not set | ||
432 | # CONFIG_IPX is not set | ||
433 | # CONFIG_ATALK is not set | ||
434 | # CONFIG_X25 is not set | ||
435 | # CONFIG_LAPB is not set | ||
436 | # CONFIG_NET_DIVERT is not set | ||
437 | # CONFIG_ECONET is not set | ||
438 | # CONFIG_WAN_ROUTER is not set | ||
439 | CONFIG_NET_SCHED=y | ||
440 | CONFIG_NET_SCH_CLK_JIFFIES=y | ||
441 | # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set | ||
442 | # CONFIG_NET_SCH_CLK_CPU is not set | ||
443 | CONFIG_NET_SCH_CBQ=m | ||
444 | CONFIG_NET_SCH_HTB=m | ||
445 | CONFIG_NET_SCH_HFSC=m | ||
446 | CONFIG_NET_SCH_PRIO=m | ||
447 | CONFIG_NET_SCH_RED=m | ||
448 | CONFIG_NET_SCH_SFQ=m | ||
449 | CONFIG_NET_SCH_TEQL=m | ||
450 | CONFIG_NET_SCH_TBF=m | ||
451 | CONFIG_NET_SCH_GRED=m | ||
452 | CONFIG_NET_SCH_DSMARK=m | ||
453 | CONFIG_NET_SCH_NETEM=m | ||
454 | CONFIG_NET_SCH_INGRESS=m | ||
455 | CONFIG_NET_QOS=y | ||
456 | CONFIG_NET_ESTIMATOR=y | ||
457 | CONFIG_NET_CLS=y | ||
458 | CONFIG_NET_CLS_BASIC=m | ||
459 | CONFIG_NET_CLS_TCINDEX=m | ||
460 | CONFIG_NET_CLS_ROUTE4=m | ||
461 | CONFIG_NET_CLS_ROUTE=y | ||
462 | CONFIG_NET_CLS_FW=m | ||
463 | CONFIG_NET_CLS_U32=m | ||
464 | CONFIG_CLS_U32_PERF=y | ||
465 | CONFIG_NET_CLS_IND=y | ||
466 | CONFIG_CLS_U32_MARK=y | ||
467 | CONFIG_NET_CLS_RSVP=m | ||
468 | CONFIG_NET_CLS_RSVP6=m | ||
469 | CONFIG_NET_EMATCH=y | ||
470 | CONFIG_NET_EMATCH_STACK=32 | ||
471 | CONFIG_NET_EMATCH_CMP=m | ||
472 | CONFIG_NET_EMATCH_NBYTE=m | ||
473 | CONFIG_NET_EMATCH_U32=m | ||
474 | CONFIG_NET_EMATCH_META=m | ||
475 | CONFIG_NET_EMATCH_TEXT=m | ||
476 | CONFIG_NET_CLS_ACT=y | ||
477 | CONFIG_NET_ACT_POLICE=m | ||
478 | CONFIG_NET_ACT_GACT=m | ||
479 | CONFIG_GACT_PROB=y | ||
480 | CONFIG_NET_ACT_MIRRED=m | ||
481 | CONFIG_NET_ACT_IPT=m | ||
482 | CONFIG_NET_ACT_PEDIT=m | ||
483 | # CONFIG_NET_ACT_SIMP is not set | ||
484 | |||
485 | # | ||
486 | # Network testing | ||
487 | # | ||
488 | # CONFIG_NET_PKTGEN is not set | ||
489 | # CONFIG_HAMRADIO is not set | ||
490 | # CONFIG_IRDA is not set | ||
491 | # CONFIG_BT is not set | ||
492 | # CONFIG_IEEE80211 is not set | ||
493 | |||
494 | # | ||
495 | # Device Drivers | ||
496 | # | ||
497 | |||
498 | # | ||
499 | # Generic Driver Options | ||
500 | # | ||
501 | CONFIG_STANDALONE=y | ||
502 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
503 | CONFIG_FW_LOADER=m | ||
504 | # CONFIG_DEBUG_DRIVER is not set | ||
505 | |||
506 | # | ||
507 | # Connector - unified userspace <-> kernelspace linker | ||
508 | # | ||
509 | CONFIG_CONNECTOR=m | ||
510 | |||
511 | # | ||
512 | # Memory Technology Devices (MTD) | ||
513 | # | ||
514 | # CONFIG_MTD is not set | ||
515 | |||
516 | # | ||
517 | # Parallel port support | ||
518 | # | ||
519 | # CONFIG_PARPORT is not set | ||
520 | |||
521 | # | ||
522 | # Plug and Play support | ||
523 | # | ||
524 | |||
525 | # | ||
526 | # Block devices | ||
527 | # | ||
528 | # CONFIG_BLK_CPQ_DA is not set | ||
529 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
530 | # CONFIG_BLK_DEV_DAC960 is not set | ||
531 | CONFIG_BLK_SSFDC=y | ||
532 | # CONFIG_BLK_DEV_UMEM is not set | ||
533 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
534 | CONFIG_BLK_DEV_LOOP=m | ||
535 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
536 | # CONFIG_BLK_DEV_NBD is not set | ||
537 | # CONFIG_BLK_DEV_SX8 is not set | ||
538 | # CONFIG_BLK_DEV_UB is not set | ||
539 | CONFIG_BLK_DEV_RAM=y | ||
540 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
541 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
542 | CONFIG_BLK_DEV_INITRD=y | ||
543 | # CONFIG_LBD is not set | ||
544 | # CONFIG_CDROM_PKTCDVD is not set | ||
545 | |||
546 | # | ||
547 | # IO Schedulers | ||
548 | # | ||
549 | CONFIG_IOSCHED_NOOP=y | ||
550 | CONFIG_IOSCHED_AS=y | ||
551 | CONFIG_IOSCHED_DEADLINE=y | ||
552 | CONFIG_IOSCHED_CFQ=y | ||
553 | # CONFIG_ATA_OVER_ETH is not set | ||
554 | |||
555 | # | ||
556 | # ATA/ATAPI/MFM/RLL support | ||
557 | # | ||
558 | # CONFIG_IDE is not set | ||
559 | |||
560 | # | ||
561 | # SCSI device support | ||
562 | # | ||
563 | # CONFIG_RAID_ATTRS is not set | ||
564 | CONFIG_SCSI=m | ||
565 | CONFIG_SCSI_PROC_FS=y | ||
566 | |||
567 | # | ||
568 | # SCSI support type (disk, tape, CD-ROM) | ||
569 | # | ||
570 | CONFIG_BLK_DEV_SD=m | ||
571 | # CONFIG_CHR_DEV_ST is not set | ||
572 | # CONFIG_CHR_DEV_OSST is not set | ||
573 | CONFIG_BLK_DEV_SR=m | ||
574 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
575 | CONFIG_CHR_DEV_SG=m | ||
576 | # CONFIG_CHR_DEV_SCH is not set | ||
577 | |||
578 | # | ||
579 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
580 | # | ||
581 | # CONFIG_SCSI_MULTI_LUN is not set | ||
582 | # CONFIG_SCSI_CONSTANTS is not set | ||
583 | # CONFIG_SCSI_LOGGING is not set | ||
584 | |||
585 | # | ||
586 | # SCSI Transport Attributes | ||
587 | # | ||
588 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
589 | # CONFIG_SCSI_FC_ATTRS is not set | ||
590 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
591 | # CONFIG_SCSI_SAS_ATTRS is not set | ||
592 | |||
593 | # | ||
594 | # SCSI low-level drivers | ||
595 | # | ||
596 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
597 | # CONFIG_SCSI_3W_9XXX is not set | ||
598 | # CONFIG_SCSI_ACARD is not set | ||
599 | # CONFIG_SCSI_AACRAID is not set | ||
600 | # CONFIG_SCSI_AIC7XXX is not set | ||
601 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
602 | # CONFIG_SCSI_AIC79XX is not set | ||
603 | # CONFIG_SCSI_DPT_I2O is not set | ||
604 | # CONFIG_MEGARAID_NEWGEN is not set | ||
605 | # CONFIG_MEGARAID_LEGACY is not set | ||
606 | # CONFIG_MEGARAID_SAS is not set | ||
607 | # CONFIG_SCSI_SATA is not set | ||
608 | # CONFIG_SCSI_DMX3191D is not set | ||
609 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
610 | # CONFIG_SCSI_IPS is not set | ||
611 | # CONFIG_SCSI_INITIO is not set | ||
612 | # CONFIG_SCSI_INIA100 is not set | ||
613 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
614 | # CONFIG_SCSI_IPR is not set | ||
615 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
616 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
617 | CONFIG_SCSI_QLA2XXX=m | ||
618 | # CONFIG_SCSI_QLA21XX is not set | ||
619 | # CONFIG_SCSI_QLA22XX is not set | ||
620 | # CONFIG_SCSI_QLA2300 is not set | ||
621 | # CONFIG_SCSI_QLA2322 is not set | ||
622 | # CONFIG_SCSI_QLA6312 is not set | ||
623 | # CONFIG_SCSI_QLA24XX is not set | ||
624 | # CONFIG_SCSI_LPFC is not set | ||
625 | # CONFIG_SCSI_DC395x is not set | ||
626 | # CONFIG_SCSI_DC390T is not set | ||
627 | # CONFIG_SCSI_NSP32 is not set | ||
628 | # CONFIG_SCSI_DEBUG is not set | ||
629 | |||
630 | # | ||
631 | # Multi-device support (RAID and LVM) | ||
632 | # | ||
633 | # CONFIG_MD is not set | ||
634 | |||
635 | # | ||
636 | # Fusion MPT device support | ||
637 | # | ||
638 | # CONFIG_FUSION is not set | ||
639 | # CONFIG_FUSION_SPI is not set | ||
640 | # CONFIG_FUSION_FC is not set | ||
641 | # CONFIG_FUSION_SAS is not set | ||
642 | |||
643 | # | ||
644 | # IEEE 1394 (FireWire) support | ||
645 | # | ||
646 | # CONFIG_IEEE1394 is not set | ||
647 | |||
648 | # | ||
649 | # I2O device support | ||
650 | # | ||
651 | # CONFIG_I2O is not set | ||
652 | |||
653 | # | ||
654 | # Network device support | ||
655 | # | ||
656 | CONFIG_NETDEVICES=y | ||
657 | # CONFIG_DUMMY is not set | ||
658 | # CONFIG_BONDING is not set | ||
659 | # CONFIG_EQUALIZER is not set | ||
660 | CONFIG_TUN=m | ||
661 | |||
662 | # | ||
663 | # ARCnet devices | ||
664 | # | ||
665 | # CONFIG_ARCNET is not set | ||
666 | |||
667 | # | ||
668 | # PHY device support | ||
669 | # | ||
670 | CONFIG_PHYLIB=m | ||
671 | CONFIG_PHYCONTROL=y | ||
672 | |||
673 | # | ||
674 | # MII PHY device drivers | ||
675 | # | ||
676 | CONFIG_MARVELL_PHY=m | ||
677 | CONFIG_DAVICOM_PHY=m | ||
678 | CONFIG_QSEMI_PHY=m | ||
679 | CONFIG_LXT_PHY=m | ||
680 | CONFIG_CICADA_PHY=m | ||
681 | |||
682 | # | ||
683 | # Ethernet (10 or 100Mbit) | ||
684 | # | ||
685 | CONFIG_NET_ETHERNET=y | ||
686 | CONFIG_MII=y | ||
687 | # CONFIG_STNIC is not set | ||
688 | # CONFIG_HAPPYMEAL is not set | ||
689 | # CONFIG_SUNGEM is not set | ||
690 | CONFIG_CASSINI=m | ||
691 | # CONFIG_NET_VENDOR_3COM is not set | ||
692 | # CONFIG_SMC91X is not set | ||
693 | |||
694 | # | ||
695 | # Tulip family network device support | ||
696 | # | ||
697 | # CONFIG_NET_TULIP is not set | ||
698 | # CONFIG_HP100 is not set | ||
699 | # CONFIG_NE2000 is not set | ||
700 | CONFIG_NET_PCI=y | ||
701 | # CONFIG_PCNET32 is not set | ||
702 | # CONFIG_AMD8111_ETH is not set | ||
703 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
704 | # CONFIG_B44 is not set | ||
705 | # CONFIG_FORCEDETH is not set | ||
706 | # CONFIG_DGRS is not set | ||
707 | # CONFIG_EEPRO100 is not set | ||
708 | # CONFIG_E100 is not set | ||
709 | # CONFIG_FEALNX is not set | ||
710 | # CONFIG_NATSEMI is not set | ||
711 | # CONFIG_NE2K_PCI is not set | ||
712 | # CONFIG_8139CP is not set | ||
713 | CONFIG_8139TOO=y | ||
714 | # CONFIG_8139TOO_PIO is not set | ||
715 | CONFIG_8139TOO_TUNE_TWISTER=y | ||
716 | # CONFIG_8139TOO_8129 is not set | ||
717 | CONFIG_8139_OLD_RX_RESET=y | ||
718 | # CONFIG_SIS900 is not set | ||
719 | # CONFIG_EPIC100 is not set | ||
720 | # CONFIG_SUNDANCE is not set | ||
721 | # CONFIG_TLAN is not set | ||
722 | # CONFIG_VIA_RHINE is not set | ||
723 | |||
724 | # | ||
725 | # Ethernet (1000 Mbit) | ||
726 | # | ||
727 | # CONFIG_ACENIC is not set | ||
728 | # CONFIG_DL2K is not set | ||
729 | # CONFIG_E1000 is not set | ||
730 | # CONFIG_NS83820 is not set | ||
731 | # CONFIG_HAMACHI is not set | ||
732 | # CONFIG_YELLOWFIN is not set | ||
733 | # CONFIG_R8169 is not set | ||
734 | # CONFIG_SIS190 is not set | ||
735 | # CONFIG_SKGE is not set | ||
736 | # CONFIG_SK98LIN is not set | ||
737 | # CONFIG_VIA_VELOCITY is not set | ||
738 | # CONFIG_TIGON3 is not set | ||
739 | # CONFIG_BNX2 is not set | ||
740 | |||
741 | # | ||
742 | # Ethernet (10000 Mbit) | ||
743 | # | ||
744 | # CONFIG_CHELSIO_T1 is not set | ||
745 | # CONFIG_IXGB is not set | ||
746 | # CONFIG_S2IO is not set | ||
747 | |||
748 | # | ||
749 | # Token Ring devices | ||
750 | # | ||
751 | # CONFIG_TR is not set | ||
752 | |||
753 | # | ||
754 | # Wireless LAN (non-hamradio) | ||
755 | # | ||
756 | CONFIG_NET_RADIO=y | ||
757 | |||
758 | # | ||
759 | # Obsolete Wireless cards support (pre-802.11) | ||
760 | # | ||
761 | # CONFIG_STRIP is not set | ||
762 | |||
763 | # | ||
764 | # Wireless 802.11b ISA/PCI cards support | ||
765 | # | ||
766 | # CONFIG_HERMES is not set | ||
767 | # CONFIG_ATMEL is not set | ||
768 | |||
769 | # | ||
770 | # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support | ||
771 | # | ||
772 | CONFIG_PRISM54=m | ||
773 | # CONFIG_HOSTAP is not set | ||
774 | CONFIG_NET_WIRELESS=y | ||
775 | |||
776 | # | ||
777 | # Wan interfaces | ||
778 | # | ||
779 | # CONFIG_WAN is not set | ||
780 | # CONFIG_FDDI is not set | ||
781 | # CONFIG_HIPPI is not set | ||
782 | CONFIG_PPP=m | ||
783 | CONFIG_PPP_MULTILINK=y | ||
784 | CONFIG_PPP_FILTER=y | ||
785 | CONFIG_PPP_ASYNC=m | ||
786 | CONFIG_PPP_SYNC_TTY=m | ||
787 | CONFIG_PPP_DEFLATE=m | ||
788 | CONFIG_PPP_BSDCOMP=m | ||
789 | CONFIG_PPPOE=m | ||
790 | # CONFIG_SLIP is not set | ||
791 | # CONFIG_NET_FC is not set | ||
792 | # CONFIG_SHAPER is not set | ||
793 | # CONFIG_NETCONSOLE is not set | ||
794 | # CONFIG_NETPOLL is not set | ||
795 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
796 | |||
797 | # | ||
798 | # ISDN subsystem | ||
799 | # | ||
800 | # CONFIG_ISDN is not set | ||
801 | |||
802 | # | ||
803 | # Telephony Support | ||
804 | # | ||
805 | # CONFIG_PHONE is not set | ||
806 | |||
807 | # | ||
808 | # Input device support | ||
809 | # | ||
810 | CONFIG_INPUT=y | ||
811 | |||
812 | # | ||
813 | # Userland interfaces | ||
814 | # | ||
815 | CONFIG_INPUT_MOUSEDEV=y | ||
816 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
817 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
818 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
819 | # CONFIG_INPUT_JOYDEV is not set | ||
820 | # CONFIG_INPUT_TSDEV is not set | ||
821 | # CONFIG_INPUT_EVDEV is not set | ||
822 | # CONFIG_INPUT_EVBUG is not set | ||
823 | |||
824 | # | ||
825 | # Input Device Drivers | ||
826 | # | ||
827 | # CONFIG_INPUT_KEYBOARD is not set | ||
828 | # CONFIG_INPUT_MOUSE is not set | ||
829 | # CONFIG_INPUT_JOYSTICK is not set | ||
830 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
831 | # CONFIG_INPUT_MISC is not set | ||
832 | |||
833 | # | ||
834 | # Hardware I/O ports | ||
835 | # | ||
836 | # CONFIG_SERIO is not set | ||
837 | # CONFIG_GAMEPORT is not set | ||
838 | |||
839 | # | ||
840 | # Character devices | ||
841 | # | ||
842 | CONFIG_VT=y | ||
843 | CONFIG_VT_CONSOLE=y | ||
844 | CONFIG_HW_CONSOLE=y | ||
845 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
846 | |||
847 | # | ||
848 | # Serial drivers | ||
849 | # | ||
850 | # CONFIG_SERIAL_8250 is not set | ||
851 | |||
852 | # | ||
853 | # Non-8250 serial port support | ||
854 | # | ||
855 | CONFIG_SERIAL_SH_SCI=y | ||
856 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
857 | CONFIG_SERIAL_CORE=y | ||
858 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
859 | # CONFIG_SERIAL_JSM is not set | ||
860 | CONFIG_UNIX98_PTYS=y | ||
861 | CONFIG_LEGACY_PTYS=y | ||
862 | CONFIG_LEGACY_PTY_COUNT=256 | ||
863 | |||
864 | # | ||
865 | # IPMI | ||
866 | # | ||
867 | # CONFIG_IPMI_HANDLER is not set | ||
868 | |||
869 | # | ||
870 | # Watchdog Cards | ||
871 | # | ||
872 | # CONFIG_WATCHDOG is not set | ||
873 | # CONFIG_RTC is not set | ||
874 | # CONFIG_GEN_RTC is not set | ||
875 | # CONFIG_DTLK is not set | ||
876 | # CONFIG_R3964 is not set | ||
877 | # CONFIG_APPLICOM is not set | ||
878 | |||
879 | # | ||
880 | # Ftape, the floppy tape device driver | ||
881 | # | ||
882 | # CONFIG_DRM is not set | ||
883 | # CONFIG_RAW_DRIVER is not set | ||
884 | |||
885 | # | ||
886 | # TPM devices | ||
887 | # | ||
888 | # CONFIG_TCG_TPM is not set | ||
889 | |||
890 | # | ||
891 | # I2C support | ||
892 | # | ||
893 | # CONFIG_I2C is not set | ||
894 | |||
895 | # | ||
896 | # Dallas's 1-wire bus | ||
897 | # | ||
898 | # CONFIG_W1 is not set | ||
899 | |||
900 | # | ||
901 | # Hardware Monitoring support | ||
902 | # | ||
903 | CONFIG_HWMON=y | ||
904 | # CONFIG_HWMON_VID is not set | ||
905 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
906 | |||
907 | # | ||
908 | # Misc devices | ||
909 | # | ||
910 | |||
911 | # | ||
912 | # Multimedia Capabilities Port drivers | ||
913 | # | ||
914 | |||
915 | # | ||
916 | # Multimedia devices | ||
917 | # | ||
918 | # CONFIG_VIDEO_DEV is not set | ||
919 | |||
920 | # | ||
921 | # Digital Video Broadcasting Devices | ||
922 | # | ||
923 | # CONFIG_DVB is not set | ||
924 | |||
925 | # | ||
926 | # Graphics support | ||
927 | # | ||
928 | # CONFIG_FB is not set | ||
929 | |||
930 | # | ||
931 | # Console display driver support | ||
932 | # | ||
933 | CONFIG_DUMMY_CONSOLE=y | ||
934 | |||
935 | # | ||
936 | # Sound | ||
937 | # | ||
938 | # CONFIG_SOUND is not set | ||
939 | |||
940 | # | ||
941 | # USB support | ||
942 | # | ||
943 | CONFIG_USB_ARCH_HAS_HCD=y | ||
944 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
945 | CONFIG_USB=m | ||
946 | # CONFIG_USB_DEBUG is not set | ||
947 | |||
948 | # | ||
949 | # Miscellaneous USB options | ||
950 | # | ||
951 | CONFIG_USB_DEVICEFS=y | ||
952 | # CONFIG_USB_BANDWIDTH is not set | ||
953 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
954 | # CONFIG_USB_OTG is not set | ||
955 | |||
956 | # | ||
957 | # USB Host Controller Drivers | ||
958 | # | ||
959 | CONFIG_USB_EHCI_HCD=m | ||
960 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | ||
961 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | ||
962 | # CONFIG_USB_ISP116X_HCD is not set | ||
963 | CONFIG_USB_OHCI_HCD=m | ||
964 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | ||
965 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
966 | # CONFIG_USB_UHCI_HCD is not set | ||
967 | # CONFIG_USB_SL811_HCD is not set | ||
968 | |||
969 | # | ||
970 | # USB Device Class drivers | ||
971 | # | ||
972 | # CONFIG_USB_BLUETOOTH_TTY is not set | ||
973 | # CONFIG_USB_ACM is not set | ||
974 | # CONFIG_USB_PRINTER is not set | ||
975 | |||
976 | # | ||
977 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
978 | # | ||
979 | CONFIG_USB_STORAGE=m | ||
980 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
981 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
982 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
983 | # CONFIG_USB_STORAGE_DPCM is not set | ||
984 | # CONFIG_USB_STORAGE_USBAT is not set | ||
985 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
986 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
987 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
988 | |||
989 | # | ||
990 | # USB Input Devices | ||
991 | # | ||
992 | # CONFIG_USB_HID is not set | ||
993 | |||
994 | # | ||
995 | # USB HID Boot Protocol drivers | ||
996 | # | ||
997 | # CONFIG_USB_KBD is not set | ||
998 | # CONFIG_USB_MOUSE is not set | ||
999 | # CONFIG_USB_AIPTEK is not set | ||
1000 | # CONFIG_USB_WACOM is not set | ||
1001 | # CONFIG_USB_ACECAD is not set | ||
1002 | # CONFIG_USB_KBTAB is not set | ||
1003 | # CONFIG_USB_POWERMATE is not set | ||
1004 | # CONFIG_USB_MTOUCH is not set | ||
1005 | # CONFIG_USB_ITMTOUCH is not set | ||
1006 | # CONFIG_USB_EGALAX is not set | ||
1007 | # CONFIG_USB_YEALINK is not set | ||
1008 | # CONFIG_USB_XPAD is not set | ||
1009 | # CONFIG_USB_ATI_REMOTE is not set | ||
1010 | # CONFIG_USB_KEYSPAN_REMOTE is not set | ||
1011 | # CONFIG_USB_APPLETOUCH is not set | ||
1012 | |||
1013 | # | ||
1014 | # USB Imaging devices | ||
1015 | # | ||
1016 | # CONFIG_USB_MDC800 is not set | ||
1017 | # CONFIG_USB_MICROTEK is not set | ||
1018 | |||
1019 | # | ||
1020 | # USB Multimedia devices | ||
1021 | # | ||
1022 | # CONFIG_USB_DABUSB is not set | ||
1023 | |||
1024 | # | ||
1025 | # Video4Linux support is needed for USB Multimedia device support | ||
1026 | # | ||
1027 | |||
1028 | # | ||
1029 | # USB Network Adapters | ||
1030 | # | ||
1031 | # CONFIG_USB_CATC is not set | ||
1032 | # CONFIG_USB_KAWETH is not set | ||
1033 | # CONFIG_USB_PEGASUS is not set | ||
1034 | # CONFIG_USB_RTL8150 is not set | ||
1035 | # CONFIG_USB_USBNET is not set | ||
1036 | # CONFIG_USB_ZD1201 is not set | ||
1037 | CONFIG_USB_MON=y | ||
1038 | |||
1039 | # | ||
1040 | # USB port drivers | ||
1041 | # | ||
1042 | |||
1043 | # | ||
1044 | # USB Serial Converter support | ||
1045 | # | ||
1046 | CONFIG_USB_SERIAL=m | ||
1047 | CONFIG_USB_SERIAL_GENERIC=y | ||
1048 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
1049 | # CONFIG_USB_SERIAL_BELKIN is not set | ||
1050 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
1051 | # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set | ||
1052 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
1053 | # CONFIG_USB_SERIAL_CYPRESS_M8 is not set | ||
1054 | # CONFIG_USB_SERIAL_EMPEG is not set | ||
1055 | # CONFIG_USB_SERIAL_FTDI_SIO is not set | ||
1056 | # CONFIG_USB_SERIAL_VISOR is not set | ||
1057 | # CONFIG_USB_SERIAL_IPAQ is not set | ||
1058 | # CONFIG_USB_SERIAL_IR is not set | ||
1059 | # CONFIG_USB_SERIAL_EDGEPORT is not set | ||
1060 | # CONFIG_USB_SERIAL_EDGEPORT_TI is not set | ||
1061 | # CONFIG_USB_SERIAL_GARMIN is not set | ||
1062 | # CONFIG_USB_SERIAL_IPW is not set | ||
1063 | # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set | ||
1064 | # CONFIG_USB_SERIAL_KEYSPAN is not set | ||
1065 | # CONFIG_USB_SERIAL_KLSI is not set | ||
1066 | # CONFIG_USB_SERIAL_KOBIL_SCT is not set | ||
1067 | # CONFIG_USB_SERIAL_MCT_U232 is not set | ||
1068 | CONFIG_USB_SERIAL_PL2303=m | ||
1069 | # CONFIG_USB_SERIAL_HP4X is not set | ||
1070 | # CONFIG_USB_SERIAL_SAFE is not set | ||
1071 | # CONFIG_USB_SERIAL_TI is not set | ||
1072 | # CONFIG_USB_SERIAL_CYBERJACK is not set | ||
1073 | # CONFIG_USB_SERIAL_XIRCOM is not set | ||
1074 | # CONFIG_USB_SERIAL_OMNINET is not set | ||
1075 | |||
1076 | # | ||
1077 | # USB Miscellaneous drivers | ||
1078 | # | ||
1079 | # CONFIG_USB_EMI62 is not set | ||
1080 | # CONFIG_USB_EMI26 is not set | ||
1081 | # CONFIG_USB_AUERSWALD is not set | ||
1082 | # CONFIG_USB_RIO500 is not set | ||
1083 | # CONFIG_USB_LEGOTOWER is not set | ||
1084 | # CONFIG_USB_LCD is not set | ||
1085 | # CONFIG_USB_LED is not set | ||
1086 | # CONFIG_USB_CYTHERM is not set | ||
1087 | # CONFIG_USB_PHIDGETKIT is not set | ||
1088 | # CONFIG_USB_PHIDGETSERVO is not set | ||
1089 | # CONFIG_USB_IDMOUSE is not set | ||
1090 | # CONFIG_USB_SISUSBVGA is not set | ||
1091 | # CONFIG_USB_LD is not set | ||
1092 | # CONFIG_USB_TEST is not set | ||
1093 | |||
1094 | # | ||
1095 | # USB DSL modem support | ||
1096 | # | ||
1097 | |||
1098 | # | ||
1099 | # USB Gadget Support | ||
1100 | # | ||
1101 | # CONFIG_USB_GADGET is not set | ||
1102 | |||
1103 | # | ||
1104 | # MMC/SD Card support | ||
1105 | # | ||
1106 | # CONFIG_MMC is not set | ||
1107 | |||
1108 | # | ||
1109 | # InfiniBand support | ||
1110 | # | ||
1111 | # CONFIG_INFINIBAND is not set | ||
1112 | |||
1113 | # | ||
1114 | # SN Devices | ||
1115 | # | ||
1116 | |||
1117 | # | ||
1118 | # File systems | ||
1119 | # | ||
1120 | CONFIG_EXT2_FS=y | ||
1121 | CONFIG_EXT2_FS_XATTR=y | ||
1122 | CONFIG_EXT2_FS_POSIX_ACL=y | ||
1123 | CONFIG_EXT2_FS_SECURITY=y | ||
1124 | # CONFIG_EXT2_FS_XIP is not set | ||
1125 | CONFIG_EXT3_FS=y | ||
1126 | CONFIG_EXT3_FS_XATTR=y | ||
1127 | CONFIG_EXT3_FS_POSIX_ACL=y | ||
1128 | CONFIG_EXT3_FS_SECURITY=y | ||
1129 | CONFIG_JBD=y | ||
1130 | # CONFIG_JBD_DEBUG is not set | ||
1131 | CONFIG_FS_MBCACHE=y | ||
1132 | CONFIG_REISERFS_FS=m | ||
1133 | # CONFIG_REISERFS_CHECK is not set | ||
1134 | # CONFIG_REISERFS_PROC_INFO is not set | ||
1135 | # CONFIG_REISERFS_FS_XATTR is not set | ||
1136 | # CONFIG_JFS_FS is not set | ||
1137 | CONFIG_FS_POSIX_ACL=y | ||
1138 | # CONFIG_XFS_FS is not set | ||
1139 | # CONFIG_MINIX_FS is not set | ||
1140 | # CONFIG_ROMFS_FS is not set | ||
1141 | CONFIG_INOTIFY=y | ||
1142 | # CONFIG_QUOTA is not set | ||
1143 | CONFIG_DNOTIFY=y | ||
1144 | # CONFIG_AUTOFS_FS is not set | ||
1145 | # CONFIG_AUTOFS4_FS is not set | ||
1146 | CONFIG_FUSE_FS=m | ||
1147 | |||
1148 | # | ||
1149 | # CD-ROM/DVD Filesystems | ||
1150 | # | ||
1151 | CONFIG_ISO9660_FS=m | ||
1152 | CONFIG_JOLIET=y | ||
1153 | CONFIG_ZISOFS=y | ||
1154 | CONFIG_ZISOFS_FS=m | ||
1155 | CONFIG_UDF_FS=m | ||
1156 | CONFIG_UDF_NLS=y | ||
1157 | |||
1158 | # | ||
1159 | # DOS/FAT/NT Filesystems | ||
1160 | # | ||
1161 | CONFIG_FAT_FS=m | ||
1162 | CONFIG_MSDOS_FS=m | ||
1163 | CONFIG_VFAT_FS=m | ||
1164 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1165 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1166 | # CONFIG_NTFS_FS is not set | ||
1167 | |||
1168 | # | ||
1169 | # Pseudo filesystems | ||
1170 | # | ||
1171 | CONFIG_PROC_FS=y | ||
1172 | CONFIG_PROC_KCORE=y | ||
1173 | CONFIG_SYSFS=y | ||
1174 | CONFIG_TMPFS=y | ||
1175 | # CONFIG_HUGETLBFS is not set | ||
1176 | # CONFIG_HUGETLB_PAGE is not set | ||
1177 | CONFIG_RAMFS=y | ||
1178 | CONFIG_RELAYFS_FS=m | ||
1179 | |||
1180 | # | ||
1181 | # Miscellaneous filesystems | ||
1182 | # | ||
1183 | # CONFIG_ADFS_FS is not set | ||
1184 | # CONFIG_AFFS_FS is not set | ||
1185 | # CONFIG_HFS_FS is not set | ||
1186 | # CONFIG_HFSPLUS_FS is not set | ||
1187 | # CONFIG_BEFS_FS is not set | ||
1188 | # CONFIG_BFS_FS is not set | ||
1189 | # CONFIG_EFS_FS is not set | ||
1190 | # CONFIG_CRAMFS is not set | ||
1191 | # CONFIG_VXFS_FS is not set | ||
1192 | # CONFIG_HPFS_FS is not set | ||
1193 | # CONFIG_QNX4FS_FS is not set | ||
1194 | # CONFIG_SYSV_FS is not set | ||
1195 | # CONFIG_UFS_FS is not set | ||
1196 | |||
1197 | # | ||
1198 | # Network File Systems | ||
1199 | # | ||
1200 | CONFIG_NFS_FS=y | ||
1201 | CONFIG_NFS_V3=y | ||
1202 | # CONFIG_NFS_V3_ACL is not set | ||
1203 | # CONFIG_NFS_V4 is not set | ||
1204 | # CONFIG_NFS_DIRECTIO is not set | ||
1205 | CONFIG_NFSD=y | ||
1206 | CONFIG_NFSD_V3=y | ||
1207 | # CONFIG_NFSD_V3_ACL is not set | ||
1208 | # CONFIG_NFSD_V4 is not set | ||
1209 | CONFIG_NFSD_TCP=y | ||
1210 | CONFIG_ROOT_NFS=y | ||
1211 | CONFIG_LOCKD=y | ||
1212 | CONFIG_LOCKD_V4=y | ||
1213 | CONFIG_EXPORTFS=y | ||
1214 | CONFIG_NFS_COMMON=y | ||
1215 | CONFIG_SUNRPC=y | ||
1216 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
1217 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1218 | CONFIG_SMB_FS=m | ||
1219 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
1220 | # CONFIG_CIFS is not set | ||
1221 | # CONFIG_NCP_FS is not set | ||
1222 | # CONFIG_CODA_FS is not set | ||
1223 | # CONFIG_AFS_FS is not set | ||
1224 | CONFIG_9P_FS=m | ||
1225 | |||
1226 | # | ||
1227 | # Partition Types | ||
1228 | # | ||
1229 | CONFIG_PARTITION_ADVANCED=y | ||
1230 | # CONFIG_ACORN_PARTITION is not set | ||
1231 | # CONFIG_OSF_PARTITION is not set | ||
1232 | # CONFIG_AMIGA_PARTITION is not set | ||
1233 | # CONFIG_ATARI_PARTITION is not set | ||
1234 | # CONFIG_MAC_PARTITION is not set | ||
1235 | CONFIG_MSDOS_PARTITION=y | ||
1236 | # CONFIG_BSD_DISKLABEL is not set | ||
1237 | # CONFIG_MINIX_SUBPARTITION is not set | ||
1238 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
1239 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
1240 | # CONFIG_LDM_PARTITION is not set | ||
1241 | # CONFIG_SGI_PARTITION is not set | ||
1242 | # CONFIG_ULTRIX_PARTITION is not set | ||
1243 | # CONFIG_SUN_PARTITION is not set | ||
1244 | # CONFIG_EFI_PARTITION is not set | ||
1245 | |||
1246 | # | ||
1247 | # Native Language Support | ||
1248 | # | ||
1249 | CONFIG_NLS=m | ||
1250 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1251 | CONFIG_NLS_CODEPAGE_437=m | ||
1252 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1253 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1254 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1255 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1256 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1257 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1258 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1259 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1260 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1261 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1262 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1263 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1264 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1265 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1266 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1267 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1268 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1269 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1270 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1271 | # CONFIG_NLS_ISO8859_8 is not set | ||
1272 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1273 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1274 | CONFIG_NLS_ASCII=m | ||
1275 | CONFIG_NLS_ISO8859_1=m | ||
1276 | # CONFIG_NLS_ISO8859_2 is not set | ||
1277 | # CONFIG_NLS_ISO8859_3 is not set | ||
1278 | # CONFIG_NLS_ISO8859_4 is not set | ||
1279 | # CONFIG_NLS_ISO8859_5 is not set | ||
1280 | # CONFIG_NLS_ISO8859_6 is not set | ||
1281 | # CONFIG_NLS_ISO8859_7 is not set | ||
1282 | # CONFIG_NLS_ISO8859_9 is not set | ||
1283 | # CONFIG_NLS_ISO8859_13 is not set | ||
1284 | # CONFIG_NLS_ISO8859_14 is not set | ||
1285 | # CONFIG_NLS_ISO8859_15 is not set | ||
1286 | # CONFIG_NLS_KOI8_R is not set | ||
1287 | # CONFIG_NLS_KOI8_U is not set | ||
1288 | CONFIG_NLS_UTF8=m | ||
1289 | |||
1290 | # | ||
1291 | # Profiling support | ||
1292 | # | ||
1293 | # CONFIG_PROFILING is not set | ||
1294 | |||
1295 | # | ||
1296 | # Kernel hacking | ||
1297 | # | ||
1298 | # CONFIG_PRINTK_TIME is not set | ||
1299 | CONFIG_DEBUG_KERNEL=y | ||
1300 | CONFIG_MAGIC_SYSRQ=y | ||
1301 | CONFIG_LOG_BUF_SHIFT=16 | ||
1302 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
1303 | # CONFIG_SCHEDSTATS is not set | ||
1304 | CONFIG_DEBUG_SLAB=y | ||
1305 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1306 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1307 | # CONFIG_DEBUG_KOBJECT is not set | ||
1308 | # CONFIG_DEBUG_INFO is not set | ||
1309 | # CONFIG_DEBUG_FS is not set | ||
1310 | # CONFIG_FRAME_POINTER is not set | ||
1311 | # CONFIG_SH_STANDARD_BIOS is not set | ||
1312 | CONFIG_EARLY_SCIF_CONSOLE=y | ||
1313 | # CONFIG_EARLY_PRINTK is not set | ||
1314 | # CONFIG_KGDB is not set | ||
1315 | |||
1316 | # | ||
1317 | # Security options | ||
1318 | # | ||
1319 | # CONFIG_KEYS is not set | ||
1320 | # CONFIG_SECURITY is not set | ||
1321 | |||
1322 | # | ||
1323 | # Cryptographic options | ||
1324 | # | ||
1325 | CONFIG_CRYPTO=y | ||
1326 | CONFIG_CRYPTO_HMAC=y | ||
1327 | # CONFIG_CRYPTO_NULL is not set | ||
1328 | CONFIG_CRYPTO_MD4=m | ||
1329 | CONFIG_CRYPTO_MD5=m | ||
1330 | CONFIG_CRYPTO_SHA1=m | ||
1331 | CONFIG_CRYPTO_SHA256=m | ||
1332 | CONFIG_CRYPTO_SHA512=m | ||
1333 | CONFIG_CRYPTO_WP512=m | ||
1334 | CONFIG_CRYPTO_TGR192=m | ||
1335 | CONFIG_CRYPTO_DES=m | ||
1336 | CONFIG_CRYPTO_BLOWFISH=m | ||
1337 | CONFIG_CRYPTO_TWOFISH=m | ||
1338 | CONFIG_CRYPTO_SERPENT=m | ||
1339 | CONFIG_CRYPTO_AES=m | ||
1340 | CONFIG_CRYPTO_CAST5=m | ||
1341 | CONFIG_CRYPTO_CAST6=m | ||
1342 | CONFIG_CRYPTO_TEA=m | ||
1343 | CONFIG_CRYPTO_ARC4=m | ||
1344 | CONFIG_CRYPTO_KHAZAD=m | ||
1345 | CONFIG_CRYPTO_ANUBIS=m | ||
1346 | CONFIG_CRYPTO_DEFLATE=m | ||
1347 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
1348 | CONFIG_CRYPTO_CRC32C=m | ||
1349 | # CONFIG_CRYPTO_TEST is not set | ||
1350 | |||
1351 | # | ||
1352 | # Hardware crypto devices | ||
1353 | # | ||
1354 | |||
1355 | # | ||
1356 | # Library routines | ||
1357 | # | ||
1358 | CONFIG_CRC_CCITT=m | ||
1359 | CONFIG_CRC16=m | ||
1360 | CONFIG_CRC32=y | ||
1361 | CONFIG_LIBCRC32C=m | ||
1362 | CONFIG_ZLIB_INFLATE=m | ||
1363 | CONFIG_ZLIB_DEFLATE=m | ||
1364 | CONFIG_TEXTSEARCH=y | ||
1365 | CONFIG_TEXTSEARCH_KMP=m | ||
1366 | CONFIG_TEXTSEARCH_BM=m | ||
1367 | CONFIG_TEXTSEARCH_FSM=m | ||
diff --git a/arch/sh/drivers/dma/Kconfig b/arch/sh/drivers/dma/Kconfig index 0f15216cd39d..defc13c37d48 100644 --- a/arch/sh/drivers/dma/Kconfig +++ b/arch/sh/drivers/dma/Kconfig | |||
@@ -11,6 +11,8 @@ config SH_DMA | |||
11 | config NR_ONCHIP_DMA_CHANNELS | 11 | config NR_ONCHIP_DMA_CHANNELS |
12 | depends on SH_DMA | 12 | depends on SH_DMA |
13 | int "Number of on-chip DMAC channels" | 13 | int "Number of on-chip DMAC channels" |
14 | default "8" if CPU_SUBTYPE_SH7750R || CPU_SUBTYPE_SH7751R | ||
15 | default "12" if CPU_SUBTYPE_SH7780 | ||
14 | default "4" | 16 | default "4" |
15 | help | 17 | help |
16 | This allows you to specify the number of channels that the on-chip | 18 | This allows you to specify the number of channels that the on-chip |
@@ -52,4 +54,3 @@ config DMA_PAGE_OPS_CHANNEL | |||
52 | are dual-address capable. | 54 | are dual-address capable. |
53 | 55 | ||
54 | endmenu | 56 | endmenu |
55 | |||
diff --git a/arch/sh/drivers/dma/dma-g2.c b/arch/sh/drivers/dma/dma-g2.c index 0f866f8789f0..9cb070924180 100644 --- a/arch/sh/drivers/dma/dma-g2.c +++ b/arch/sh/drivers/dma/dma-g2.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * G2 bus DMA support | 4 | * G2 bus DMA support |
5 | * | 5 | * |
6 | * Copyright (C) 2003, 2004 Paul Mundt | 6 | * Copyright (C) 2003 - 2006 Paul Mundt |
7 | * | 7 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | 16 | #include <asm/cacheflush.h> | |
17 | #include <asm/mach/sysasic.h> | 17 | #include <asm/mach/sysasic.h> |
18 | #include <asm/mach/dma.h> | 18 | #include <asm/mach/dma.h> |
19 | #include <asm/dma.h> | 19 | #include <asm/dma.h> |
@@ -47,17 +47,31 @@ struct g2_dma_info { | |||
47 | 47 | ||
48 | static volatile struct g2_dma_info *g2_dma = (volatile struct g2_dma_info *)0xa05f7800; | 48 | static volatile struct g2_dma_info *g2_dma = (volatile struct g2_dma_info *)0xa05f7800; |
49 | 49 | ||
50 | #define g2_bytes_remaining(i) \ | ||
51 | ((g2_dma->channel[i].size - \ | ||
52 | g2_dma->status[i].size) & 0x0fffffff) | ||
53 | |||
50 | static irqreturn_t g2_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 54 | static irqreturn_t g2_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
51 | { | 55 | { |
52 | /* FIXME: Do some meaningful completion work here.. */ | 56 | int i; |
53 | return IRQ_HANDLED; | ||
54 | } | ||
55 | 57 | ||
56 | static struct irqaction g2_dma_irq = { | 58 | for (i = 0; i < G2_NR_DMA_CHANNELS; i++) { |
57 | .name = "g2 DMA handler", | 59 | if (g2_dma->status[i].status & 0x20000000) { |
58 | .handler = g2_dma_interrupt, | 60 | unsigned int bytes = g2_bytes_remaining(i); |
59 | .flags = IRQF_DISABLED, | 61 | |
60 | }; | 62 | if (likely(bytes == 0)) { |
63 | struct dma_info *info = dev_id; | ||
64 | struct dma_channel *chan = info->channels + i; | ||
65 | |||
66 | wake_up(&chan->wait_queue); | ||
67 | |||
68 | return IRQ_HANDLED; | ||
69 | } | ||
70 | } | ||
71 | } | ||
72 | |||
73 | return IRQ_NONE; | ||
74 | } | ||
61 | 75 | ||
62 | static int g2_enable_dma(struct dma_channel *chan) | 76 | static int g2_enable_dma(struct dma_channel *chan) |
63 | { | 77 | { |
@@ -135,8 +149,14 @@ static int g2_xfer_dma(struct dma_channel *chan) | |||
135 | return 0; | 149 | return 0; |
136 | } | 150 | } |
137 | 151 | ||
152 | static int g2_get_residue(struct dma_channel *chan) | ||
153 | { | ||
154 | return g2_bytes_remaining(chan->chan); | ||
155 | } | ||
156 | |||
138 | static struct dma_ops g2_dma_ops = { | 157 | static struct dma_ops g2_dma_ops = { |
139 | .xfer = g2_xfer_dma, | 158 | .xfer = g2_xfer_dma, |
159 | .get_residue = g2_get_residue, | ||
140 | }; | 160 | }; |
141 | 161 | ||
142 | static struct dma_info g2_dma_info = { | 162 | static struct dma_info g2_dma_info = { |
@@ -148,13 +168,22 @@ static struct dma_info g2_dma_info = { | |||
148 | 168 | ||
149 | static int __init g2_dma_init(void) | 169 | static int __init g2_dma_init(void) |
150 | { | 170 | { |
151 | setup_irq(HW_EVENT_G2_DMA, &g2_dma_irq); | 171 | int ret; |
172 | |||
173 | ret = request_irq(HW_EVENT_G2_DMA, g2_dma_interrupt, IRQF_DISABLED, | ||
174 | "g2 DMA handler", &g2_dma_info); | ||
175 | if (unlikely(ret)) | ||
176 | return -EINVAL; | ||
152 | 177 | ||
153 | /* Magic */ | 178 | /* Magic */ |
154 | g2_dma->wait_state = 27; | 179 | g2_dma->wait_state = 27; |
155 | g2_dma->magic = 0x4659404f; | 180 | g2_dma->magic = 0x4659404f; |
156 | 181 | ||
157 | return register_dmac(&g2_dma_info); | 182 | ret = register_dmac(&g2_dma_info); |
183 | if (unlikely(ret != 0)) | ||
184 | free_irq(HW_EVENT_G2_DMA, 0); | ||
185 | |||
186 | return ret; | ||
158 | } | 187 | } |
159 | 188 | ||
160 | static void __exit g2_dma_exit(void) | 189 | static void __exit g2_dma_exit(void) |
@@ -169,4 +198,3 @@ module_exit(g2_dma_exit); | |||
169 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>"); | 198 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>"); |
170 | MODULE_DESCRIPTION("G2 bus DMA driver"); | 199 | MODULE_DESCRIPTION("G2 bus DMA driver"); |
171 | MODULE_LICENSE("GPL"); | 200 | MODULE_LICENSE("GPL"); |
172 | |||
diff --git a/arch/sh/drivers/dma/dma-pvr2.c b/arch/sh/drivers/dma/dma-pvr2.c index 30a580aa7cbd..3b0b0f60bb3c 100644 --- a/arch/sh/drivers/dma/dma-pvr2.c +++ b/arch/sh/drivers/dma/dma-pvr2.c | |||
@@ -18,8 +18,8 @@ | |||
18 | #include <asm/dma.h> | 18 | #include <asm/dma.h> |
19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
20 | 20 | ||
21 | static unsigned int xfer_complete = 0; | 21 | static unsigned int xfer_complete; |
22 | static int count = 0; | 22 | static int count; |
23 | 23 | ||
24 | static irqreturn_t pvr2_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 24 | static irqreturn_t pvr2_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
25 | { | 25 | { |
@@ -107,4 +107,3 @@ module_exit(pvr2_dma_exit); | |||
107 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>"); | 107 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>"); |
108 | MODULE_DESCRIPTION("NEC PowerVR 2 DMA driver"); | 108 | MODULE_DESCRIPTION("NEC PowerVR 2 DMA driver"); |
109 | MODULE_LICENSE("GPL"); | 109 | MODULE_LICENSE("GPL"); |
110 | |||
diff --git a/arch/sh/drivers/dma/dma-sh.c b/arch/sh/drivers/dma/dma-sh.c index e028a2d2a4ea..cbbe8bce3d67 100644 --- a/arch/sh/drivers/dma/dma-sh.c +++ b/arch/sh/drivers/dma/dma-sh.c | |||
@@ -11,14 +11,10 @@ | |||
11 | * License. See the file "COPYING" in the main directory of this archive | 11 | * License. See the file "COPYING" in the main directory of this archive |
12 | * for more details. | 12 | * for more details. |
13 | */ | 13 | */ |
14 | |||
15 | #include <linux/init.h> | 14 | #include <linux/init.h> |
16 | #include <linux/irq.h> | ||
17 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
18 | #include <linux/module.h> | 16 | #include <linux/module.h> |
19 | #include <asm/dreamcast/dma.h> | 17 | #include <asm/dreamcast/dma.h> |
20 | #include <asm/signal.h> | ||
21 | #include <asm/irq.h> | ||
22 | #include <asm/dma.h> | 18 | #include <asm/dma.h> |
23 | #include <asm/io.h> | 19 | #include <asm/io.h> |
24 | #include "dma-sh.h" | 20 | #include "dma-sh.h" |
@@ -84,18 +80,23 @@ static irqreturn_t dma_tei(int irq, void *dev_id, struct pt_regs *regs) | |||
84 | 80 | ||
85 | static int sh_dmac_request_dma(struct dma_channel *chan) | 81 | static int sh_dmac_request_dma(struct dma_channel *chan) |
86 | { | 82 | { |
87 | char name[32]; | 83 | if (unlikely(!chan->flags & DMA_TEI_CAPABLE)) |
84 | return 0; | ||
88 | 85 | ||
89 | snprintf(name, sizeof(name), "DMAC Transfer End (Channel %d)", | 86 | chan->name = kzalloc(32, GFP_KERNEL); |
87 | if (unlikely(chan->name == NULL)) | ||
88 | return -ENOMEM; | ||
89 | snprintf(chan->name, 32, "DMAC Transfer End (Channel %d)", | ||
90 | chan->chan); | 90 | chan->chan); |
91 | 91 | ||
92 | return request_irq(get_dmte_irq(chan->chan), dma_tei, | 92 | return request_irq(get_dmte_irq(chan->chan), dma_tei, |
93 | IRQF_DISABLED, name, chan); | 93 | IRQF_DISABLED, chan->name, chan); |
94 | } | 94 | } |
95 | 95 | ||
96 | static void sh_dmac_free_dma(struct dma_channel *chan) | 96 | static void sh_dmac_free_dma(struct dma_channel *chan) |
97 | { | 97 | { |
98 | free_irq(get_dmte_irq(chan->chan), chan); | 98 | free_irq(get_dmte_irq(chan->chan), chan); |
99 | kfree(chan->name); | ||
99 | } | 100 | } |
100 | 101 | ||
101 | static void | 102 | static void |
@@ -259,7 +260,7 @@ static int __init sh_dmac_init(void) | |||
259 | #ifdef CONFIG_CPU_SH4 | 260 | #ifdef CONFIG_CPU_SH4 |
260 | make_ipr_irq(DMAE_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | 261 | make_ipr_irq(DMAE_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); |
261 | i = request_irq(DMAE_IRQ, dma_err, IRQF_DISABLED, "DMAC Address Error", 0); | 262 | i = request_irq(DMAE_IRQ, dma_err, IRQF_DISABLED, "DMAC Address Error", 0); |
262 | if (i < 0) | 263 | if (unlikely(i < 0)) |
263 | return i; | 264 | return i; |
264 | #endif | 265 | #endif |
265 | 266 | ||
@@ -274,7 +275,7 @@ static int __init sh_dmac_init(void) | |||
274 | * been set. | 275 | * been set. |
275 | */ | 276 | */ |
276 | i = dmaor_reset(); | 277 | i = dmaor_reset(); |
277 | if (i < 0) | 278 | if (unlikely(i != 0)) |
278 | return i; | 279 | return i; |
279 | 280 | ||
280 | return register_dmac(info); | 281 | return register_dmac(info); |
diff --git a/arch/sh/drivers/pci/Makefile b/arch/sh/drivers/pci/Makefile index 365bc16a4a83..9e00cb8a39e9 100644 --- a/arch/sh/drivers/pci/Makefile +++ b/arch/sh/drivers/pci/Makefile | |||
@@ -6,7 +6,8 @@ obj-y += pci.o | |||
6 | obj-$(CONFIG_PCI_AUTO) += pci-auto.o | 6 | obj-$(CONFIG_PCI_AUTO) += pci-auto.o |
7 | 7 | ||
8 | obj-$(CONFIG_CPU_SUBTYPE_ST40STB1) += pci-st40.o | 8 | obj-$(CONFIG_CPU_SUBTYPE_ST40STB1) += pci-st40.o |
9 | obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o | 9 | obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o ops-sh4.o |
10 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += pci-sh7780.o ops-sh4.o | ||
10 | 11 | ||
11 | obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \ | 12 | obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \ |
12 | dma-dreamcast.o | 13 | dma-dreamcast.o |
@@ -14,3 +15,6 @@ obj-$(CONFIG_SH_SECUREEDGE5410) += ops-snapgear.o | |||
14 | obj-$(CONFIG_SH_BIGSUR) += ops-bigsur.o | 15 | obj-$(CONFIG_SH_BIGSUR) += ops-bigsur.o |
15 | obj-$(CONFIG_SH_RTS7751R2D) += ops-rts7751r2d.o fixups-rts7751r2d.o | 16 | obj-$(CONFIG_SH_RTS7751R2D) += ops-rts7751r2d.o fixups-rts7751r2d.o |
16 | obj-$(CONFIG_SH_SH03) += ops-sh03.o fixups-sh03.o | 17 | obj-$(CONFIG_SH_SH03) += ops-sh03.o fixups-sh03.o |
18 | obj-$(CONFIG_SH_R7780RP) += ops-r7780rp.o fixups-r7780rp.o | ||
19 | obj-$(CONFIG_SH_TITAN) += ops-titan.o | ||
20 | obj-$(CONFIG_SH_LANDISK) += ops-landisk.o | ||
diff --git a/arch/sh/drivers/pci/fixups-dreamcast.c b/arch/sh/drivers/pci/fixups-dreamcast.c index 63b1c6f4b8d2..c0af5f7ef414 100644 --- a/arch/sh/drivers/pci/fixups-dreamcast.c +++ b/arch/sh/drivers/pci/fixups-dreamcast.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * PCI fixups for the Sega Dreamcast | 4 | * PCI fixups for the Sega Dreamcast |
5 | * | 5 | * |
6 | * Copyright (C) 2001, 2002 M. R. Brown | 6 | * Copyright (C) 2001, 2002 M. R. Brown |
7 | * Copyright (C) 2002, 2003 Paul Mundt | 7 | * Copyright (C) 2002, 2003, 2006 Paul Mundt |
8 | * | 8 | * |
9 | * This file originally bore the message (with enclosed-$): | 9 | * This file originally bore the message (with enclosed-$): |
10 | * Id: pci.c,v 1.3 2003/05/04 19:29:46 lethal Exp | 10 | * Id: pci.c,v 1.3 2003/05/04 19:29:46 lethal Exp |
@@ -45,36 +45,16 @@ static void __init gapspci_fixup_resources(struct pci_dev *dev) | |||
45 | printk("PCI: Failed resource fixup\n"); | 45 | printk("PCI: Failed resource fixup\n"); |
46 | } | 46 | } |
47 | } | 47 | } |
48 | |||
49 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, gapspci_fixup_resources); | 48 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, gapspci_fixup_resources); |
50 | 49 | ||
51 | void __init pcibios_fixup_bus(struct pci_bus *bus) | 50 | int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin) |
52 | { | 51 | { |
53 | /* | 52 | /* |
54 | * We don't have any sub bus to fix up, and this is a rather | 53 | * The interrupt routing semantics here are quite trivial. |
55 | * stupid place to put general device fixups. Don't do it. | 54 | * |
56 | * Use the pcibios_fixups table or suffer the consequences. | 55 | * We basically only support one interrupt, so we only bother |
56 | * updating a device's interrupt line with this single shared | ||
57 | * interrupt. Keeps routing quite simple, doesn't it? | ||
57 | */ | 58 | */ |
59 | return GAPSPCI_IRQ; | ||
58 | } | 60 | } |
59 | |||
60 | void __init pcibios_fixup_irqs(void) | ||
61 | { | ||
62 | struct pci_dev *dev = 0; | ||
63 | |||
64 | for_each_pci_dev(dev) { | ||
65 | /* | ||
66 | * The interrupt routing semantics here are quite trivial. | ||
67 | * | ||
68 | * We basically only support one interrupt, so we only bother | ||
69 | * updating a device's interrupt line with this single shared | ||
70 | * interrupt. Keeps routing quite simple, doesn't it? | ||
71 | */ | ||
72 | printk(KERN_NOTICE "PCI: Fixing up IRQ routing for device %s\n", | ||
73 | pci_name(dev)); | ||
74 | |||
75 | dev->irq = GAPSPCI_IRQ; | ||
76 | |||
77 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | ||
78 | } | ||
79 | } | ||
80 | |||
diff --git a/arch/sh/drivers/pci/fixups-r7780rp.c b/arch/sh/drivers/pci/fixups-r7780rp.c new file mode 100644 index 000000000000..3e321df65d22 --- /dev/null +++ b/arch/sh/drivers/pci/fixups-r7780rp.c | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * arch/sh/drivers/pci/fixups-r7780rp.c | ||
3 | * | ||
4 | * Highlander R7780RP-1 PCI fixups | ||
5 | * | ||
6 | * Copyright (C) 2003 Lineo uSolutions, Inc. | ||
7 | * Copyright (C) 2004 - 2006 Paul Mundt | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | */ | ||
13 | #include <linux/pci.h> | ||
14 | #include "pci-sh4.h" | ||
15 | #include <asm/io.h> | ||
16 | |||
17 | int pci_fixup_pcic(void) | ||
18 | { | ||
19 | pci_write_reg(0x000043ff, SH4_PCIINTM); | ||
20 | pci_write_reg(0x0000380f, SH4_PCIAINTM); | ||
21 | |||
22 | pci_write_reg(0xfbb00047, SH7780_PCICMD); | ||
23 | pci_write_reg(0x00000000, SH7780_PCIIBAR); | ||
24 | |||
25 | pci_write_reg(0x00011912, SH7780_PCISVID); | ||
26 | pci_write_reg(0x08000000, SH7780_PCICSCR0); | ||
27 | pci_write_reg(0x0000001b, SH7780_PCICSAR0); | ||
28 | pci_write_reg(0xfd000000, SH7780_PCICSCR1); | ||
29 | pci_write_reg(0x0000000f, SH7780_PCICSAR1); | ||
30 | |||
31 | pci_write_reg(0xfd000000, SH7780_PCIMBR0); | ||
32 | pci_write_reg(0x00fc0000, SH7780_PCIMBMR0); | ||
33 | |||
34 | #ifdef CONFIG_32BIT | ||
35 | pci_write_reg(0xc0000000, SH7780_PCIMBR2); | ||
36 | pci_write_reg(0x20000000 - SH7780_PCI_IO_SIZE, SH7780_PCIMBMR2); | ||
37 | #endif | ||
38 | |||
39 | /* Set IOBR for windows containing area specified in pci.h */ | ||
40 | pci_write_reg((PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE - 1)), | ||
41 | SH7780_PCIIOBR); | ||
42 | pci_write_reg(((SH7780_PCI_IO_SIZE-1) & (7<<18)), SH7780_PCIIOBMR); | ||
43 | |||
44 | return 0; | ||
45 | } | ||
diff --git a/arch/sh/drivers/pci/fixups-rts7751r2d.c b/arch/sh/drivers/pci/fixups-rts7751r2d.c index 0c590fc7a081..e72ceb560d5b 100644 --- a/arch/sh/drivers/pci/fixups-rts7751r2d.c +++ b/arch/sh/drivers/pci/fixups-rts7751r2d.c | |||
@@ -10,8 +10,7 @@ | |||
10 | * License. See the file "COPYING" in the main directory of this archive | 10 | * License. See the file "COPYING" in the main directory of this archive |
11 | * for more details. | 11 | * for more details. |
12 | */ | 12 | */ |
13 | #include "pci-sh7751.h" | 13 | #include "pci-sh4.h" |
14 | #include <asm/io.h> | ||
15 | 14 | ||
16 | #define PCIMCR_MRSET_OFF 0xBFFFFFFF | 15 | #define PCIMCR_MRSET_OFF 0xBFFFFFFF |
17 | #define PCIMCR_RFSH_OFF 0xFFFFFFFB | 16 | #define PCIMCR_RFSH_OFF 0xFFFFFFFB |
@@ -22,22 +21,23 @@ int pci_fixup_pcic(void) | |||
22 | 21 | ||
23 | bcr1 = inl(SH7751_BCR1); | 22 | bcr1 = inl(SH7751_BCR1); |
24 | bcr1 |= 0x40080000; /* Enable Bit 19 BREQEN, set PCIC to slave */ | 23 | bcr1 |= 0x40080000; /* Enable Bit 19 BREQEN, set PCIC to slave */ |
25 | outl(bcr1, PCI_REG(SH7751_PCIBCR1)); | 24 | pci_write_reg(bcr1, SH4_PCIBCR1); |
26 | 25 | ||
27 | /* Enable all interrupts, so we known what to fix */ | 26 | /* Enable all interrupts, so we known what to fix */ |
28 | outl(0x0000c3ff, PCI_REG(SH7751_PCIINTM)); | 27 | pci_write_reg(0x0000c3ff, SH4_PCIINTM); |
29 | outl(0x0000380f, PCI_REG(SH7751_PCIAINTM)); | 28 | pci_write_reg(0x0000380f, SH4_PCIAINTM); |
30 | 29 | ||
31 | outl(0xfb900047, PCI_REG(SH7751_PCICONF1)); | 30 | pci_write_reg(0xfb900047, SH7751_PCICONF1); |
32 | outl(0xab000001, PCI_REG(SH7751_PCICONF4)); | 31 | pci_write_reg(0xab000001, SH7751_PCICONF4); |
33 | 32 | ||
34 | mcr = inl(SH7751_MCR); | 33 | mcr = inl(SH7751_MCR); |
35 | mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF; | 34 | mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF; |
36 | outl(mcr, PCI_REG(SH7751_PCIMCR)); | 35 | pci_write_reg(mcr, SH4_PCIMCR); |
36 | |||
37 | pci_write_reg(0x0c000000, SH7751_PCICONF5); | ||
38 | pci_write_reg(0xd0000000, SH7751_PCICONF6); | ||
39 | pci_write_reg(0x0c000000, SH4_PCILAR0); | ||
40 | pci_write_reg(0x00000000, SH4_PCILAR1); | ||
37 | 41 | ||
38 | outl(0x0c000000, PCI_REG(SH7751_PCICONF5)); | ||
39 | outl(0xd0000000, PCI_REG(SH7751_PCICONF6)); | ||
40 | outl(0x0c000000, PCI_REG(SH7751_PCILAR0)); | ||
41 | outl(0x00000000, PCI_REG(SH7751_PCILAR1)); | ||
42 | return 0; | 42 | return 0; |
43 | } | 43 | } |
diff --git a/arch/sh/drivers/pci/fixups-sh03.c b/arch/sh/drivers/pci/fixups-sh03.c index 57ac26c2171f..2e8a18b7ee53 100644 --- a/arch/sh/drivers/pci/fixups-sh03.c +++ b/arch/sh/drivers/pci/fixups-sh03.c | |||
@@ -3,11 +3,7 @@ | |||
3 | #include <linux/types.h> | 3 | #include <linux/types.h> |
4 | #include <linux/pci.h> | 4 | #include <linux/pci.h> |
5 | 5 | ||
6 | /* | 6 | int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin) |
7 | * IRQ functions | ||
8 | */ | ||
9 | |||
10 | int __init pcibios_map_platform_irq(u8 slot, u8 pin, struct pci_dev *dev) | ||
11 | { | 7 | { |
12 | int irq; | 8 | int irq; |
13 | 9 | ||
@@ -17,8 +13,9 @@ int __init pcibios_map_platform_irq(u8 slot, u8 pin, struct pci_dev *dev) | |||
17 | case 8: return 5; /* eth1 */ | 13 | case 8: return 5; /* eth1 */ |
18 | case 6: return 2; /* PCI bridge */ | 14 | case 6: return 2; /* PCI bridge */ |
19 | default: | 15 | default: |
20 | printk("PCI: Bad IRQ mapping request for slot %d\n", slot); | 16 | printk(KERN_ERR "PCI: Bad IRQ mapping request " |
21 | return 2; | 17 | "for slot %d\n", slot); |
18 | return 2; | ||
22 | } | 19 | } |
23 | } else { | 20 | } else { |
24 | switch (pin) { | 21 | switch (pin) { |
@@ -32,30 +29,3 @@ int __init pcibios_map_platform_irq(u8 slot, u8 pin, struct pci_dev *dev) | |||
32 | } | 29 | } |
33 | return irq; | 30 | return irq; |
34 | } | 31 | } |
35 | |||
36 | static u8 __init sh03_no_swizzle(struct pci_dev *dev, u8 *pin) | ||
37 | { | ||
38 | /* no swizzling */ | ||
39 | return PCI_SLOT(dev->devfn); | ||
40 | } | ||
41 | |||
42 | static int sh03_pci_lookup_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
43 | { | ||
44 | int irq = -1; | ||
45 | |||
46 | /* now lookup the actual IRQ on a platform specific basis (pci-'platform'.c) */ | ||
47 | irq = pcibios_map_platform_irq(slot, pin, dev); | ||
48 | if( irq < 0 ) { | ||
49 | pr_debug("PCI: Error mapping IRQ on device %s\n", pci_name(dev)); | ||
50 | return irq; | ||
51 | } | ||
52 | |||
53 | pr_debug("Setting IRQ for slot %s to %d\n", pci_name(dev), irq); | ||
54 | |||
55 | return irq; | ||
56 | } | ||
57 | |||
58 | void __init pcibios_fixup_irqs(void) | ||
59 | { | ||
60 | pci_fixup_irqs(sh03_no_swizzle, sh03_pci_lookup_irq); | ||
61 | } | ||
diff --git a/arch/sh/drivers/pci/ops-bigsur.c b/arch/sh/drivers/pci/ops-bigsur.c index ae82c6ca05e5..5da501bd77b5 100644 --- a/arch/sh/drivers/pci/ops-bigsur.c +++ b/arch/sh/drivers/pci/ops-bigsur.c | |||
@@ -10,15 +10,12 @@ | |||
10 | * | 10 | * |
11 | * PCI initialization for the Hitachi Big Sur Evaluation Board | 11 | * PCI initialization for the Hitachi Big Sur Evaluation Board |
12 | */ | 12 | */ |
13 | |||
14 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
15 | #include <linux/types.h> | 14 | #include <linux/types.h> |
16 | #include <linux/init.h> | 15 | #include <linux/init.h> |
17 | #include <linux/delay.h> | ||
18 | #include <linux/pci.h> | 16 | #include <linux/pci.h> |
19 | |||
20 | #include <asm/io.h> | 17 | #include <asm/io.h> |
21 | #include "pci-sh7751.h" | 18 | #include "pci-sh4.h" |
22 | #include <asm/bigsur/bigsur.h> | 19 | #include <asm/bigsur/bigsur.h> |
23 | 20 | ||
24 | #define BIGSUR_PCI_IO 0x4000 | 21 | #define BIGSUR_PCI_IO 0x4000 |
@@ -41,11 +38,11 @@ static struct resource sh7751_mem_resource = { | |||
41 | extern struct pci_ops sh7751_pci_ops; | 38 | extern struct pci_ops sh7751_pci_ops; |
42 | 39 | ||
43 | struct pci_channel board_pci_channels[] = { | 40 | struct pci_channel board_pci_channels[] = { |
44 | { &sh7751_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff }, | 41 | { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff }, |
45 | { 0, } | 42 | { 0, } |
46 | }; | 43 | }; |
47 | 44 | ||
48 | static struct sh7751_pci_address_map sh7751_pci_map = { | 45 | static struct sh4_pci_address_map sh7751_pci_map = { |
49 | .window0 = { | 46 | .window0 = { |
50 | .base = SH7751_CS3_BASE_ADDR, | 47 | .base = SH7751_CS3_BASE_ADDR, |
51 | .size = BIGSUR_LSR0_SIZE, | 48 | .size = BIGSUR_LSR0_SIZE, |
@@ -58,7 +55,7 @@ static struct sh7751_pci_address_map sh7751_pci_map = { | |||
58 | }; | 55 | }; |
59 | 56 | ||
60 | /* | 57 | /* |
61 | * Initialize the Big Sur PCI interface | 58 | * Initialize the Big Sur PCI interface |
62 | * Setup hardware to be Central Funtion | 59 | * Setup hardware to be Central Funtion |
63 | * Copy the BSR regs to the PCI interface | 60 | * Copy the BSR regs to the PCI interface |
64 | * Setup PCI windows into local RAM | 61 | * Setup PCI windows into local RAM |
@@ -68,15 +65,15 @@ int __init pcibios_init_platform(void) | |||
68 | return sh7751_pcic_init(&sh7751_pci_map); | 65 | return sh7751_pcic_init(&sh7751_pci_map); |
69 | } | 66 | } |
70 | 67 | ||
71 | int pcibios_map_platform_irq(u8 slot, u8 pin) | 68 | int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) |
72 | { | 69 | { |
73 | /* | 70 | /* |
74 | * The Big Sur can be used in a CPCI chassis, but the SH7751 PCI | 71 | * The Big Sur can be used in a CPCI chassis, but the SH7751 PCI |
75 | * interface is on the wrong end of the board so that it can also | 72 | * interface is on the wrong end of the board so that it can also |
76 | * support a V320 CPI interface chip... Therefor the IRQ mapping is | 73 | * support a V320 CPI interface chip... Therefor the IRQ mapping is |
77 | * somewhat use dependent... I'l assume a linear map for now, i.e. | 74 | * somewhat use dependent... I'l assume a linear map for now, i.e. |
78 | * INTA=slot0,pin0... INTD=slot3,pin0... | 75 | * INTA=slot0,pin0... INTD=slot3,pin0... |
79 | */ | 76 | */ |
80 | int irq = (slot + pin-1) % 4 + BIGSUR_SH7751_PCI_IRQ_BASE; | 77 | int irq = (slot + pin-1) % 4 + BIGSUR_SH7751_PCI_IRQ_BASE; |
81 | 78 | ||
82 | PCIDBG(2, "PCI: Mapping Big Sur IRQ for slot %d, pin %c to irq %d\n", | 79 | PCIDBG(2, "PCI: Mapping Big Sur IRQ for slot %d, pin %c to irq %d\n", |
@@ -84,4 +81,3 @@ int pcibios_map_platform_irq(u8 slot, u8 pin) | |||
84 | 81 | ||
85 | return irq; | 82 | return irq; |
86 | } | 83 | } |
87 | |||
diff --git a/arch/sh/drivers/pci/ops-landisk.c b/arch/sh/drivers/pci/ops-landisk.c new file mode 100644 index 000000000000..ada301c21fe7 --- /dev/null +++ b/arch/sh/drivers/pci/ops-landisk.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * arch/sh/drivers/pci/ops-landisk.c | ||
3 | * | ||
4 | * PCI initialization for the I-O DATA Device, Inc. LANDISK board | ||
5 | * | ||
6 | * Copyright (C) 2006 kogiidena | ||
7 | * | ||
8 | * May be copied or modified under the terms of the GNU General Public | ||
9 | * License. See linux/COPYING for more information. | ||
10 | */ | ||
11 | #include <linux/config.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/pci.h> | ||
17 | #include "pci-sh4.h" | ||
18 | |||
19 | static struct resource sh7751_io_resource = { | ||
20 | .name = "SH7751 IO", | ||
21 | .start = 0x4000, | ||
22 | .end = 0x4000 + SH7751_PCI_IO_SIZE - 1, | ||
23 | .flags = IORESOURCE_IO | ||
24 | }; | ||
25 | |||
26 | static struct resource sh7751_mem_resource = { | ||
27 | .name = "SH7751 mem", | ||
28 | .start = SH7751_PCI_MEMORY_BASE, | ||
29 | .end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1, | ||
30 | .flags = IORESOURCE_MEM | ||
31 | }; | ||
32 | |||
33 | struct pci_channel board_pci_channels[] = { | ||
34 | {&sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0x3ff}, | ||
35 | {NULL, NULL, NULL, 0, 0}, | ||
36 | }; | ||
37 | |||
38 | static struct sh4_pci_address_map sh7751_pci_map = { | ||
39 | .window0 = { | ||
40 | .base = SH7751_CS3_BASE_ADDR, | ||
41 | .size = (64 << 20), /* 64MB */ | ||
42 | }, | ||
43 | |||
44 | .flags = SH4_PCIC_NO_RESET, | ||
45 | }; | ||
46 | |||
47 | int __init pcibios_init_platform(void) | ||
48 | { | ||
49 | return sh7751_pcic_init(&sh7751_pci_map); | ||
50 | } | ||
51 | |||
52 | int pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) | ||
53 | { | ||
54 | /* | ||
55 | * slot0: pin1-4 = irq5,6,7,8 | ||
56 | * slot1: pin1-4 = irq6,7,8,5 | ||
57 | * slot2: pin1-4 = irq7,8,5,6 | ||
58 | * slot3: pin1-4 = irq8,5,6,7 | ||
59 | */ | ||
60 | int irq = ((slot + pin - 1) & 0x3) + 5; | ||
61 | |||
62 | if ((slot | (pin - 1)) > 0x3) { | ||
63 | printk("PCI: Bad IRQ mapping request for slot %d pin %c\n", | ||
64 | slot, pin - 1 + 'A'); | ||
65 | return -1; | ||
66 | } | ||
67 | return irq; | ||
68 | } | ||
diff --git a/arch/sh/drivers/pci/ops-r7780rp.c b/arch/sh/drivers/pci/ops-r7780rp.c new file mode 100644 index 000000000000..554d5ed2c586 --- /dev/null +++ b/arch/sh/drivers/pci/ops-r7780rp.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * Author: Ian DaSilva (idasilva@mvista.com) | ||
3 | * | ||
4 | * Highly leveraged from pci-bigsur.c, written by Dustin McIntire. | ||
5 | * | ||
6 | * May be copied or modified under the terms of the GNU General Public | ||
7 | * License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * PCI initialization for the Renesas SH7780 Highlander R7780RP-1 board | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/pci.h> | ||
18 | #include <asm/r7780rp/r7780rp.h> | ||
19 | #include <asm/io.h> | ||
20 | #include "pci-sh4.h" | ||
21 | |||
22 | int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) | ||
23 | { | ||
24 | switch (slot) { | ||
25 | case 0: return IRQ_PCISLOT1; /* PCI Interrupt #1 */ | ||
26 | case 1: return IRQ_PCISLOT2; /* PCI Interrupt #2 */ | ||
27 | case 2: return IRQ_PCISLOT3; /* PCI Interrupt #3 */ | ||
28 | case 3: return IRQ_PCISLOT4; /* PCI Interrupt E4 */ | ||
29 | default: | ||
30 | printk(KERN_ERR "PCI: Bad IRQ mapping " | ||
31 | "request for slot %d, func %d\n", slot, pin-1); | ||
32 | return -1; | ||
33 | } | ||
34 | } | ||
35 | |||
36 | static struct resource sh7780_io_resource = { | ||
37 | .name = "SH7780_IO", | ||
38 | .start = 0x2000, | ||
39 | .end = 0x2000 + SH7780_PCI_IO_SIZE - 1, | ||
40 | .flags = IORESOURCE_IO | ||
41 | }; | ||
42 | |||
43 | static struct resource sh7780_mem_resource = { | ||
44 | .name = "SH7780_mem", | ||
45 | .start = SH7780_PCI_MEMORY_BASE, | ||
46 | .end = SH7780_PCI_MEMORY_BASE + SH7780_PCI_MEM_SIZE - 1, | ||
47 | .flags = IORESOURCE_MEM | ||
48 | }; | ||
49 | |||
50 | extern struct pci_ops sh7780_pci_ops; | ||
51 | |||
52 | struct pci_channel board_pci_channels[] = { | ||
53 | { &sh4_pci_ops, &sh7780_io_resource, &sh7780_mem_resource, 0, 0xff }, | ||
54 | { NULL, NULL, NULL, 0, 0 }, | ||
55 | }; | ||
56 | EXPORT_SYMBOL(board_pci_channels); | ||
57 | |||
58 | static struct sh4_pci_address_map sh7780_pci_map = { | ||
59 | .window0 = { | ||
60 | .base = SH7780_CS2_BASE_ADDR, | ||
61 | .size = 0x04000000, | ||
62 | }, | ||
63 | |||
64 | .window1 = { | ||
65 | .base = SH7780_CS3_BASE_ADDR, | ||
66 | .size = 0x04000000, | ||
67 | }, | ||
68 | |||
69 | .flags = SH4_PCIC_NO_RESET, | ||
70 | }; | ||
71 | |||
72 | int __init pcibios_init_platform(void) | ||
73 | { | ||
74 | return sh7780_pcic_init(&sh7780_pci_map); | ||
75 | } | ||
diff --git a/arch/sh/drivers/pci/ops-rts7751r2d.c b/arch/sh/drivers/pci/ops-rts7751r2d.c index 83171d10141a..88f44e245424 100644 --- a/arch/sh/drivers/pci/ops-rts7751r2d.c +++ b/arch/sh/drivers/pci/ops-rts7751r2d.c | |||
@@ -17,12 +17,11 @@ | |||
17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | |||
21 | #include <asm/io.h> | ||
22 | #include "pci-sh7751.h" | ||
23 | #include <asm/rts7751r2d/rts7751r2d.h> | 20 | #include <asm/rts7751r2d/rts7751r2d.h> |
21 | #include <asm/io.h> | ||
22 | #include "pci-sh4.h" | ||
24 | 23 | ||
25 | int __init pcibios_map_platform_irq(u8 slot, u8 pin) | 24 | int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) |
26 | { | 25 | { |
27 | switch (slot) { | 26 | switch (slot) { |
28 | case 0: return IRQ_PCISLOT1; /* PCI Extend slot #1 */ | 27 | case 0: return IRQ_PCISLOT1; /* PCI Extend slot #1 */ |
@@ -52,12 +51,12 @@ static struct resource sh7751_mem_resource = { | |||
52 | extern struct pci_ops sh7751_pci_ops; | 51 | extern struct pci_ops sh7751_pci_ops; |
53 | 52 | ||
54 | struct pci_channel board_pci_channels[] = { | 53 | struct pci_channel board_pci_channels[] = { |
55 | { &sh7751_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff }, | 54 | { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff }, |
56 | { NULL, NULL, NULL, 0, 0 }, | 55 | { NULL, NULL, NULL, 0, 0 }, |
57 | }; | 56 | }; |
58 | EXPORT_SYMBOL(board_pci_channels); | 57 | EXPORT_SYMBOL(board_pci_channels); |
59 | 58 | ||
60 | static struct sh7751_pci_address_map sh7751_pci_map = { | 59 | static struct sh4_pci_address_map sh7751_pci_map = { |
61 | .window0 = { | 60 | .window0 = { |
62 | .base = SH7751_CS3_BASE_ADDR, | 61 | .base = SH7751_CS3_BASE_ADDR, |
63 | .size = 0x04000000, | 62 | .size = 0x04000000, |
@@ -68,7 +67,7 @@ static struct sh7751_pci_address_map sh7751_pci_map = { | |||
68 | .size = 0x00000000, /* Unused */ | 67 | .size = 0x00000000, /* Unused */ |
69 | }, | 68 | }, |
70 | 69 | ||
71 | .flags = SH7751_PCIC_NO_RESET, | 70 | .flags = SH4_PCIC_NO_RESET, |
72 | }; | 71 | }; |
73 | 72 | ||
74 | int __init pcibios_init_platform(void) | 73 | int __init pcibios_init_platform(void) |
diff --git a/arch/sh/drivers/pci/ops-sh4.c b/arch/sh/drivers/pci/ops-sh4.c new file mode 100644 index 000000000000..2d4371009a5e --- /dev/null +++ b/arch/sh/drivers/pci/ops-sh4.c | |||
@@ -0,0 +1,164 @@ | |||
1 | /* | ||
2 | * Generic SH-4 / SH-4A PCIC operations (SH7751, SH7780). | ||
3 | * | ||
4 | * Copyright (C) 2002 - 2006 Paul Mundt | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License v2. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #include <linux/pci.h> | ||
11 | #include <asm/addrspace.h> | ||
12 | #include <asm/io.h> | ||
13 | #include "pci-sh4.h" | ||
14 | |||
15 | /* | ||
16 | * Direct access to PCI hardware... | ||
17 | */ | ||
18 | #define CONFIG_CMD(bus, devfn, where) \ | ||
19 | P1SEGADDR((bus->number << 16) | (devfn << 8) | (where & ~3)) | ||
20 | |||
21 | static DEFINE_SPINLOCK(sh4_pci_lock); | ||
22 | |||
23 | /* | ||
24 | * Functions for accessing PCI configuration space with type 1 accesses | ||
25 | */ | ||
26 | static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn, | ||
27 | int where, int size, u32 *val) | ||
28 | { | ||
29 | unsigned long flags; | ||
30 | u32 data; | ||
31 | |||
32 | /* | ||
33 | * PCIPDR may only be accessed as 32 bit words, | ||
34 | * so we must do byte alignment by hand | ||
35 | */ | ||
36 | spin_lock_irqsave(&sh4_pci_lock, flags); | ||
37 | pci_write_reg(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR); | ||
38 | data = pci_read_reg(SH4_PCIPDR); | ||
39 | spin_unlock_irqrestore(&sh4_pci_lock, flags); | ||
40 | |||
41 | switch (size) { | ||
42 | case 1: | ||
43 | *val = (data >> ((where & 3) << 3)) & 0xff; | ||
44 | break; | ||
45 | case 2: | ||
46 | *val = (data >> ((where & 2) << 3)) & 0xffff; | ||
47 | break; | ||
48 | case 4: | ||
49 | *val = data; | ||
50 | break; | ||
51 | default: | ||
52 | return PCIBIOS_FUNC_NOT_SUPPORTED; | ||
53 | } | ||
54 | |||
55 | return PCIBIOS_SUCCESSFUL; | ||
56 | } | ||
57 | |||
58 | /* | ||
59 | * Since SH4 only does 32bit access we'll have to do a read, | ||
60 | * mask,write operation. | ||
61 | * We'll allow an odd byte offset, though it should be illegal. | ||
62 | */ | ||
63 | static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn, | ||
64 | int where, int size, u32 val) | ||
65 | { | ||
66 | unsigned long flags; | ||
67 | int shift; | ||
68 | u32 data; | ||
69 | |||
70 | spin_lock_irqsave(&sh4_pci_lock, flags); | ||
71 | pci_write_reg(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR); | ||
72 | data = pci_read_reg(SH4_PCIPDR); | ||
73 | spin_unlock_irqrestore(&sh4_pci_lock, flags); | ||
74 | |||
75 | switch (size) { | ||
76 | case 1: | ||
77 | shift = (where & 3) << 3; | ||
78 | data &= ~(0xff << shift); | ||
79 | data |= ((val & 0xff) << shift); | ||
80 | break; | ||
81 | case 2: | ||
82 | shift = (where & 2) << 3; | ||
83 | data &= ~(0xffff << shift); | ||
84 | data |= ((val & 0xffff) << shift); | ||
85 | break; | ||
86 | case 4: | ||
87 | data = val; | ||
88 | break; | ||
89 | default: | ||
90 | return PCIBIOS_FUNC_NOT_SUPPORTED; | ||
91 | } | ||
92 | |||
93 | pci_write_reg(data, SH4_PCIPDR); | ||
94 | |||
95 | return PCIBIOS_SUCCESSFUL; | ||
96 | } | ||
97 | |||
98 | struct pci_ops sh4_pci_ops = { | ||
99 | .read = sh4_pci_read, | ||
100 | .write = sh4_pci_write, | ||
101 | }; | ||
102 | |||
103 | /* | ||
104 | * Not really related to pci_ops, but it's common and not worth shoving | ||
105 | * somewhere else for now.. | ||
106 | */ | ||
107 | static unsigned int pci_probe = PCI_PROBE_CONF1; | ||
108 | |||
109 | int __init sh4_pci_check_direct(void) | ||
110 | { | ||
111 | /* | ||
112 | * Check if configuration works. | ||
113 | */ | ||
114 | if (pci_probe & PCI_PROBE_CONF1) { | ||
115 | unsigned int tmp = pci_read_reg(SH4_PCIPAR); | ||
116 | |||
117 | pci_write_reg(P1SEG, SH4_PCIPAR); | ||
118 | |||
119 | if (pci_read_reg(SH4_PCIPAR) == P1SEG) { | ||
120 | pci_write_reg(tmp, SH4_PCIPAR); | ||
121 | printk(KERN_INFO "PCI: Using configuration type 1\n"); | ||
122 | request_region(PCI_REG(SH4_PCIPAR), 8, "PCI conf1"); | ||
123 | |||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | pci_write_reg(tmp, SH4_PCIPAR); | ||
128 | } | ||
129 | |||
130 | pr_debug("PCI: pci_check_direct failed\n"); | ||
131 | return -EINVAL; | ||
132 | } | ||
133 | |||
134 | /* Handle generic fixups */ | ||
135 | static void __init pci_fixup_ide_bases(struct pci_dev *d) | ||
136 | { | ||
137 | int i; | ||
138 | |||
139 | /* | ||
140 | * PCI IDE controllers use non-standard I/O port decoding, respect it. | ||
141 | */ | ||
142 | if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE) | ||
143 | return; | ||
144 | pr_debug("PCI: IDE base address fixup for %s\n", pci_name(d)); | ||
145 | for(i = 0; i < 4; i++) { | ||
146 | struct resource *r = &d->resource[i]; | ||
147 | |||
148 | if ((r->start & ~0x80) == 0x374) { | ||
149 | r->start |= 2; | ||
150 | r->end = r->start; | ||
151 | } | ||
152 | } | ||
153 | } | ||
154 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases); | ||
155 | |||
156 | char * __init pcibios_setup(char *str) | ||
157 | { | ||
158 | if (!strcmp(str, "off")) { | ||
159 | pci_probe = 0; | ||
160 | return NULL; | ||
161 | } | ||
162 | |||
163 | return str; | ||
164 | } | ||
diff --git a/arch/sh/drivers/pci/ops-snapgear.c b/arch/sh/drivers/pci/ops-snapgear.c index 3cbd14dd28fe..53dd893d4e54 100644 --- a/arch/sh/drivers/pci/ops-snapgear.c +++ b/arch/sh/drivers/pci/ops-snapgear.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/sh/drivers/pci/ops-snapgear.c | 2 | * arch/sh/drivers/pci/ops-snapgear.c |
3 | * | 3 | * |
4 | * Author: David McCullough <davidm@snapgear.com> | 4 | * Author: David McCullough <davidm@snapgear.com> |
5 | * | 5 | * |
6 | * Ported to new API by Paul Mundt <lethal@linux-sh.org> | 6 | * Ported to new API by Paul Mundt <lethal@linux-sh.org> |
7 | * | 7 | * |
8 | * Highly leveraged from pci-bigsur.c, written by Dustin McIntire. | 8 | * Highly leveraged from pci-bigsur.c, written by Dustin McIntire. |
@@ -12,15 +12,11 @@ | |||
12 | * | 12 | * |
13 | * PCI initialization for the SnapGear boards | 13 | * PCI initialization for the SnapGear boards |
14 | */ | 14 | */ |
15 | |||
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/types.h> | 16 | #include <linux/types.h> |
18 | #include <linux/init.h> | 17 | #include <linux/init.h> |
19 | #include <linux/delay.h> | ||
20 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
21 | 19 | #include "pci-sh4.h" | |
22 | #include <asm/io.h> | ||
23 | #include "pci-sh7751.h" | ||
24 | 20 | ||
25 | #define SNAPGEAR_PCI_IO 0x4000 | 21 | #define SNAPGEAR_PCI_IO 0x4000 |
26 | #define SNAPGEAR_PCI_MEM 0xfd000000 | 22 | #define SNAPGEAR_PCI_MEM 0xfd000000 |
@@ -43,14 +39,12 @@ static struct resource sh7751_mem_resource = { | |||
43 | .flags = IORESOURCE_MEM, | 39 | .flags = IORESOURCE_MEM, |
44 | }; | 40 | }; |
45 | 41 | ||
46 | extern struct pci_ops sh7751_pci_ops; | ||
47 | |||
48 | struct pci_channel board_pci_channels[] = { | 42 | struct pci_channel board_pci_channels[] = { |
49 | { &sh7751_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff }, | 43 | { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff }, |
50 | { 0, } | 44 | { 0, } |
51 | }; | 45 | }; |
52 | 46 | ||
53 | static struct sh7751_pci_address_map sh7751_pci_map = { | 47 | static struct sh4_pci_address_map sh7751_pci_map = { |
54 | .window0 = { | 48 | .window0 = { |
55 | .base = SH7751_CS2_BASE_ADDR, | 49 | .base = SH7751_CS2_BASE_ADDR, |
56 | .size = SNAPGEAR_LSR0_SIZE, | 50 | .size = SNAPGEAR_LSR0_SIZE, |
@@ -61,11 +55,11 @@ static struct sh7751_pci_address_map sh7751_pci_map = { | |||
61 | .size = SNAPGEAR_LSR1_SIZE, | 55 | .size = SNAPGEAR_LSR1_SIZE, |
62 | }, | 56 | }, |
63 | 57 | ||
64 | .flags = SH7751_PCIC_NO_RESET, | 58 | .flags = SH4_PCIC_NO_RESET, |
65 | }; | 59 | }; |
66 | 60 | ||
67 | /* | 61 | /* |
68 | * Initialize the SnapGear PCI interface | 62 | * Initialize the SnapGear PCI interface |
69 | * Setup hardware to be Central Funtion | 63 | * Setup hardware to be Central Funtion |
70 | * Copy the BSR regs to the PCI interface | 64 | * Copy the BSR regs to the PCI interface |
71 | * Setup PCI windows into local RAM | 65 | * Setup PCI windows into local RAM |
@@ -75,7 +69,7 @@ int __init pcibios_init_platform(void) | |||
75 | return sh7751_pcic_init(&sh7751_pci_map); | 69 | return sh7751_pcic_init(&sh7751_pci_map); |
76 | } | 70 | } |
77 | 71 | ||
78 | int __init pcibios_map_platform_irq(u8 slot, u8 pin) | 72 | int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) |
79 | { | 73 | { |
80 | int irq = -1; | 74 | int irq = -1; |
81 | 75 | ||
@@ -98,4 +92,3 @@ void __init pcibios_fixup(void) | |||
98 | { | 92 | { |
99 | /* Nothing to fixup .. */ | 93 | /* Nothing to fixup .. */ |
100 | } | 94 | } |
101 | |||
diff --git a/arch/sh/drivers/pci/ops-titan.c b/arch/sh/drivers/pci/ops-titan.c new file mode 100644 index 000000000000..c6097bcd97fd --- /dev/null +++ b/arch/sh/drivers/pci/ops-titan.c | |||
@@ -0,0 +1,83 @@ | |||
1 | /* | ||
2 | * arch/sh/drivers/pci/ops-titan.c | ||
3 | * | ||
4 | * Ported to new API by Paul Mundt <lethal@linux-sh.org> | ||
5 | * | ||
6 | * Modified from ops-snapgear.c written by David McCullough | ||
7 | * Highly leveraged from pci-bigsur.c, written by Dustin McIntire. | ||
8 | * | ||
9 | * May be copied or modified under the terms of the GNU General Public | ||
10 | * License. See linux/COPYING for more information. | ||
11 | * | ||
12 | * PCI initialization for the Titan boards | ||
13 | */ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/types.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/pci.h> | ||
20 | #include <asm/io.h> | ||
21 | #include <asm/titan.h> | ||
22 | #include "pci-sh4.h" | ||
23 | |||
24 | int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) | ||
25 | { | ||
26 | int irq = -1; | ||
27 | |||
28 | switch (slot) { | ||
29 | case 0: irq = TITAN_IRQ_WAN; break; /* eth0 (WAN) */ | ||
30 | case 1: irq = TITAN_IRQ_LAN; break; /* eth1 (LAN) */ | ||
31 | case 2: irq = TITAN_IRQ_MPCIA; break; /* mPCI A */ | ||
32 | case 3: irq = TITAN_IRQ_MPCIB; break; /* mPCI B */ | ||
33 | case 4: irq = TITAN_IRQ_USB; break; /* USB */ | ||
34 | default: | ||
35 | printk(KERN_INFO "PCI: Bad IRQ mapping " | ||
36 | "request for slot %d\n", slot); | ||
37 | return -1; | ||
38 | } | ||
39 | |||
40 | printk("PCI: Mapping TITAN IRQ for slot %d, pin %c to irq %d\n", | ||
41 | slot, pin - 1 + 'A', irq); | ||
42 | |||
43 | return irq; | ||
44 | } | ||
45 | |||
46 | static struct resource sh7751_io_resource = { | ||
47 | .name = "SH7751_IO", | ||
48 | .start = SH7751_PCI_IO_BASE, | ||
49 | .end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1, | ||
50 | .flags = IORESOURCE_IO | ||
51 | }; | ||
52 | |||
53 | static struct resource sh7751_mem_resource = { | ||
54 | .name = "SH7751_mem", | ||
55 | .start = SH7751_PCI_MEMORY_BASE, | ||
56 | .end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1, | ||
57 | .flags = IORESOURCE_MEM | ||
58 | }; | ||
59 | |||
60 | struct pci_channel board_pci_channels[] = { | ||
61 | { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff }, | ||
62 | { NULL, NULL, NULL, 0, 0 }, | ||
63 | }; | ||
64 | EXPORT_SYMBOL(board_pci_channels); | ||
65 | |||
66 | static struct sh4_pci_address_map sh7751_pci_map = { | ||
67 | .window0 = { | ||
68 | .base = SH7751_CS2_BASE_ADDR, | ||
69 | .size = SH7751_MEM_REGION_SIZE*2, /* cs2 and cs3 */ | ||
70 | }, | ||
71 | |||
72 | .window1 = { | ||
73 | .base = SH7751_CS2_BASE_ADDR, | ||
74 | .size = SH7751_MEM_REGION_SIZE*2, | ||
75 | }, | ||
76 | |||
77 | .flags = SH4_PCIC_NO_RESET, | ||
78 | }; | ||
79 | |||
80 | int __init pcibios_init_platform(void) | ||
81 | { | ||
82 | return sh7751_pcic_init(&sh7751_pci_map); | ||
83 | } | ||
diff --git a/arch/sh/drivers/pci/pci-auto.c b/arch/sh/drivers/pci/pci-auto.c index 4cef4d1d8c84..ecf16344f94a 100644 --- a/arch/sh/drivers/pci/pci-auto.c +++ b/arch/sh/drivers/pci/pci-auto.c | |||
@@ -45,11 +45,11 @@ | |||
45 | #include <linux/types.h> | 45 | #include <linux/types.h> |
46 | #include <linux/pci.h> | 46 | #include <linux/pci.h> |
47 | 47 | ||
48 | #undef DEBUG | 48 | #define DEBUG |
49 | #ifdef DEBUG | 49 | #ifdef DEBUG |
50 | #define DBG(x...) printk(x) | 50 | #define DBG(x...) printk(x) |
51 | #else | 51 | #else |
52 | #define DBG(x...) | 52 | #define DBG(x...) |
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | /* | 55 | /* |
@@ -102,7 +102,7 @@ static u32 pciauto_upper_iospc; | |||
102 | static u32 pciauto_lower_memspc; | 102 | static u32 pciauto_lower_memspc; |
103 | static u32 pciauto_upper_memspc; | 103 | static u32 pciauto_upper_memspc; |
104 | 104 | ||
105 | static void __init | 105 | static void __init |
106 | pciauto_setup_bars(struct pci_channel *hose, | 106 | pciauto_setup_bars(struct pci_channel *hose, |
107 | int top_bus, | 107 | int top_bus, |
108 | int current_bus, | 108 | int current_bus, |
@@ -116,7 +116,6 @@ pciauto_setup_bars(struct pci_channel *hose, | |||
116 | int found_mem64 = 0; | 116 | int found_mem64 = 0; |
117 | 117 | ||
118 | for (bar = PCI_BASE_ADDRESS_0; bar <= bar_limit; bar+=4) { | 118 | for (bar = PCI_BASE_ADDRESS_0; bar <= bar_limit; bar+=4) { |
119 | #if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D) | ||
120 | u32 bar_addr; | 119 | u32 bar_addr; |
121 | 120 | ||
122 | /* Read the old BAR value */ | 121 | /* Read the old BAR value */ |
@@ -125,7 +124,6 @@ pciauto_setup_bars(struct pci_channel *hose, | |||
125 | pci_devfn, | 124 | pci_devfn, |
126 | bar, | 125 | bar, |
127 | &bar_addr); | 126 | &bar_addr); |
128 | #endif | ||
129 | 127 | ||
130 | /* Tickle the BAR and get the response */ | 128 | /* Tickle the BAR and get the response */ |
131 | early_write_config_dword(hose, top_bus, | 129 | early_write_config_dword(hose, top_bus, |
@@ -140,8 +138,7 @@ pciauto_setup_bars(struct pci_channel *hose, | |||
140 | bar, | 138 | bar, |
141 | &bar_response); | 139 | &bar_response); |
142 | 140 | ||
143 | #if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D) | 141 | /* |
144 | /* | ||
145 | * Write the old BAR value back out, only update the BAR | 142 | * Write the old BAR value back out, only update the BAR |
146 | * if we implicitly want resources to be updated, which | 143 | * if we implicitly want resources to be updated, which |
147 | * is done by the generic code further down. -- PFM. | 144 | * is done by the generic code further down. -- PFM. |
@@ -151,7 +148,6 @@ pciauto_setup_bars(struct pci_channel *hose, | |||
151 | pci_devfn, | 148 | pci_devfn, |
152 | bar, | 149 | bar, |
153 | bar_addr); | 150 | bar_addr); |
154 | #endif | ||
155 | 151 | ||
156 | /* If BAR is not implemented go to the next BAR */ | 152 | /* If BAR is not implemented go to the next BAR */ |
157 | if (!bar_response) | 153 | if (!bar_response) |
@@ -177,7 +173,7 @@ retry: | |||
177 | PCI_BASE_ADDRESS_MEM_TYPE_64) | 173 | PCI_BASE_ADDRESS_MEM_TYPE_64) |
178 | found_mem64 = 1; | 174 | found_mem64 = 1; |
179 | 175 | ||
180 | addr_mask = PCI_BASE_ADDRESS_MEM_MASK; | 176 | addr_mask = PCI_BASE_ADDRESS_MEM_MASK; |
181 | upper_limit = &pciauto_upper_memspc; | 177 | upper_limit = &pciauto_upper_memspc; |
182 | lower_limit = &pciauto_lower_memspc; | 178 | lower_limit = &pciauto_lower_memspc; |
183 | DBG(" Mem"); | 179 | DBG(" Mem"); |
@@ -193,22 +189,22 @@ retry: | |||
193 | if ((bar_value + bar_size) > *upper_limit) { | 189 | if ((bar_value + bar_size) > *upper_limit) { |
194 | if (bar_response & PCI_BASE_ADDRESS_SPACE) { | 190 | if (bar_response & PCI_BASE_ADDRESS_SPACE) { |
195 | if (io_resource_inuse->child) { | 191 | if (io_resource_inuse->child) { |
196 | io_resource_inuse = | 192 | io_resource_inuse = |
197 | io_resource_inuse->child; | 193 | io_resource_inuse->child; |
198 | pciauto_lower_iospc = | 194 | pciauto_lower_iospc = |
199 | io_resource_inuse->start; | 195 | io_resource_inuse->start; |
200 | pciauto_upper_iospc = | 196 | pciauto_upper_iospc = |
201 | io_resource_inuse->end + 1; | 197 | io_resource_inuse->end + 1; |
202 | goto retry; | 198 | goto retry; |
203 | } | 199 | } |
204 | 200 | ||
205 | } else { | 201 | } else { |
206 | if (mem_resource_inuse->child) { | 202 | if (mem_resource_inuse->child) { |
207 | mem_resource_inuse = | 203 | mem_resource_inuse = |
208 | mem_resource_inuse->child; | 204 | mem_resource_inuse->child; |
209 | pciauto_lower_memspc = | 205 | pciauto_lower_memspc = |
210 | mem_resource_inuse->start; | 206 | mem_resource_inuse->start; |
211 | pciauto_upper_memspc = | 207 | pciauto_upper_memspc = |
212 | mem_resource_inuse->end + 1; | 208 | mem_resource_inuse->end + 1; |
213 | goto retry; | 209 | goto retry; |
214 | } | 210 | } |
@@ -230,7 +226,7 @@ retry: | |||
230 | * If we are a 64-bit decoder then increment to the | 226 | * If we are a 64-bit decoder then increment to the |
231 | * upper 32 bits of the bar and force it to locate | 227 | * upper 32 bits of the bar and force it to locate |
232 | * in the lower 4GB of memory. | 228 | * in the lower 4GB of memory. |
233 | */ | 229 | */ |
234 | if (found_mem64) { | 230 | if (found_mem64) { |
235 | bar += 4; | 231 | bar += 4; |
236 | early_write_config_dword(hose, top_bus, | 232 | early_write_config_dword(hose, top_bus, |
@@ -362,7 +358,6 @@ pciauto_postscan_setup_cardbus_bridge(struct pci_channel *hose, | |||
362 | { | 358 | { |
363 | u32 temp; | 359 | u32 temp; |
364 | 360 | ||
365 | #if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D) | ||
366 | /* | 361 | /* |
367 | * [jsun] we always bump up baselines a little, so that if there | 362 | * [jsun] we always bump up baselines a little, so that if there |
368 | * nothing behind P2P bridge, we don't wind up overlapping IO/MEM | 363 | * nothing behind P2P bridge, we don't wind up overlapping IO/MEM |
@@ -370,7 +365,6 @@ pciauto_postscan_setup_cardbus_bridge(struct pci_channel *hose, | |||
370 | */ | 365 | */ |
371 | pciauto_lower_memspc += 1; | 366 | pciauto_lower_memspc += 1; |
372 | pciauto_lower_iospc += 1; | 367 | pciauto_lower_iospc += 1; |
373 | #endif | ||
374 | 368 | ||
375 | /* | 369 | /* |
376 | * Configure subordinate bus number. The PCI subsystem | 370 | * Configure subordinate bus number. The PCI subsystem |
@@ -396,11 +390,6 @@ pciauto_postscan_setup_cardbus_bridge(struct pci_channel *hose, | |||
396 | * configured by this routine to happily live behind a | 390 | * configured by this routine to happily live behind a |
397 | * P2P bridge in a system. | 391 | * P2P bridge in a system. |
398 | */ | 392 | */ |
399 | #if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D) | ||
400 | pciauto_lower_memspc += 0x00400000; | ||
401 | pciauto_lower_iospc += 0x00004000; | ||
402 | #endif | ||
403 | |||
404 | /* Align memory and I/O to 4KB and 4 byte boundaries. */ | 393 | /* Align memory and I/O to 4KB and 4 byte boundaries. */ |
405 | pciauto_lower_memspc = (pciauto_lower_memspc + (0x1000 - 1)) | 394 | pciauto_lower_memspc = (pciauto_lower_memspc + (0x1000 - 1)) |
406 | & ~(0x1000 - 1); | 395 | & ~(0x1000 - 1); |
@@ -433,12 +422,12 @@ pciauto_bus_scan(struct pci_channel *hose, int top_bus, int current_bus) | |||
433 | int devfn_stop = 0xff; | 422 | int devfn_stop = 0xff; |
434 | 423 | ||
435 | sub_bus = current_bus; | 424 | sub_bus = current_bus; |
436 | 425 | ||
437 | if (hose->first_devfn) | 426 | if (hose->first_devfn) |
438 | devfn_start = hose->first_devfn; | 427 | devfn_start = hose->first_devfn; |
439 | if (hose->last_devfn) | 428 | if (hose->last_devfn) |
440 | devfn_stop = hose->last_devfn; | 429 | devfn_stop = hose->last_devfn; |
441 | 430 | ||
442 | for (pci_devfn=devfn_start; pci_devfn<devfn_stop; pci_devfn++) { | 431 | for (pci_devfn=devfn_start; pci_devfn<devfn_stop; pci_devfn++) { |
443 | 432 | ||
444 | if (PCI_FUNC(pci_devfn) && !found_multi) | 433 | if (PCI_FUNC(pci_devfn) && !found_multi) |
@@ -471,9 +460,6 @@ pciauto_bus_scan(struct pci_channel *hose, int top_bus, int current_bus) | |||
471 | if ((pci_class >> 16) == PCI_CLASS_BRIDGE_PCI) { | 460 | if ((pci_class >> 16) == PCI_CLASS_BRIDGE_PCI) { |
472 | DBG(" Bridge: primary=%.2x, secondary=%.2x\n", | 461 | DBG(" Bridge: primary=%.2x, secondary=%.2x\n", |
473 | current_bus, sub_bus + 1); | 462 | current_bus, sub_bus + 1); |
474 | #if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D) | ||
475 | pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_1); | ||
476 | #endif | ||
477 | pciauto_prescan_setup_bridge(hose, top_bus, current_bus, | 463 | pciauto_prescan_setup_bridge(hose, top_bus, current_bus, |
478 | pci_devfn, sub_bus); | 464 | pci_devfn, sub_bus); |
479 | DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n", | 465 | DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n", |
@@ -490,10 +476,10 @@ pciauto_bus_scan(struct pci_channel *hose, int top_bus, int current_bus) | |||
490 | DBG("PCI Autoconfig: Found CardBus bridge, device %d function %d\n", PCI_SLOT(pci_devfn), PCI_FUNC(pci_devfn)); | 476 | DBG("PCI Autoconfig: Found CardBus bridge, device %d function %d\n", PCI_SLOT(pci_devfn), PCI_FUNC(pci_devfn)); |
491 | /* Place CardBus Socket/ExCA registers */ | 477 | /* Place CardBus Socket/ExCA registers */ |
492 | pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_0); | 478 | pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_0); |
493 | 479 | ||
494 | pciauto_prescan_setup_cardbus_bridge(hose, top_bus, | 480 | pciauto_prescan_setup_cardbus_bridge(hose, top_bus, |
495 | current_bus, pci_devfn, sub_bus); | 481 | current_bus, pci_devfn, sub_bus); |
496 | 482 | ||
497 | DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n", | 483 | DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n", |
498 | sub_bus + 1, | 484 | sub_bus + 1, |
499 | pciauto_lower_iospc, pciauto_lower_memspc); | 485 | pciauto_lower_iospc, pciauto_lower_memspc); |
diff --git a/arch/sh/drivers/pci/pci-sh4.h b/arch/sh/drivers/pci/pci-sh4.h new file mode 100644 index 000000000000..5a61d6041f2c --- /dev/null +++ b/arch/sh/drivers/pci/pci-sh4.h | |||
@@ -0,0 +1,180 @@ | |||
1 | #ifndef __PCI_SH4_H | ||
2 | #define __PCI_SH4_H | ||
3 | |||
4 | #ifdef CONFIG_CPU_SUBTYPE_SH7780 | ||
5 | #include "pci-sh7780.h" | ||
6 | #else | ||
7 | #include "pci-sh7751.h" | ||
8 | #endif | ||
9 | |||
10 | #include <asm/io.h> | ||
11 | |||
12 | /* startup values */ | ||
13 | #define PCI_PROBE_BIOS 1 | ||
14 | #define PCI_PROBE_CONF1 2 | ||
15 | #define PCI_PROBE_CONF2 4 | ||
16 | #define PCI_NO_SORT 0x100 | ||
17 | #define PCI_BIOS_SORT 0x200 | ||
18 | #define PCI_NO_CHECKS 0x400 | ||
19 | #define PCI_ASSIGN_ROMS 0x1000 | ||
20 | #define PCI_BIOS_IRQ_SCAN 0x2000 | ||
21 | |||
22 | #define SH4_PCICR 0x100 /* PCI Control Register */ | ||
23 | #define SH4_PCICR_PREFIX 0xA5000000 /* CR prefix for write */ | ||
24 | #define SH4_PCICR_FTO 0x00000400 /* TRDY/IRDY Enable */ | ||
25 | #define SH4_PCICR_TRSB 0x00000200 /* Target Read Single */ | ||
26 | #define SH4_PCICR_BSWP 0x00000100 /* Target Byte Swap */ | ||
27 | #define SH4_PCICR_PLUP 0x00000080 /* Enable PCI Pullup */ | ||
28 | #define SH4_PCICR_ARBM 0x00000040 /* PCI Arbitration Mode */ | ||
29 | #define SH4_PCICR_MD 0x00000030 /* MD9 and MD10 status */ | ||
30 | #define SH4_PCICR_SERR 0x00000008 /* SERR output assert */ | ||
31 | #define SH4_PCICR_INTA 0x00000004 /* INTA output assert */ | ||
32 | #define SH4_PCICR_PRST 0x00000002 /* PCI Reset Assert */ | ||
33 | #define SH4_PCICR_CFIN 0x00000001 /* Central Fun. Init Done */ | ||
34 | #define SH4_PCILSR0 0x104 /* PCI Local Space Register0 */ | ||
35 | #define SH4_PCILSR1 0x108 /* PCI Local Space Register1 */ | ||
36 | #define SH4_PCILAR0 0x10C /* PCI Local Addr Register1 */ | ||
37 | #define SH4_PCILAR1 0x110 /* PCI Local Addr Register1 */ | ||
38 | #define SH4_PCIINT 0x114 /* PCI Interrupt Register */ | ||
39 | #define SH4_PCIINT_MLCK 0x00008000 /* Master Lock Error */ | ||
40 | #define SH4_PCIINT_TABT 0x00004000 /* Target Abort Error */ | ||
41 | #define SH4_PCIINT_TRET 0x00000200 /* Target Retry Error */ | ||
42 | #define SH4_PCIINT_MFDE 0x00000100 /* Master Func. Disable Error */ | ||
43 | #define SH4_PCIINT_PRTY 0x00000080 /* Address Parity Error */ | ||
44 | #define SH4_PCIINT_SERR 0x00000040 /* SERR Detection Error */ | ||
45 | #define SH4_PCIINT_TWDP 0x00000020 /* Tgt. Write Parity Error */ | ||
46 | #define SH4_PCIINT_TRDP 0x00000010 /* Tgt. Read Parity Err Det. */ | ||
47 | #define SH4_PCIINT_MTABT 0x00000008 /* Master-Tgt. Abort Error */ | ||
48 | #define SH4_PCIINT_MMABT 0x00000004 /* Master-Master Abort Error */ | ||
49 | #define SH4_PCIINT_MWPD 0x00000002 /* Master Write PERR Detect */ | ||
50 | #define SH4_PCIINT_MRPD 0x00000001 /* Master Read PERR Detect */ | ||
51 | #define SH4_PCIINTM 0x118 /* PCI Interrupt Mask */ | ||
52 | #define SH4_PCIALR 0x11C /* Error Address Register */ | ||
53 | #define SH4_PCICLR 0x120 /* Error Command/Data */ | ||
54 | #define SH4_PCICLR_MPIO 0x80000000 | ||
55 | #define SH4_PCICLR_MDMA0 0x40000000 /* DMA0 Transfer Error */ | ||
56 | #define SH4_PCICLR_MDMA1 0x20000000 /* DMA1 Transfer Error */ | ||
57 | #define SH4_PCICLR_MDMA2 0x10000000 /* DMA2 Transfer Error */ | ||
58 | #define SH4_PCICLR_MDMA3 0x08000000 /* DMA3 Transfer Error */ | ||
59 | #define SH4_PCICLR_TGT 0x04000000 /* Target Transfer Error */ | ||
60 | #define SH4_PCICLR_CMDL 0x0000000F /* PCI Command at Error */ | ||
61 | #define SH4_PCIAINT 0x130 /* Arbiter Interrupt Register */ | ||
62 | #define SH4_PCIAINT_MBKN 0x00002000 /* Master Broken Interrupt */ | ||
63 | #define SH4_PCIAINT_TBTO 0x00001000 /* Target Bus Time Out */ | ||
64 | #define SH4_PCIAINT_MBTO 0x00001000 /* Master Bus Time Out */ | ||
65 | #define SH4_PCIAINT_TABT 0x00000008 /* Target Abort */ | ||
66 | #define SH4_PCIAINT_MABT 0x00000004 /* Master Abort */ | ||
67 | #define SH4_PCIAINT_RDPE 0x00000002 /* Read Data Parity Error */ | ||
68 | #define SH4_PCIAINT_WDPE 0x00000001 /* Write Data Parity Error */ | ||
69 | #define SH4_PCIAINTM 0x134 /* Arbiter Int. Mask Register */ | ||
70 | #define SH4_PCIBMLR 0x138 /* Error Bus Master Register */ | ||
71 | #define SH4_PCIBMLR_REQ4 0x00000010 /* REQ4 bus master at error */ | ||
72 | #define SH4_PCIBMLR_REQ3 0x00000008 /* REQ3 bus master at error */ | ||
73 | #define SH4_PCIBMLR_REQ2 0x00000004 /* REQ2 bus master at error */ | ||
74 | #define SH4_PCIBMLR_REQ1 0x00000002 /* REQ1 bus master at error */ | ||
75 | #define SH4_PCIBMLR_REQ0 0x00000001 /* REQ0 bus master at error */ | ||
76 | #define SH4_PCIDMABT 0x140 /* DMA Transfer Arb. Register */ | ||
77 | #define SH4_PCIDMABT_RRBN 0x00000001 /* DMA Arbitor Round-Robin */ | ||
78 | #define SH4_PCIDPA0 0x180 /* DMA0 Transfer Addr. */ | ||
79 | #define SH4_PCIDLA0 0x184 /* DMA0 Local Addr. */ | ||
80 | #define SH4_PCIDTC0 0x188 /* DMA0 Transfer Cnt. */ | ||
81 | #define SH4_PCIDCR0 0x18C /* DMA0 Control Register */ | ||
82 | #define SH4_PCIDCR_ALGN 0x00000600 /* DMA Alignment Mode */ | ||
83 | #define SH4_PCIDCR_MAST 0x00000100 /* DMA Termination Type */ | ||
84 | #define SH4_PCIDCR_INTM 0x00000080 /* DMA Interrupt Done Mask*/ | ||
85 | #define SH4_PCIDCR_INTS 0x00000040 /* DMA Interrupt Done Status */ | ||
86 | #define SH4_PCIDCR_LHLD 0x00000020 /* Local Address Control */ | ||
87 | #define SH4_PCIDCR_PHLD 0x00000010 /* PCI Address Control*/ | ||
88 | #define SH4_PCIDCR_IOSEL 0x00000008 /* PCI Address Space Type */ | ||
89 | #define SH4_PCIDCR_DIR 0x00000004 /* DMA Transfer Direction */ | ||
90 | #define SH4_PCIDCR_STOP 0x00000002 /* Force DMA Stop */ | ||
91 | #define SH4_PCIDCR_STRT 0x00000001 /* DMA Start */ | ||
92 | #define SH4_PCIDPA1 0x190 /* DMA1 Transfer Addr. */ | ||
93 | #define SH4_PCIDLA1 0x194 /* DMA1 Local Addr. */ | ||
94 | #define SH4_PCIDTC1 0x198 /* DMA1 Transfer Cnt. */ | ||
95 | #define SH4_PCIDCR1 0x19C /* DMA1 Control Register */ | ||
96 | #define SH4_PCIDPA2 0x1A0 /* DMA2 Transfer Addr. */ | ||
97 | #define SH4_PCIDLA2 0x1A4 /* DMA2 Local Addr. */ | ||
98 | #define SH4_PCIDTC2 0x1A8 /* DMA2 Transfer Cnt. */ | ||
99 | #define SH4_PCIDCR2 0x1AC /* DMA2 Control Register */ | ||
100 | #define SH4_PCIDPA3 0x1B0 /* DMA3 Transfer Addr. */ | ||
101 | #define SH4_PCIDLA3 0x1B4 /* DMA3 Local Addr. */ | ||
102 | #define SH4_PCIDTC3 0x1B8 /* DMA3 Transfer Cnt. */ | ||
103 | #define SH4_PCIDCR3 0x1BC /* DMA3 Control Register */ | ||
104 | #define SH4_PCIPAR 0x1C0 /* PIO Address Register */ | ||
105 | #define SH4_PCIPAR_CFGEN 0x80000000 /* Configuration Enable */ | ||
106 | #define SH4_PCIPAR_BUSNO 0x00FF0000 /* Config. Bus Number */ | ||
107 | #define SH4_PCIPAR_DEVNO 0x0000FF00 /* Config. Device Number */ | ||
108 | #define SH4_PCIPAR_REGAD 0x000000FC /* Register Address Number */ | ||
109 | #define SH4_PCIMBR 0x1C4 /* Memory Base Address */ | ||
110 | #define SH4_PCIMBR_MASK 0xFF000000 /* Memory Space Mask */ | ||
111 | #define SH4_PCIMBR_LOCK 0x00000001 /* Lock Memory Space */ | ||
112 | #define SH4_PCIIOBR 0x1C8 /* I/O Base Address Register */ | ||
113 | #define SH4_PCIIOBR_MASK 0xFFFC0000 /* IO Space Mask */ | ||
114 | #define SH4_PCIIOBR_LOCK 0x00000001 /* Lock IO Space */ | ||
115 | #define SH4_PCIPINT 0x1CC /* Power Mgmnt Int. Register */ | ||
116 | #define SH4_PCIPINT_D3 0x00000002 /* D3 Pwr Mgmt. Interrupt */ | ||
117 | #define SH4_PCIPINT_D0 0x00000001 /* D0 Pwr Mgmt. Interrupt */ | ||
118 | #define SH4_PCIPINTM 0x1D0 /* Power Mgmnt Mask Register */ | ||
119 | #define SH4_PCICLKR 0x1D4 /* Clock Ctrl. Register */ | ||
120 | #define SH4_PCICLKR_PCSTP 0x00000002 /* PCI Clock Stop */ | ||
121 | #define SH4_PCICLKR_BCSTP 0x00000001 /* BCLK Clock Stop */ | ||
122 | /* For definitions of BCR, MCR see ... */ | ||
123 | #define SH4_PCIBCR1 0x1E0 /* Memory BCR1 Register */ | ||
124 | #define SH4_PCIMBR0 SH4_PCIBCR1 | ||
125 | #define SH4_PCIBCR2 0x1E4 /* Memory BCR2 Register */ | ||
126 | #define SH4_PCIMBMR0 SH4_PCIBCR2 | ||
127 | #define SH4_PCIWCR1 0x1E8 /* Wait Control 1 Register */ | ||
128 | #define SH4_PCIWCR2 0x1EC /* Wait Control 2 Register */ | ||
129 | #define SH4_PCIWCR3 0x1F0 /* Wait Control 3 Register */ | ||
130 | #define SH4_PCIMBR2 SH4_PCIWCR3 | ||
131 | #define SH4_PCIMCR 0x1F4 /* Memory Control Register */ | ||
132 | #define SH4_PCIBCR3 0x1f8 /* Memory BCR3 Register */ | ||
133 | #define SH4_PCIPCTR 0x200 /* Port Control Register */ | ||
134 | #define SH4_PCIPCTR_P2EN 0x000400000 /* Port 2 Enable */ | ||
135 | #define SH4_PCIPCTR_P1EN 0x000200000 /* Port 1 Enable */ | ||
136 | #define SH4_PCIPCTR_P0EN 0x000100000 /* Port 0 Enable */ | ||
137 | #define SH4_PCIPCTR_P2UP 0x000000020 /* Port2 Pull Up Enable */ | ||
138 | #define SH4_PCIPCTR_P2IO 0x000000010 /* Port2 Output Enable */ | ||
139 | #define SH4_PCIPCTR_P1UP 0x000000008 /* Port1 Pull Up Enable */ | ||
140 | #define SH4_PCIPCTR_P1IO 0x000000004 /* Port1 Output Enable */ | ||
141 | #define SH4_PCIPCTR_P0UP 0x000000002 /* Port0 Pull Up Enable */ | ||
142 | #define SH4_PCIPCTR_P0IO 0x000000001 /* Port0 Output Enable */ | ||
143 | #define SH4_PCIPDTR 0x204 /* Port Data Register */ | ||
144 | #define SH4_PCIPDTR_PB5 0x000000020 /* Port 5 Enable */ | ||
145 | #define SH4_PCIPDTR_PB4 0x000000010 /* Port 4 Enable */ | ||
146 | #define SH4_PCIPDTR_PB3 0x000000008 /* Port 3 Enable */ | ||
147 | #define SH4_PCIPDTR_PB2 0x000000004 /* Port 2 Enable */ | ||
148 | #define SH4_PCIPDTR_PB1 0x000000002 /* Port 1 Enable */ | ||
149 | #define SH4_PCIPDTR_PB0 0x000000001 /* Port 0 Enable */ | ||
150 | #define SH4_PCIPDR 0x220 /* Port IO Data Register */ | ||
151 | |||
152 | /* Flags */ | ||
153 | #define SH4_PCIC_NO_RESET 0x0001 | ||
154 | |||
155 | /* arch/sh/kernel/drivers/pci/ops-sh4.c */ | ||
156 | extern struct pci_ops sh4_pci_ops; | ||
157 | int sh4_pci_check_direct(void); | ||
158 | int pci_fixup_pcic(void); | ||
159 | |||
160 | struct sh4_pci_address_space { | ||
161 | unsigned long base; | ||
162 | unsigned long size; | ||
163 | }; | ||
164 | |||
165 | struct sh4_pci_address_map { | ||
166 | struct sh4_pci_address_space window0; | ||
167 | struct sh4_pci_address_space window1; | ||
168 | unsigned long flags; | ||
169 | }; | ||
170 | |||
171 | static inline void pci_write_reg(unsigned long val, unsigned long reg) | ||
172 | { | ||
173 | outl(val, PCI_REG(reg)); | ||
174 | } | ||
175 | |||
176 | static inline unsigned long pci_read_reg(unsigned long reg) | ||
177 | { | ||
178 | return inl(PCI_REG(reg)); | ||
179 | } | ||
180 | #endif /* __PCI_SH4_H */ | ||
diff --git a/arch/sh/drivers/pci/pci-sh7751.c b/arch/sh/drivers/pci/pci-sh7751.c index 682f3dae305d..dbe837884983 100644 --- a/arch/sh/drivers/pci/pci-sh7751.c +++ b/arch/sh/drivers/pci/pci-sh7751.c | |||
@@ -15,180 +15,14 @@ | |||
15 | 15 | ||
16 | #undef DEBUG | 16 | #undef DEBUG |
17 | 17 | ||
18 | #include <linux/types.h> | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | 18 | #include <linux/init.h> |
21 | #include <linux/pci.h> | 19 | #include <linux/pci.h> |
22 | #include <linux/sched.h> | 20 | #include <linux/types.h> |
23 | #include <linux/ioport.h> | ||
24 | #include <linux/errno.h> | 21 | #include <linux/errno.h> |
25 | #include <linux/irq.h> | ||
26 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
27 | 23 | #include "pci-sh4.h" | |
28 | #include <asm/machvec.h> | 24 | #include <asm/addrspace.h> |
29 | #include <asm/io.h> | 25 | #include <asm/io.h> |
30 | #include "pci-sh7751.h" | ||
31 | |||
32 | static unsigned int pci_probe = PCI_PROBE_CONF1; | ||
33 | extern int pci_fixup_pcic(void); | ||
34 | |||
35 | void pcibios_fixup_irqs(void) __attribute__ ((weak)); | ||
36 | |||
37 | /* | ||
38 | * Direct access to PCI hardware... | ||
39 | */ | ||
40 | |||
41 | #define CONFIG_CMD(bus, devfn, where) (0x80000000 | (bus->number << 16) | (devfn << 8) | (where & ~3)) | ||
42 | |||
43 | /* | ||
44 | * Functions for accessing PCI configuration space with type 1 accesses | ||
45 | */ | ||
46 | static int sh7751_pci_read(struct pci_bus *bus, unsigned int devfn, | ||
47 | int where, int size, u32 *val) | ||
48 | { | ||
49 | unsigned long flags; | ||
50 | u32 data; | ||
51 | |||
52 | /* | ||
53 | * PCIPDR may only be accessed as 32 bit words, | ||
54 | * so we must do byte alignment by hand | ||
55 | */ | ||
56 | local_irq_save(flags); | ||
57 | outl(CONFIG_CMD(bus,devfn,where), PCI_REG(SH7751_PCIPAR)); | ||
58 | data = inl(PCI_REG(SH7751_PCIPDR)); | ||
59 | local_irq_restore(flags); | ||
60 | |||
61 | switch (size) { | ||
62 | case 1: | ||
63 | *val = (data >> ((where & 3) << 3)) & 0xff; | ||
64 | break; | ||
65 | case 2: | ||
66 | *val = (data >> ((where & 2) << 3)) & 0xffff; | ||
67 | break; | ||
68 | case 4: | ||
69 | *val = data; | ||
70 | break; | ||
71 | default: | ||
72 | return PCIBIOS_FUNC_NOT_SUPPORTED; | ||
73 | } | ||
74 | |||
75 | return PCIBIOS_SUCCESSFUL; | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * Since SH7751 only does 32bit access we'll have to do a read, | ||
80 | * mask,write operation. | ||
81 | * We'll allow an odd byte offset, though it should be illegal. | ||
82 | */ | ||
83 | static int sh7751_pci_write(struct pci_bus *bus, unsigned int devfn, | ||
84 | int where, int size, u32 val) | ||
85 | { | ||
86 | unsigned long flags; | ||
87 | int shift; | ||
88 | u32 data; | ||
89 | |||
90 | local_irq_save(flags); | ||
91 | outl(CONFIG_CMD(bus,devfn,where), PCI_REG(SH7751_PCIPAR)); | ||
92 | data = inl(PCI_REG(SH7751_PCIPDR)); | ||
93 | local_irq_restore(flags); | ||
94 | |||
95 | switch (size) { | ||
96 | case 1: | ||
97 | shift = (where & 3) << 3; | ||
98 | data &= ~(0xff << shift); | ||
99 | data |= ((val & 0xff) << shift); | ||
100 | break; | ||
101 | case 2: | ||
102 | shift = (where & 2) << 3; | ||
103 | data &= ~(0xffff << shift); | ||
104 | data |= ((val & 0xffff) << shift); | ||
105 | break; | ||
106 | case 4: | ||
107 | data = val; | ||
108 | break; | ||
109 | default: | ||
110 | return PCIBIOS_FUNC_NOT_SUPPORTED; | ||
111 | } | ||
112 | |||
113 | outl(data, PCI_REG(SH7751_PCIPDR)); | ||
114 | |||
115 | return PCIBIOS_SUCCESSFUL; | ||
116 | } | ||
117 | |||
118 | #undef CONFIG_CMD | ||
119 | |||
120 | struct pci_ops sh7751_pci_ops = { | ||
121 | .read = sh7751_pci_read, | ||
122 | .write = sh7751_pci_write, | ||
123 | }; | ||
124 | |||
125 | static int __init pci_check_direct(void) | ||
126 | { | ||
127 | unsigned int tmp, id; | ||
128 | |||
129 | /* check for SH7751/SH7751R hardware */ | ||
130 | id = inl(SH7751_PCIREG_BASE+SH7751_PCICONF0); | ||
131 | if (id != ((SH7751_DEVICE_ID << 16) | SH7751_VENDOR_ID) && | ||
132 | id != ((SH7751R_DEVICE_ID << 16) | SH7751_VENDOR_ID)) { | ||
133 | pr_debug("PCI: This is not an SH7751(R) (%x)\n", id); | ||
134 | return -ENODEV; | ||
135 | } | ||
136 | |||
137 | /* | ||
138 | * Check if configuration works. | ||
139 | */ | ||
140 | if (pci_probe & PCI_PROBE_CONF1) { | ||
141 | tmp = inl (PCI_REG(SH7751_PCIPAR)); | ||
142 | outl (0x80000000, PCI_REG(SH7751_PCIPAR)); | ||
143 | if (inl (PCI_REG(SH7751_PCIPAR)) == 0x80000000) { | ||
144 | outl (tmp, PCI_REG(SH7751_PCIPAR)); | ||
145 | printk(KERN_INFO "PCI: Using configuration type 1\n"); | ||
146 | request_region(PCI_REG(SH7751_PCIPAR), 8, "PCI conf1"); | ||
147 | return 0; | ||
148 | } | ||
149 | outl (tmp, PCI_REG(SH7751_PCIPAR)); | ||
150 | } | ||
151 | |||
152 | pr_debug("PCI: pci_check_direct failed\n"); | ||
153 | return -EINVAL; | ||
154 | } | ||
155 | |||
156 | /***************************************************************************************/ | ||
157 | |||
158 | /* | ||
159 | * Handle bus scanning and fixups .... | ||
160 | */ | ||
161 | |||
162 | static void __init pci_fixup_ide_bases(struct pci_dev *d) | ||
163 | { | ||
164 | int i; | ||
165 | |||
166 | /* | ||
167 | * PCI IDE controllers use non-standard I/O port decoding, respect it. | ||
168 | */ | ||
169 | if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE) | ||
170 | return; | ||
171 | pr_debug("PCI: IDE base address fixup for %s\n", pci_name(d)); | ||
172 | for(i=0; i<4; i++) { | ||
173 | struct resource *r = &d->resource[i]; | ||
174 | if ((r->start & ~0x80) == 0x374) { | ||
175 | r->start |= 2; | ||
176 | r->end = r->start; | ||
177 | } | ||
178 | } | ||
179 | } | ||
180 | |||
181 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases); | ||
182 | |||
183 | /* | ||
184 | * Called after each bus is probed, but before its children | ||
185 | * are examined. | ||
186 | */ | ||
187 | |||
188 | void __init pcibios_fixup_bus(struct pci_bus *b) | ||
189 | { | ||
190 | pci_read_bridge_bases(b); | ||
191 | } | ||
192 | 26 | ||
193 | /* | 27 | /* |
194 | * Initialization. Try all known PCI access methods. Note that we support | 28 | * Initialization. Try all known PCI access methods. Note that we support |
@@ -196,25 +30,29 @@ void __init pcibios_fixup_bus(struct pci_bus *b) | |||
196 | * to access config space. | 30 | * to access config space. |
197 | * | 31 | * |
198 | * Note that the platform specific initialization (BSC registers, and memory | 32 | * Note that the platform specific initialization (BSC registers, and memory |
199 | * space mapping) will be called via the machine vectors (sh_mv.mv_pci_init()) if it | 33 | * space mapping) will be called via the platform defined function |
200 | * exitst and via the platform defined function pcibios_init_platform(). | 34 | * pcibios_init_platform(). |
201 | * See pci_bigsur.c for implementation; | ||
202 | * | ||
203 | * The BIOS version of the pci functions is not yet implemented but it is left | ||
204 | * in for completeness. Currently an error will be genereated at compile time. | ||
205 | */ | 35 | */ |
206 | |||
207 | static int __init sh7751_pci_init(void) | 36 | static int __init sh7751_pci_init(void) |
208 | { | 37 | { |
38 | unsigned int id; | ||
209 | int ret; | 39 | int ret; |
210 | 40 | ||
211 | pr_debug("PCI: Starting intialization.\n"); | 41 | pr_debug("PCI: Starting intialization.\n"); |
212 | if ((ret = pci_check_direct()) != 0) | 42 | |
43 | /* check for SH7751/SH7751R hardware */ | ||
44 | id = pci_read_reg(SH7751_PCICONF0); | ||
45 | if (id != ((SH7751_DEVICE_ID << 16) | SH7751_VENDOR_ID) && | ||
46 | id != ((SH7751R_DEVICE_ID << 16) | SH7751_VENDOR_ID)) { | ||
47 | pr_debug("PCI: This is not an SH7751(R) (%x)\n", id); | ||
48 | return -ENODEV; | ||
49 | } | ||
50 | |||
51 | if ((ret = sh4_pci_check_direct()) != 0) | ||
213 | return ret; | 52 | return ret; |
214 | 53 | ||
215 | return pcibios_init_platform(); | 54 | return pcibios_init_platform(); |
216 | } | 55 | } |
217 | |||
218 | subsys_initcall(sh7751_pci_init); | 56 | subsys_initcall(sh7751_pci_init); |
219 | 57 | ||
220 | static int __init __area_sdram_check(unsigned int area) | 58 | static int __init __area_sdram_check(unsigned int area) |
@@ -223,26 +61,26 @@ static int __init __area_sdram_check(unsigned int area) | |||
223 | 61 | ||
224 | word = inl(SH7751_BCR1); | 62 | word = inl(SH7751_BCR1); |
225 | /* check BCR for SDRAM in area */ | 63 | /* check BCR for SDRAM in area */ |
226 | if(((word >> area) & 1) == 0) { | 64 | if (((word >> area) & 1) == 0) { |
227 | printk("PCI: Area %d is not configured for SDRAM. BCR1=0x%x\n", | 65 | printk("PCI: Area %d is not configured for SDRAM. BCR1=0x%x\n", |
228 | area, word); | 66 | area, word); |
229 | return 0; | 67 | return 0; |
230 | } | 68 | } |
231 | outl(word, PCI_REG(SH7751_PCIBCR1)); | 69 | pci_write_reg(word, SH4_PCIBCR1); |
232 | 70 | ||
233 | word = (u16)inw(SH7751_BCR2); | 71 | word = (u16)inw(SH7751_BCR2); |
234 | /* check BCR2 for 32bit SDRAM interface*/ | 72 | /* check BCR2 for 32bit SDRAM interface*/ |
235 | if(((word >> (area << 1)) & 0x3) != 0x3) { | 73 | if (((word >> (area << 1)) & 0x3) != 0x3) { |
236 | printk("PCI: Area %d is not 32 bit SDRAM. BCR2=0x%x\n", | 74 | printk("PCI: Area %d is not 32 bit SDRAM. BCR2=0x%x\n", |
237 | area, word); | 75 | area, word); |
238 | return 0; | 76 | return 0; |
239 | } | 77 | } |
240 | outl(word, PCI_REG(SH7751_PCIBCR2)); | 78 | pci_write_reg(word, SH4_PCIBCR2); |
241 | 79 | ||
242 | return 1; | 80 | return 1; |
243 | } | 81 | } |
244 | 82 | ||
245 | int __init sh7751_pcic_init(struct sh7751_pci_address_map *map) | 83 | int __init sh7751_pcic_init(struct sh4_pci_address_map *map) |
246 | { | 84 | { |
247 | u32 reg; | 85 | u32 reg; |
248 | u32 word; | 86 | u32 word; |
@@ -251,39 +89,39 @@ int __init sh7751_pcic_init(struct sh7751_pci_address_map *map) | |||
251 | reg = inl(SH7751_BCR1); | 89 | reg = inl(SH7751_BCR1); |
252 | reg |= 0x80000; | 90 | reg |= 0x80000; |
253 | outl(reg, SH7751_BCR1); | 91 | outl(reg, SH7751_BCR1); |
254 | 92 | ||
255 | /* Turn the clocks back on (not done in reset)*/ | 93 | /* Turn the clocks back on (not done in reset)*/ |
256 | outl(0, PCI_REG(SH7751_PCICLKR)); | 94 | pci_write_reg(0, SH4_PCICLKR); |
257 | /* Clear Powerdown IRQ's (not done in reset) */ | 95 | /* Clear Powerdown IRQ's (not done in reset) */ |
258 | word = SH7751_PCIPINT_D3 | SH7751_PCIPINT_D0; | 96 | word = SH4_PCIPINT_D3 | SH4_PCIPINT_D0; |
259 | outl(word, PCI_REG(SH7751_PCIPINT)); | 97 | pci_write_reg(word, SH4_PCIPINT); |
260 | 98 | ||
261 | /* | 99 | /* |
262 | * This code is unused for some boards as it is done in the | 100 | * This code is unused for some boards as it is done in the |
263 | * bootloader and doing it here means the MAC addresses loaded | 101 | * bootloader and doing it here means the MAC addresses loaded |
264 | * by the bootloader get lost. | 102 | * by the bootloader get lost. |
265 | */ | 103 | */ |
266 | if (!(map->flags & SH7751_PCIC_NO_RESET)) { | 104 | if (!(map->flags & SH4_PCIC_NO_RESET)) { |
267 | /* toggle PCI reset pin */ | 105 | /* toggle PCI reset pin */ |
268 | word = SH7751_PCICR_PREFIX | SH7751_PCICR_PRST; | 106 | word = SH4_PCICR_PREFIX | SH4_PCICR_PRST; |
269 | outl(word,PCI_REG(SH7751_PCICR)); | 107 | pci_write_reg(word, SH4_PCICR); |
270 | /* Wait for a long time... not 1 sec. but long enough */ | 108 | /* Wait for a long time... not 1 sec. but long enough */ |
271 | mdelay(100); | 109 | mdelay(100); |
272 | word = SH7751_PCICR_PREFIX; | 110 | word = SH4_PCICR_PREFIX; |
273 | outl(word,PCI_REG(SH7751_PCICR)); | 111 | pci_write_reg(word, SH4_PCICR); |
274 | } | 112 | } |
275 | 113 | ||
276 | /* set the command/status bits to: | 114 | /* set the command/status bits to: |
277 | * Wait Cycle Control + Parity Enable + Bus Master + | 115 | * Wait Cycle Control + Parity Enable + Bus Master + |
278 | * Mem space enable | 116 | * Mem space enable |
279 | */ | 117 | */ |
280 | word = SH7751_PCICONF1_WCC | SH7751_PCICONF1_PER | | 118 | word = SH7751_PCICONF1_WCC | SH7751_PCICONF1_PER | |
281 | SH7751_PCICONF1_BUM | SH7751_PCICONF1_MES; | 119 | SH7751_PCICONF1_BUM | SH7751_PCICONF1_MES; |
282 | outl(word, PCI_REG(SH7751_PCICONF1)); | 120 | pci_write_reg(word, SH7751_PCICONF1); |
283 | 121 | ||
284 | /* define this host as the host bridge */ | 122 | /* define this host as the host bridge */ |
285 | word = SH7751_PCI_HOST_BRIDGE << 24; | 123 | word = PCI_BASE_CLASS_BRIDGE << 24; |
286 | outl(word, PCI_REG(SH7751_PCICONF2)); | 124 | pci_write_reg(word, SH7751_PCICONF2); |
287 | 125 | ||
288 | /* Set IO and Mem windows to local address | 126 | /* Set IO and Mem windows to local address |
289 | * Make PCI and local address the same for easy 1 to 1 mapping | 127 | * Make PCI and local address the same for easy 1 to 1 mapping |
@@ -291,46 +129,49 @@ int __init sh7751_pcic_init(struct sh7751_pci_address_map *map) | |||
291 | * Window1 = map->window1.size @ cached area base = SDRAM | 129 | * Window1 = map->window1.size @ cached area base = SDRAM |
292 | */ | 130 | */ |
293 | word = map->window0.size - 1; | 131 | word = map->window0.size - 1; |
294 | outl(word, PCI_REG(SH7751_PCILSR0)); | 132 | pci_write_reg(word, SH4_PCILSR0); |
295 | word = map->window1.size - 1; | 133 | word = map->window1.size - 1; |
296 | outl(word, PCI_REG(SH7751_PCILSR1)); | 134 | pci_write_reg(word, SH4_PCILSR1); |
297 | /* Set the values on window 0 PCI config registers */ | 135 | /* Set the values on window 0 PCI config registers */ |
298 | word = P2SEGADDR(map->window0.base); | 136 | word = P2SEGADDR(map->window0.base); |
299 | outl(word, PCI_REG(SH7751_PCILAR0)); | 137 | pci_write_reg(word, SH4_PCILAR0); |
300 | outl(word, PCI_REG(SH7751_PCICONF5)); | 138 | pci_write_reg(word, SH7751_PCICONF5); |
301 | /* Set the values on window 1 PCI config registers */ | 139 | /* Set the values on window 1 PCI config registers */ |
302 | word = PHYSADDR(map->window1.base); | 140 | word = PHYSADDR(map->window1.base); |
303 | outl(word, PCI_REG(SH7751_PCILAR1)); | 141 | pci_write_reg(word, SH4_PCILAR1); |
304 | outl(word, PCI_REG(SH7751_PCICONF6)); | 142 | pci_write_reg(word, SH7751_PCICONF6); |
305 | 143 | ||
306 | /* Set the local 16MB PCI memory space window to | 144 | /* Set the local 16MB PCI memory space window to |
307 | * the lowest PCI mapped address | 145 | * the lowest PCI mapped address |
308 | */ | 146 | */ |
309 | word = PCIBIOS_MIN_MEM & SH7751_PCIMBR_MASK; | 147 | word = PCIBIOS_MIN_MEM & SH4_PCIMBR_MASK; |
310 | PCIDBG(2,"PCI: Setting upper bits of Memory window to 0x%x\n", word); | 148 | pr_debug("PCI: Setting upper bits of Memory window to 0x%x\n", word); |
311 | outl(word , PCI_REG(SH7751_PCIMBR)); | 149 | pci_write_reg(word , SH4_PCIMBR); |
312 | 150 | ||
313 | /* Map IO space into PCI IO window | 151 | /* Map IO space into PCI IO window |
314 | * The IO window is 64K-PCIBIOS_MIN_IO in size | 152 | * The IO window is 64K-PCIBIOS_MIN_IO in size |
315 | * IO addresses will be translated to the | 153 | * IO addresses will be translated to the |
316 | * PCI IO window base address | 154 | * PCI IO window base address |
317 | */ | 155 | */ |
318 | PCIDBG(3,"PCI: Mapping IO address 0x%x - 0x%x to base 0x%x\n", PCIBIOS_MIN_IO, | 156 | pr_debug("PCI: Mapping IO address 0x%x - 0x%x to base 0x%x\n", |
319 | (64*1024), SH7751_PCI_IO_BASE+PCIBIOS_MIN_IO); | 157 | PCIBIOS_MIN_IO, (64 << 10), |
158 | SH4_PCI_IO_BASE + PCIBIOS_MIN_IO); | ||
320 | 159 | ||
321 | /* | 160 | /* |
322 | * XXX: For now, leave this board-specific. In the event we have other | 161 | * XXX: For now, leave this board-specific. In the event we have other |
323 | * boards that need to do similar work, this can be wrapped. | 162 | * boards that need to do similar work, this can be wrapped. |
324 | */ | 163 | */ |
325 | #ifdef CONFIG_SH_BIGSUR | 164 | #ifdef CONFIG_SH_BIGSUR |
326 | bigsur_port_map(PCIBIOS_MIN_IO, (64*1024), SH7751_PCI_IO_BASE+PCIBIOS_MIN_IO,0); | 165 | bigsur_port_map(PCIBIOS_MIN_IO, (64 << 10), |
166 | SH4_PCI_IO_BASE + PCIBIOS_MIN_IO, 0); | ||
327 | #endif | 167 | #endif |
328 | 168 | ||
329 | /* Make sure the MSB's of IO window are set to access PCI space correctly */ | 169 | /* Make sure the MSB's of IO window are set to access PCI space |
330 | word = PCIBIOS_MIN_IO & SH7751_PCIIOBR_MASK; | 170 | * correctly */ |
331 | PCIDBG(2,"PCI: Setting upper bits of IO window to 0x%x\n", word); | 171 | word = PCIBIOS_MIN_IO & SH4_PCIIOBR_MASK; |
332 | outl(word, PCI_REG(SH7751_PCIIOBR)); | 172 | pr_debug("PCI: Setting upper bits of IO window to 0x%x\n", word); |
333 | 173 | pci_write_reg(word, SH4_PCIIOBR); | |
174 | |||
334 | /* Set PCI WCRx, BCRx's, copy from BSC locations */ | 175 | /* Set PCI WCRx, BCRx's, copy from BSC locations */ |
335 | 176 | ||
336 | /* check BCR for SDRAM in specified area */ | 177 | /* check BCR for SDRAM in specified area */ |
@@ -349,13 +190,13 @@ int __init sh7751_pcic_init(struct sh7751_pci_address_map *map) | |||
349 | 190 | ||
350 | /* configure the wait control registers */ | 191 | /* configure the wait control registers */ |
351 | word = inl(SH7751_WCR1); | 192 | word = inl(SH7751_WCR1); |
352 | outl(word, PCI_REG(SH7751_PCIWCR1)); | 193 | pci_write_reg(word, SH4_PCIWCR1); |
353 | word = inl(SH7751_WCR2); | 194 | word = inl(SH7751_WCR2); |
354 | outl(word, PCI_REG(SH7751_PCIWCR2)); | 195 | pci_write_reg(word, SH4_PCIWCR2); |
355 | word = inl(SH7751_WCR3); | 196 | word = inl(SH7751_WCR3); |
356 | outl(word, PCI_REG(SH7751_PCIWCR3)); | 197 | pci_write_reg(word, SH4_PCIWCR3); |
357 | word = inl(SH7751_MCR); | 198 | word = inl(SH7751_MCR); |
358 | outl(word, PCI_REG(SH7751_PCIMCR)); | 199 | pci_write_reg(word, SH4_PCIMCR); |
359 | 200 | ||
360 | /* NOTE: I'm ignoring the PCI error IRQs for now.. | 201 | /* NOTE: I'm ignoring the PCI error IRQs for now.. |
361 | * TODO: add support for the internal error interrupts and | 202 | * TODO: add support for the internal error interrupts and |
@@ -368,49 +209,8 @@ int __init sh7751_pcic_init(struct sh7751_pci_address_map *map) | |||
368 | 209 | ||
369 | /* SH7751 init done, set central function init complete */ | 210 | /* SH7751 init done, set central function init complete */ |
370 | /* use round robin mode to stop a device starving/overruning */ | 211 | /* use round robin mode to stop a device starving/overruning */ |
371 | word = SH7751_PCICR_PREFIX | SH7751_PCICR_CFIN | SH7751_PCICR_ARBM; | 212 | word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM; |
372 | outl(word,PCI_REG(SH7751_PCICR)); | 213 | pci_write_reg(word, SH4_PCICR); |
373 | 214 | ||
374 | return 1; | 215 | return 1; |
375 | } | 216 | } |
376 | |||
377 | char * __init pcibios_setup(char *str) | ||
378 | { | ||
379 | if (!strcmp(str, "off")) { | ||
380 | pci_probe = 0; | ||
381 | return NULL; | ||
382 | } | ||
383 | |||
384 | return str; | ||
385 | } | ||
386 | |||
387 | /* | ||
388 | * IRQ functions | ||
389 | */ | ||
390 | static u8 __init sh7751_no_swizzle(struct pci_dev *dev, u8 *pin) | ||
391 | { | ||
392 | /* no swizzling */ | ||
393 | return PCI_SLOT(dev->devfn); | ||
394 | } | ||
395 | |||
396 | static int sh7751_pci_lookup_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
397 | { | ||
398 | int irq = -1; | ||
399 | |||
400 | /* now lookup the actual IRQ on a platform specific basis (pci-'platform'.c) */ | ||
401 | irq = pcibios_map_platform_irq(slot,pin); | ||
402 | if( irq < 0 ) { | ||
403 | pr_debug("PCI: Error mapping IRQ on device %s\n", pci_name(dev)); | ||
404 | return irq; | ||
405 | } | ||
406 | |||
407 | pr_debug("Setting IRQ for slot %s to %d\n", pci_name(dev), irq); | ||
408 | |||
409 | return irq; | ||
410 | } | ||
411 | |||
412 | void __init pcibios_fixup_irqs(void) | ||
413 | { | ||
414 | pci_fixup_irqs(sh7751_no_swizzle, sh7751_pci_lookup_irq); | ||
415 | } | ||
416 | |||
diff --git a/arch/sh/drivers/pci/pci-sh7751.h b/arch/sh/drivers/pci/pci-sh7751.h index 1fee5cae10d1..68e3cb5e6bec 100644 --- a/arch/sh/drivers/pci/pci-sh7751.h +++ b/arch/sh/drivers/pci/pci-sh7751.h | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Dustin McIntire (dustin@sensoria.com) (c) 2001 | 4 | * Dustin McIntire (dustin@sensoria.com) (c) 2001 |
5 | * Paul Mundt (lethal@linux-sh.org) (c) 2003 | 5 | * Paul Mundt (lethal@linux-sh.org) (c) 2003 |
6 | * | 6 | * |
7 | * May be copied or modified under the terms of the GNU General Public | 7 | * May be copied or modified under the terms of the GNU General Public |
8 | * License. See linux/COPYING for more information. | 8 | * License. See linux/COPYING for more information. |
9 | * | 9 | * |
@@ -12,28 +12,6 @@ | |||
12 | #ifndef _PCI_SH7751_H_ | 12 | #ifndef _PCI_SH7751_H_ |
13 | #define _PCI_SH7751_H_ | 13 | #define _PCI_SH7751_H_ |
14 | 14 | ||
15 | #include <linux/pci.h> | ||
16 | |||
17 | /* set debug level 4=verbose...1=terse */ | ||
18 | //#define DEBUG_PCI 3 | ||
19 | #undef DEBUG_PCI | ||
20 | |||
21 | #ifdef DEBUG_PCI | ||
22 | #define PCIDBG(n, x...) { if(DEBUG_PCI>=n) printk(x); } | ||
23 | #else | ||
24 | #define PCIDBG(n, x...) | ||
25 | #endif | ||
26 | |||
27 | /* startup values */ | ||
28 | #define PCI_PROBE_BIOS 1 | ||
29 | #define PCI_PROBE_CONF1 2 | ||
30 | #define PCI_PROBE_CONF2 4 | ||
31 | #define PCI_NO_SORT 0x100 | ||
32 | #define PCI_BIOS_SORT 0x200 | ||
33 | #define PCI_NO_CHECKS 0x400 | ||
34 | #define PCI_ASSIGN_ROMS 0x1000 | ||
35 | #define PCI_BIOS_IRQ_SCAN 0x2000 | ||
36 | |||
37 | /* Platform Specific Values */ | 15 | /* Platform Specific Values */ |
38 | #define SH7751_VENDOR_ID 0x1054 | 16 | #define SH7751_VENDOR_ID 0x1054 |
39 | #define SH7751_DEVICE_ID 0x3505 | 17 | #define SH7751_DEVICE_ID 0x3505 |
@@ -128,131 +106,6 @@ | |||
128 | #define SH7751_PCICONF17_PMEN 0x00010000 /* PME Enable */ | 106 | #define SH7751_PCICONF17_PMEN 0x00010000 /* PME Enable */ |
129 | #define SH7751_PCICONF17_PWST 0x00000003 /* Power State */ | 107 | #define SH7751_PCICONF17_PWST 0x00000003 /* Power State */ |
130 | /* SH7715 Internal PCI Registers */ | 108 | /* SH7715 Internal PCI Registers */ |
131 | #define SH7751_PCICR 0x100 /* PCI Control Register */ | ||
132 | #define SH7751_PCICR_PREFIX 0xA5000000 /* CR prefix for write */ | ||
133 | #define SH7751_PCICR_TRSB 0x00000200 /* Target Read Single */ | ||
134 | #define SH7751_PCICR_BSWP 0x00000100 /* Target Byte Swap */ | ||
135 | #define SH7751_PCICR_PLUP 0x00000080 /* Enable PCI Pullup */ | ||
136 | #define SH7751_PCICR_ARBM 0x00000040 /* PCI Arbitration Mode */ | ||
137 | #define SH7751_PCICR_MD 0x00000030 /* MD9 and MD10 status */ | ||
138 | #define SH7751_PCICR_SERR 0x00000008 /* SERR output assert */ | ||
139 | #define SH7751_PCICR_INTA 0x00000004 /* INTA output assert */ | ||
140 | #define SH7751_PCICR_PRST 0x00000002 /* PCI Reset Assert */ | ||
141 | #define SH7751_PCICR_CFIN 0x00000001 /* Central Fun. Init Done */ | ||
142 | #define SH7751_PCILSR0 0x104 /* PCI Local Space Register0 */ | ||
143 | #define SH7751_PCILSR1 0x108 /* PCI Local Space Register1 */ | ||
144 | #define SH7751_PCILAR0 0x10C /* PCI Local Address Register1 */ | ||
145 | #define SH7751_PCILAR1 0x110 /* PCI Local Address Register1 */ | ||
146 | #define SH7751_PCIINT 0x114 /* PCI Interrupt Register */ | ||
147 | #define SH7751_PCIINT_MLCK 0x00008000 /* Master Lock Error */ | ||
148 | #define SH7751_PCIINT_TABT 0x00004000 /* Target Abort Error */ | ||
149 | #define SH7751_PCIINT_TRET 0x00000200 /* Target Retry Error */ | ||
150 | #define SH7751_PCIINT_MFDE 0x00000100 /* Master Func. Disable Error */ | ||
151 | #define SH7751_PCIINT_PRTY 0x00000080 /* Address Parity Error */ | ||
152 | #define SH7751_PCIINT_SERR 0x00000040 /* SERR Detection Error */ | ||
153 | #define SH7751_PCIINT_TWDP 0x00000020 /* Tgt. Write Parity Error */ | ||
154 | #define SH7751_PCIINT_TRDP 0x00000010 /* Tgt. Read Parity Error Det. */ | ||
155 | #define SH7751_PCIINT_MTABT 0x00000008 /* Master-Tgt. Abort Error */ | ||
156 | #define SH7751_PCIINT_MMABT 0x00000004 /* Master-Master Abort Error */ | ||
157 | #define SH7751_PCIINT_MWPD 0x00000002 /* Master Write PERR Detect */ | ||
158 | #define SH7751_PCIINT_MRPD 0x00000002 /* Master Read PERR Detect */ | ||
159 | #define SH7751_PCIINTM 0x118 /* PCI Interrupt Mask Register */ | ||
160 | #define SH7751_PCIALR 0x11C /* Error Address Register */ | ||
161 | #define SH7751_PCICLR 0x120 /* Error Command/Data Register */ | ||
162 | #define SH7751_PCICLR_MPIO 0x80000000 /* Error Command/Data Register */ | ||
163 | #define SH7751_PCICLR_MDMA0 0x40000000 /* DMA0 Transfer Error */ | ||
164 | #define SH7751_PCICLR_MDMA1 0x20000000 /* DMA1 Transfer Error */ | ||
165 | #define SH7751_PCICLR_MDMA2 0x10000000 /* DMA2 Transfer Error */ | ||
166 | #define SH7751_PCICLR_MDMA3 0x08000000 /* DMA3 Transfer Error */ | ||
167 | #define SH7751_PCICLR_TGT 0x04000000 /* Target Transfer Error */ | ||
168 | #define SH7751_PCICLR_CMDL 0x0000000F /* PCI Command at Error */ | ||
169 | #define SH7751_PCIAINT 0x130 /* Arbiter Interrupt Register */ | ||
170 | #define SH7751_PCIAINT_MBKN 0x00002000 /* Master Broken Interrupt */ | ||
171 | #define SH7751_PCIAINT_TBTO 0x00001000 /* Target Bus Time Out */ | ||
172 | #define SH7751_PCIAINT_MBTO 0x00001000 /* Master Bus Time Out */ | ||
173 | #define SH7751_PCIAINT_TABT 0x00000008 /* Target Abort */ | ||
174 | #define SH7751_PCIAINT_MABT 0x00000004 /* Master Abort */ | ||
175 | #define SH7751_PCIAINT_RDPE 0x00000002 /* Read Data Parity Error */ | ||
176 | #define SH7751_PCIAINT_WDPE 0x00000002 /* Write Data Parity Error */ | ||
177 | #define SH7751_PCIAINTM 0x134 /* Arbiter Int. Mask Register */ | ||
178 | #define SH7751_PCIBMLR 0x138 /* Error Bus Master Register */ | ||
179 | #define SH7751_PCIBMLR_REQ4 0x00000010 /* REQ4 bus master at error */ | ||
180 | #define SH7751_PCIBMLR_REQ3 0x00000008 /* REQ3 bus master at error */ | ||
181 | #define SH7751_PCIBMLR_REQ2 0x00000004 /* REQ2 bus master at error */ | ||
182 | #define SH7751_PCIBMLR_REQ1 0x00000002 /* REQ1 bus master at error */ | ||
183 | #define SH7751_PCIBMLR_REQ0 0x00000001 /* REQ0 bus master at error */ | ||
184 | #define SH7751_PCIDMABT 0x140 /* DMA Transfer Arb. Register */ | ||
185 | #define SH7751_PCIDMABT_RRBN 0x00000001 /* DMA Arbitor Round-Robin */ | ||
186 | #define SH7751_PCIDPA0 0x180 /* DMA0 Transfer Addr. Register */ | ||
187 | #define SH7751_PCIDLA0 0x184 /* DMA0 Local Addr. Register */ | ||
188 | #define SH7751_PCIDTC0 0x188 /* DMA0 Transfer Cnt. Register */ | ||
189 | #define SH7751_PCIDCR0 0x18C /* DMA0 Control Register */ | ||
190 | #define SH7751_PCIDCR_ALGN 0x00000600 /* DMA Alignment Mode */ | ||
191 | #define SH7751_PCIDCR_MAST 0x00000100 /* DMA Termination Type */ | ||
192 | #define SH7751_PCIDCR_INTM 0x00000080 /* DMA Interrupt Done Mask*/ | ||
193 | #define SH7751_PCIDCR_INTS 0x00000040 /* DMA Interrupt Done Status */ | ||
194 | #define SH7751_PCIDCR_LHLD 0x00000020 /* Local Address Control */ | ||
195 | #define SH7751_PCIDCR_PHLD 0x00000010 /* PCI Address Control*/ | ||
196 | #define SH7751_PCIDCR_IOSEL 0x00000008 /* PCI Address Space Type */ | ||
197 | #define SH7751_PCIDCR_DIR 0x00000004 /* DMA Transfer Direction */ | ||
198 | #define SH7751_PCIDCR_STOP 0x00000002 /* Force DMA Stop */ | ||
199 | #define SH7751_PCIDCR_STRT 0x00000001 /* DMA Start */ | ||
200 | #define SH7751_PCIDPA1 0x190 /* DMA1 Transfer Addr. Register */ | ||
201 | #define SH7751_PCIDLA1 0x194 /* DMA1 Local Addr. Register */ | ||
202 | #define SH7751_PCIDTC1 0x198 /* DMA1 Transfer Cnt. Register */ | ||
203 | #define SH7751_PCIDCR1 0x19C /* DMA1 Control Register */ | ||
204 | #define SH7751_PCIDPA2 0x1A0 /* DMA2 Transfer Addr. Register */ | ||
205 | #define SH7751_PCIDLA2 0x1A4 /* DMA2 Local Addr. Register */ | ||
206 | #define SH7751_PCIDTC2 0x1A8 /* DMA2 Transfer Cnt. Register */ | ||
207 | #define SH7751_PCIDCR2 0x1AC /* DMA2 Control Register */ | ||
208 | #define SH7751_PCIDPA3 0x1B0 /* DMA3 Transfer Addr. Register */ | ||
209 | #define SH7751_PCIDLA3 0x1B4 /* DMA3 Local Addr. Register */ | ||
210 | #define SH7751_PCIDTC3 0x1B8 /* DMA3 Transfer Cnt. Register */ | ||
211 | #define SH7751_PCIDCR3 0x1BC /* DMA3 Control Register */ | ||
212 | #define SH7751_PCIPAR 0x1C0 /* PIO Address Register */ | ||
213 | #define SH7751_PCIPAR_CFGEN 0x80000000 /* Configuration Enable */ | ||
214 | #define SH7751_PCIPAR_BUSNO 0x00FF0000 /* Config. Bus Number */ | ||
215 | #define SH7751_PCIPAR_DEVNO 0x0000FF00 /* Config. Device Number */ | ||
216 | #define SH7751_PCIPAR_REGAD 0x000000FC /* Register Address Number */ | ||
217 | #define SH7751_PCIMBR 0x1C4 /* Memory Base Address Register */ | ||
218 | #define SH7751_PCIMBR_MASK 0xFF000000 /* Memory Space Mask */ | ||
219 | #define SH7751_PCIMBR_LOCK 0x00000001 /* Lock Memory Space */ | ||
220 | #define SH7751_PCIIOBR 0x1C8 /* I/O Base Address Register */ | ||
221 | #define SH7751_PCIIOBR_MASK 0xFFFC0000 /* IO Space Mask */ | ||
222 | #define SH7751_PCIIOBR_LOCK 0x00000001 /* Lock IO Space */ | ||
223 | #define SH7751_PCIPINT 0x1CC /* Power Mgmnt Int. Register */ | ||
224 | #define SH7751_PCIPINT_D3 0x00000002 /* D3 Pwr Mgmt. Interrupt */ | ||
225 | #define SH7751_PCIPINT_D0 0x00000001 /* D0 Pwr Mgmt. Interrupt */ | ||
226 | #define SH7751_PCIPINTM 0x1D0 /* Power Mgmnt Mask Register */ | ||
227 | #define SH7751_PCICLKR 0x1D4 /* Clock Ctrl. Register */ | ||
228 | #define SH7751_PCICLKR_PCSTP 0x00000002 /* PCI Clock Stop */ | ||
229 | #define SH7751_PCICLKR_BCSTP 0x00000002 /* BCLK Clock Stop */ | ||
230 | /* For definitions of BCR, MCR see ... */ | ||
231 | #define SH7751_PCIBCR1 0x1E0 /* Memory BCR1 Register */ | ||
232 | #define SH7751_PCIBCR2 0x1E4 /* Memory BCR2 Register */ | ||
233 | #define SH7751_PCIWCR1 0x1E8 /* Wait Control 1 Register */ | ||
234 | #define SH7751_PCIWCR2 0x1EC /* Wait Control 2 Register */ | ||
235 | #define SH7751_PCIWCR3 0x1F0 /* Wait Control 3 Register */ | ||
236 | #define SH7751_PCIMCR 0x1F4 /* Memory Control Register */ | ||
237 | #define SH7751_PCIBCR3 0x1f8 /* Memory BCR3 Register */ | ||
238 | #define SH7751_PCIPCTR 0x200 /* Port Control Register */ | ||
239 | #define SH7751_PCIPCTR_P2EN 0x000400000 /* Port 2 Enable */ | ||
240 | #define SH7751_PCIPCTR_P1EN 0x000200000 /* Port 1 Enable */ | ||
241 | #define SH7751_PCIPCTR_P0EN 0x000100000 /* Port 0 Enable */ | ||
242 | #define SH7751_PCIPCTR_P2UP 0x000000020 /* Port2 Pull Up Enable */ | ||
243 | #define SH7751_PCIPCTR_P2IO 0x000000010 /* Port2 Output Enable */ | ||
244 | #define SH7751_PCIPCTR_P1UP 0x000000008 /* Port1 Pull Up Enable */ | ||
245 | #define SH7751_PCIPCTR_P1IO 0x000000004 /* Port1 Output Enable */ | ||
246 | #define SH7751_PCIPCTR_P0UP 0x000000002 /* Port0 Pull Up Enable */ | ||
247 | #define SH7751_PCIPCTR_P0IO 0x000000001 /* Port0 Output Enable */ | ||
248 | #define SH7751_PCIPDTR 0x204 /* Port Data Register */ | ||
249 | #define SH7751_PCIPDTR_PB5 0x000000020 /* Port 5 Enable */ | ||
250 | #define SH7751_PCIPDTR_PB4 0x000000010 /* Port 4 Enable */ | ||
251 | #define SH7751_PCIPDTR_PB3 0x000000008 /* Port 3 Enable */ | ||
252 | #define SH7751_PCIPDTR_PB2 0x000000004 /* Port 2 Enable */ | ||
253 | #define SH7751_PCIPDTR_PB1 0x000000002 /* Port 1 Enable */ | ||
254 | #define SH7751_PCIPDTR_PB0 0x000000001 /* Port 0 Enable */ | ||
255 | #define SH7751_PCIPDR 0x220 /* Port IO Data Register */ | ||
256 | 109 | ||
257 | /* Memory Control Registers */ | 110 | /* Memory Control Registers */ |
258 | #define SH7751_BCR1 0xFF800000 /* Memory BCR1 Register */ | 111 | #define SH7751_BCR1 0xFF800000 /* Memory BCR1 Register */ |
@@ -274,30 +127,9 @@ | |||
274 | #define SH7751_CS5_BASE_ADDR (SH7751_CS4_BASE_ADDR + SH7751_MEM_REGION_SIZE) | 127 | #define SH7751_CS5_BASE_ADDR (SH7751_CS4_BASE_ADDR + SH7751_MEM_REGION_SIZE) |
275 | #define SH7751_CS6_BASE_ADDR (SH7751_CS5_BASE_ADDR + SH7751_MEM_REGION_SIZE) | 128 | #define SH7751_CS6_BASE_ADDR (SH7751_CS5_BASE_ADDR + SH7751_MEM_REGION_SIZE) |
276 | 129 | ||
277 | /* General PCI values */ | 130 | struct sh4_pci_address_map; |
278 | #define SH7751_PCI_HOST_BRIDGE 0x6 | ||
279 | |||
280 | /* Flags */ | ||
281 | #define SH7751_PCIC_NO_RESET 0x0001 | ||
282 | |||
283 | /* External functions defined per platform i.e. Big Sur, SE... (these could be routed | ||
284 | * through the machine vectors... */ | ||
285 | extern int pcibios_init_platform(void); | ||
286 | extern int pcibios_map_platform_irq(u8 slot, u8 pin); | ||
287 | |||
288 | struct sh7751_pci_address_space { | ||
289 | unsigned long base; | ||
290 | unsigned long size; | ||
291 | }; | ||
292 | |||
293 | struct sh7751_pci_address_map { | ||
294 | struct sh7751_pci_address_space window0; | ||
295 | struct sh7751_pci_address_space window1; | ||
296 | unsigned long flags; | ||
297 | }; | ||
298 | 131 | ||
299 | /* arch/sh/drivers/pci/pci-sh7751.c */ | 132 | /* arch/sh/drivers/pci/pci-sh7751.c */ |
300 | extern int sh7751_pcic_init(struct sh7751_pci_address_map *map); | 133 | int sh7751_pcic_init(struct sh4_pci_address_map *map); |
301 | 134 | ||
302 | #endif /* _PCI_SH7751_H_ */ | 135 | #endif /* _PCI_SH7751_H_ */ |
303 | |||
diff --git a/arch/sh/drivers/pci/pci-sh7780.c b/arch/sh/drivers/pci/pci-sh7780.c new file mode 100644 index 000000000000..bd3064a82087 --- /dev/null +++ b/arch/sh/drivers/pci/pci-sh7780.c | |||
@@ -0,0 +1,139 @@ | |||
1 | /* | ||
2 | * Low-Level PCI Support for the SH7780 | ||
3 | * | ||
4 | * Dustin McIntire (dustin@sensoria.com) | ||
5 | * Derived from arch/i386/kernel/pci-*.c which bore the message: | ||
6 | * (c) 1999--2000 Martin Mares <mj@ucw.cz> | ||
7 | * | ||
8 | * Ported to the new API by Paul Mundt <lethal@linux-sh.org> | ||
9 | * With cleanup by Paul van Gool <pvangool@mimotech.com> | ||
10 | * | ||
11 | * May be copied or modified under the terms of the GNU General Public | ||
12 | * License. See linux/COPYING for more information. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #undef DEBUG | ||
17 | |||
18 | #include <linux/config.h> | ||
19 | #include <linux/types.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/pci.h> | ||
23 | #include <linux/errno.h> | ||
24 | #include <linux/delay.h> | ||
25 | #include "pci-sh4.h" | ||
26 | |||
27 | /* | ||
28 | * Initialization. Try all known PCI access methods. Note that we support | ||
29 | * using both PCI BIOS and direct access: in such cases, we use I/O ports | ||
30 | * to access config space. | ||
31 | * | ||
32 | * Note that the platform specific initialization (BSC registers, and memory | ||
33 | * space mapping) will be called via the platform defined function | ||
34 | * pcibios_init_platform(). | ||
35 | */ | ||
36 | static int __init sh7780_pci_init(void) | ||
37 | { | ||
38 | unsigned int id; | ||
39 | int ret; | ||
40 | |||
41 | pr_debug("PCI: Starting intialization.\n"); | ||
42 | |||
43 | outl(0x00000001, SH7780_PCI_VCR2); /* Enable PCIC */ | ||
44 | |||
45 | /* check for SH7780/SH7780R hardware */ | ||
46 | id = pci_read_reg(SH7780_PCIVID); | ||
47 | if ((id != ((SH7780_DEVICE_ID << 16) | SH7780_VENDOR_ID)) && | ||
48 | (id != ((SH7781_DEVICE_ID << 16) | SH7780_VENDOR_ID))) { | ||
49 | printk(KERN_ERR "PCI: This is not an SH7780 (%x)\n", id); | ||
50 | return -ENODEV; | ||
51 | } | ||
52 | |||
53 | /* Setup the INTC */ | ||
54 | ctrl_outl(0x00200000, INTC_ICR0); /* INTC SH-4 Mode */ | ||
55 | ctrl_outl(0x00078000, INTC_INT2MSKCR); /* enable PCIINTA - PCIINTD */ | ||
56 | ctrl_outl(0x40000000, INTC_INTMSK1); /* disable IRL4-7 Interrupt */ | ||
57 | ctrl_outl(0x0000fffe, INTC_INTMSK2); /* disable IRL4-7 Interrupt */ | ||
58 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); /* enable IRL0-3 Interrupt */ | ||
59 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); /* enable IRL0-3 Interrupt */ | ||
60 | |||
61 | if ((ret = sh4_pci_check_direct()) != 0) | ||
62 | return ret; | ||
63 | |||
64 | return pcibios_init_platform(); | ||
65 | } | ||
66 | core_initcall(sh7780_pci_init); | ||
67 | |||
68 | int __init sh7780_pcic_init(struct sh4_pci_address_map *map) | ||
69 | { | ||
70 | u32 word; | ||
71 | |||
72 | /* | ||
73 | * This code is unused for some boards as it is done in the | ||
74 | * bootloader and doing it here means the MAC addresses loaded | ||
75 | * by the bootloader get lost. | ||
76 | */ | ||
77 | if (!(map->flags & SH4_PCIC_NO_RESET)) { | ||
78 | /* toggle PCI reset pin */ | ||
79 | word = SH4_PCICR_PREFIX | SH4_PCICR_PRST; | ||
80 | pci_write_reg(word, SH4_PCICR); | ||
81 | /* Wait for a long time... not 1 sec. but long enough */ | ||
82 | mdelay(100); | ||
83 | word = SH4_PCICR_PREFIX; | ||
84 | pci_write_reg(word, SH4_PCICR); | ||
85 | } | ||
86 | |||
87 | /* set the command/status bits to: | ||
88 | * Wait Cycle Control + Parity Enable + Bus Master + | ||
89 | * Mem space enable | ||
90 | */ | ||
91 | pci_write_reg(0x00000046, SH7780_PCICMD); | ||
92 | |||
93 | /* define this host as the host bridge */ | ||
94 | word = PCI_BASE_CLASS_BRIDGE << 24; | ||
95 | pci_write_reg(word, SH7780_PCIRID); | ||
96 | |||
97 | /* Set IO and Mem windows to local address | ||
98 | * Make PCI and local address the same for easy 1 to 1 mapping | ||
99 | * Window0 = map->window0.size @ non-cached area base = SDRAM | ||
100 | * Window1 = map->window1.size @ cached area base = SDRAM | ||
101 | */ | ||
102 | word = ((map->window0.size - 1) & 0x1ff00001) | 0x01; | ||
103 | pci_write_reg(0x07f00001, SH4_PCILSR0); | ||
104 | word = ((map->window1.size - 1) & 0x1ff00001) | 0x01; | ||
105 | pci_write_reg(0x00000001, SH4_PCILSR1); | ||
106 | /* Set the values on window 0 PCI config registers */ | ||
107 | word = P2SEGADDR(map->window0.base); | ||
108 | pci_write_reg(0xa8000000, SH4_PCILAR0); | ||
109 | pci_write_reg(0x08000000, SH7780_PCIMBAR0); | ||
110 | /* Set the values on window 1 PCI config registers */ | ||
111 | word = P2SEGADDR(map->window1.base); | ||
112 | pci_write_reg(0x00000000, SH4_PCILAR1); | ||
113 | pci_write_reg(0x00000000, SH7780_PCIMBAR1); | ||
114 | |||
115 | /* Map IO space into PCI IO window | ||
116 | * The IO window is 64K-PCIBIOS_MIN_IO in size | ||
117 | * IO addresses will be translated to the | ||
118 | * PCI IO window base address | ||
119 | */ | ||
120 | pr_debug("PCI: Mapping IO address 0x%x - 0x%x to base 0x%x\n", | ||
121 | PCIBIOS_MIN_IO, (64 << 10), | ||
122 | SH7780_PCI_IO_BASE + PCIBIOS_MIN_IO); | ||
123 | |||
124 | /* NOTE: I'm ignoring the PCI error IRQs for now.. | ||
125 | * TODO: add support for the internal error interrupts and | ||
126 | * DMA interrupts... | ||
127 | */ | ||
128 | |||
129 | #ifdef CONFIG_SH_R7780RP | ||
130 | pci_fixup_pcic(); | ||
131 | #endif | ||
132 | |||
133 | /* SH7780 init done, set central function init complete */ | ||
134 | /* use round robin mode to stop a device starving/overruning */ | ||
135 | word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO; | ||
136 | pci_write_reg(word, SH4_PCICR); | ||
137 | |||
138 | return 1; | ||
139 | } | ||
diff --git a/arch/sh/drivers/pci/pci-sh7780.h b/arch/sh/drivers/pci/pci-sh7780.h new file mode 100644 index 000000000000..f02d2180a4bc --- /dev/null +++ b/arch/sh/drivers/pci/pci-sh7780.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * Low-Level PCI Support for SH7780 targets | ||
3 | * | ||
4 | * Dustin McIntire (dustin@sensoria.com) (c) 2001 | ||
5 | * Paul Mundt (lethal@linux-sh.org) (c) 2003 | ||
6 | * | ||
7 | * May be copied or modified under the terms of the GNU General Public | ||
8 | * License. See linux/COPYING for more information. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #ifndef _PCI_SH7780_H_ | ||
13 | #define _PCI_SH7780_H_ | ||
14 | |||
15 | /* Platform Specific Values */ | ||
16 | #define SH7780_VENDOR_ID 0x1912 | ||
17 | #define SH7780_DEVICE_ID 0x0002 | ||
18 | #define SH7781_DEVICE_ID 0x0001 | ||
19 | |||
20 | /* SH7780 Control Registers */ | ||
21 | #define SH7780_PCI_VCR0 0xFE000000 | ||
22 | #define SH7780_PCI_VCR1 0xFE000004 | ||
23 | #define SH7780_PCI_VCR2 0xFE000008 | ||
24 | |||
25 | /* SH7780 Specific Values */ | ||
26 | #define SH7780_PCI_CONFIG_BASE 0xFD000000 /* Config space base addr */ | ||
27 | #define SH7780_PCI_CONFIG_SIZE 0x01000000 /* Config space size */ | ||
28 | |||
29 | #define SH7780_PCI_MEMORY_BASE 0xFD000000 /* Memory space base addr */ | ||
30 | #define SH7780_PCI_MEM_SIZE 0x01000000 /* Size of Memory window */ | ||
31 | |||
32 | #define SH7780_PCI_IO_BASE 0xFE400000 /* IO space base address */ | ||
33 | #define SH7780_PCI_IO_SIZE 0x00400000 /* Size of IO window */ | ||
34 | |||
35 | #define SH7780_PCIREG_BASE 0xFE040000 /* PCI regs base address */ | ||
36 | #define PCI_REG(n) (SH7780_PCIREG_BASE+n) | ||
37 | |||
38 | /* SH7780 PCI Config Registers */ | ||
39 | #define SH7780_PCIVID 0x000 /* Vendor ID */ | ||
40 | #define SH7780_PCIDID 0x002 /* Device ID */ | ||
41 | #define SH7780_PCICMD 0x004 /* Command */ | ||
42 | #define SH7780_PCISTATUS 0x006 /* Status */ | ||
43 | #define SH7780_PCIRID 0x008 /* Revision ID */ | ||
44 | #define SH7780_PCIPIF 0x009 /* Program Interface */ | ||
45 | #define SH7780_PCISUB 0x00a /* Sub class code */ | ||
46 | #define SH7780_PCIBCC 0x00b /* Base class code */ | ||
47 | #define SH7780_PCICLS 0x00c /* Cache line size */ | ||
48 | #define SH7780_PCILTM 0x00d /* latency timer */ | ||
49 | #define SH7780_PCIHDR 0x00e /* Header type */ | ||
50 | #define SH7780_PCIBIST 0x00f /* BIST */ | ||
51 | #define SH7780_PCIIBAR 0x010 /* IO Base address */ | ||
52 | #define SH7780_PCIMBAR0 0x014 /* Memory base address0 */ | ||
53 | #define SH7780_PCIMBAR1 0x018 /* Memory base address1 */ | ||
54 | #define SH7780_PCISVID 0x02c /* Sub system vendor ID */ | ||
55 | #define SH7780_PCISID 0x02e /* Sub system ID */ | ||
56 | #define SH7780_PCICP 0x034 | ||
57 | #define SH7780_PCIINTLINE 0x03c /* Interrupt line */ | ||
58 | #define SH7780_PCIINTPIN 0x03d /* Interrupt pin */ | ||
59 | #define SH7780_PCIMINGNT 0x03e /* Minumum grand */ | ||
60 | #define SH7780_PCIMAXLAT 0x03f /* Maxmum latency */ | ||
61 | #define SH7780_PCICID 0x040 | ||
62 | #define SH7780_PCINIP 0x041 | ||
63 | #define SH7780_PCIPMC 0x042 | ||
64 | #define SH7780_PCIPMCSR 0x044 | ||
65 | #define SH7780_PCIPMCSR_BSE 0x046 | ||
66 | #define SH7780_PCICDD 0x047 | ||
67 | |||
68 | #define SH7780_PCIMBR0 0x1E0 | ||
69 | #define SH7780_PCIMBMR0 0x1E4 | ||
70 | #define SH7780_PCIMBR2 0x1F0 | ||
71 | #define SH7780_PCIMBMR2 0x1F4 | ||
72 | #define SH7780_PCIIOBR 0x1F8 | ||
73 | #define SH7780_PCIIOBMR 0x1FC | ||
74 | #define SH7780_PCICSCR0 0x210 /* Cache Snoop1 Cnt. Register */ | ||
75 | #define SH7780_PCICSCR1 0x214 /* Cache Snoop2 Cnt. Register */ | ||
76 | #define SH7780_PCICSAR0 0x218 /* Cache Snoop1 Addr. Register */ | ||
77 | #define SH7780_PCICSAR1 0x21C /* Cache Snoop2 Addr. Register */ | ||
78 | |||
79 | /* General Memory Config Addresses */ | ||
80 | #define SH7780_CS0_BASE_ADDR 0x0 | ||
81 | #define SH7780_MEM_REGION_SIZE 0x04000000 | ||
82 | #define SH7780_CS1_BASE_ADDR (SH7780_CS0_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
83 | #define SH7780_CS2_BASE_ADDR (SH7780_CS1_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
84 | #define SH7780_CS3_BASE_ADDR (SH7780_CS2_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
85 | #define SH7780_CS4_BASE_ADDR (SH7780_CS3_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
86 | #define SH7780_CS5_BASE_ADDR (SH7780_CS4_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
87 | #define SH7780_CS6_BASE_ADDR (SH7780_CS5_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
88 | |||
89 | struct sh4_pci_address_map; | ||
90 | |||
91 | /* arch/sh/drivers/pci/pci-sh7780.c */ | ||
92 | int sh7780_pcic_init(struct sh4_pci_address_map *map); | ||
93 | |||
94 | #endif /* _PCI_SH7780_H_ */ | ||
diff --git a/arch/sh/drivers/pci/pci-st40.c b/arch/sh/drivers/pci/pci-st40.c index 7c81b8b65bb5..4ab5ea6b35fb 100644 --- a/arch/sh/drivers/pci/pci-st40.c +++ b/arch/sh/drivers/pci/pci-st40.c | |||
@@ -70,12 +70,6 @@ | |||
70 | static void pci_set_rbar_region(unsigned int region, unsigned long localAddr, | 70 | static void pci_set_rbar_region(unsigned int region, unsigned long localAddr, |
71 | unsigned long pciOffset, unsigned long regionSize); | 71 | unsigned long pciOffset, unsigned long regionSize); |
72 | 72 | ||
73 | /* | ||
74 | * The pcibios_map_platform_irq function is defined in the appropriate | ||
75 | * board specific code and referenced here | ||
76 | */ | ||
77 | extern int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin); | ||
78 | |||
79 | static __init void SetPCIPLL(void) | 73 | static __init void SetPCIPLL(void) |
80 | { | 74 | { |
81 | { | 75 | { |
@@ -422,13 +416,6 @@ struct pci_ops st40pci_config_ops = { | |||
422 | /* Everything hangs off this */ | 416 | /* Everything hangs off this */ |
423 | static struct pci_bus *pci_root_bus; | 417 | static struct pci_bus *pci_root_bus; |
424 | 418 | ||
425 | |||
426 | static u8 __init no_swizzle(struct pci_dev *dev, u8 * pin) | ||
427 | { | ||
428 | return PCI_SLOT(dev->devfn); | ||
429 | } | ||
430 | |||
431 | |||
432 | static int __init pcibios_init(void) | 419 | static int __init pcibios_init(void) |
433 | { | 420 | { |
434 | extern unsigned long memory_start, memory_end; | 421 | extern unsigned long memory_start, memory_end; |
@@ -465,17 +452,11 @@ static int __init pcibios_init(void) | |||
465 | /* ok, do the scan man */ | 452 | /* ok, do the scan man */ |
466 | pci_root_bus = pci_scan_bus(0, &st40pci_config_ops, NULL); | 453 | pci_root_bus = pci_scan_bus(0, &st40pci_config_ops, NULL); |
467 | pci_assign_unassigned_resources(); | 454 | pci_assign_unassigned_resources(); |
468 | pci_fixup_irqs(no_swizzle, pcibios_map_platform_irq); | ||
469 | 455 | ||
470 | return 0; | 456 | return 0; |
471 | } | 457 | } |
472 | |||
473 | subsys_initcall(pcibios_init); | 458 | subsys_initcall(pcibios_init); |
474 | 459 | ||
475 | void __init pcibios_fixup_bus(struct pci_bus *bus) | ||
476 | { | ||
477 | } | ||
478 | |||
479 | /* | 460 | /* |
480 | * Publish a region of local address space over the PCI bus | 461 | * Publish a region of local address space over the PCI bus |
481 | * to other devices. | 462 | * to other devices. |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 3d546ba329cf..d439336d2e18 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -1,21 +1,45 @@ | |||
1 | /* arch/sh/kernel/pci.c | 1 | /* |
2 | * $Id: pci.c,v 1.1 2003/08/24 19:15:45 lethal Exp $ | 2 | * arch/sh/drivers/pci/pci.c |
3 | * | 3 | * |
4 | * Copyright (c) 2002 M. R. Brown <mrbrown@linux-sh.org> | 4 | * Copyright (c) 2002 M. R. Brown <mrbrown@linux-sh.org> |
5 | * | 5 | * Copyright (c) 2004 - 2006 Paul Mundt <lethal@linux-sh.org> |
6 | * | 6 | * |
7 | * These functions are collected here to reduce duplication of common | 7 | * These functions are collected here to reduce duplication of common |
8 | * code amongst the many platform-specific PCI support code files. | 8 | * code amongst the many platform-specific PCI support code files. |
9 | * | 9 | * |
10 | * These routines require the following board-specific routines: | 10 | * These routines require the following board-specific routines: |
11 | * void pcibios_fixup_irqs(); | 11 | * void pcibios_fixup_irqs(); |
12 | * | 12 | * |
13 | * See include/asm-sh/pci.h for more information. | 13 | * See include/asm-sh/pci.h for more information. |
14 | * | ||
15 | * This file is subject to the terms and conditions of the GNU General Public | ||
16 | * License. See the file "COPYING" in the main directory of this archive | ||
17 | * for more details. | ||
14 | */ | 18 | */ |
15 | |||
16 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
17 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
18 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <asm/io.h> | ||
23 | |||
24 | static inline u8 bridge_swizzle(u8 pin, u8 slot) | ||
25 | { | ||
26 | return (((pin - 1) + slot) % 4) + 1; | ||
27 | } | ||
28 | |||
29 | static u8 __init simple_swizzle(struct pci_dev *dev, u8 *pinp) | ||
30 | { | ||
31 | u8 pin = *pinp; | ||
32 | |||
33 | while (dev->bus->parent) { | ||
34 | pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); | ||
35 | /* Move up the chain of bridges. */ | ||
36 | dev = dev->bus->self; | ||
37 | } | ||
38 | *pinp = pin; | ||
39 | |||
40 | /* The slot is the slot of the last bridge. */ | ||
41 | return PCI_SLOT(dev->devfn); | ||
42 | } | ||
19 | 43 | ||
20 | static int __init pcibios_init(void) | 44 | static int __init pcibios_init(void) |
21 | { | 45 | { |
@@ -26,26 +50,32 @@ static int __init pcibios_init(void) | |||
26 | #ifdef CONFIG_PCI_AUTO | 50 | #ifdef CONFIG_PCI_AUTO |
27 | /* assign resources */ | 51 | /* assign resources */ |
28 | busno = 0; | 52 | busno = 0; |
29 | for (p = board_pci_channels; p->pci_ops != NULL; p++) { | 53 | for (p = board_pci_channels; p->pci_ops != NULL; p++) |
30 | busno = pciauto_assign_resources(busno, p) + 1; | 54 | busno = pciauto_assign_resources(busno, p) + 1; |
31 | } | ||
32 | #endif | 55 | #endif |
33 | 56 | ||
34 | /* scan the buses */ | 57 | /* scan the buses */ |
35 | busno = 0; | 58 | busno = 0; |
36 | for (p= board_pci_channels; p->pci_ops != NULL; p++) { | 59 | for (p = board_pci_channels; p->pci_ops != NULL; p++) { |
37 | bus = pci_scan_bus(busno, p->pci_ops, p); | 60 | bus = pci_scan_bus(busno, p->pci_ops, p); |
38 | busno = bus->subordinate+1; | 61 | busno = bus->subordinate + 1; |
39 | } | 62 | } |
40 | 63 | ||
41 | /* board-specific fixups */ | 64 | pci_fixup_irqs(simple_swizzle, pcibios_map_platform_irq); |
42 | pcibios_fixup_irqs(); | ||
43 | 65 | ||
44 | return 0; | 66 | return 0; |
45 | } | 67 | } |
46 | |||
47 | subsys_initcall(pcibios_init); | 68 | subsys_initcall(pcibios_init); |
48 | 69 | ||
70 | /* | ||
71 | * Called after each bus is probed, but before its children | ||
72 | * are examined. | ||
73 | */ | ||
74 | void __init pcibios_fixup_bus(struct pci_bus *bus) | ||
75 | { | ||
76 | pci_read_bridge_bases(bus); | ||
77 | } | ||
78 | |||
49 | void | 79 | void |
50 | pcibios_update_resource(struct pci_dev *dev, struct resource *root, | 80 | pcibios_update_resource(struct pci_dev *dev, struct resource *root, |
51 | struct resource *res, int resource) | 81 | struct resource *res, int resource) |
@@ -61,13 +91,17 @@ pcibios_update_resource(struct pci_dev *dev, struct resource *root, | |||
61 | new |= PCI_ROM_ADDRESS_ENABLE; | 91 | new |= PCI_ROM_ADDRESS_ENABLE; |
62 | reg = dev->rom_base_reg; | 92 | reg = dev->rom_base_reg; |
63 | } else { | 93 | } else { |
64 | /* Somebody might have asked allocation of a non-standard resource */ | 94 | /* |
95 | * Somebody might have asked allocation of a non-standard | ||
96 | * resource | ||
97 | */ | ||
65 | return; | 98 | return; |
66 | } | 99 | } |
67 | 100 | ||
68 | pci_write_config_dword(dev, reg, new); | 101 | pci_write_config_dword(dev, reg, new); |
69 | pci_read_config_dword(dev, reg, &check); | 102 | pci_read_config_dword(dev, reg, &check); |
70 | if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) { | 103 | if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? |
104 | PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) { | ||
71 | printk(KERN_ERR "PCI: Error while updating region " | 105 | printk(KERN_ERR "PCI: Error while updating region " |
72 | "%s/%d (%08x != %08x)\n", pci_name(dev), resource, | 106 | "%s/%d (%08x != %08x)\n", pci_name(dev), resource, |
73 | new, check); | 107 | new, check); |
@@ -145,7 +179,8 @@ void pcibios_set_master(struct pci_dev *dev) | |||
145 | lat = pcibios_max_latency; | 179 | lat = pcibios_max_latency; |
146 | else | 180 | else |
147 | return; | 181 | return; |
148 | printk(KERN_INFO "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat); | 182 | printk(KERN_INFO "PCI: Setting latency timer of device %s to %d\n", |
183 | pci_name(dev), lat); | ||
149 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); | 184 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); |
150 | } | 185 | } |
151 | 186 | ||
@@ -153,3 +188,39 @@ void __init pcibios_update_irq(struct pci_dev *dev, int irq) | |||
153 | { | 188 | { |
154 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | 189 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); |
155 | } | 190 | } |
191 | |||
192 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | ||
193 | { | ||
194 | unsigned long start = pci_resource_start(dev, bar); | ||
195 | unsigned long len = pci_resource_len(dev, bar); | ||
196 | unsigned long flags = pci_resource_flags(dev, bar); | ||
197 | |||
198 | if (unlikely(!len || !start)) | ||
199 | return NULL; | ||
200 | if (maxlen && len > maxlen) | ||
201 | len = maxlen; | ||
202 | |||
203 | /* | ||
204 | * Presently the IORESOURCE_MEM case is a bit special, most | ||
205 | * SH7751 style PCI controllers have PCI memory at a fixed | ||
206 | * location in the address space where no remapping is desired | ||
207 | * (typically at 0xfd000000, but is_pci_memaddr() will know | ||
208 | * best). With the IORESOURCE_MEM case more care has to be taken | ||
209 | * to inhibit page table mapping for legacy cores, but this is | ||
210 | * punted off to __ioremap(). | ||
211 | * -- PFM. | ||
212 | */ | ||
213 | if (flags & IORESOURCE_IO) | ||
214 | return ioport_map(start, len); | ||
215 | if (flags & IORESOURCE_MEM) | ||
216 | return ioremap(start, len); | ||
217 | |||
218 | return NULL; | ||
219 | } | ||
220 | EXPORT_SYMBOL(pci_iomap); | ||
221 | |||
222 | void pci_iounmap(struct pci_dev *dev, void __iomem *addr) | ||
223 | { | ||
224 | iounmap(addr); | ||
225 | } | ||
226 | EXPORT_SYMBOL(pci_iounmap); | ||
diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile index f05cd96f8867..5da88a43d350 100644 --- a/arch/sh/kernel/Makefile +++ b/arch/sh/kernel/Makefile | |||
@@ -6,9 +6,10 @@ extra-y := head.o init_task.o vmlinux.lds | |||
6 | 6 | ||
7 | obj-y := process.o signal.o entry.o traps.o irq.o \ | 7 | obj-y := process.o signal.o entry.o traps.o irq.o \ |
8 | ptrace.o setup.o time.o sys_sh.o semaphore.o \ | 8 | ptrace.o setup.o time.o sys_sh.o semaphore.o \ |
9 | io.o io_generic.o sh_ksyms.o | 9 | io.o io_generic.o sh_ksyms.o syscalls.o |
10 | 10 | ||
11 | obj-y += cpu/ timers/ | 11 | obj-y += cpu/ timers/ |
12 | obj-$(CONFIG_VSYSCALL) += vsyscall/ | ||
12 | 13 | ||
13 | obj-$(CONFIG_SMP) += smp.o | 14 | obj-$(CONFIG_SMP) += smp.o |
14 | obj-$(CONFIG_CF_ENABLER) += cf-enabler.o | 15 | obj-$(CONFIG_CF_ENABLER) += cf-enabler.o |
@@ -18,3 +19,5 @@ obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o | |||
18 | obj-$(CONFIG_MODULES) += module.o | 19 | obj-$(CONFIG_MODULES) += module.o |
19 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 20 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
20 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o | 21 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o |
22 | obj-$(CONFIG_APM) += apm.o | ||
23 | obj-$(CONFIG_PM) += pm.o | ||
diff --git a/arch/sh/kernel/apm.c b/arch/sh/kernel/apm.c new file mode 100644 index 000000000000..871e7d640002 --- /dev/null +++ b/arch/sh/kernel/apm.c | |||
@@ -0,0 +1,539 @@ | |||
1 | /* | ||
2 | * bios-less APM driver for hp680 | ||
3 | * | ||
4 | * Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com> | ||
5 | * | ||
6 | * based on ARM APM driver by | ||
7 | * Jamey Hicks <jamey@crl.dec.com> | ||
8 | * | ||
9 | * adapted from the APM BIOS driver for Linux by | ||
10 | * Stephen Rothwell (sfr@linuxcare.com) | ||
11 | * | ||
12 | * APM 1.2 Reference: | ||
13 | * Intel Corporation, Microsoft Corporation. Advanced Power Management | ||
14 | * (APM) BIOS Interface Specification, Revision 1.2, February 1996. | ||
15 | * | ||
16 | * [This document is available from Microsoft at: | ||
17 | * http://www.microsoft.com/hwdev/busbios/amp_12.htm] | ||
18 | */ | ||
19 | #include <linux/config.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/poll.h> | ||
22 | #include <linux/timer.h> | ||
23 | #include <linux/slab.h> | ||
24 | #include <linux/proc_fs.h> | ||
25 | #include <linux/miscdevice.h> | ||
26 | #include <linux/apm_bios.h> | ||
27 | #include <linux/pm.h> | ||
28 | #include <linux/pm_legacy.h> | ||
29 | #include <asm/apm.h> | ||
30 | |||
31 | #define MODNAME "apm" | ||
32 | |||
33 | /* | ||
34 | * The apm_bios device is one of the misc char devices. | ||
35 | * This is its minor number. | ||
36 | */ | ||
37 | #define APM_MINOR_DEV 134 | ||
38 | |||
39 | /* | ||
40 | * Maximum number of events stored | ||
41 | */ | ||
42 | #define APM_MAX_EVENTS 16 | ||
43 | |||
44 | struct apm_queue { | ||
45 | unsigned int event_head; | ||
46 | unsigned int event_tail; | ||
47 | apm_event_t events[APM_MAX_EVENTS]; | ||
48 | }; | ||
49 | |||
50 | /* | ||
51 | * The per-file APM data | ||
52 | */ | ||
53 | struct apm_user { | ||
54 | struct list_head list; | ||
55 | |||
56 | unsigned int suser: 1; | ||
57 | unsigned int writer: 1; | ||
58 | unsigned int reader: 1; | ||
59 | |||
60 | int suspend_result; | ||
61 | unsigned int suspend_state; | ||
62 | #define SUSPEND_NONE 0 /* no suspend pending */ | ||
63 | #define SUSPEND_PENDING 1 /* suspend pending read */ | ||
64 | #define SUSPEND_READ 2 /* suspend read, pending ack */ | ||
65 | #define SUSPEND_ACKED 3 /* suspend acked */ | ||
66 | #define SUSPEND_DONE 4 /* suspend completed */ | ||
67 | |||
68 | struct apm_queue queue; | ||
69 | }; | ||
70 | |||
71 | /* | ||
72 | * Local variables | ||
73 | */ | ||
74 | static int suspends_pending; | ||
75 | |||
76 | static DECLARE_WAIT_QUEUE_HEAD(apm_waitqueue); | ||
77 | static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue); | ||
78 | |||
79 | /* | ||
80 | * This is a list of everyone who has opened /dev/apm_bios | ||
81 | */ | ||
82 | static DECLARE_RWSEM(user_list_lock); | ||
83 | static LIST_HEAD(apm_user_list); | ||
84 | |||
85 | /* | ||
86 | * kapmd info. kapmd provides us a process context to handle | ||
87 | * "APM" events within - specifically necessary if we're going | ||
88 | * to be suspending the system. | ||
89 | */ | ||
90 | static DECLARE_WAIT_QUEUE_HEAD(kapmd_wait); | ||
91 | static DECLARE_COMPLETION(kapmd_exit); | ||
92 | static DEFINE_SPINLOCK(kapmd_queue_lock); | ||
93 | static struct apm_queue kapmd_queue; | ||
94 | |||
95 | int apm_suspended; | ||
96 | EXPORT_SYMBOL(apm_suspended); | ||
97 | |||
98 | /* Platform-specific apm_read_proc(). */ | ||
99 | int (*apm_get_info)(char *buf, char **start, off_t fpos, int length); | ||
100 | EXPORT_SYMBOL(apm_get_info); | ||
101 | |||
102 | /* | ||
103 | * APM event queue management. | ||
104 | */ | ||
105 | static inline int queue_empty(struct apm_queue *q) | ||
106 | { | ||
107 | return q->event_head == q->event_tail; | ||
108 | } | ||
109 | |||
110 | static inline apm_event_t queue_get_event(struct apm_queue *q) | ||
111 | { | ||
112 | q->event_tail = (q->event_tail + 1) % APM_MAX_EVENTS; | ||
113 | return q->events[q->event_tail]; | ||
114 | } | ||
115 | |||
116 | static void queue_add_event(struct apm_queue *q, apm_event_t event) | ||
117 | { | ||
118 | q->event_head = (q->event_head + 1) % APM_MAX_EVENTS; | ||
119 | if (q->event_head == q->event_tail) { | ||
120 | static int notified; | ||
121 | |||
122 | if (notified++ == 0) | ||
123 | printk(KERN_ERR "apm: an event queue overflowed\n"); | ||
124 | |||
125 | q->event_tail = (q->event_tail + 1) % APM_MAX_EVENTS; | ||
126 | } | ||
127 | q->events[q->event_head] = event; | ||
128 | } | ||
129 | |||
130 | static void queue_event_one_user(struct apm_user *as, apm_event_t event) | ||
131 | { | ||
132 | if (as->suser && as->writer) { | ||
133 | switch (event) { | ||
134 | case APM_SYS_SUSPEND: | ||
135 | case APM_USER_SUSPEND: | ||
136 | /* | ||
137 | * If this user already has a suspend pending, | ||
138 | * don't queue another one. | ||
139 | */ | ||
140 | if (as->suspend_state != SUSPEND_NONE) | ||
141 | return; | ||
142 | |||
143 | as->suspend_state = SUSPEND_PENDING; | ||
144 | suspends_pending++; | ||
145 | break; | ||
146 | } | ||
147 | } | ||
148 | queue_add_event(&as->queue, event); | ||
149 | } | ||
150 | |||
151 | static void queue_event(apm_event_t event, struct apm_user *sender) | ||
152 | { | ||
153 | struct apm_user *as; | ||
154 | |||
155 | down_read(&user_list_lock); | ||
156 | |||
157 | list_for_each_entry(as, &apm_user_list, list) | ||
158 | if (as != sender && as->reader) | ||
159 | queue_event_one_user(as, event); | ||
160 | |||
161 | up_read(&user_list_lock); | ||
162 | wake_up_interruptible(&apm_waitqueue); | ||
163 | } | ||
164 | |||
165 | /** | ||
166 | * apm_queue_event - queue an APM event for kapmd | ||
167 | * @event: APM event | ||
168 | * | ||
169 | * Queue an APM event for kapmd to process and ultimately take the | ||
170 | * appropriate action. Only a subset of events are handled: | ||
171 | * %APM_LOW_BATTERY | ||
172 | * %APM_POWER_STATUS_CHANGE | ||
173 | * %APM_USER_SUSPEND | ||
174 | * %APM_SYS_SUSPEND | ||
175 | * %APM_CRITICAL_SUSPEND | ||
176 | */ | ||
177 | void apm_queue_event(apm_event_t event) | ||
178 | { | ||
179 | spin_lock_irq(&kapmd_queue_lock); | ||
180 | queue_add_event(&kapmd_queue, event); | ||
181 | spin_unlock_irq(&kapmd_queue_lock); | ||
182 | |||
183 | wake_up_interruptible(&kapmd_wait); | ||
184 | } | ||
185 | EXPORT_SYMBOL(apm_queue_event); | ||
186 | |||
187 | static void apm_suspend(void) | ||
188 | { | ||
189 | struct apm_user *as; | ||
190 | int err; | ||
191 | |||
192 | apm_suspended = 1; | ||
193 | err = pm_suspend(PM_SUSPEND_MEM); | ||
194 | |||
195 | /* | ||
196 | * Anyone on the APM queues will think we're still suspended. | ||
197 | * Send a message so everyone knows we're now awake again. | ||
198 | */ | ||
199 | queue_event(APM_NORMAL_RESUME, NULL); | ||
200 | |||
201 | /* | ||
202 | * Finally, wake up anyone who is sleeping on the suspend. | ||
203 | */ | ||
204 | down_read(&user_list_lock); | ||
205 | list_for_each_entry(as, &apm_user_list, list) { | ||
206 | as->suspend_result = err; | ||
207 | as->suspend_state = SUSPEND_DONE; | ||
208 | } | ||
209 | up_read(&user_list_lock); | ||
210 | |||
211 | wake_up(&apm_suspend_waitqueue); | ||
212 | apm_suspended = 0; | ||
213 | } | ||
214 | |||
215 | static ssize_t apm_read(struct file *fp, char __user *buf, | ||
216 | size_t count, loff_t *ppos) | ||
217 | { | ||
218 | struct apm_user *as = fp->private_data; | ||
219 | apm_event_t event; | ||
220 | int i = count, ret = 0; | ||
221 | |||
222 | if (count < sizeof(apm_event_t)) | ||
223 | return -EINVAL; | ||
224 | |||
225 | if (queue_empty(&as->queue) && fp->f_flags & O_NONBLOCK) | ||
226 | return -EAGAIN; | ||
227 | |||
228 | wait_event_interruptible(apm_waitqueue, !queue_empty(&as->queue)); | ||
229 | |||
230 | while ((i >= sizeof(event)) && !queue_empty(&as->queue)) { | ||
231 | event = queue_get_event(&as->queue); | ||
232 | |||
233 | ret = -EFAULT; | ||
234 | if (copy_to_user(buf, &event, sizeof(event))) | ||
235 | break; | ||
236 | |||
237 | if (event == APM_SYS_SUSPEND || event == APM_USER_SUSPEND) | ||
238 | as->suspend_state = SUSPEND_READ; | ||
239 | |||
240 | buf += sizeof(event); | ||
241 | i -= sizeof(event); | ||
242 | } | ||
243 | |||
244 | if (i < count) | ||
245 | ret = count - i; | ||
246 | |||
247 | return ret; | ||
248 | } | ||
249 | |||
250 | static unsigned int apm_poll(struct file *fp, poll_table * wait) | ||
251 | { | ||
252 | struct apm_user *as = fp->private_data; | ||
253 | |||
254 | poll_wait(fp, &apm_waitqueue, wait); | ||
255 | return queue_empty(&as->queue) ? 0 : POLLIN | POLLRDNORM; | ||
256 | } | ||
257 | |||
258 | /* | ||
259 | * apm_ioctl - handle APM ioctl | ||
260 | * | ||
261 | * APM_IOC_SUSPEND | ||
262 | * This IOCTL is overloaded, and performs two functions. It is used to: | ||
263 | * - initiate a suspend | ||
264 | * - acknowledge a suspend read from /dev/apm_bios. | ||
265 | * Only when everyone who has opened /dev/apm_bios with write permission | ||
266 | * has acknowledge does the actual suspend happen. | ||
267 | */ | ||
268 | static int | ||
269 | apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg) | ||
270 | { | ||
271 | struct apm_user *as = filp->private_data; | ||
272 | unsigned long flags; | ||
273 | int err = -EINVAL; | ||
274 | |||
275 | if (!as->suser || !as->writer) | ||
276 | return -EPERM; | ||
277 | |||
278 | switch (cmd) { | ||
279 | case APM_IOC_SUSPEND: | ||
280 | as->suspend_result = -EINTR; | ||
281 | |||
282 | if (as->suspend_state == SUSPEND_READ) { | ||
283 | /* | ||
284 | * If we read a suspend command from /dev/apm_bios, | ||
285 | * then the corresponding APM_IOC_SUSPEND ioctl is | ||
286 | * interpreted as an acknowledge. | ||
287 | */ | ||
288 | as->suspend_state = SUSPEND_ACKED; | ||
289 | suspends_pending--; | ||
290 | } else { | ||
291 | /* | ||
292 | * Otherwise it is a request to suspend the system. | ||
293 | * Queue an event for all readers, and expect an | ||
294 | * acknowledge from all writers who haven't already | ||
295 | * acknowledged. | ||
296 | */ | ||
297 | queue_event(APM_USER_SUSPEND, as); | ||
298 | } | ||
299 | |||
300 | /* | ||
301 | * If there are no further acknowledges required, suspend | ||
302 | * the system. | ||
303 | */ | ||
304 | if (suspends_pending == 0) | ||
305 | apm_suspend(); | ||
306 | |||
307 | /* | ||
308 | * Wait for the suspend/resume to complete. If there are | ||
309 | * pending acknowledges, we wait here for them. | ||
310 | * | ||
311 | * Note that we need to ensure that the PM subsystem does | ||
312 | * not kick us out of the wait when it suspends the threads. | ||
313 | */ | ||
314 | flags = current->flags; | ||
315 | current->flags |= PF_NOFREEZE; | ||
316 | |||
317 | /* | ||
318 | * Note: do not allow a thread which is acking the suspend | ||
319 | * to escape until the resume is complete. | ||
320 | */ | ||
321 | if (as->suspend_state == SUSPEND_ACKED) | ||
322 | wait_event(apm_suspend_waitqueue, | ||
323 | as->suspend_state == SUSPEND_DONE); | ||
324 | else | ||
325 | wait_event_interruptible(apm_suspend_waitqueue, | ||
326 | as->suspend_state == SUSPEND_DONE); | ||
327 | |||
328 | current->flags = flags; | ||
329 | err = as->suspend_result; | ||
330 | as->suspend_state = SUSPEND_NONE; | ||
331 | break; | ||
332 | } | ||
333 | |||
334 | return err; | ||
335 | } | ||
336 | |||
337 | static int apm_release(struct inode * inode, struct file * filp) | ||
338 | { | ||
339 | struct apm_user *as = filp->private_data; | ||
340 | filp->private_data = NULL; | ||
341 | |||
342 | down_write(&user_list_lock); | ||
343 | list_del(&as->list); | ||
344 | up_write(&user_list_lock); | ||
345 | |||
346 | /* | ||
347 | * We are now unhooked from the chain. As far as new | ||
348 | * events are concerned, we no longer exist. However, we | ||
349 | * need to balance suspends_pending, which means the | ||
350 | * possibility of sleeping. | ||
351 | */ | ||
352 | if (as->suspend_state != SUSPEND_NONE) { | ||
353 | suspends_pending -= 1; | ||
354 | if (suspends_pending == 0) | ||
355 | apm_suspend(); | ||
356 | } | ||
357 | |||
358 | kfree(as); | ||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | static int apm_open(struct inode * inode, struct file * filp) | ||
363 | { | ||
364 | struct apm_user *as; | ||
365 | |||
366 | as = kzalloc(sizeof(*as), GFP_KERNEL); | ||
367 | if (as) { | ||
368 | /* | ||
369 | * XXX - this is a tiny bit broken, when we consider BSD | ||
370 | * process accounting. If the device is opened by root, we | ||
371 | * instantly flag that we used superuser privs. Who knows, | ||
372 | * we might close the device immediately without doing a | ||
373 | * privileged operation -- cevans | ||
374 | */ | ||
375 | as->suser = capable(CAP_SYS_ADMIN); | ||
376 | as->writer = (filp->f_mode & FMODE_WRITE) == FMODE_WRITE; | ||
377 | as->reader = (filp->f_mode & FMODE_READ) == FMODE_READ; | ||
378 | |||
379 | down_write(&user_list_lock); | ||
380 | list_add(&as->list, &apm_user_list); | ||
381 | up_write(&user_list_lock); | ||
382 | |||
383 | filp->private_data = as; | ||
384 | } | ||
385 | |||
386 | return as ? 0 : -ENOMEM; | ||
387 | } | ||
388 | |||
389 | static struct file_operations apm_bios_fops = { | ||
390 | .owner = THIS_MODULE, | ||
391 | .read = apm_read, | ||
392 | .poll = apm_poll, | ||
393 | .ioctl = apm_ioctl, | ||
394 | .open = apm_open, | ||
395 | .release = apm_release, | ||
396 | }; | ||
397 | |||
398 | static struct miscdevice apm_device = { | ||
399 | .minor = APM_MINOR_DEV, | ||
400 | .name = "apm_bios", | ||
401 | .fops = &apm_bios_fops | ||
402 | }; | ||
403 | |||
404 | |||
405 | #ifdef CONFIG_PROC_FS | ||
406 | /* | ||
407 | * Arguments, with symbols from linux/apm_bios.h. | ||
408 | * | ||
409 | * 0) Linux driver version (this will change if format changes) | ||
410 | * 1) APM BIOS Version. Usually 1.0, 1.1 or 1.2. | ||
411 | * 2) APM flags from APM Installation Check (0x00): | ||
412 | * bit 0: APM_16_BIT_SUPPORT | ||
413 | * bit 1: APM_32_BIT_SUPPORT | ||
414 | * bit 2: APM_IDLE_SLOWS_CLOCK | ||
415 | * bit 3: APM_BIOS_DISABLED | ||
416 | * bit 4: APM_BIOS_DISENGAGED | ||
417 | * 3) AC line status | ||
418 | * 0x00: Off-line | ||
419 | * 0x01: On-line | ||
420 | * 0x02: On backup power (BIOS >= 1.1 only) | ||
421 | * 0xff: Unknown | ||
422 | * 4) Battery status | ||
423 | * 0x00: High | ||
424 | * 0x01: Low | ||
425 | * 0x02: Critical | ||
426 | * 0x03: Charging | ||
427 | * 0x04: Selected battery not present (BIOS >= 1.2 only) | ||
428 | * 0xff: Unknown | ||
429 | * 5) Battery flag | ||
430 | * bit 0: High | ||
431 | * bit 1: Low | ||
432 | * bit 2: Critical | ||
433 | * bit 3: Charging | ||
434 | * bit 7: No system battery | ||
435 | * 0xff: Unknown | ||
436 | * 6) Remaining battery life (percentage of charge): | ||
437 | * 0-100: valid | ||
438 | * -1: Unknown | ||
439 | * 7) Remaining battery life (time units): | ||
440 | * Number of remaining minutes or seconds | ||
441 | * -1: Unknown | ||
442 | * 8) min = minutes; sec = seconds | ||
443 | */ | ||
444 | static int apm_read_proc(char *buf, char **start, off_t fpos, int length) | ||
445 | { | ||
446 | if (likely(apm_get_info)) | ||
447 | return apm_get_info(buf, start, fpos, length); | ||
448 | |||
449 | return -EINVAL; | ||
450 | } | ||
451 | #endif | ||
452 | |||
453 | static int kapmd(void *arg) | ||
454 | { | ||
455 | daemonize("kapmd"); | ||
456 | current->flags |= PF_NOFREEZE; | ||
457 | |||
458 | do { | ||
459 | apm_event_t event; | ||
460 | |||
461 | wait_event_interruptible(kapmd_wait, | ||
462 | !queue_empty(&kapmd_queue) || !pm_active); | ||
463 | |||
464 | if (!pm_active) | ||
465 | break; | ||
466 | |||
467 | spin_lock_irq(&kapmd_queue_lock); | ||
468 | event = 0; | ||
469 | if (!queue_empty(&kapmd_queue)) | ||
470 | event = queue_get_event(&kapmd_queue); | ||
471 | spin_unlock_irq(&kapmd_queue_lock); | ||
472 | |||
473 | switch (event) { | ||
474 | case 0: | ||
475 | break; | ||
476 | |||
477 | case APM_LOW_BATTERY: | ||
478 | case APM_POWER_STATUS_CHANGE: | ||
479 | queue_event(event, NULL); | ||
480 | break; | ||
481 | |||
482 | case APM_USER_SUSPEND: | ||
483 | case APM_SYS_SUSPEND: | ||
484 | queue_event(event, NULL); | ||
485 | if (suspends_pending == 0) | ||
486 | apm_suspend(); | ||
487 | break; | ||
488 | |||
489 | case APM_CRITICAL_SUSPEND: | ||
490 | apm_suspend(); | ||
491 | break; | ||
492 | } | ||
493 | } while (1); | ||
494 | |||
495 | complete_and_exit(&kapmd_exit, 0); | ||
496 | } | ||
497 | |||
498 | static int __init apm_init(void) | ||
499 | { | ||
500 | int ret; | ||
501 | |||
502 | pm_active = 1; | ||
503 | |||
504 | ret = kernel_thread(kapmd, NULL, CLONE_KERNEL); | ||
505 | if (unlikely(ret < 0)) { | ||
506 | pm_active = 0; | ||
507 | return ret; | ||
508 | } | ||
509 | |||
510 | create_proc_info_entry("apm", 0, NULL, apm_read_proc); | ||
511 | |||
512 | ret = misc_register(&apm_device); | ||
513 | if (unlikely(ret != 0)) { | ||
514 | remove_proc_entry("apm", NULL); | ||
515 | |||
516 | pm_active = 0; | ||
517 | wake_up(&kapmd_wait); | ||
518 | wait_for_completion(&kapmd_exit); | ||
519 | } | ||
520 | |||
521 | return ret; | ||
522 | } | ||
523 | |||
524 | static void __exit apm_exit(void) | ||
525 | { | ||
526 | misc_deregister(&apm_device); | ||
527 | remove_proc_entry("apm", NULL); | ||
528 | |||
529 | pm_active = 0; | ||
530 | wake_up(&kapmd_wait); | ||
531 | wait_for_completion(&kapmd_exit); | ||
532 | } | ||
533 | |||
534 | module_init(apm_init); | ||
535 | module_exit(apm_exit); | ||
536 | |||
537 | MODULE_AUTHOR("Stephen Rothwell, Andriy Skulysh"); | ||
538 | MODULE_DESCRIPTION("Advanced Power Management"); | ||
539 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/sh/kernel/cf-enabler.c b/arch/sh/kernel/cf-enabler.c index f1f9ab87f0b0..3e5fa1e24df0 100644 --- a/arch/sh/kernel/cf-enabler.c +++ b/arch/sh/kernel/cf-enabler.c | |||
@@ -10,7 +10,8 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | 13 | #include <linux/mm.h> | |
14 | #include <linux/vmalloc.h> | ||
14 | #include <asm/io.h> | 15 | #include <asm/io.h> |
15 | #include <asm/irq.h> | 16 | #include <asm/irq.h> |
16 | 17 | ||
@@ -32,8 +33,6 @@ | |||
32 | /* SH4 can't access PCMCIA interface through P2 area. | 33 | /* SH4 can't access PCMCIA interface through P2 area. |
33 | * we must remap it with appropreate attribute bit of the page set. | 34 | * we must remap it with appropreate attribute bit of the page set. |
34 | * this part is based on Greg Banks' hd64465_ss.c implementation - Masahiro Abe */ | 35 | * this part is based on Greg Banks' hd64465_ss.c implementation - Masahiro Abe */ |
35 | #include <linux/mm.h> | ||
36 | #include <linux/vmalloc.h> | ||
37 | 36 | ||
38 | #if defined(CONFIG_CF_AREA6) | 37 | #if defined(CONFIG_CF_AREA6) |
39 | #define slot_no 0 | 38 | #define slot_no 0 |
@@ -41,9 +40,6 @@ | |||
41 | #define slot_no 1 | 40 | #define slot_no 1 |
42 | #endif | 41 | #endif |
43 | 42 | ||
44 | /* defined in mm/ioremap.c */ | ||
45 | extern void * p3_ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags); | ||
46 | |||
47 | /* use this pointer to access to directly connected compact flash io area*/ | 43 | /* use this pointer to access to directly connected compact flash io area*/ |
48 | void *cf_io_base; | 44 | void *cf_io_base; |
49 | 45 | ||
@@ -62,7 +58,7 @@ static int __init allocate_cf_area(void) | |||
62 | return -ENOMEM; | 58 | return -ENOMEM; |
63 | } | 59 | } |
64 | /* printk("p3_ioremap(paddr=0x%08lx, psize=0x%08lx, prot=0x%08lx)=0x%08lx\n", | 60 | /* printk("p3_ioremap(paddr=0x%08lx, psize=0x%08lx, prot=0x%08lx)=0x%08lx\n", |
65 | paddrbase, psize, prot.pgprot, cf_io_base);*/ | 61 | paddrbase, psize, prot.pgprot, cf_io_base);*/ |
66 | 62 | ||
67 | /* XXX : do we need attribute and common-memory area also? */ | 63 | /* XXX : do we need attribute and common-memory area also? */ |
68 | 64 | ||
@@ -87,7 +83,7 @@ static int __init cf_init_default(void) | |||
87 | } | 83 | } |
88 | 84 | ||
89 | #if defined(CONFIG_SH_SOLUTION_ENGINE) | 85 | #if defined(CONFIG_SH_SOLUTION_ENGINE) |
90 | #include <asm/se/se.h> | 86 | #include <asm/se.h> |
91 | 87 | ||
92 | /* | 88 | /* |
93 | * SolutionEngine | 89 | * SolutionEngine |
diff --git a/arch/sh/kernel/cpu/Makefile b/arch/sh/kernel/cpu/Makefile index 59d5b748752f..fb5dac069382 100644 --- a/arch/sh/kernel/cpu/Makefile +++ b/arch/sh/kernel/cpu/Makefile | |||
@@ -8,6 +8,5 @@ obj-$(CONFIG_CPU_SH2) += sh2/ | |||
8 | obj-$(CONFIG_CPU_SH3) += sh3/ | 8 | obj-$(CONFIG_CPU_SH3) += sh3/ |
9 | obj-$(CONFIG_CPU_SH4) += sh4/ | 9 | obj-$(CONFIG_CPU_SH4) += sh4/ |
10 | 10 | ||
11 | obj-$(CONFIG_SH_RTC) += rtc.o | ||
12 | obj-$(CONFIG_UBC_WAKEUP) += ubc.o | 11 | obj-$(CONFIG_UBC_WAKEUP) += ubc.o |
13 | obj-$(CONFIG_SH_ADC) += adc.o | 12 | obj-$(CONFIG_SH_ADC) += adc.o |
diff --git a/arch/sh/kernel/cpu/clock.c b/arch/sh/kernel/cpu/clock.c index 97fa37f42b84..51ec64cdf348 100644 --- a/arch/sh/kernel/cpu/clock.c +++ b/arch/sh/kernel/cpu/clock.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/sh/kernel/cpu/clock.c - SuperH clock framework | 2 | * arch/sh/kernel/cpu/clock.c - SuperH clock framework |
3 | * | 3 | * |
4 | * Copyright (C) 2005 Paul Mundt | 4 | * Copyright (C) 2005, 2006 Paul Mundt |
5 | * | 5 | * |
6 | * This clock framework is derived from the OMAP version by: | 6 | * This clock framework is derived from the OMAP version by: |
7 | * | 7 | * |
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/mutex.h> | ||
18 | #include <linux/list.h> | 19 | #include <linux/list.h> |
19 | #include <linux/kref.h> | 20 | #include <linux/kref.h> |
20 | #include <linux/seq_file.h> | 21 | #include <linux/seq_file.h> |
@@ -24,7 +25,7 @@ | |||
24 | 25 | ||
25 | static LIST_HEAD(clock_list); | 26 | static LIST_HEAD(clock_list); |
26 | static DEFINE_SPINLOCK(clock_lock); | 27 | static DEFINE_SPINLOCK(clock_lock); |
27 | static DECLARE_MUTEX(clock_list_sem); | 28 | static DEFINE_MUTEX(clock_list_sem); |
28 | 29 | ||
29 | /* | 30 | /* |
30 | * Each subtype is expected to define the init routines for these clocks, | 31 | * Each subtype is expected to define the init routines for these clocks, |
@@ -140,21 +141,21 @@ void clk_disable(struct clk *clk) | |||
140 | 141 | ||
141 | int clk_register(struct clk *clk) | 142 | int clk_register(struct clk *clk) |
142 | { | 143 | { |
143 | down(&clock_list_sem); | 144 | mutex_lock(&clock_list_sem); |
144 | 145 | ||
145 | list_add(&clk->node, &clock_list); | 146 | list_add(&clk->node, &clock_list); |
146 | kref_init(&clk->kref); | 147 | kref_init(&clk->kref); |
147 | 148 | ||
148 | up(&clock_list_sem); | 149 | mutex_unlock(&clock_list_sem); |
149 | 150 | ||
150 | return 0; | 151 | return 0; |
151 | } | 152 | } |
152 | 153 | ||
153 | void clk_unregister(struct clk *clk) | 154 | void clk_unregister(struct clk *clk) |
154 | { | 155 | { |
155 | down(&clock_list_sem); | 156 | mutex_lock(&clock_list_sem); |
156 | list_del(&clk->node); | 157 | list_del(&clk->node); |
157 | up(&clock_list_sem); | 158 | mutex_unlock(&clock_list_sem); |
158 | } | 159 | } |
159 | 160 | ||
160 | inline unsigned long clk_get_rate(struct clk *clk) | 161 | inline unsigned long clk_get_rate(struct clk *clk) |
@@ -198,14 +199,14 @@ struct clk *clk_get(const char *id) | |||
198 | { | 199 | { |
199 | struct clk *p, *clk = ERR_PTR(-ENOENT); | 200 | struct clk *p, *clk = ERR_PTR(-ENOENT); |
200 | 201 | ||
201 | down(&clock_list_sem); | 202 | mutex_lock(&clock_list_sem); |
202 | list_for_each_entry(p, &clock_list, node) { | 203 | list_for_each_entry(p, &clock_list, node) { |
203 | if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { | 204 | if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { |
204 | clk = p; | 205 | clk = p; |
205 | break; | 206 | break; |
206 | } | 207 | } |
207 | } | 208 | } |
208 | up(&clock_list_sem); | 209 | mutex_unlock(&clock_list_sem); |
209 | 210 | ||
210 | return clk; | 211 | return clk; |
211 | } | 212 | } |
@@ -225,7 +226,7 @@ int __init clk_init(void) | |||
225 | { | 226 | { |
226 | int i, ret = 0; | 227 | int i, ret = 0; |
227 | 228 | ||
228 | BUG_ON(unlikely(!master_clk.rate)); | 229 | BUG_ON(!master_clk.rate); |
229 | 230 | ||
230 | for (i = 0; i < ARRAY_SIZE(onchip_clocks); i++) { | 231 | for (i = 0; i < ARRAY_SIZE(onchip_clocks); i++) { |
231 | struct clk *clk = onchip_clocks[i]; | 232 | struct clk *clk = onchip_clocks[i]; |
diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c index 868e68b28880..bfb90eb0b7a6 100644 --- a/arch/sh/kernel/cpu/init.c +++ b/arch/sh/kernel/cpu/init.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * CPU init code | 4 | * CPU init code |
5 | * | 5 | * |
6 | * Copyright (C) 2002, 2003 Paul Mundt | 6 | * Copyright (C) 2002, 2003 Paul Mundt |
7 | * Copyright (C) 2003 Richard Curnow | ||
7 | * | 8 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive | 10 | * License. See the file "COPYING" in the main directory of this archive |
@@ -13,6 +14,7 @@ | |||
13 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
14 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
15 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
17 | #include <asm/page.h> | ||
16 | #include <asm/system.h> | 18 | #include <asm/system.h> |
17 | #include <asm/cacheflush.h> | 19 | #include <asm/cacheflush.h> |
18 | #include <asm/cache.h> | 20 | #include <asm/cache.h> |
@@ -51,7 +53,15 @@ static void __init cache_init(void) | |||
51 | ccr = ctrl_inl(CCR); | 53 | ccr = ctrl_inl(CCR); |
52 | 54 | ||
53 | /* | 55 | /* |
54 | * If the cache is already enabled .. flush it. | 56 | * At this point we don't know whether the cache is enabled or not - a |
57 | * bootloader may have enabled it. There are at least 2 things that | ||
58 | * could be dirty in the cache at this point: | ||
59 | * 1. kernel command line set up by boot loader | ||
60 | * 2. spilled registers from the prolog of this function | ||
61 | * => before re-initialising the cache, we must do a purge of the whole | ||
62 | * cache out to memory for safety. As long as nothing is spilled | ||
63 | * during the loop to lines that have already been done, this is safe. | ||
64 | * - RPC | ||
55 | */ | 65 | */ |
56 | if (ccr & CCR_CACHE_ENABLE) { | 66 | if (ccr & CCR_CACHE_ENABLE) { |
57 | unsigned long ways, waysize, addrstart; | 67 | unsigned long ways, waysize, addrstart; |
@@ -98,6 +108,8 @@ static void __init cache_init(void) | |||
98 | /* Force EMODE if possible */ | 108 | /* Force EMODE if possible */ |
99 | if (cpu_data->dcache.ways > 1) | 109 | if (cpu_data->dcache.ways > 1) |
100 | flags |= CCR_CACHE_EMODE; | 110 | flags |= CCR_CACHE_EMODE; |
111 | else | ||
112 | flags &= ~CCR_CACHE_EMODE; | ||
101 | #endif | 113 | #endif |
102 | 114 | ||
103 | #ifdef CONFIG_SH_WRITETHROUGH | 115 | #ifdef CONFIG_SH_WRITETHROUGH |
@@ -112,6 +124,9 @@ static void __init cache_init(void) | |||
112 | /* Turn on OCRAM -- halve the OC */ | 124 | /* Turn on OCRAM -- halve the OC */ |
113 | flags |= CCR_CACHE_ORA; | 125 | flags |= CCR_CACHE_ORA; |
114 | cpu_data->dcache.sets >>= 1; | 126 | cpu_data->dcache.sets >>= 1; |
127 | |||
128 | cpu_data->dcache.way_size = cpu_data->dcache.sets * | ||
129 | cpu_data->dcache.linesz; | ||
115 | #endif | 130 | #endif |
116 | 131 | ||
117 | ctrl_outl(flags, CCR); | 132 | ctrl_outl(flags, CCR); |
@@ -184,6 +199,10 @@ asmlinkage void __init sh_cpu_init(void) | |||
184 | /* Init the cache */ | 199 | /* Init the cache */ |
185 | cache_init(); | 200 | cache_init(); |
186 | 201 | ||
202 | shm_align_mask = max_t(unsigned long, | ||
203 | cpu_data->dcache.way_size - 1, | ||
204 | PAGE_SIZE - 1); | ||
205 | |||
187 | /* Disable the FPU */ | 206 | /* Disable the FPU */ |
188 | if (fpu_disabled) { | 207 | if (fpu_disabled) { |
189 | printk("FPU Disabled\n"); | 208 | printk("FPU Disabled\n"); |
diff --git a/arch/sh/kernel/cpu/irq/Makefile b/arch/sh/kernel/cpu/irq/Makefile index e3cccea15e1d..1c034c283f59 100644 --- a/arch/sh/kernel/cpu/irq/Makefile +++ b/arch/sh/kernel/cpu/irq/Makefile | |||
@@ -3,5 +3,6 @@ | |||
3 | # | 3 | # |
4 | obj-y += ipr.o imask.o | 4 | obj-y += ipr.o imask.o |
5 | 5 | ||
6 | obj-$(CONFIG_CPU_HAS_PINT_IRQ) += pint.o | 6 | obj-$(CONFIG_CPU_HAS_PINT_IRQ) += pint.o |
7 | obj-$(CONFIG_CPU_HAS_INTC2_IRQ) += intc2.o | 7 | obj-$(CONFIG_CPU_HAS_MASKREG_IRQ) += maskreg.o |
8 | obj-$(CONFIG_CPU_HAS_INTC2_IRQ) += intc2.o | ||
diff --git a/arch/sh/kernel/cpu/irq/intc2.c b/arch/sh/kernel/cpu/irq/intc2.c index 30064bf6e154..e30e4b7aa70e 100644 --- a/arch/sh/kernel/cpu/irq/intc2.c +++ b/arch/sh/kernel/cpu/irq/intc2.c | |||
@@ -241,9 +241,9 @@ static struct intc2_init { | |||
241 | /* 110-111 reserved/unused */ | 241 | /* 110-111 reserved/unused */ |
242 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) | 242 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) |
243 | { TIMER_IRQ, 0, 24, 0, INTC_TMU0_MSK, 2}, | 243 | { TIMER_IRQ, 0, 24, 0, INTC_TMU0_MSK, 2}, |
244 | #ifdef CONFIG_SH_RTC | 244 | { 21, 1, 0, 0, INTC_RTC_MSK, TIMER_PRIORITY }, |
245 | { RTC_IRQ, 4, 0, 0, INTC_RTC_MSK, TIMER_PRIORITY }, | 245 | { 22, 1, 1, 0, INTC_RTC_MSK, TIMER_PRIORITY }, |
246 | #endif | 246 | { 23, 1, 2, 0, INTC_RTC_MSK, TIMER_PRIORITY }, |
247 | { SCIF0_ERI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | 247 | { SCIF0_ERI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, |
248 | { SCIF0_RXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | 248 | { SCIF0_RXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, |
249 | { SCIF0_BRI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | 249 | { SCIF0_BRI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, |
diff --git a/arch/sh/kernel/cpu/irq/ipr.c b/arch/sh/kernel/cpu/irq/ipr.c index 0f545941fb4f..f785822cd5de 100644 --- a/arch/sh/kernel/cpu/irq/ipr.c +++ b/arch/sh/kernel/cpu/irq/ipr.c | |||
@@ -57,31 +57,27 @@ static struct hw_interrupt_type ipr_irq_type = { | |||
57 | 57 | ||
58 | static void disable_ipr_irq(unsigned int irq) | 58 | static void disable_ipr_irq(unsigned int irq) |
59 | { | 59 | { |
60 | unsigned long val, flags; | 60 | unsigned long val; |
61 | unsigned int addr = ipr_data[irq].addr; | 61 | unsigned int addr = ipr_data[irq].addr; |
62 | unsigned short mask = 0xffff ^ (0x0f << ipr_data[irq].shift); | 62 | unsigned short mask = 0xffff ^ (0x0f << ipr_data[irq].shift); |
63 | 63 | ||
64 | /* Set the priority in IPR to 0 */ | 64 | /* Set the priority in IPR to 0 */ |
65 | local_irq_save(flags); | ||
66 | val = ctrl_inw(addr); | 65 | val = ctrl_inw(addr); |
67 | val &= mask; | 66 | val &= mask; |
68 | ctrl_outw(val, addr); | 67 | ctrl_outw(val, addr); |
69 | local_irq_restore(flags); | ||
70 | } | 68 | } |
71 | 69 | ||
72 | static void enable_ipr_irq(unsigned int irq) | 70 | static void enable_ipr_irq(unsigned int irq) |
73 | { | 71 | { |
74 | unsigned long val, flags; | 72 | unsigned long val; |
75 | unsigned int addr = ipr_data[irq].addr; | 73 | unsigned int addr = ipr_data[irq].addr; |
76 | int priority = ipr_data[irq].priority; | 74 | int priority = ipr_data[irq].priority; |
77 | unsigned short value = (priority << ipr_data[irq].shift); | 75 | unsigned short value = (priority << ipr_data[irq].shift); |
78 | 76 | ||
79 | /* Set priority in IPR back to original value */ | 77 | /* Set priority in IPR back to original value */ |
80 | local_irq_save(flags); | ||
81 | val = ctrl_inw(addr); | 78 | val = ctrl_inw(addr); |
82 | val |= value; | 79 | val |= value; |
83 | ctrl_outw(val, addr); | 80 | ctrl_outw(val, addr); |
84 | local_irq_restore(flags); | ||
85 | } | 81 | } |
86 | 82 | ||
87 | static void mask_and_ack_ipr(unsigned int irq) | 83 | static void mask_and_ack_ipr(unsigned int irq) |
@@ -89,6 +85,7 @@ static void mask_and_ack_ipr(unsigned int irq) | |||
89 | disable_ipr_irq(irq); | 85 | disable_ipr_irq(irq); |
90 | 86 | ||
91 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \ | 87 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \ |
88 | defined(CONFIG_CPU_SUBTYPE_SH7706) || \ | ||
92 | defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705) | 89 | defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705) |
93 | /* This is needed when we use edge triggered setting */ | 90 | /* This is needed when we use edge triggered setting */ |
94 | /* XXX: Is it really needed? */ | 91 | /* XXX: Is it really needed? */ |
@@ -123,7 +120,7 @@ void __init init_IRQ(void) | |||
123 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | 120 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 |
124 | make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY); | 121 | make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY); |
125 | make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY); | 122 | make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY); |
126 | #if defined(CONFIG_SH_RTC) | 123 | #ifdef RTC_IRQ |
127 | make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY); | 124 | make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY); |
128 | #endif | 125 | #endif |
129 | 126 | ||
@@ -162,6 +159,7 @@ void __init init_IRQ(void) | |||
162 | #endif | 159 | #endif |
163 | 160 | ||
164 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \ | 161 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \ |
162 | defined(CONFIG_CPU_SUBTYPE_SH7706) || \ | ||
165 | defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705) | 163 | defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705) |
166 | /* | 164 | /* |
167 | * Initialize the Interrupt Controller (INTC) | 165 | * Initialize the Interrupt Controller (INTC) |
@@ -192,6 +190,8 @@ void __init init_IRQ(void) | |||
192 | /* Perform the machine specific initialisation */ | 190 | /* Perform the machine specific initialisation */ |
193 | if (sh_mv.mv_init_irq != NULL) | 191 | if (sh_mv.mv_init_irq != NULL) |
194 | sh_mv.mv_init_irq(); | 192 | sh_mv.mv_init_irq(); |
193 | |||
194 | irq_ctx_init(smp_processor_id()); | ||
195 | } | 195 | } |
196 | 196 | ||
197 | #if !defined(CONFIG_CPU_HAS_PINT_IRQ) | 197 | #if !defined(CONFIG_CPU_HAS_PINT_IRQ) |
diff --git a/arch/sh/boards/adx/irq_maskreg.c b/arch/sh/kernel/cpu/irq/maskreg.c index 4b2abe5eb165..492db31b3cab 100644 --- a/arch/sh/boards/adx/irq_maskreg.c +++ b/arch/sh/kernel/cpu/irq/maskreg.c | |||
@@ -1,30 +1,23 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/irq_maskreg.c | 2 | * Interrupt handling for Simple external interrupt mask register |
3 | * | 3 | * |
4 | * Copyright (C) 2001 A&D Co., Ltd. <http://www.aandd.co.jp> | 4 | * Copyright (C) 2001 A&D Co., Ltd. <http://www.aandd.co.jp> |
5 | * | 5 | * |
6 | * This file may be copied or modified under the terms of the GNU | ||
7 | * General Public License. See linux/COPYING for more information. | ||
8 | * | ||
9 | * Interrupt handling for Simple external interrupt mask register | ||
10 | * | ||
11 | * This is for the machine which have single 16 bit register | 6 | * This is for the machine which have single 16 bit register |
12 | * for masking external IRQ individually. | 7 | * for masking external IRQ individually. |
13 | * Each bit of the register is for masking each interrupt. | 8 | * Each bit of the register is for masking each interrupt. |
9 | * | ||
10 | * This file may be copied or modified under the terms of the GNU | ||
11 | * General Public License. See linux/COPYING for more information. | ||
14 | */ | 12 | */ |
15 | |||
16 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
17 | #include <linux/init.h> | 14 | #include <linux/init.h> |
18 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
19 | |||
20 | #include <asm/system.h> | 16 | #include <asm/system.h> |
21 | #include <asm/io.h> | 17 | #include <asm/io.h> |
22 | #include <asm/machvec.h> | ||
23 | 18 | ||
24 | /* address of external interrupt mask register | 19 | /* address of external interrupt mask register */ |
25 | * address must be set prior to use these (maybe in init_XXX_irq()) | 20 | unsigned long irq_mask_register; |
26 | * XXX : is it better to use .config than specifying it in code? */ | ||
27 | unsigned short *irq_mask_register = 0; | ||
28 | 21 | ||
29 | /* forward declaration */ | 22 | /* forward declaration */ |
30 | static unsigned int startup_maskreg_irq(unsigned int irq); | 23 | static unsigned int startup_maskreg_irq(unsigned int irq); |
@@ -36,7 +29,7 @@ static void end_maskreg_irq(unsigned int irq); | |||
36 | 29 | ||
37 | /* hw_interrupt_type */ | 30 | /* hw_interrupt_type */ |
38 | static struct hw_interrupt_type maskreg_irq_type = { | 31 | static struct hw_interrupt_type maskreg_irq_type = { |
39 | .typename = " Mask Register", | 32 | .typename = "Mask Register", |
40 | .startup = startup_maskreg_irq, | 33 | .startup = startup_maskreg_irq, |
41 | .shutdown = shutdown_maskreg_irq, | 34 | .shutdown = shutdown_maskreg_irq, |
42 | .enable = enable_maskreg_irq, | 35 | .enable = enable_maskreg_irq, |
@@ -47,7 +40,7 @@ static struct hw_interrupt_type maskreg_irq_type = { | |||
47 | 40 | ||
48 | /* actual implementatin */ | 41 | /* actual implementatin */ |
49 | static unsigned int startup_maskreg_irq(unsigned int irq) | 42 | static unsigned int startup_maskreg_irq(unsigned int irq) |
50 | { | 43 | { |
51 | enable_maskreg_irq(irq); | 44 | enable_maskreg_irq(irq); |
52 | return 0; /* never anything pending */ | 45 | return 0; /* never anything pending */ |
53 | } | 46 | } |
@@ -59,32 +52,26 @@ static void shutdown_maskreg_irq(unsigned int irq) | |||
59 | 52 | ||
60 | static void disable_maskreg_irq(unsigned int irq) | 53 | static void disable_maskreg_irq(unsigned int irq) |
61 | { | 54 | { |
62 | if (irq_mask_register) { | 55 | unsigned short val, mask = 0x01 << irq; |
63 | unsigned long flags; | 56 | |
64 | unsigned short val, mask = 0x01 << irq; | 57 | BUG_ON(!irq_mask_register); |
65 | 58 | ||
66 | /* Set "irq"th bit */ | 59 | /* Set "irq"th bit */ |
67 | local_irq_save(flags); | 60 | val = ctrl_inw(irq_mask_register); |
68 | val = ctrl_inw((unsigned long)irq_mask_register); | 61 | val |= mask; |
69 | val |= mask; | 62 | ctrl_outw(val, irq_mask_register); |
70 | ctrl_outw(val, (unsigned long)irq_mask_register); | ||
71 | local_irq_restore(flags); | ||
72 | } | ||
73 | } | 63 | } |
74 | 64 | ||
75 | static void enable_maskreg_irq(unsigned int irq) | 65 | static void enable_maskreg_irq(unsigned int irq) |
76 | { | 66 | { |
77 | if (irq_mask_register) { | 67 | unsigned short val, mask = ~(0x01 << irq); |
78 | unsigned long flags; | 68 | |
79 | unsigned short val, mask = ~(0x01 << irq); | 69 | BUG_ON(!irq_mask_register); |
80 | 70 | ||
81 | /* Clear "irq"th bit */ | 71 | /* Clear "irq"th bit */ |
82 | local_irq_save(flags); | 72 | val = ctrl_inw(irq_mask_register); |
83 | val = ctrl_inw((unsigned long)irq_mask_register); | 73 | val &= mask; |
84 | val &= mask; | 74 | ctrl_outw(val, irq_mask_register); |
85 | ctrl_outw(val, (unsigned long)irq_mask_register); | ||
86 | local_irq_restore(flags); | ||
87 | } | ||
88 | } | 75 | } |
89 | 76 | ||
90 | static void mask_and_ack_maskreg(unsigned int irq) | 77 | static void mask_and_ack_maskreg(unsigned int irq) |
@@ -101,6 +88,6 @@ static void end_maskreg_irq(unsigned int irq) | |||
101 | void make_maskreg_irq(unsigned int irq) | 88 | void make_maskreg_irq(unsigned int irq) |
102 | { | 89 | { |
103 | disable_irq_nosync(irq); | 90 | disable_irq_nosync(irq); |
104 | irq_desc[irq].chip = &maskreg_irq_type; | 91 | irq_desc[irq].handler = &maskreg_irq_type; |
105 | disable_maskreg_irq(irq); | 92 | disable_maskreg_irq(irq); |
106 | } | 93 | } |
diff --git a/arch/sh/kernel/cpu/irq/pint.c b/arch/sh/kernel/cpu/irq/pint.c index 80cd8108d36a..17f47b373d6e 100644 --- a/arch/sh/kernel/cpu/irq/pint.c +++ b/arch/sh/kernel/cpu/irq/pint.c | |||
@@ -48,26 +48,22 @@ static struct hw_interrupt_type pint_irq_type = { | |||
48 | 48 | ||
49 | static void disable_pint_irq(unsigned int irq) | 49 | static void disable_pint_irq(unsigned int irq) |
50 | { | 50 | { |
51 | unsigned long val, flags; | 51 | unsigned long val; |
52 | 52 | ||
53 | local_irq_save(flags); | ||
54 | val = ctrl_inw(INTC_INTER); | 53 | val = ctrl_inw(INTC_INTER); |
55 | val &= ~(1 << (irq - PINT_IRQ_BASE)); | 54 | val &= ~(1 << (irq - PINT_IRQ_BASE)); |
56 | ctrl_outw(val, INTC_INTER); /* disable PINTn */ | 55 | ctrl_outw(val, INTC_INTER); /* disable PINTn */ |
57 | portcr_mask &= ~(3 << (irq - PINT_IRQ_BASE)*2); | 56 | portcr_mask &= ~(3 << (irq - PINT_IRQ_BASE)*2); |
58 | local_irq_restore(flags); | ||
59 | } | 57 | } |
60 | 58 | ||
61 | static void enable_pint_irq(unsigned int irq) | 59 | static void enable_pint_irq(unsigned int irq) |
62 | { | 60 | { |
63 | unsigned long val, flags; | 61 | unsigned long val; |
64 | 62 | ||
65 | local_irq_save(flags); | ||
66 | val = ctrl_inw(INTC_INTER); | 63 | val = ctrl_inw(INTC_INTER); |
67 | val |= 1 << (irq - PINT_IRQ_BASE); | 64 | val |= 1 << (irq - PINT_IRQ_BASE); |
68 | ctrl_outw(val, INTC_INTER); /* enable PINTn */ | 65 | ctrl_outw(val, INTC_INTER); /* enable PINTn */ |
69 | portcr_mask |= 3 << (irq - PINT_IRQ_BASE)*2; | 66 | portcr_mask |= 3 << (irq - PINT_IRQ_BASE)*2; |
70 | local_irq_restore(flags); | ||
71 | } | 67 | } |
72 | 68 | ||
73 | static void mask_and_ack_pint(unsigned int irq) | 69 | static void mask_and_ack_pint(unsigned int irq) |
diff --git a/arch/sh/kernel/cpu/rtc.c b/arch/sh/kernel/cpu/rtc.c deleted file mode 100644 index 4304cf75cfa2..000000000000 --- a/arch/sh/kernel/cpu/rtc.c +++ /dev/null | |||
@@ -1,128 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/sh/kernel/rtc.c -- SH3 / SH4 on-chip RTC support | ||
3 | * | ||
4 | * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> | ||
5 | * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka | ||
6 | */ | ||
7 | |||
8 | #include <linux/init.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/sched.h> | ||
11 | #include <linux/time.h> | ||
12 | #include <linux/bcd.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/rtc.h> | ||
15 | |||
16 | void sh_rtc_gettimeofday(struct timespec *ts) | ||
17 | { | ||
18 | unsigned int sec128, sec, sec2, min, hr, wk, day, mon, yr, yr100, cf_bit; | ||
19 | unsigned long flags; | ||
20 | |||
21 | again: | ||
22 | do { | ||
23 | local_irq_save(flags); | ||
24 | ctrl_outb(0, RCR1); /* Clear CF-bit */ | ||
25 | sec128 = ctrl_inb(R64CNT); | ||
26 | sec = ctrl_inb(RSECCNT); | ||
27 | min = ctrl_inb(RMINCNT); | ||
28 | hr = ctrl_inb(RHRCNT); | ||
29 | wk = ctrl_inb(RWKCNT); | ||
30 | day = ctrl_inb(RDAYCNT); | ||
31 | mon = ctrl_inb(RMONCNT); | ||
32 | #if defined(CONFIG_CPU_SH4) | ||
33 | yr = ctrl_inw(RYRCNT); | ||
34 | yr100 = (yr >> 8); | ||
35 | yr &= 0xff; | ||
36 | #else | ||
37 | yr = ctrl_inb(RYRCNT); | ||
38 | yr100 = (yr == 0x99) ? 0x19 : 0x20; | ||
39 | #endif | ||
40 | sec2 = ctrl_inb(R64CNT); | ||
41 | cf_bit = ctrl_inb(RCR1) & RCR1_CF; | ||
42 | local_irq_restore(flags); | ||
43 | } while (cf_bit != 0 || ((sec128 ^ sec2) & RTC_BIT_INVERTED) != 0); | ||
44 | |||
45 | BCD_TO_BIN(yr100); | ||
46 | BCD_TO_BIN(yr); | ||
47 | BCD_TO_BIN(mon); | ||
48 | BCD_TO_BIN(day); | ||
49 | BCD_TO_BIN(hr); | ||
50 | BCD_TO_BIN(min); | ||
51 | BCD_TO_BIN(sec); | ||
52 | |||
53 | if (yr > 99 || mon < 1 || mon > 12 || day > 31 || day < 1 || | ||
54 | hr > 23 || min > 59 || sec > 59) { | ||
55 | printk(KERN_ERR | ||
56 | "SH RTC: invalid value, resetting to 1 Jan 2000\n"); | ||
57 | local_irq_save(flags); | ||
58 | ctrl_outb(RCR2_RESET, RCR2); /* Reset & Stop */ | ||
59 | ctrl_outb(0, RSECCNT); | ||
60 | ctrl_outb(0, RMINCNT); | ||
61 | ctrl_outb(0, RHRCNT); | ||
62 | ctrl_outb(6, RWKCNT); | ||
63 | ctrl_outb(1, RDAYCNT); | ||
64 | ctrl_outb(1, RMONCNT); | ||
65 | #if defined(CONFIG_CPU_SH4) | ||
66 | ctrl_outw(0x2000, RYRCNT); | ||
67 | #else | ||
68 | ctrl_outb(0, RYRCNT); | ||
69 | #endif | ||
70 | ctrl_outb(RCR2_RTCEN|RCR2_START, RCR2); /* Start */ | ||
71 | goto again; | ||
72 | } | ||
73 | |||
74 | #if RTC_BIT_INVERTED != 0 | ||
75 | if ((sec128 & RTC_BIT_INVERTED)) | ||
76 | sec--; | ||
77 | #endif | ||
78 | |||
79 | ts->tv_sec = mktime(yr100 * 100 + yr, mon, day, hr, min, sec); | ||
80 | ts->tv_nsec = ((sec128 * 1000000) / 128) * 1000; | ||
81 | } | ||
82 | |||
83 | /* | ||
84 | * Changed to only care about tv_sec, and not the full timespec struct | ||
85 | * (i.e. tv_nsec). It can easily be switched to timespec for future cpus | ||
86 | * that support setting usec or nsec RTC values. | ||
87 | */ | ||
88 | int sh_rtc_settimeofday(const time_t secs) | ||
89 | { | ||
90 | int retval = 0; | ||
91 | int real_seconds, real_minutes, cmos_minutes; | ||
92 | unsigned long flags; | ||
93 | |||
94 | local_irq_save(flags); | ||
95 | ctrl_outb(RCR2_RESET, RCR2); /* Reset pre-scaler & stop RTC */ | ||
96 | |||
97 | cmos_minutes = ctrl_inb(RMINCNT); | ||
98 | BCD_TO_BIN(cmos_minutes); | ||
99 | |||
100 | /* | ||
101 | * since we're only adjusting minutes and seconds, | ||
102 | * don't interfere with hour overflow. This avoids | ||
103 | * messing with unknown time zones but requires your | ||
104 | * RTC not to be off by more than 15 minutes | ||
105 | */ | ||
106 | real_seconds = secs % 60; | ||
107 | real_minutes = secs / 60; | ||
108 | if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1) | ||
109 | real_minutes += 30; /* correct for half hour time zone */ | ||
110 | real_minutes %= 60; | ||
111 | |||
112 | if (abs(real_minutes - cmos_minutes) < 30) { | ||
113 | BIN_TO_BCD(real_seconds); | ||
114 | BIN_TO_BCD(real_minutes); | ||
115 | ctrl_outb(real_seconds, RSECCNT); | ||
116 | ctrl_outb(real_minutes, RMINCNT); | ||
117 | } else { | ||
118 | printk(KERN_WARNING | ||
119 | "set_rtc_time: can't update from %d to %d\n", | ||
120 | cmos_minutes, real_minutes); | ||
121 | retval = -1; | ||
122 | } | ||
123 | |||
124 | ctrl_outb(RCR2_RTCEN|RCR2_START, RCR2); /* Start RTC */ | ||
125 | local_irq_restore(flags); | ||
126 | |||
127 | return retval; | ||
128 | } | ||
diff --git a/arch/sh/kernel/cpu/sh3/Makefile b/arch/sh/kernel/cpu/sh3/Makefile index b54dbb9a0c86..58d3815695ff 100644 --- a/arch/sh/kernel/cpu/sh3/Makefile +++ b/arch/sh/kernel/cpu/sh3/Makefile | |||
@@ -4,10 +4,21 @@ | |||
4 | 4 | ||
5 | obj-y := ex.o probe.o | 5 | obj-y := ex.o probe.o |
6 | 6 | ||
7 | # CPU subtype setup | ||
8 | obj-$(CONFIG_CPU_SUBTYPE_SH7705) += setup-sh7705.o | ||
9 | obj-$(CONFIG_CPU_SUBTYPE_SH7706) += setup-sh7709.o | ||
10 | obj-$(CONFIG_CPU_SUBTYPE_SH7707) += setup-sh7709.o | ||
11 | obj-$(CONFIG_CPU_SUBTYPE_SH7708) += setup-sh7708.o | ||
12 | obj-$(CONFIG_CPU_SUBTYPE_SH7709) += setup-sh7709.o | ||
13 | obj-$(CONFIG_CPU_SUBTYPE_SH7300) += setup-sh7300.o | ||
14 | obj-$(CONFIG_CPU_SUBTYPE_SH7710) += setup-sh7710.o | ||
15 | |||
16 | # Primary on-chip clocks (common) | ||
7 | clock-$(CONFIG_CPU_SH3) := clock-sh3.o | 17 | clock-$(CONFIG_CPU_SH3) := clock-sh3.o |
8 | clock-$(CONFIG_CPU_SUBTYPE_SH7300) := clock-sh7300.o | 18 | clock-$(CONFIG_CPU_SUBTYPE_SH7300) := clock-sh7300.o |
9 | 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 | ||
10 | 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 | ||
11 | 23 | ||
12 | obj-y += $(clock-y) | 24 | obj-y += $(clock-y) |
13 | |||
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 000000000000..0cf96f9833bc --- /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 cc04e9e239ff..44daf44833f9 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 5cdc88638601..e67098836290 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-sh7300.c b/arch/sh/kernel/cpu/sh3/setup-sh7300.c new file mode 100644 index 000000000000..ab4d204bfba5 --- /dev/null +++ b/arch/sh/kernel/cpu/sh3/setup-sh7300.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * SH7300 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 = 0xa4430000, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCI, | ||
20 | .irqs = { 80, 80, 80, 80 }, | ||
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 *sh7300_devices[] __initdata = { | ||
35 | &sci_device, | ||
36 | }; | ||
37 | |||
38 | static int __init sh7300_devices_setup(void) | ||
39 | { | ||
40 | return platform_add_devices(sh7300_devices, | ||
41 | ARRAY_SIZE(sh7300_devices)); | ||
42 | } | ||
43 | __initcall(sh7300_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7705.c b/arch/sh/kernel/cpu/sh3/setup-sh7705.c new file mode 100644 index 000000000000..a8e41c5241fa --- /dev/null +++ b/arch/sh/kernel/cpu/sh3/setup-sh7705.c | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * SH7705 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 | .mapbase = 0xa4410000, | ||
23 | .flags = UPF_BOOT_AUTOCONF, | ||
24 | .type = PORT_SCIF, | ||
25 | .irqs = { 56, 57, 59, 58 }, | ||
26 | }, { | ||
27 | .flags = 0, | ||
28 | } | ||
29 | }; | ||
30 | |||
31 | static struct platform_device sci_device = { | ||
32 | .name = "sh-sci", | ||
33 | .id = -1, | ||
34 | .dev = { | ||
35 | .platform_data = sci_platform_data, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | static struct platform_device *sh7705_devices[] __initdata = { | ||
40 | &sci_device, | ||
41 | }; | ||
42 | |||
43 | static int __init sh7705_devices_setup(void) | ||
44 | { | ||
45 | return platform_add_devices(sh7705_devices, | ||
46 | ARRAY_SIZE(sh7705_devices)); | ||
47 | } | ||
48 | __initcall(sh7705_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7708.c b/arch/sh/kernel/cpu/sh3/setup-sh7708.c new file mode 100644 index 000000000000..f933723911ca --- /dev/null +++ b/arch/sh/kernel/cpu/sh3/setup-sh7708.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * SH7708 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 = 0xfffffe80, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCI, | ||
20 | .irqs = { 23, 24, 25, 0 }, | ||
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 *sh7708_devices[] __initdata = { | ||
35 | &sci_device, | ||
36 | }; | ||
37 | |||
38 | static int __init sh7708_devices_setup(void) | ||
39 | { | ||
40 | return platform_add_devices(sh7708_devices, | ||
41 | ARRAY_SIZE(sh7708_devices)); | ||
42 | } | ||
43 | __initcall(sh7708_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7709.c b/arch/sh/kernel/cpu/sh3/setup-sh7709.c new file mode 100644 index 000000000000..ff43ef2a1f0c --- /dev/null +++ b/arch/sh/kernel/cpu/sh3/setup-sh7709.c | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * SH7707/SH7709 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 = 0xfffffe80, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCI, | ||
20 | .irqs = { 23, 24, 25, 0 }, | ||
21 | }, { | ||
22 | .mapbase = 0xa4000150, | ||
23 | .flags = UPF_BOOT_AUTOCONF, | ||
24 | .type = PORT_SCIF, | ||
25 | .irqs = { 56, 57, 59, 58 }, | ||
26 | }, { | ||
27 | .mapbase = 0xa4000140, | ||
28 | .flags = UPF_BOOT_AUTOCONF, | ||
29 | .type = PORT_IRDA, | ||
30 | .irqs = { 52, 53, 55, 54 }, | ||
31 | }, { | ||
32 | .flags = 0, | ||
33 | } | ||
34 | }; | ||
35 | |||
36 | static struct platform_device sci_device = { | ||
37 | .name = "sh-sci", | ||
38 | .id = -1, | ||
39 | .dev = { | ||
40 | .platform_data = sci_platform_data, | ||
41 | }, | ||
42 | }; | ||
43 | |||
44 | static struct platform_device *sh7709_devices[] __initdata = { | ||
45 | &sci_device, | ||
46 | }; | ||
47 | |||
48 | static int __init sh7709_devices_setup(void) | ||
49 | { | ||
50 | return platform_add_devices(sh7709_devices, | ||
51 | ARRAY_SIZE(sh7709_devices)); | ||
52 | } | ||
53 | __initcall(sh7709_devices_setup); | ||
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 000000000000..895f99ee6a95 --- /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); | ||
diff --git a/arch/sh/kernel/cpu/sh4/Makefile b/arch/sh/kernel/cpu/sh4/Makefile index 3d5cafc71ae3..8dbf3895ece7 100644 --- a/arch/sh/kernel/cpu/sh4/Makefile +++ b/arch/sh/kernel/cpu/sh4/Makefile | |||
@@ -7,6 +7,16 @@ obj-y := ex.o probe.o | |||
7 | obj-$(CONFIG_SH_FPU) += fpu.o | 7 | obj-$(CONFIG_SH_FPU) += fpu.o |
8 | obj-$(CONFIG_SH_STORE_QUEUES) += sq.o | 8 | obj-$(CONFIG_SH_STORE_QUEUES) += sq.o |
9 | 9 | ||
10 | # CPU subtype setup | ||
11 | obj-$(CONFIG_CPU_SUBTYPE_SH7750) += setup-sh7750.o | ||
12 | obj-$(CONFIG_CPU_SUBTYPE_SH7751) += setup-sh7750.o | ||
13 | obj-$(CONFIG_CPU_SUBTYPE_SH7760) += setup-sh7760.o | ||
14 | obj-$(CONFIG_CPU_SUBTYPE_SH7770) += setup-sh7770.o | ||
15 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += setup-sh7780.o | ||
16 | obj-$(CONFIG_CPU_SUBTYPE_SH73180) += setup-sh73180.o | ||
17 | obj-$(CONFIG_CPU_SUBTYPE_SH7343) += setup-sh7343.o | ||
18 | obj-$(CONFIG_CPU_SUBTYPE_SH4_202) += setup-sh4-202.o | ||
19 | |||
10 | # Primary on-chip clocks (common) | 20 | # Primary on-chip clocks (common) |
11 | clock-$(CONFIG_CPU_SH4) := clock-sh4.o | 21 | clock-$(CONFIG_CPU_SH4) := clock-sh4.o |
12 | clock-$(CONFIG_CPU_SUBTYPE_SH73180) := clock-sh73180.o | 22 | clock-$(CONFIG_CPU_SUBTYPE_SH73180) := clock-sh73180.o |
diff --git a/arch/sh/kernel/cpu/sh4/ex.S b/arch/sh/kernel/cpu/sh4/ex.S index 26a27df06505..7146893a6cca 100644 --- a/arch/sh/kernel/cpu/sh4/ex.S +++ b/arch/sh/kernel/cpu/sh4/ex.S | |||
@@ -72,6 +72,7 @@ ENTRY(interrupt_table) | |||
72 | .long do_IRQ ! 1110 | 72 | .long do_IRQ ! 1110 |
73 | .long exception_error | 73 | .long exception_error |
74 | ! Internal hardware | 74 | ! Internal hardware |
75 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | ||
75 | .long do_IRQ ! TMU0 tuni0 /* 400 */ | 76 | .long do_IRQ ! TMU0 tuni0 /* 400 */ |
76 | .long do_IRQ ! TMU1 tuni1 | 77 | .long do_IRQ ! TMU1 tuni1 |
77 | .long do_IRQ ! TMU2 tuni2 | 78 | .long do_IRQ ! TMU2 tuni2 |
@@ -122,6 +123,13 @@ ENTRY(interrupt_table) | |||
122 | .long do_IRQ ! 45 dmte5 | 123 | .long do_IRQ ! 45 dmte5 |
123 | .long do_IRQ ! 46 dmte6 | 124 | .long do_IRQ ! 46 dmte6 |
124 | .long do_IRQ ! 47 dmte7 /* 7E0 */ | 125 | .long do_IRQ ! 47 dmte7 /* 7E0 */ |
126 | #elif defined(CONFIG_CPU_SUBTYPE_SH7343) | ||
127 | .long do_IRQ ! 44 IIC1 ali /* 780 */ | ||
128 | .long do_IRQ ! 45 tacki | ||
129 | .long do_IRQ ! 46 waiti | ||
130 | .long do_IRQ ! 47 dtei /* 7E0 */ | ||
131 | .long do_IRQ ! 48 DMAC dei0 /* 800 */ | ||
132 | .long do_IRQ ! 49 dei1 /* 820 */ | ||
125 | #else | 133 | #else |
126 | .long exception_error ! 44 /* 780 */ | 134 | .long exception_error ! 44 /* 780 */ |
127 | .long exception_error ! 45 | 135 | .long exception_error ! 45 |
@@ -131,7 +139,8 @@ ENTRY(interrupt_table) | |||
131 | #if defined(CONFIG_SH_FPU) | 139 | #if defined(CONFIG_SH_FPU) |
132 | .long do_fpu_state_restore ! 48 /* 800 */ | 140 | .long do_fpu_state_restore ! 48 /* 800 */ |
133 | .long do_fpu_state_restore ! 49 /* 820 */ | 141 | .long do_fpu_state_restore ! 49 /* 820 */ |
134 | #else | 142 | #elif !defined(CONFIG_CPU_SUBTYPE_SH7343) && \ |
143 | !defined(CONFIG_CPU_SUBTYPE_SH73180) | ||
135 | .long exception_error | 144 | .long exception_error |
136 | .long exception_error | 145 | .long exception_error |
137 | #endif | 146 | #endif |
@@ -224,7 +233,7 @@ ENTRY(interrupt_table) | |||
224 | .long exception_error | 233 | .long exception_error |
225 | .long do_IRQ ! ADC adi | 234 | .long do_IRQ ! ADC adi |
226 | .long do_IRQ ! CMT cmti /* FA0 */ | 235 | .long do_IRQ ! CMT cmti /* FA0 */ |
227 | #elif defined(CONFIG_CPU_SUBTYPE_SH73180) | 236 | #elif defined(CONFIG_CPU_SUBTYPE_SH73180) || defined(CONFIG_CPU_SUBTYPE_SH7343) |
228 | .long do_IRQ ! 50 0x840 | 237 | .long do_IRQ ! 50 0x840 |
229 | .long do_IRQ ! 51 0x860 | 238 | .long do_IRQ ! 51 0x860 |
230 | .long do_IRQ ! 52 0x880 | 239 | .long do_IRQ ! 52 0x880 |
@@ -379,5 +388,168 @@ ENTRY(interrupt_table) | |||
379 | .long exception_error ! 141 0x13a0 | 388 | .long exception_error ! 141 0x13a0 |
380 | .long exception_error ! 142 0x13c0 | 389 | .long exception_error ! 142 0x13c0 |
381 | .long exception_error ! 143 0x13e0 | 390 | .long exception_error ! 143 0x13e0 |
391 | #elif defined(CONFIG_CPU_SUBTYPE_SH7770) | ||
392 | .long do_IRQ ! 50 0x840 | ||
393 | .long do_IRQ ! 51 0x860 | ||
394 | .long do_IRQ ! 52 0x880 | ||
395 | .long do_IRQ ! 53 0x8a0 | ||
396 | .long do_IRQ ! 54 0x8c0 | ||
397 | .long do_IRQ ! 55 0x8e0 | ||
398 | .long do_IRQ ! 56 0x900 | ||
399 | .long do_IRQ ! 57 0x920 | ||
400 | .long do_IRQ ! 58 0x940 | ||
401 | .long do_IRQ ! 59 0x960 | ||
402 | .long do_IRQ ! 60 0x980 | ||
403 | .long do_IRQ ! 61 0x9a0 | ||
404 | .long do_IRQ ! 62 0x9c0 | ||
405 | .long do_IRQ ! 63 0x9e0 | ||
406 | .long do_IRQ ! 64 0xa00 | ||
407 | .long do_IRQ ! 65 0xa20 | ||
408 | .long do_IRQ ! 66 0xa4d | ||
409 | .long do_IRQ ! 67 0xa60 | ||
410 | .long do_IRQ ! 68 0xa80 | ||
411 | .long do_IRQ ! 69 0xaa0 | ||
412 | .long do_IRQ ! 70 0xac0 | ||
413 | .long do_IRQ ! 71 0xae0 | ||
414 | .long do_IRQ ! 72 0xb00 | ||
415 | .long do_IRQ ! 73 0xb20 | ||
416 | .long do_IRQ ! 74 0xb40 | ||
417 | .long do_IRQ ! 75 0xb60 | ||
418 | .long do_IRQ ! 76 0xb80 | ||
419 | .long do_IRQ ! 77 0xba0 | ||
420 | .long do_IRQ ! 78 0xbc0 | ||
421 | .long do_IRQ ! 79 0xbe0 | ||
422 | .long do_IRQ ! 80 0xc00 | ||
423 | .long do_IRQ ! 81 0xc20 | ||
424 | .long do_IRQ ! 82 0xc40 | ||
425 | .long do_IRQ ! 83 0xc60 | ||
426 | .long do_IRQ ! 84 0xc80 | ||
427 | .long do_IRQ ! 85 0xca0 | ||
428 | .long do_IRQ ! 86 0xcc0 | ||
429 | .long do_IRQ ! 87 0xce0 | ||
430 | .long do_IRQ ! 88 0xd00 | ||
431 | .long do_IRQ ! 89 0xd20 | ||
432 | .long do_IRQ ! 90 0xd40 | ||
433 | .long do_IRQ ! 91 0xd60 | ||
434 | .long do_IRQ ! 92 0xd80 | ||
435 | .long do_IRQ ! 93 0xda0 | ||
436 | .long do_IRQ ! 94 0xdc0 | ||
437 | .long do_IRQ ! 95 0xde0 | ||
438 | .long do_IRQ ! 96 0xe00 | ||
439 | .long do_IRQ ! 97 0xe20 | ||
440 | .long do_IRQ ! 98 0xe40 | ||
441 | .long do_IRQ ! 99 0xe60 | ||
442 | .long do_IRQ ! 100 0xe80 | ||
443 | .long do_IRQ ! 101 0xea0 | ||
444 | .long do_IRQ ! 102 0xec0 | ||
445 | .long do_IRQ ! 103 0xee0 | ||
446 | .long do_IRQ ! 104 0xf00 | ||
447 | .long do_IRQ ! 105 0xf20 | ||
448 | .long do_IRQ ! 106 0xf40 | ||
449 | .long do_IRQ ! 107 0xf60 | ||
450 | .long do_IRQ ! 108 0xf80 | ||
451 | #endif | ||
452 | #else | ||
453 | .long exception_error /* 400 */ | ||
454 | .long exception_error | ||
455 | .long exception_error | ||
456 | .long exception_error | ||
457 | .long do_IRQ ! RTC ati | ||
458 | .long do_IRQ ! pri | ||
459 | .long do_IRQ ! cui | ||
460 | .long exception_error | ||
461 | .long exception_error /* 500 */ | ||
462 | .long exception_error | ||
463 | .long exception_error | ||
464 | .long do_IRQ ! WDT iti /* 560 */ | ||
465 | .long do_IRQ ! TMU-ch0 | ||
466 | .long do_IRQ ! TMU-ch1 | ||
467 | .long do_IRQ ! TMU-ch2 | ||
468 | .long do_IRQ ! ticpi2 /* 5E0 */ | ||
469 | .long do_IRQ ! 32 Hitachi UDI /* 600 */ | ||
470 | .long exception_error | ||
471 | .long do_IRQ ! 34 DMAC dmte0 | ||
472 | .long do_IRQ ! 35 dmte1 | ||
473 | .long do_IRQ ! 36 dmte2 | ||
474 | .long do_IRQ ! 37 dmte3 | ||
475 | .long do_IRQ ! 38 dmae | ||
476 | .long exception_error ! 39 /* 6E0 */ | ||
477 | .long do_IRQ ! 40 SCIF-ch0 eri /* 700 */ | ||
478 | .long do_IRQ ! 41 rxi | ||
479 | .long do_IRQ ! 42 bri | ||
480 | .long do_IRQ ! 43 txi | ||
481 | .long do_IRQ ! 44 DMAC dmte4 /* 780 */ | ||
482 | .long do_IRQ ! 45 dmte5 | ||
483 | .long do_IRQ ! 46 dmte6 | ||
484 | .long do_IRQ ! 47 dmte7 /* 7E0 */ | ||
485 | #if defined(CONFIG_SH_FPU) | ||
486 | .long do_fpu_state_restore ! 48 /* 800 */ | ||
487 | .long do_fpu_state_restore ! 49 /* 820 */ | ||
488 | #else | ||
489 | .long exception_error | ||
490 | .long exception_error | ||
491 | #endif | ||
492 | .long exception_error /* 840 */ | ||
493 | .long exception_error | ||
494 | .long exception_error | ||
495 | .long exception_error | ||
496 | .long exception_error | ||
497 | .long exception_error | ||
498 | .long do_IRQ ! 56 CMT /* 900 */ | ||
499 | .long exception_error | ||
500 | .long exception_error | ||
501 | .long exception_error | ||
502 | .long do_IRQ ! 60 HAC | ||
503 | .long exception_error | ||
504 | .long exception_error | ||
505 | .long exception_error | ||
506 | .long do_IRQ ! PCI serr /* A00 */ | ||
507 | .long do_IRQ ! INTA | ||
508 | .long do_IRQ ! INTB | ||
509 | .long do_IRQ ! INTC | ||
510 | .long do_IRQ ! INTD | ||
511 | .long do_IRQ ! err | ||
512 | .long do_IRQ ! pwd3 | ||
513 | .long do_IRQ ! pwd2 | ||
514 | .long do_IRQ ! pwd1 /* B00 */ | ||
515 | .long do_IRQ ! pwd0 | ||
516 | .long exception_error | ||
517 | .long exception_error | ||
518 | .long do_IRQ ! SCIF-ch1 eri /* B80 */ | ||
519 | .long do_IRQ ! rxi | ||
520 | .long do_IRQ ! bri | ||
521 | .long do_IRQ ! txi | ||
522 | .long do_IRQ ! SIOF /* C00 */ | ||
523 | .long exception_error | ||
524 | .long exception_error | ||
525 | .long exception_error | ||
526 | .long do_IRQ ! HSPI /* C80 */ | ||
527 | .long exception_error | ||
528 | .long exception_error | ||
529 | .long exception_error | ||
530 | .long do_IRQ ! MMCIF fatat /* D00 */ | ||
531 | .long do_IRQ ! tran | ||
532 | .long do_IRQ ! err | ||
533 | .long do_IRQ ! frdy | ||
534 | .long do_IRQ ! DMAC dmint8 /* D80 */ | ||
535 | .long do_IRQ ! dmint9 | ||
536 | .long do_IRQ ! dmint10 | ||
537 | .long do_IRQ ! dmint11 | ||
538 | .long do_IRQ ! TMU-ch3 /* E00 */ | ||
539 | .long do_IRQ ! TMU-ch4 | ||
540 | .long do_IRQ ! TMU-ch5 | ||
541 | .long exception_error | ||
542 | .long do_IRQ ! SSI | ||
543 | .long exception_error | ||
544 | .long exception_error | ||
545 | .long exception_error | ||
546 | .long do_IRQ ! FLCTL flste /* F00 */ | ||
547 | .long do_IRQ ! fltend | ||
548 | .long do_IRQ ! fltrq0 | ||
549 | .long do_IRQ ! fltrq1 | ||
550 | .long do_IRQ ! GPIO gpioi0 /* F80 */ | ||
551 | .long do_IRQ ! gpioi1 | ||
552 | .long do_IRQ ! gpioi2 | ||
553 | .long do_IRQ ! gpioi3 | ||
382 | #endif | 554 | #endif |
383 | 555 | ||
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index 42427b79697b..c294de1e14a3 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * CPU Subtype Probing for SH-4. | 4 | * CPU Subtype Probing for SH-4. |
5 | * | 5 | * |
6 | * Copyright (C) 2001, 2002, 2003, 2004 Paul Mundt | 6 | * Copyright (C) 2001 - 2006 Paul Mundt |
7 | * Copyright (C) 2003 Richard Curnow | 7 | * Copyright (C) 2003 Richard Curnow |
8 | * | 8 | * |
9 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
@@ -29,7 +29,7 @@ int __init detect_cpu_and_cache_system(void) | |||
29 | [9] = (1 << 16) | 29 | [9] = (1 << 16) |
30 | }; | 30 | }; |
31 | 31 | ||
32 | pvr = (ctrl_inl(CCN_PVR) >> 8) & 0xffff; | 32 | pvr = (ctrl_inl(CCN_PVR) >> 8) & 0xffffff; |
33 | prr = (ctrl_inl(CCN_PRR) >> 4) & 0xff; | 33 | prr = (ctrl_inl(CCN_PRR) >> 4) & 0xff; |
34 | cvr = (ctrl_inl(CCN_CVR)); | 34 | cvr = (ctrl_inl(CCN_CVR)); |
35 | 35 | ||
@@ -38,7 +38,6 @@ int __init detect_cpu_and_cache_system(void) | |||
38 | */ | 38 | */ |
39 | cpu_data->icache.way_incr = (1 << 13); | 39 | cpu_data->icache.way_incr = (1 << 13); |
40 | cpu_data->icache.entry_shift = 5; | 40 | cpu_data->icache.entry_shift = 5; |
41 | cpu_data->icache.entry_mask = 0x1fe0; | ||
42 | cpu_data->icache.sets = 256; | 41 | cpu_data->icache.sets = 256; |
43 | cpu_data->icache.ways = 1; | 42 | cpu_data->icache.ways = 1; |
44 | cpu_data->icache.linesz = L1_CACHE_BYTES; | 43 | cpu_data->icache.linesz = L1_CACHE_BYTES; |
@@ -48,13 +47,29 @@ int __init detect_cpu_and_cache_system(void) | |||
48 | */ | 47 | */ |
49 | cpu_data->dcache.way_incr = (1 << 14); | 48 | cpu_data->dcache.way_incr = (1 << 14); |
50 | cpu_data->dcache.entry_shift = 5; | 49 | cpu_data->dcache.entry_shift = 5; |
51 | cpu_data->dcache.entry_mask = 0x3fe0; | ||
52 | cpu_data->dcache.sets = 512; | 50 | cpu_data->dcache.sets = 512; |
53 | cpu_data->dcache.ways = 1; | 51 | cpu_data->dcache.ways = 1; |
54 | cpu_data->dcache.linesz = L1_CACHE_BYTES; | 52 | cpu_data->dcache.linesz = L1_CACHE_BYTES; |
55 | 53 | ||
56 | /* Set the FPU flag, virtually all SH-4's have one */ | 54 | /* |
57 | cpu_data->flags |= CPU_HAS_FPU; | 55 | * Setup some generic flags we can probe |
56 | * (L2 and DSP detection only work on SH-4A) | ||
57 | */ | ||
58 | if (((pvr >> 16) & 0xff) == 0x10) { | ||
59 | if ((cvr & 0x02000000) == 0) | ||
60 | cpu_data->flags |= CPU_HAS_L2_CACHE; | ||
61 | if ((cvr & 0x10000000) == 0) | ||
62 | cpu_data->flags |= CPU_HAS_DSP; | ||
63 | |||
64 | cpu_data->flags |= CPU_HAS_LLSC; | ||
65 | } | ||
66 | |||
67 | /* FPU detection works for everyone */ | ||
68 | if ((cvr & 0x20000000) == 1) | ||
69 | cpu_data->flags |= CPU_HAS_FPU; | ||
70 | |||
71 | /* Mask off the upper chip ID */ | ||
72 | pvr &= 0xffff; | ||
58 | 73 | ||
59 | /* | 74 | /* |
60 | * Probe the underlying processor version/revision and | 75 | * Probe the underlying processor version/revision and |
@@ -63,56 +78,101 @@ int __init detect_cpu_and_cache_system(void) | |||
63 | switch (pvr) { | 78 | switch (pvr) { |
64 | case 0x205: | 79 | case 0x205: |
65 | cpu_data->type = CPU_SH7750; | 80 | cpu_data->type = CPU_SH7750; |
66 | cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_PERF_COUNTER; | 81 | cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU | |
82 | CPU_HAS_PERF_COUNTER | CPU_HAS_PTEA; | ||
67 | break; | 83 | break; |
68 | case 0x206: | 84 | case 0x206: |
69 | cpu_data->type = CPU_SH7750S; | 85 | cpu_data->type = CPU_SH7750S; |
70 | cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_PERF_COUNTER; | 86 | cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU | |
87 | CPU_HAS_PERF_COUNTER | CPU_HAS_PTEA; | ||
71 | break; | 88 | break; |
72 | case 0x1100: | 89 | case 0x1100: |
73 | cpu_data->type = CPU_SH7751; | 90 | cpu_data->type = CPU_SH7751; |
91 | cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA; | ||
74 | break; | 92 | break; |
75 | case 0x2000: | 93 | case 0x2000: |
76 | cpu_data->type = CPU_SH73180; | 94 | cpu_data->type = CPU_SH73180; |
77 | cpu_data->icache.ways = 4; | 95 | cpu_data->icache.ways = 4; |
78 | cpu_data->dcache.ways = 4; | 96 | cpu_data->dcache.ways = 4; |
79 | cpu_data->flags &= ~CPU_HAS_FPU; | 97 | cpu_data->flags |= CPU_HAS_LLSC; |
98 | break; | ||
99 | case 0x2001: | ||
100 | case 0x2004: | ||
101 | cpu_data->type = CPU_SH7770; | ||
102 | cpu_data->icache.ways = 4; | ||
103 | cpu_data->dcache.ways = 4; | ||
104 | |||
105 | cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_LLSC; | ||
106 | break; | ||
107 | case 0x2006: | ||
108 | case 0x200A: | ||
109 | if (prr == 0x61) | ||
110 | cpu_data->type = CPU_SH7781; | ||
111 | else | ||
112 | cpu_data->type = CPU_SH7780; | ||
113 | |||
114 | cpu_data->icache.ways = 4; | ||
115 | cpu_data->dcache.ways = 4; | ||
116 | |||
117 | cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER | | ||
118 | CPU_HAS_LLSC; | ||
119 | break; | ||
120 | case 0x3000: | ||
121 | case 0x3003: | ||
122 | cpu_data->type = CPU_SH7343; | ||
123 | cpu_data->icache.ways = 4; | ||
124 | cpu_data->dcache.ways = 4; | ||
125 | cpu_data->flags |= CPU_HAS_LLSC; | ||
80 | break; | 126 | break; |
81 | case 0x8000: | 127 | case 0x8000: |
82 | cpu_data->type = CPU_ST40RA; | 128 | cpu_data->type = CPU_ST40RA; |
129 | cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA; | ||
83 | break; | 130 | break; |
84 | case 0x8100: | 131 | case 0x8100: |
85 | cpu_data->type = CPU_ST40GX1; | 132 | cpu_data->type = CPU_ST40GX1; |
133 | cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA; | ||
86 | break; | 134 | break; |
87 | case 0x700: | 135 | case 0x700: |
88 | cpu_data->type = CPU_SH4_501; | 136 | cpu_data->type = CPU_SH4_501; |
89 | cpu_data->icache.ways = 2; | 137 | cpu_data->icache.ways = 2; |
90 | cpu_data->dcache.ways = 2; | 138 | cpu_data->dcache.ways = 2; |
91 | 139 | cpu_data->flags |= CPU_HAS_PTEA; | |
92 | /* No FPU on the SH4-500 series.. */ | ||
93 | cpu_data->flags &= ~CPU_HAS_FPU; | ||
94 | break; | 140 | break; |
95 | case 0x600: | 141 | case 0x600: |
96 | cpu_data->type = CPU_SH4_202; | 142 | cpu_data->type = CPU_SH4_202; |
97 | cpu_data->icache.ways = 2; | 143 | cpu_data->icache.ways = 2; |
98 | cpu_data->dcache.ways = 2; | 144 | cpu_data->dcache.ways = 2; |
145 | cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA; | ||
99 | break; | 146 | break; |
100 | case 0x500 ... 0x501: | 147 | case 0x500 ... 0x501: |
101 | switch (prr) { | 148 | switch (prr) { |
102 | case 0x10: cpu_data->type = CPU_SH7750R; break; | 149 | case 0x10: |
103 | case 0x11: cpu_data->type = CPU_SH7751R; break; | 150 | cpu_data->type = CPU_SH7750R; |
104 | case 0x50: cpu_data->type = CPU_SH7760; break; | 151 | break; |
152 | case 0x11: | ||
153 | cpu_data->type = CPU_SH7751R; | ||
154 | break; | ||
155 | case 0x50 ... 0x5f: | ||
156 | cpu_data->type = CPU_SH7760; | ||
157 | break; | ||
105 | } | 158 | } |
106 | 159 | ||
107 | cpu_data->icache.ways = 2; | 160 | cpu_data->icache.ways = 2; |
108 | cpu_data->dcache.ways = 2; | 161 | cpu_data->dcache.ways = 2; |
109 | 162 | ||
163 | cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA; | ||
164 | |||
110 | break; | 165 | break; |
111 | default: | 166 | default: |
112 | cpu_data->type = CPU_SH_NONE; | 167 | cpu_data->type = CPU_SH_NONE; |
113 | break; | 168 | break; |
114 | } | 169 | } |
115 | 170 | ||
171 | #ifdef CONFIG_SH_DIRECT_MAPPED | ||
172 | cpu_data->icache.ways = 1; | ||
173 | cpu_data->dcache.ways = 1; | ||
174 | #endif | ||
175 | |||
116 | /* | 176 | /* |
117 | * On anything that's not a direct-mapped cache, look to the CVR | 177 | * On anything that's not a direct-mapped cache, look to the CVR |
118 | * for I/D-cache specifics. | 178 | * for I/D-cache specifics. |
@@ -121,18 +181,56 @@ int __init detect_cpu_and_cache_system(void) | |||
121 | size = sizes[(cvr >> 20) & 0xf]; | 181 | size = sizes[(cvr >> 20) & 0xf]; |
122 | cpu_data->icache.way_incr = (size >> 1); | 182 | cpu_data->icache.way_incr = (size >> 1); |
123 | cpu_data->icache.sets = (size >> 6); | 183 | cpu_data->icache.sets = (size >> 6); |
124 | cpu_data->icache.entry_mask = | 184 | |
125 | (cpu_data->icache.way_incr - (1 << 5)); | ||
126 | } | 185 | } |
127 | 186 | ||
187 | /* Setup the rest of the I-cache info */ | ||
188 | cpu_data->icache.entry_mask = cpu_data->icache.way_incr - | ||
189 | cpu_data->icache.linesz; | ||
190 | |||
191 | cpu_data->icache.way_size = cpu_data->icache.sets * | ||
192 | cpu_data->icache.linesz; | ||
193 | |||
194 | /* And the rest of the D-cache */ | ||
128 | if (cpu_data->dcache.ways > 1) { | 195 | if (cpu_data->dcache.ways > 1) { |
129 | size = sizes[(cvr >> 16) & 0xf]; | 196 | size = sizes[(cvr >> 16) & 0xf]; |
130 | cpu_data->dcache.way_incr = (size >> 1); | 197 | cpu_data->dcache.way_incr = (size >> 1); |
131 | cpu_data->dcache.sets = (size >> 6); | 198 | cpu_data->dcache.sets = (size >> 6); |
132 | cpu_data->dcache.entry_mask = | 199 | } |
133 | (cpu_data->dcache.way_incr - (1 << 5)); | 200 | |
201 | cpu_data->dcache.entry_mask = cpu_data->dcache.way_incr - | ||
202 | cpu_data->dcache.linesz; | ||
203 | |||
204 | cpu_data->dcache.way_size = cpu_data->dcache.sets * | ||
205 | cpu_data->dcache.linesz; | ||
206 | |||
207 | /* | ||
208 | * Setup the L2 cache desc | ||
209 | * | ||
210 | * SH-4A's have an optional PIPT L2. | ||
211 | */ | ||
212 | if (cpu_data->flags & CPU_HAS_L2_CACHE) { | ||
213 | /* | ||
214 | * Size calculation is much more sensible | ||
215 | * than it is for the L1. | ||
216 | * | ||
217 | * Sizes are 128KB, 258KB, 512KB, and 1MB. | ||
218 | */ | ||
219 | size = (cvr & 0xf) << 17; | ||
220 | |||
221 | BUG_ON(!size); | ||
222 | |||
223 | cpu_data->scache.way_incr = (1 << 16); | ||
224 | cpu_data->scache.entry_shift = 5; | ||
225 | cpu_data->scache.ways = 4; | ||
226 | cpu_data->scache.linesz = L1_CACHE_BYTES; | ||
227 | cpu_data->scache.entry_mask = | ||
228 | (cpu_data->scache.way_incr - cpu_data->scache.linesz); | ||
229 | cpu_data->scache.sets = size / | ||
230 | (cpu_data->scache.linesz * cpu_data->scache.ways); | ||
231 | cpu_data->scache.way_size = | ||
232 | (cpu_data->scache.sets * cpu_data->scache.linesz); | ||
134 | } | 233 | } |
135 | 234 | ||
136 | return 0; | 235 | return 0; |
137 | } | 236 | } |
138 | |||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh4-202.c b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c new file mode 100644 index 000000000000..6e4e96541358 --- /dev/null +++ b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * SH4-202 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 = 0xffe80000, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCIF, | ||
20 | .irqs = { 40, 41, 43, 42 }, | ||
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 *sh4202_devices[] __initdata = { | ||
35 | &sci_device, | ||
36 | }; | ||
37 | |||
38 | static int __init sh4202_devices_setup(void) | ||
39 | { | ||
40 | return platform_add_devices(sh4202_devices, | ||
41 | ARRAY_SIZE(sh4202_devices)); | ||
42 | } | ||
43 | __initcall(sh4202_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh73180.c b/arch/sh/kernel/cpu/sh4/setup-sh73180.c new file mode 100644 index 000000000000..cc9ea1e2e5df --- /dev/null +++ b/arch/sh/kernel/cpu/sh4/setup-sh73180.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * SH73180 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 = 0xffe80000, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCIF, | ||
20 | .irqs = { 80, 81, 83, 82 }, | ||
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 *sh73180_devices[] __initdata = { | ||
35 | &sci_device, | ||
36 | }; | ||
37 | |||
38 | static int __init sh73180_devices_setup(void) | ||
39 | { | ||
40 | return platform_add_devices(sh73180_devices, | ||
41 | ARRAY_SIZE(sh73180_devices)); | ||
42 | } | ||
43 | __initcall(sh73180_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7343.c b/arch/sh/kernel/cpu/sh4/setup-sh7343.c new file mode 100644 index 000000000000..91d61cf91ba1 --- /dev/null +++ b/arch/sh/kernel/cpu/sh4/setup-sh7343.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * SH7343 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 = 0xffe00000, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCIF, | ||
20 | .irqs = { 80, 81, 83, 82 }, | ||
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 *sh7343_devices[] __initdata = { | ||
35 | &sci_device, | ||
36 | }; | ||
37 | |||
38 | static int __init sh7343_devices_setup(void) | ||
39 | { | ||
40 | return platform_add_devices(sh7343_devices, | ||
41 | ARRAY_SIZE(sh7343_devices)); | ||
42 | } | ||
43 | __initcall(sh7343_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c new file mode 100644 index 000000000000..50812d57c1c1 --- /dev/null +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * SH7750/SH7751 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 = 0xffe00000, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCI, | ||
20 | .irqs = { 23, 24, 25, 0 }, | ||
21 | }, { | ||
22 | .mapbase = 0xffe80000, | ||
23 | .flags = UPF_BOOT_AUTOCONF, | ||
24 | .type = PORT_SCIF, | ||
25 | .irqs = { 40, 41, 43, 42 }, | ||
26 | }, { | ||
27 | .flags = 0, | ||
28 | } | ||
29 | }; | ||
30 | |||
31 | static struct platform_device sci_device = { | ||
32 | .name = "sh-sci", | ||
33 | .id = -1, | ||
34 | .dev = { | ||
35 | .platform_data = sci_platform_data, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | static struct platform_device *sh7750_devices[] __initdata = { | ||
40 | &sci_device, | ||
41 | }; | ||
42 | |||
43 | static int __init sh7750_devices_setup(void) | ||
44 | { | ||
45 | return platform_add_devices(sh7750_devices, | ||
46 | ARRAY_SIZE(sh7750_devices)); | ||
47 | } | ||
48 | __initcall(sh7750_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7760.c b/arch/sh/kernel/cpu/sh4/setup-sh7760.c new file mode 100644 index 000000000000..97f1c9af35d6 --- /dev/null +++ b/arch/sh/kernel/cpu/sh4/setup-sh7760.c | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * SH7760 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 = 0xfe600000, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCIF, | ||
20 | .irqs = { 52, 53, 55, 54 }, | ||
21 | }, { | ||
22 | .mapbase = 0xfe610000, | ||
23 | .flags = UPF_BOOT_AUTOCONF, | ||
24 | .type = PORT_SCIF, | ||
25 | .irqs = { 72, 73, 75, 74 }, | ||
26 | }, { | ||
27 | .mapbase = 0xfe620000, | ||
28 | .flags = UPF_BOOT_AUTOCONF, | ||
29 | .type = PORT_SCIF, | ||
30 | .irqs = { 76, 77, 79, 78 }, | ||
31 | }, { | ||
32 | .flags = 0, | ||
33 | } | ||
34 | }; | ||
35 | |||
36 | static struct platform_device sci_device = { | ||
37 | .name = "sh-sci", | ||
38 | .id = -1, | ||
39 | .dev = { | ||
40 | .platform_data = sci_platform_data, | ||
41 | }, | ||
42 | }; | ||
43 | |||
44 | static struct platform_device *sh7760_devices[] __initdata = { | ||
45 | &sci_device, | ||
46 | }; | ||
47 | |||
48 | static int __init sh7760_devices_setup(void) | ||
49 | { | ||
50 | return platform_add_devices(sh7760_devices, | ||
51 | ARRAY_SIZE(sh7760_devices)); | ||
52 | } | ||
53 | __initcall(sh7760_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7770.c b/arch/sh/kernel/cpu/sh4/setup-sh7770.c new file mode 100644 index 000000000000..6a04cc5f5aca --- /dev/null +++ b/arch/sh/kernel/cpu/sh4/setup-sh7770.c | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * SH7770 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 = 0xff923000, | ||
18 | .flags = UPF_BOOT_AUTOCONF, | ||
19 | .type = PORT_SCIF, | ||
20 | .irqs = { 61, 61, 61, 61 }, | ||
21 | }, { | ||
22 | .mapbase = 0xff924000, | ||
23 | .flags = UPF_BOOT_AUTOCONF, | ||
24 | .type = PORT_SCIF, | ||
25 | .irqs = { 62, 62, 62, 62 }, | ||
26 | }, { | ||
27 | .mapbase = 0xff925000, | ||
28 | .flags = UPF_BOOT_AUTOCONF, | ||
29 | .type = PORT_SCIF, | ||
30 | .irqs = { 63, 63, 63, 63 }, | ||
31 | }, { | ||
32 | .flags = 0, | ||
33 | } | ||
34 | }; | ||
35 | |||
36 | static struct platform_device sci_device = { | ||
37 | .name = "sh-sci", | ||
38 | .id = -1, | ||
39 | .dev = { | ||
40 | .platform_data = sci_platform_data, | ||
41 | }, | ||
42 | }; | ||
43 | |||
44 | static struct platform_device *sh7770_devices[] __initdata = { | ||
45 | &sci_device, | ||
46 | }; | ||
47 | |||
48 | static int __init sh7770_devices_setup(void) | ||
49 | { | ||
50 | return platform_add_devices(sh7770_devices, | ||
51 | ARRAY_SIZE(sh7770_devices)); | ||
52 | } | ||
53 | __initcall(sh7770_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7780.c b/arch/sh/kernel/cpu/sh4/setup-sh7780.c new file mode 100644 index 000000000000..72493f259edc --- /dev/null +++ b/arch/sh/kernel/cpu/sh4/setup-sh7780.c | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * SH7780 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 resource rtc_resources[] = { | ||
16 | [0] = { | ||
17 | .start = 0xffe80000, | ||
18 | .end = 0xffe80000 + 0x58 - 1, | ||
19 | .flags = IORESOURCE_IO, | ||
20 | }, | ||
21 | [1] = { | ||
22 | /* Period IRQ */ | ||
23 | .start = 21, | ||
24 | .flags = IORESOURCE_IRQ, | ||
25 | }, | ||
26 | [2] = { | ||
27 | /* Carry IRQ */ | ||
28 | .start = 22, | ||
29 | .flags = IORESOURCE_IRQ, | ||
30 | }, | ||
31 | [3] = { | ||
32 | /* Alarm IRQ */ | ||
33 | .start = 23, | ||
34 | .flags = IORESOURCE_IRQ, | ||
35 | }, | ||
36 | }; | ||
37 | |||
38 | static struct platform_device rtc_device = { | ||
39 | .name = "sh-rtc", | ||
40 | .id = -1, | ||
41 | .num_resources = ARRAY_SIZE(rtc_resources), | ||
42 | .resource = rtc_resources, | ||
43 | }; | ||
44 | |||
45 | static struct plat_sci_port sci_platform_data[] = { | ||
46 | { | ||
47 | .mapbase = 0xffe00000, | ||
48 | .flags = UPF_BOOT_AUTOCONF, | ||
49 | .type = PORT_SCIF, | ||
50 | .irqs = { 40, 41, 43, 42 }, | ||
51 | }, { | ||
52 | .mapbase = 0xffe10000, | ||
53 | .flags = UPF_BOOT_AUTOCONF, | ||
54 | .type = PORT_SCIF, | ||
55 | .irqs = { 76, 77, 79, 78 }, | ||
56 | }, { | ||
57 | .flags = 0, | ||
58 | } | ||
59 | }; | ||
60 | |||
61 | static struct platform_device sci_device = { | ||
62 | .name = "sh-sci", | ||
63 | .id = -1, | ||
64 | .dev = { | ||
65 | .platform_data = sci_platform_data, | ||
66 | }, | ||
67 | }; | ||
68 | |||
69 | static struct platform_device *sh7780_devices[] __initdata = { | ||
70 | &rtc_device, | ||
71 | &sci_device, | ||
72 | }; | ||
73 | |||
74 | static int __init sh7780_devices_setup(void) | ||
75 | { | ||
76 | return platform_add_devices(sh7780_devices, | ||
77 | ARRAY_SIZE(sh7780_devices)); | ||
78 | } | ||
79 | __initcall(sh7780_devices_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c index b09805f3ee23..7bcc73f9b8df 100644 --- a/arch/sh/kernel/cpu/sh4/sq.c +++ b/arch/sh/kernel/cpu/sh4/sq.c | |||
@@ -1,49 +1,52 @@ | |||
1 | /* | 1 | /* |
2 | * arch/sh/kernel/cpu/sq.c | 2 | * arch/sh/kernel/cpu/sh4/sq.c |
3 | * | 3 | * |
4 | * General management API for SH-4 integrated Store Queues | 4 | * General management API for SH-4 integrated Store Queues |
5 | * | 5 | * |
6 | * Copyright (C) 2001, 2002, 2003, 2004 Paul Mundt | 6 | * Copyright (C) 2001 - 2006 Paul Mundt |
7 | * Copyright (C) 2001, 2002 M. R. Brown | 7 | * Copyright (C) 2001, 2002 M. R. Brown |
8 | * | 8 | * |
9 | * Some of this code has been adopted directly from the old arch/sh/mm/sq.c | ||
10 | * hack that was part of the LinuxDC project. For all intents and purposes, | ||
11 | * this is a completely new interface that really doesn't have much in common | ||
12 | * with the old zone-based approach at all. In fact, it's only listed here for | ||
13 | * general completeness. | ||
14 | * | ||
15 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
16 | * License. See the file "COPYING" in the main directory of this archive | 10 | * License. See the file "COPYING" in the main directory of this archive |
17 | * for more details. | 11 | * for more details. |
18 | */ | 12 | */ |
19 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/cpu.h> | ||
15 | #include <linux/bitmap.h> | ||
16 | #include <linux/sysdev.h> | ||
20 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
21 | #include <linux/module.h> | 18 | #include <linux/module.h> |
22 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
23 | #include <linux/list.h> | ||
24 | #include <linux/proc_fs.h> | ||
25 | #include <linux/miscdevice.h> | ||
26 | #include <linux/vmalloc.h> | 20 | #include <linux/vmalloc.h> |
27 | 21 | #include <linux/mm.h> | |
28 | #include <asm/io.h> | 22 | #include <asm/io.h> |
29 | #include <asm/page.h> | 23 | #include <asm/page.h> |
30 | #include <asm/mmu_context.h> | 24 | #include <asm/cacheflush.h> |
31 | #include <asm/cpu/sq.h> | 25 | #include <asm/cpu/sq.h> |
32 | 26 | ||
33 | static LIST_HEAD(sq_mapping_list); | 27 | struct sq_mapping; |
28 | |||
29 | struct sq_mapping { | ||
30 | const char *name; | ||
31 | |||
32 | unsigned long sq_addr; | ||
33 | unsigned long addr; | ||
34 | unsigned int size; | ||
35 | |||
36 | struct sq_mapping *next; | ||
37 | }; | ||
38 | |||
39 | static struct sq_mapping *sq_mapping_list; | ||
34 | static DEFINE_SPINLOCK(sq_mapping_lock); | 40 | static DEFINE_SPINLOCK(sq_mapping_lock); |
41 | static kmem_cache_t *sq_cache; | ||
42 | static unsigned long *sq_bitmap; | ||
35 | 43 | ||
36 | /** | 44 | #define store_queue_barrier() \ |
37 | * sq_flush - Flush (prefetch) the store queue cache | 45 | do { \ |
38 | * @addr: the store queue address to flush | 46 | (void)ctrl_inl(P4SEG_STORE_QUE); \ |
39 | * | 47 | ctrl_outl(0, P4SEG_STORE_QUE + 0); \ |
40 | * Executes a prefetch instruction on the specified store queue cache, | 48 | ctrl_outl(0, P4SEG_STORE_QUE + 8); \ |
41 | * so that the cached data is written to physical memory. | 49 | } while (0); |
42 | */ | ||
43 | inline void sq_flush(void *addr) | ||
44 | { | ||
45 | __asm__ __volatile__ ("pref @%0" : : "r" (addr) : "memory"); | ||
46 | } | ||
47 | 50 | ||
48 | /** | 51 | /** |
49 | * sq_flush_range - Flush (prefetch) a specific SQ range | 52 | * sq_flush_range - Flush (prefetch) a specific SQ range |
@@ -56,152 +59,73 @@ inline void sq_flush(void *addr) | |||
56 | void sq_flush_range(unsigned long start, unsigned int len) | 59 | void sq_flush_range(unsigned long start, unsigned int len) |
57 | { | 60 | { |
58 | volatile unsigned long *sq = (unsigned long *)start; | 61 | volatile unsigned long *sq = (unsigned long *)start; |
59 | unsigned long dummy; | ||
60 | 62 | ||
61 | /* Flush the queues */ | 63 | /* Flush the queues */ |
62 | for (len >>= 5; len--; sq += 8) | 64 | for (len >>= 5; len--; sq += 8) |
63 | sq_flush((void *)sq); | 65 | prefetchw((void *)sq); |
64 | 66 | ||
65 | /* Wait for completion */ | 67 | /* Wait for completion */ |
66 | dummy = ctrl_inl(P4SEG_STORE_QUE); | 68 | store_queue_barrier(); |
67 | |||
68 | ctrl_outl(0, P4SEG_STORE_QUE + 0); | ||
69 | ctrl_outl(0, P4SEG_STORE_QUE + 8); | ||
70 | } | 69 | } |
71 | 70 | ||
72 | static struct sq_mapping *__sq_alloc_mapping(unsigned long virt, unsigned long phys, unsigned long size, const char *name) | 71 | static inline void sq_mapping_list_add(struct sq_mapping *map) |
73 | { | 72 | { |
74 | struct sq_mapping *map; | 73 | struct sq_mapping **p, *tmp; |
75 | |||
76 | if (virt + size > SQ_ADDRMAX) | ||
77 | return ERR_PTR(-ENOSPC); | ||
78 | |||
79 | map = kmalloc(sizeof(struct sq_mapping), GFP_KERNEL); | ||
80 | if (!map) | ||
81 | return ERR_PTR(-ENOMEM); | ||
82 | 74 | ||
83 | INIT_LIST_HEAD(&map->list); | 75 | spin_lock_irq(&sq_mapping_lock); |
84 | 76 | ||
85 | map->sq_addr = virt; | 77 | p = &sq_mapping_list; |
86 | map->addr = phys; | 78 | while ((tmp = *p) != NULL) |
87 | map->size = size + 1; | 79 | p = &tmp->next; |
88 | map->name = name; | ||
89 | 80 | ||
90 | list_add(&map->list, &sq_mapping_list); | 81 | map->next = tmp; |
82 | *p = map; | ||
91 | 83 | ||
92 | return map; | 84 | spin_unlock_irq(&sq_mapping_lock); |
93 | } | 85 | } |
94 | 86 | ||
95 | static unsigned long __sq_get_next_addr(void) | 87 | static inline void sq_mapping_list_del(struct sq_mapping *map) |
96 | { | 88 | { |
97 | if (!list_empty(&sq_mapping_list)) { | 89 | struct sq_mapping **p, *tmp; |
98 | struct list_head *pos, *tmp; | 90 | |
99 | 91 | spin_lock_irq(&sq_mapping_lock); | |
100 | /* | 92 | |
101 | * Read one off the list head, as it will have the highest | 93 | for (p = &sq_mapping_list; (tmp = *p); p = &tmp->next) |
102 | * mapped allocation. Set the next one up right above it. | 94 | if (tmp == map) { |
103 | * | 95 | *p = tmp->next; |
104 | * This is somewhat sub-optimal, as we don't look at | 96 | break; |
105 | * gaps between allocations or anything lower then the | ||
106 | * highest-level allocation. | ||
107 | * | ||
108 | * However, in the interest of performance and the general | ||
109 | * lack of desire to do constant list rebalancing, we don't | ||
110 | * worry about it. | ||
111 | */ | ||
112 | list_for_each_safe(pos, tmp, &sq_mapping_list) { | ||
113 | struct sq_mapping *entry; | ||
114 | |||
115 | entry = list_entry(pos, typeof(*entry), list); | ||
116 | |||
117 | return entry->sq_addr + entry->size; | ||
118 | } | 97 | } |
119 | } | ||
120 | 98 | ||
121 | return P4SEG_STORE_QUE; | 99 | spin_unlock_irq(&sq_mapping_lock); |
122 | } | 100 | } |
123 | 101 | ||
124 | /** | 102 | static int __sq_remap(struct sq_mapping *map, unsigned long flags) |
125 | * __sq_remap - Perform a translation from the SQ to a phys addr | ||
126 | * @map: sq mapping containing phys and store queue addresses. | ||
127 | * | ||
128 | * Maps the store queue address specified in the mapping to the physical | ||
129 | * address specified in the mapping. | ||
130 | */ | ||
131 | static struct sq_mapping *__sq_remap(struct sq_mapping *map) | ||
132 | { | 103 | { |
133 | unsigned long flags, pteh, ptel; | 104 | #if defined(CONFIG_MMU) |
134 | struct vm_struct *vma; | 105 | struct vm_struct *vma; |
135 | pgprot_t pgprot; | ||
136 | |||
137 | /* | ||
138 | * Without an MMU (or with it turned off), this is much more | ||
139 | * straightforward, as we can just load up each queue's QACR with | ||
140 | * the physical address appropriately masked. | ||
141 | */ | ||
142 | |||
143 | ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR0); | ||
144 | ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR1); | ||
145 | 106 | ||
146 | #ifdef CONFIG_MMU | ||
147 | /* | ||
148 | * With an MMU on the other hand, things are slightly more involved. | ||
149 | * Namely, we have to have a direct mapping between the SQ addr and | ||
150 | * the associated physical address in the UTLB by way of setting up | ||
151 | * a virt<->phys translation by hand. We do this by simply specifying | ||
152 | * the SQ addr in UTLB.VPN and the associated physical address in | ||
153 | * UTLB.PPN. | ||
154 | * | ||
155 | * Notably, even though this is a special case translation, and some | ||
156 | * of the configuration bits are meaningless, we're still required | ||
157 | * to have a valid ASID context in PTEH. | ||
158 | * | ||
159 | * We could also probably get by without explicitly setting PTEA, but | ||
160 | * we do it here just for good measure. | ||
161 | */ | ||
162 | spin_lock_irqsave(&sq_mapping_lock, flags); | ||
163 | |||
164 | pteh = map->sq_addr; | ||
165 | ctrl_outl((pteh & MMU_VPN_MASK) | get_asid(), MMU_PTEH); | ||
166 | |||
167 | ptel = map->addr & PAGE_MASK; | ||
168 | ctrl_outl(((ptel >> 28) & 0xe) | (ptel & 0x1), MMU_PTEA); | ||
169 | |||
170 | pgprot = pgprot_noncached(PAGE_KERNEL); | ||
171 | |||
172 | ptel &= _PAGE_FLAGS_HARDWARE_MASK; | ||
173 | ptel |= pgprot_val(pgprot); | ||
174 | ctrl_outl(ptel, MMU_PTEL); | ||
175 | |||
176 | __asm__ __volatile__ ("ldtlb" : : : "memory"); | ||
177 | |||
178 | spin_unlock_irqrestore(&sq_mapping_lock, flags); | ||
179 | |||
180 | /* | ||
181 | * Next, we need to map ourselves in the kernel page table, so that | ||
182 | * future accesses after a TLB flush will be handled when we take a | ||
183 | * page fault. | ||
184 | * | ||
185 | * Theoretically we could just do this directly and not worry about | ||
186 | * setting up the translation by hand ahead of time, but for the | ||
187 | * cases where we want a one-shot SQ mapping followed by a quick | ||
188 | * writeout before we hit the TLB flush, we do it anyways. This way | ||
189 | * we at least save ourselves the initial page fault overhead. | ||
190 | */ | ||
191 | vma = __get_vm_area(map->size, VM_ALLOC, map->sq_addr, SQ_ADDRMAX); | 107 | vma = __get_vm_area(map->size, VM_ALLOC, map->sq_addr, SQ_ADDRMAX); |
192 | if (!vma) | 108 | if (!vma) |
193 | return ERR_PTR(-ENOMEM); | 109 | return -ENOMEM; |
194 | 110 | ||
195 | vma->phys_addr = map->addr; | 111 | vma->phys_addr = map->addr; |
196 | 112 | ||
197 | if (remap_area_pages((unsigned long)vma->addr, vma->phys_addr, | 113 | if (remap_area_pages((unsigned long)vma->addr, vma->phys_addr, |
198 | map->size, pgprot_val(pgprot))) { | 114 | map->size, flags)) { |
199 | vunmap(vma->addr); | 115 | vunmap(vma->addr); |
200 | return NULL; | 116 | return -EAGAIN; |
201 | } | 117 | } |
202 | #endif /* CONFIG_MMU */ | 118 | #else |
119 | /* | ||
120 | * Without an MMU (or with it turned off), this is much more | ||
121 | * straightforward, as we can just load up each queue's QACR with | ||
122 | * the physical address appropriately masked. | ||
123 | */ | ||
124 | ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR0); | ||
125 | ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR1); | ||
126 | #endif | ||
203 | 127 | ||
204 | return map; | 128 | return 0; |
205 | } | 129 | } |
206 | 130 | ||
207 | /** | 131 | /** |
@@ -209,42 +133,65 @@ static struct sq_mapping *__sq_remap(struct sq_mapping *map) | |||
209 | * @phys: Physical address of mapping. | 133 | * @phys: Physical address of mapping. |
210 | * @size: Length of mapping. | 134 | * @size: Length of mapping. |
211 | * @name: User invoking mapping. | 135 | * @name: User invoking mapping. |
136 | * @flags: Protection flags. | ||
212 | * | 137 | * |
213 | * Remaps the physical address @phys through the next available store queue | 138 | * Remaps the physical address @phys through the next available store queue |
214 | * address of @size length. @name is logged at boot time as well as through | 139 | * address of @size length. @name is logged at boot time as well as through |
215 | * the procfs interface. | 140 | * the sysfs interface. |
216 | * | ||
217 | * A pre-allocated and filled sq_mapping pointer is returned, and must be | ||
218 | * cleaned up with a call to sq_unmap() when the user is done with the | ||
219 | * mapping. | ||
220 | */ | 141 | */ |
221 | struct sq_mapping *sq_remap(unsigned long phys, unsigned int size, const char *name) | 142 | unsigned long sq_remap(unsigned long phys, unsigned int size, |
143 | const char *name, unsigned long flags) | ||
222 | { | 144 | { |
223 | struct sq_mapping *map; | 145 | struct sq_mapping *map; |
224 | unsigned long virt, end; | 146 | unsigned long end; |
225 | unsigned int psz; | 147 | unsigned int psz; |
148 | int ret, page; | ||
226 | 149 | ||
227 | /* Don't allow wraparound or zero size */ | 150 | /* Don't allow wraparound or zero size */ |
228 | end = phys + size - 1; | 151 | end = phys + size - 1; |
229 | if (!size || end < phys) | 152 | if (unlikely(!size || end < phys)) |
230 | return NULL; | 153 | return -EINVAL; |
231 | /* Don't allow anyone to remap normal memory.. */ | 154 | /* Don't allow anyone to remap normal memory.. */ |
232 | if (phys < virt_to_phys(high_memory)) | 155 | if (unlikely(phys < virt_to_phys(high_memory))) |
233 | return NULL; | 156 | return -EINVAL; |
234 | 157 | ||
235 | phys &= PAGE_MASK; | 158 | phys &= PAGE_MASK; |
159 | size = PAGE_ALIGN(end + 1) - phys; | ||
160 | |||
161 | map = kmem_cache_alloc(sq_cache, GFP_KERNEL); | ||
162 | if (unlikely(!map)) | ||
163 | return -ENOMEM; | ||
164 | |||
165 | map->addr = phys; | ||
166 | map->size = size; | ||
167 | map->name = name; | ||
168 | |||
169 | page = bitmap_find_free_region(sq_bitmap, 0x04000000, | ||
170 | get_order(map->size)); | ||
171 | if (unlikely(page < 0)) { | ||
172 | ret = -ENOSPC; | ||
173 | goto out; | ||
174 | } | ||
175 | |||
176 | map->sq_addr = P4SEG_STORE_QUE + (page << PAGE_SHIFT); | ||
177 | |||
178 | ret = __sq_remap(map, flags); | ||
179 | if (unlikely(ret != 0)) | ||
180 | goto out; | ||
181 | |||
182 | psz = (size + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
183 | pr_info("sqremap: %15s [%4d page%s] va 0x%08lx pa 0x%08lx\n", | ||
184 | likely(map->name) ? map->name : "???", | ||
185 | psz, psz == 1 ? " " : "s", | ||
186 | map->sq_addr, map->addr); | ||
236 | 187 | ||
237 | size = PAGE_ALIGN(end + 1) - phys; | 188 | sq_mapping_list_add(map); |
238 | virt = __sq_get_next_addr(); | ||
239 | psz = (size + (PAGE_SIZE - 1)) / PAGE_SIZE; | ||
240 | map = __sq_alloc_mapping(virt, phys, size, name); | ||
241 | 189 | ||
242 | printk("sqremap: %15s [%4d page%s] va 0x%08lx pa 0x%08lx\n", | 190 | return map->sq_addr; |
243 | map->name ? map->name : "???", | ||
244 | psz, psz == 1 ? " " : "s", | ||
245 | map->sq_addr, map->addr); | ||
246 | 191 | ||
247 | return __sq_remap(map); | 192 | out: |
193 | kmem_cache_free(sq_cache, map); | ||
194 | return ret; | ||
248 | } | 195 | } |
249 | 196 | ||
250 | /** | 197 | /** |
@@ -255,188 +202,198 @@ struct sq_mapping *sq_remap(unsigned long phys, unsigned int size, const char *n | |||
255 | * sq_remap(). Also frees up the pte that was previously inserted into | 202 | * sq_remap(). Also frees up the pte that was previously inserted into |
256 | * the kernel page table and discards the UTLB translation. | 203 | * the kernel page table and discards the UTLB translation. |
257 | */ | 204 | */ |
258 | void sq_unmap(struct sq_mapping *map) | 205 | void sq_unmap(unsigned long vaddr) |
259 | { | 206 | { |
260 | if (map->sq_addr > (unsigned long)high_memory) | 207 | struct sq_mapping **p, *map; |
261 | vfree((void *)(map->sq_addr & PAGE_MASK)); | 208 | struct vm_struct *vma; |
209 | int page; | ||
262 | 210 | ||
263 | list_del(&map->list); | 211 | for (p = &sq_mapping_list; (map = *p); p = &map->next) |
264 | kfree(map); | 212 | if (map->sq_addr == vaddr) |
265 | } | 213 | break; |
266 | 214 | ||
267 | /** | 215 | if (unlikely(!map)) { |
268 | * sq_clear - Clear a store queue range | 216 | printk("%s: bad store queue address 0x%08lx\n", |
269 | * @addr: Address to start clearing from. | 217 | __FUNCTION__, vaddr); |
270 | * @len: Length to clear. | 218 | return; |
271 | * | 219 | } |
272 | * A quick zero-fill implementation for clearing out memory that has been | ||
273 | * remapped through the store queues. | ||
274 | */ | ||
275 | void sq_clear(unsigned long addr, unsigned int len) | ||
276 | { | ||
277 | int i; | ||
278 | 220 | ||
279 | /* Clear out both queues linearly */ | 221 | page = (map->sq_addr - P4SEG_STORE_QUE) >> PAGE_SHIFT; |
280 | for (i = 0; i < 8; i++) { | 222 | bitmap_release_region(sq_bitmap, page, get_order(map->size)); |
281 | ctrl_outl(0, addr + i + 0); | 223 | |
282 | ctrl_outl(0, addr + i + 8); | 224 | #ifdef CONFIG_MMU |
225 | vma = remove_vm_area((void *)(map->sq_addr & PAGE_MASK)); | ||
226 | if (!vma) { | ||
227 | printk(KERN_ERR "%s: bad address 0x%08lx\n", | ||
228 | __FUNCTION__, map->sq_addr); | ||
229 | return; | ||
283 | } | 230 | } |
231 | #endif | ||
232 | |||
233 | sq_mapping_list_del(map); | ||
284 | 234 | ||
285 | sq_flush_range(addr, len); | 235 | kmem_cache_free(sq_cache, map); |
286 | } | 236 | } |
287 | 237 | ||
288 | /** | 238 | /* |
289 | * sq_vma_unmap - Unmap a VMA range | 239 | * Needlessly complex sysfs interface. Unfortunately it doesn't seem like |
290 | * @area: VMA containing range. | 240 | * there is any other easy way to add things on a per-cpu basis without |
291 | * @addr: Start of range. | 241 | * putting the directory entries somewhere stupid and having to create |
292 | * @len: Length of range. | 242 | * links in sysfs by hand back in to the per-cpu directories. |
293 | * | 243 | * |
294 | * Searches the sq_mapping_list for a mapping matching the sq addr @addr, | 244 | * Some day we may want to have an additional abstraction per store |
295 | * and subsequently frees up the entry. Further cleanup is done by generic | 245 | * queue, but considering the kobject hell we already have to deal with, |
296 | * code. | 246 | * it's simply not worth the trouble. |
297 | */ | 247 | */ |
298 | static void sq_vma_unmap(struct vm_area_struct *area, | 248 | static struct kobject *sq_kobject[NR_CPUS]; |
299 | unsigned long addr, size_t len) | ||
300 | { | ||
301 | struct list_head *pos, *tmp; | ||
302 | 249 | ||
303 | list_for_each_safe(pos, tmp, &sq_mapping_list) { | 250 | struct sq_sysfs_attr { |
304 | struct sq_mapping *entry; | 251 | struct attribute attr; |
252 | ssize_t (*show)(char *buf); | ||
253 | ssize_t (*store)(const char *buf, size_t count); | ||
254 | }; | ||
305 | 255 | ||
306 | entry = list_entry(pos, typeof(*entry), list); | 256 | #define to_sq_sysfs_attr(attr) container_of(attr, struct sq_sysfs_attr, attr) |
307 | 257 | ||
308 | if (entry->sq_addr == addr) { | 258 | static ssize_t sq_sysfs_show(struct kobject *kobj, struct attribute *attr, |
309 | /* | 259 | char *buf) |
310 | * We could probably get away without doing the tlb flush | 260 | { |
311 | * here, as generic code should take care of most of this | 261 | struct sq_sysfs_attr *sattr = to_sq_sysfs_attr(attr); |
312 | * when unmapping the rest of the VMA range for us. Leave | ||
313 | * it in for added sanity for the time being.. | ||
314 | */ | ||
315 | __flush_tlb_page(get_asid(), entry->sq_addr & PAGE_MASK); | ||
316 | 262 | ||
317 | list_del(&entry->list); | 263 | if (likely(sattr->show)) |
318 | kfree(entry); | 264 | return sattr->show(buf); |
319 | 265 | ||
320 | return; | 266 | return -EIO; |
321 | } | ||
322 | } | ||
323 | } | 267 | } |
324 | 268 | ||
325 | /** | 269 | static ssize_t sq_sysfs_store(struct kobject *kobj, struct attribute *attr, |
326 | * sq_vma_sync - Sync a VMA range | 270 | const char *buf, size_t count) |
327 | * @area: VMA containing range. | ||
328 | * @start: Start of range. | ||
329 | * @len: Length of range. | ||
330 | * @flags: Additional flags. | ||
331 | * | ||
332 | * Synchronizes an sq mapped range by flushing the store queue cache for | ||
333 | * the duration of the mapping. | ||
334 | * | ||
335 | * Used internally for user mappings, which must use msync() to prefetch | ||
336 | * the store queue cache. | ||
337 | */ | ||
338 | static int sq_vma_sync(struct vm_area_struct *area, | ||
339 | unsigned long start, size_t len, unsigned int flags) | ||
340 | { | 271 | { |
341 | sq_flush_range(start, len); | 272 | struct sq_sysfs_attr *sattr = to_sq_sysfs_attr(attr); |
342 | 273 | ||
343 | return 0; | 274 | if (likely(sattr->store)) |
275 | return sattr->store(buf, count); | ||
276 | |||
277 | return -EIO; | ||
344 | } | 278 | } |
345 | 279 | ||
346 | static struct vm_operations_struct sq_vma_ops = { | 280 | static ssize_t mapping_show(char *buf) |
347 | .unmap = sq_vma_unmap, | 281 | { |
348 | .sync = sq_vma_sync, | 282 | struct sq_mapping **list, *entry; |
349 | }; | 283 | char *p = buf; |
350 | 284 | ||
351 | /** | 285 | for (list = &sq_mapping_list; (entry = *list); list = &entry->next) |
352 | * sq_mmap - mmap() for /dev/cpu/sq | 286 | p += sprintf(p, "%08lx-%08lx [%08lx]: %s\n", |
353 | * @file: unused. | 287 | entry->sq_addr, entry->sq_addr + entry->size, |
354 | * @vma: VMA to remap. | 288 | entry->addr, entry->name); |
355 | * | 289 | |
356 | * Remap the specified vma @vma through the store queues, and setup associated | 290 | return p - buf; |
357 | * information for the new mapping. Also build up the page tables for the new | 291 | } |
358 | * area. | 292 | |
359 | */ | 293 | static ssize_t mapping_store(const char *buf, size_t count) |
360 | static int sq_mmap(struct file *file, struct vm_area_struct *vma) | ||
361 | { | 294 | { |
362 | unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; | 295 | unsigned long base = 0, len = 0; |
363 | unsigned long size = vma->vm_end - vma->vm_start; | ||
364 | struct sq_mapping *map; | ||
365 | 296 | ||
366 | /* | 297 | sscanf(buf, "%lx %lx", &base, &len); |
367 | * We're not interested in any arbitrary virtual address that has | 298 | if (!base) |
368 | * been stuck in the VMA, as we already know what addresses we | 299 | return -EIO; |
369 | * want. Save off the size, and reposition the VMA to begin at | ||
370 | * the next available sq address. | ||
371 | */ | ||
372 | vma->vm_start = __sq_get_next_addr(); | ||
373 | vma->vm_end = vma->vm_start + size; | ||
374 | 300 | ||
375 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | 301 | if (likely(len)) { |
302 | int ret = sq_remap(base, len, "Userspace", | ||
303 | pgprot_val(PAGE_SHARED)); | ||
304 | if (ret < 0) | ||
305 | return ret; | ||
306 | } else | ||
307 | sq_unmap(base); | ||
376 | 308 | ||
377 | vma->vm_flags |= VM_IO | VM_RESERVED; | 309 | return count; |
310 | } | ||
378 | 311 | ||
379 | map = __sq_alloc_mapping(vma->vm_start, offset, size, "Userspace"); | 312 | static struct sq_sysfs_attr mapping_attr = |
313 | __ATTR(mapping, 0644, mapping_show, mapping_store); | ||
380 | 314 | ||
381 | if (io_remap_pfn_range(vma, map->sq_addr, map->addr >> PAGE_SHIFT, | 315 | static struct attribute *sq_sysfs_attrs[] = { |
382 | size, vma->vm_page_prot)) | 316 | &mapping_attr.attr, |
383 | return -EAGAIN; | 317 | NULL, |
318 | }; | ||
384 | 319 | ||
385 | vma->vm_ops = &sq_vma_ops; | 320 | static struct sysfs_ops sq_sysfs_ops = { |
321 | .show = sq_sysfs_show, | ||
322 | .store = sq_sysfs_store, | ||
323 | }; | ||
386 | 324 | ||
387 | return 0; | 325 | static struct kobj_type ktype_percpu_entry = { |
388 | } | 326 | .sysfs_ops = &sq_sysfs_ops, |
327 | .default_attrs = sq_sysfs_attrs, | ||
328 | }; | ||
389 | 329 | ||
390 | #ifdef CONFIG_PROC_FS | 330 | static int __devinit sq_sysdev_add(struct sys_device *sysdev) |
391 | static int sq_mapping_read_proc(char *buf, char **start, off_t off, | ||
392 | int len, int *eof, void *data) | ||
393 | { | 331 | { |
394 | struct list_head *pos; | 332 | unsigned int cpu = sysdev->id; |
395 | char *p = buf; | 333 | struct kobject *kobj; |
396 | 334 | ||
397 | list_for_each_prev(pos, &sq_mapping_list) { | 335 | sq_kobject[cpu] = kzalloc(sizeof(struct kobject), GFP_KERNEL); |
398 | struct sq_mapping *entry; | 336 | if (unlikely(!sq_kobject[cpu])) |
337 | return -ENOMEM; | ||
399 | 338 | ||
400 | entry = list_entry(pos, typeof(*entry), list); | 339 | kobj = sq_kobject[cpu]; |
340 | kobj->parent = &sysdev->kobj; | ||
341 | kobject_set_name(kobj, "%s", "sq"); | ||
342 | kobj->ktype = &ktype_percpu_entry; | ||
401 | 343 | ||
402 | p += sprintf(p, "%08lx-%08lx [%08lx]: %s\n", entry->sq_addr, | 344 | return kobject_register(kobj); |
403 | entry->sq_addr + entry->size - 1, entry->addr, | ||
404 | entry->name); | ||
405 | } | ||
406 | |||
407 | return p - buf; | ||
408 | } | 345 | } |
409 | #endif | ||
410 | 346 | ||
411 | static struct file_operations sq_fops = { | 347 | static int __devexit sq_sysdev_remove(struct sys_device *sysdev) |
412 | .owner = THIS_MODULE, | 348 | { |
413 | .mmap = sq_mmap, | 349 | unsigned int cpu = sysdev->id; |
414 | }; | 350 | struct kobject *kobj = sq_kobject[cpu]; |
415 | 351 | ||
416 | static struct miscdevice sq_dev = { | 352 | kobject_unregister(kobj); |
417 | .minor = STORE_QUEUE_MINOR, | 353 | return 0; |
418 | .name = "sq", | 354 | } |
419 | .fops = &sq_fops, | 355 | |
356 | static struct sysdev_driver sq_sysdev_driver = { | ||
357 | .add = sq_sysdev_add, | ||
358 | .remove = __devexit_p(sq_sysdev_remove), | ||
420 | }; | 359 | }; |
421 | 360 | ||
422 | static int __init sq_api_init(void) | 361 | static int __init sq_api_init(void) |
423 | { | 362 | { |
424 | int ret; | 363 | unsigned int nr_pages = 0x04000000 >> PAGE_SHIFT; |
364 | unsigned int size = (nr_pages + (BITS_PER_LONG - 1)) / BITS_PER_LONG; | ||
365 | int ret = -ENOMEM; | ||
366 | |||
425 | printk(KERN_NOTICE "sq: Registering store queue API.\n"); | 367 | printk(KERN_NOTICE "sq: Registering store queue API.\n"); |
426 | 368 | ||
427 | create_proc_read_entry("sq_mapping", 0, 0, sq_mapping_read_proc, 0); | 369 | sq_cache = kmem_cache_create("store_queue_cache", |
370 | sizeof(struct sq_mapping), 0, 0, | ||
371 | NULL, NULL); | ||
372 | if (unlikely(!sq_cache)) | ||
373 | return ret; | ||
428 | 374 | ||
429 | ret = misc_register(&sq_dev); | 375 | sq_bitmap = kzalloc(size, GFP_KERNEL); |
430 | if (ret) | 376 | if (unlikely(!sq_bitmap)) |
431 | remove_proc_entry("sq_mapping", NULL); | 377 | goto out; |
378 | |||
379 | ret = sysdev_driver_register(&cpu_sysdev_class, &sq_sysdev_driver); | ||
380 | if (unlikely(ret != 0)) | ||
381 | goto out; | ||
382 | |||
383 | return 0; | ||
384 | |||
385 | out: | ||
386 | kfree(sq_bitmap); | ||
387 | kmem_cache_destroy(sq_cache); | ||
432 | 388 | ||
433 | return ret; | 389 | return ret; |
434 | } | 390 | } |
435 | 391 | ||
436 | static void __exit sq_api_exit(void) | 392 | static void __exit sq_api_exit(void) |
437 | { | 393 | { |
438 | misc_deregister(&sq_dev); | 394 | sysdev_driver_unregister(&cpu_sysdev_class, &sq_sysdev_driver); |
439 | remove_proc_entry("sq_mapping", NULL); | 395 | kfree(sq_bitmap); |
396 | kmem_cache_destroy(sq_cache); | ||
440 | } | 397 | } |
441 | 398 | ||
442 | module_init(sq_api_init); | 399 | module_init(sq_api_init); |
@@ -445,11 +402,7 @@ module_exit(sq_api_exit); | |||
445 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, M. R. Brown <mrbrown@0xd6.org>"); | 402 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, M. R. Brown <mrbrown@0xd6.org>"); |
446 | MODULE_DESCRIPTION("Simple API for SH-4 integrated Store Queues"); | 403 | MODULE_DESCRIPTION("Simple API for SH-4 integrated Store Queues"); |
447 | MODULE_LICENSE("GPL"); | 404 | MODULE_LICENSE("GPL"); |
448 | MODULE_ALIAS_MISCDEV(STORE_QUEUE_MINOR); | ||
449 | 405 | ||
450 | EXPORT_SYMBOL(sq_remap); | 406 | EXPORT_SYMBOL(sq_remap); |
451 | EXPORT_SYMBOL(sq_unmap); | 407 | EXPORT_SYMBOL(sq_unmap); |
452 | EXPORT_SYMBOL(sq_clear); | ||
453 | EXPORT_SYMBOL(sq_flush); | ||
454 | EXPORT_SYMBOL(sq_flush_range); | 408 | EXPORT_SYMBOL(sq_flush_range); |
455 | |||
diff --git a/arch/sh/kernel/early_printk.c b/arch/sh/kernel/early_printk.c index 1378db375e17..a00022722e9e 100644 --- a/arch/sh/kernel/early_printk.c +++ b/arch/sh/kernel/early_printk.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1999, 2000 Niibe Yutaka | 4 | * Copyright (C) 1999, 2000 Niibe Yutaka |
5 | * Copyright (C) 2002 M. R. Brown | 5 | * Copyright (C) 2002 M. R. Brown |
6 | * Copyright (C) 2004 Paul Mundt | 6 | * Copyright (C) 2004 - 2006 Paul Mundt |
7 | * | 7 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
@@ -49,7 +49,7 @@ static int __init sh_console_setup(struct console *co, char *options) | |||
49 | return 0; | 49 | return 0; |
50 | } | 50 | } |
51 | 51 | ||
52 | static struct console early_console = { | 52 | static struct console bios_console = { |
53 | .name = "bios", | 53 | .name = "bios", |
54 | .write = sh_console_write, | 54 | .write = sh_console_write, |
55 | .setup = sh_console_setup, | 55 | .setup = sh_console_setup, |
@@ -59,34 +59,43 @@ static struct console early_console = { | |||
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | #ifdef CONFIG_EARLY_SCIF_CONSOLE | 61 | #ifdef CONFIG_EARLY_SCIF_CONSOLE |
62 | #include <linux/serial_core.h> | ||
63 | #include "../../../drivers/serial/sh-sci.h" | ||
64 | |||
65 | #ifdef CONFIG_CPU_SH4 | ||
62 | #define SCIF_REG 0xffe80000 | 66 | #define SCIF_REG 0xffe80000 |
67 | #elif defined(CONFIG_CPU_SUBTYPE_SH72060) | ||
68 | #define SCIF_REG 0xfffe9800 | ||
69 | #else | ||
70 | #error "Undefined SCIF for this subtype" | ||
71 | #endif | ||
72 | |||
73 | static struct uart_port scif_port = { | ||
74 | .mapbase = SCIF_REG, | ||
75 | .membase = (char __iomem *)SCIF_REG, | ||
76 | }; | ||
63 | 77 | ||
64 | static void scif_sercon_putc(int c) | 78 | static void scif_sercon_putc(int c) |
65 | { | 79 | { |
66 | while (!(ctrl_inw(SCIF_REG + 0x10) & 0x20)) ; | 80 | while (((sci_in(&scif_port, SCFDR) & 0x1f00 >> 8) == 16)) |
81 | ; | ||
67 | 82 | ||
68 | ctrl_outb(c, SCIF_REG + 12); | 83 | sci_out(&scif_port, SCxTDR, c); |
69 | ctrl_outw((ctrl_inw(SCIF_REG + 0x10) & 0x9f), SCIF_REG + 0x10); | 84 | sci_in(&scif_port, SCxSR); |
85 | sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); | ||
86 | |||
87 | while ((sci_in(&scif_port, SCxSR) & 0x40) == 0); | ||
88 | ; | ||
70 | 89 | ||
71 | if (c == '\n') | 90 | if (c == '\n') |
72 | scif_sercon_putc('\r'); | 91 | scif_sercon_putc('\r'); |
73 | } | 92 | } |
74 | 93 | ||
75 | static void scif_sercon_flush(void) | 94 | static void scif_sercon_write(struct console *con, const char *s, |
76 | { | 95 | unsigned count) |
77 | ctrl_outw((ctrl_inw(SCIF_REG + 0x10) & 0xbf), SCIF_REG + 0x10); | ||
78 | |||
79 | while (!(ctrl_inw(SCIF_REG + 0x10) & 0x40)) ; | ||
80 | |||
81 | ctrl_outw((ctrl_inw(SCIF_REG + 0x10) & 0xbf), SCIF_REG + 0x10); | ||
82 | } | ||
83 | |||
84 | static void scif_sercon_write(struct console *con, const char *s, unsigned count) | ||
85 | { | 96 | { |
86 | while (count-- > 0) | 97 | while (count-- > 0) |
87 | scif_sercon_putc(*s++); | 98 | scif_sercon_putc(*s++); |
88 | |||
89 | scif_sercon_flush(); | ||
90 | } | 99 | } |
91 | 100 | ||
92 | static int __init scif_sercon_setup(struct console *con, char *options) | 101 | static int __init scif_sercon_setup(struct console *con, char *options) |
@@ -96,7 +105,7 @@ static int __init scif_sercon_setup(struct console *con, char *options) | |||
96 | return 0; | 105 | return 0; |
97 | } | 106 | } |
98 | 107 | ||
99 | static struct console early_console = { | 108 | static struct console scif_console = { |
100 | .name = "sercon", | 109 | .name = "sercon", |
101 | .write = scif_sercon_write, | 110 | .write = scif_sercon_write, |
102 | .setup = scif_sercon_setup, | 111 | .setup = scif_sercon_setup, |
@@ -104,7 +113,7 @@ static struct console early_console = { | |||
104 | .index = -1, | 113 | .index = -1, |
105 | }; | 114 | }; |
106 | 115 | ||
107 | void scif_sercon_init(int baud) | 116 | static void scif_sercon_init(int baud) |
108 | { | 117 | { |
109 | ctrl_outw(0, SCIF_REG + 8); | 118 | ctrl_outw(0, SCIF_REG + 8); |
110 | ctrl_outw(0, SCIF_REG); | 119 | ctrl_outw(0, SCIF_REG); |
@@ -122,16 +131,61 @@ void scif_sercon_init(int baud) | |||
122 | } | 131 | } |
123 | #endif | 132 | #endif |
124 | 133 | ||
125 | void __init enable_early_printk(void) | 134 | /* |
135 | * Setup a default console, if more than one is compiled in, rely on the | ||
136 | * earlyprintk= parsing to give priority. | ||
137 | */ | ||
138 | static struct console *early_console = | ||
139 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
140 | &bios_console | ||
141 | #elif defined(CONFIG_EARLY_SCIF_CONSOLE) | ||
142 | &scif_console | ||
143 | #else | ||
144 | NULL | ||
145 | #endif | ||
146 | ; | ||
147 | |||
148 | static int __initdata keep_early; | ||
149 | |||
150 | int __init setup_early_printk(char *opt) | ||
126 | { | 151 | { |
127 | #ifdef CONFIG_EARLY_SCIF_CONSOLE | 152 | char *space; |
128 | scif_sercon_init(115200); | 153 | char buf[256]; |
154 | |||
155 | strlcpy(buf, opt, sizeof(buf)); | ||
156 | space = strchr(buf, ' '); | ||
157 | if (space) | ||
158 | *space = 0; | ||
159 | |||
160 | if (strstr(buf, "keep")) | ||
161 | keep_early = 1; | ||
162 | |||
163 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
164 | if (!strncmp(buf, "bios", 4)) | ||
165 | early_console = &bios_console; | ||
166 | #endif | ||
167 | #if defined(CONFIG_EARLY_SCIF_CONSOLE) | ||
168 | if (!strncmp(buf, "serial", 6)) { | ||
169 | early_console = &scif_console; | ||
170 | |||
171 | #ifdef CONFIG_CPU_SH4 | ||
172 | scif_sercon_init(115200); | ||
173 | #endif | ||
174 | } | ||
129 | #endif | 175 | #endif |
130 | register_console(&early_console); | 176 | |
177 | if (likely(early_console)) | ||
178 | register_console(early_console); | ||
179 | |||
180 | return 1; | ||
131 | } | 181 | } |
182 | __setup("earlyprintk=", setup_early_printk); | ||
132 | 183 | ||
133 | void disable_early_printk(void) | 184 | void __init disable_early_printk(void) |
134 | { | 185 | { |
135 | unregister_console(&early_console); | 186 | if (!keep_early) { |
187 | printk("disabling early console\n"); | ||
188 | unregister_console(early_console); | ||
189 | } else | ||
190 | printk("keeping early console\n"); | ||
136 | } | 191 | } |
137 | |||
diff --git a/arch/sh/kernel/entry.S b/arch/sh/kernel/entry.S index 7dfd2ba75f7f..fe8221855b28 100644 --- a/arch/sh/kernel/entry.S +++ b/arch/sh/kernel/entry.S | |||
@@ -18,24 +18,6 @@ | |||
18 | #include <asm/cpu/mmu_context.h> | 18 | #include <asm/cpu/mmu_context.h> |
19 | #include <asm/unistd.h> | 19 | #include <asm/unistd.h> |
20 | 20 | ||
21 | #if !defined(CONFIG_NFSD) && !defined(CONFIG_NFSD_MODULE) | ||
22 | #define sys_nfsservctl sys_ni_syscall | ||
23 | #endif | ||
24 | |||
25 | #if !defined(CONFIG_MMU) | ||
26 | #define sys_madvise sys_ni_syscall | ||
27 | #define sys_readahead sys_ni_syscall | ||
28 | #define sys_mprotect sys_ni_syscall | ||
29 | #define sys_msync sys_ni_syscall | ||
30 | #define sys_mlock sys_ni_syscall | ||
31 | #define sys_munlock sys_ni_syscall | ||
32 | #define sys_mlockall sys_ni_syscall | ||
33 | #define sys_munlockall sys_ni_syscall | ||
34 | #define sys_mremap sys_ni_syscall | ||
35 | #define sys_mincore sys_ni_syscall | ||
36 | #define sys_remap_file_pages sys_ni_syscall | ||
37 | #endif | ||
38 | |||
39 | ! NOTE: | 21 | ! NOTE: |
40 | ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address | 22 | ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address |
41 | ! to be jumped is too far, but it causes illegal slot exception. | 23 | ! to be jumped is too far, but it causes illegal slot exception. |
@@ -326,7 +308,7 @@ ENTRY(exception_error) | |||
326 | .align 2 | 308 | .align 2 |
327 | ret_from_exception: | 309 | ret_from_exception: |
328 | preempt_stop() | 310 | preempt_stop() |
329 | ret_from_irq: | 311 | ENTRY(ret_from_irq) |
330 | ! | 312 | ! |
331 | mov #OFF_SR, r0 | 313 | mov #OFF_SR, r0 |
332 | mov.l @(r0,r15), r0 ! get status register | 314 | mov.l @(r0,r15), r0 ! get status register |
@@ -389,11 +371,12 @@ work_pending: | |||
389 | ! r8: current_thread_info | 371 | ! r8: current_thread_info |
390 | ! t: result of "tst #_TIF_NEED_RESCHED, r0" | 372 | ! t: result of "tst #_TIF_NEED_RESCHED, r0" |
391 | bf/s work_resched | 373 | bf/s work_resched |
392 | tst #_TIF_SIGPENDING, r0 | 374 | tst #(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), r0 |
393 | work_notifysig: | 375 | work_notifysig: |
394 | bt/s restore_all | 376 | bt/s restore_all |
395 | mov r15, r4 | 377 | mov r15, r4 |
396 | mov #0, r5 | 378 | mov r12, r5 ! set arg1(save_r0) |
379 | mov r0, r6 | ||
397 | mov.l 2f, r1 | 380 | mov.l 2f, r1 |
398 | mova restore_all, r0 | 381 | mova restore_all, r0 |
399 | jmp @r1 | 382 | jmp @r1 |
@@ -431,7 +414,7 @@ work_resched: | |||
431 | 414 | ||
432 | .align 2 | 415 | .align 2 |
433 | 1: .long schedule | 416 | 1: .long schedule |
434 | 2: .long do_signal | 417 | 2: .long do_notify_resume |
435 | 418 | ||
436 | .align 2 | 419 | .align 2 |
437 | syscall_exit_work: | 420 | syscall_exit_work: |
@@ -552,6 +535,7 @@ syscall_call: | |||
552 | mov.l @r9, r8 | 535 | mov.l @r9, r8 |
553 | jsr @r8 ! jump to specific syscall handler | 536 | jsr @r8 ! jump to specific syscall handler |
554 | nop | 537 | nop |
538 | mov.l @(OFF_R0,r15), r12 ! save r0 | ||
555 | mov.l r0, @(OFF_R0,r15) ! save the return value | 539 | mov.l r0, @(OFF_R0,r15) ! save the return value |
556 | ! | 540 | ! |
557 | syscall_exit: | 541 | syscall_exit: |
@@ -644,7 +628,7 @@ skip_restore: | |||
644 | ! | 628 | ! |
645 | #if defined(CONFIG_KGDB_NMI) | 629 | #if defined(CONFIG_KGDB_NMI) |
646 | ! Clear in_nmi | 630 | ! Clear in_nmi |
647 | mov.l 4f, k0 | 631 | mov.l 6f, k0 |
648 | mov #0, k1 | 632 | mov #0, k1 |
649 | mov.b k1, @k0 | 633 | mov.b k1, @k0 |
650 | #endif | 634 | #endif |
@@ -722,7 +706,7 @@ interrupt: | |||
722 | ! | 706 | ! |
723 | ! | 707 | ! |
724 | .align 2 | 708 | .align 2 |
725 | handle_exception: | 709 | ENTRY(handle_exception) |
726 | ! Using k0, k1 for scratch registers (r0_bank1, r1_bank), | 710 | ! Using k0, k1 for scratch registers (r0_bank1, r1_bank), |
727 | ! save all registers onto stack. | 711 | ! save all registers onto stack. |
728 | ! | 712 | ! |
@@ -732,8 +716,8 @@ handle_exception: | |||
732 | bt/s 1f ! It's a kernel to kernel transition. | 716 | bt/s 1f ! It's a kernel to kernel transition. |
733 | mov r15, k0 ! save original stack to k0 | 717 | mov r15, k0 ! save original stack to k0 |
734 | /* User space to kernel */ | 718 | /* User space to kernel */ |
735 | mov #0x20, k1 | 719 | mov #(THREAD_SIZE >> 8), k1 |
736 | shll8 k1 ! k1 := 8192 (== THREAD_SIZE) | 720 | shll8 k1 ! k1 := THREAD_SIZE |
737 | add current, k1 | 721 | add current, k1 |
738 | mov k1, r15 ! change to kernel stack | 722 | mov k1, r15 ! change to kernel stack |
739 | ! | 723 | ! |
@@ -838,300 +822,3 @@ ENTRY(exception_none) | |||
838 | rts | 822 | rts |
839 | nop | 823 | nop |
840 | 824 | ||
841 | .data | ||
842 | ENTRY(sys_call_table) | ||
843 | .long sys_ni_syscall /* 0 - old "setup()" system call*/ | ||
844 | .long sys_exit | ||
845 | .long sys_fork | ||
846 | .long sys_read | ||
847 | .long sys_write | ||
848 | .long sys_open /* 5 */ | ||
849 | .long sys_close | ||
850 | .long sys_waitpid | ||
851 | .long sys_creat | ||
852 | .long sys_link | ||
853 | .long sys_unlink /* 10 */ | ||
854 | .long sys_execve | ||
855 | .long sys_chdir | ||
856 | .long sys_time | ||
857 | .long sys_mknod | ||
858 | .long sys_chmod /* 15 */ | ||
859 | .long sys_lchown16 | ||
860 | .long sys_ni_syscall /* old break syscall holder */ | ||
861 | .long sys_stat | ||
862 | .long sys_lseek | ||
863 | .long sys_getpid /* 20 */ | ||
864 | .long sys_mount | ||
865 | .long sys_oldumount | ||
866 | .long sys_setuid16 | ||
867 | .long sys_getuid16 | ||
868 | .long sys_stime /* 25 */ | ||
869 | .long sys_ptrace | ||
870 | .long sys_alarm | ||
871 | .long sys_fstat | ||
872 | .long sys_pause | ||
873 | .long sys_utime /* 30 */ | ||
874 | .long sys_ni_syscall /* old stty syscall holder */ | ||
875 | .long sys_ni_syscall /* old gtty syscall holder */ | ||
876 | .long sys_access | ||
877 | .long sys_nice | ||
878 | .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */ | ||
879 | .long sys_sync | ||
880 | .long sys_kill | ||
881 | .long sys_rename | ||
882 | .long sys_mkdir | ||
883 | .long sys_rmdir /* 40 */ | ||
884 | .long sys_dup | ||
885 | .long sys_pipe | ||
886 | .long sys_times | ||
887 | .long sys_ni_syscall /* old prof syscall holder */ | ||
888 | .long sys_brk /* 45 */ | ||
889 | .long sys_setgid16 | ||
890 | .long sys_getgid16 | ||
891 | .long sys_signal | ||
892 | .long sys_geteuid16 | ||
893 | .long sys_getegid16 /* 50 */ | ||
894 | .long sys_acct | ||
895 | .long sys_umount /* recycled never used phys() */ | ||
896 | .long sys_ni_syscall /* old lock syscall holder */ | ||
897 | .long sys_ioctl | ||
898 | .long sys_fcntl /* 55 */ | ||
899 | .long sys_ni_syscall /* old mpx syscall holder */ | ||
900 | .long sys_setpgid | ||
901 | .long sys_ni_syscall /* old ulimit syscall holder */ | ||
902 | .long sys_ni_syscall /* sys_olduname */ | ||
903 | .long sys_umask /* 60 */ | ||
904 | .long sys_chroot | ||
905 | .long sys_ustat | ||
906 | .long sys_dup2 | ||
907 | .long sys_getppid | ||
908 | .long sys_getpgrp /* 65 */ | ||
909 | .long sys_setsid | ||
910 | .long sys_sigaction | ||
911 | .long sys_sgetmask | ||
912 | .long sys_ssetmask | ||
913 | .long sys_setreuid16 /* 70 */ | ||
914 | .long sys_setregid16 | ||
915 | .long sys_sigsuspend | ||
916 | .long sys_sigpending | ||
917 | .long sys_sethostname | ||
918 | .long sys_setrlimit /* 75 */ | ||
919 | .long sys_old_getrlimit | ||
920 | .long sys_getrusage | ||
921 | .long sys_gettimeofday | ||
922 | .long sys_settimeofday | ||
923 | .long sys_getgroups16 /* 80 */ | ||
924 | .long sys_setgroups16 | ||
925 | .long sys_ni_syscall /* sys_oldselect */ | ||
926 | .long sys_symlink | ||
927 | .long sys_lstat | ||
928 | .long sys_readlink /* 85 */ | ||
929 | .long sys_uselib | ||
930 | .long sys_swapon | ||
931 | .long sys_reboot | ||
932 | .long old_readdir | ||
933 | .long old_mmap /* 90 */ | ||
934 | .long sys_munmap | ||
935 | .long sys_truncate | ||
936 | .long sys_ftruncate | ||
937 | .long sys_fchmod | ||
938 | .long sys_fchown16 /* 95 */ | ||
939 | .long sys_getpriority | ||
940 | .long sys_setpriority | ||
941 | .long sys_ni_syscall /* old profil syscall holder */ | ||
942 | .long sys_statfs | ||
943 | .long sys_fstatfs /* 100 */ | ||
944 | .long sys_ni_syscall /* ioperm */ | ||
945 | .long sys_socketcall | ||
946 | .long sys_syslog | ||
947 | .long sys_setitimer | ||
948 | .long sys_getitimer /* 105 */ | ||
949 | .long sys_newstat | ||
950 | .long sys_newlstat | ||
951 | .long sys_newfstat | ||
952 | .long sys_uname | ||
953 | .long sys_ni_syscall /* 110 */ /* iopl */ | ||
954 | .long sys_vhangup | ||
955 | .long sys_ni_syscall /* idle */ | ||
956 | .long sys_ni_syscall /* vm86old */ | ||
957 | .long sys_wait4 | ||
958 | .long sys_swapoff /* 115 */ | ||
959 | .long sys_sysinfo | ||
960 | .long sys_ipc | ||
961 | .long sys_fsync | ||
962 | .long sys_sigreturn | ||
963 | .long sys_clone /* 120 */ | ||
964 | .long sys_setdomainname | ||
965 | .long sys_newuname | ||
966 | .long sys_ni_syscall /* sys_modify_ldt */ | ||
967 | .long sys_adjtimex | ||
968 | .long sys_mprotect /* 125 */ | ||
969 | .long sys_sigprocmask | ||
970 | .long sys_ni_syscall /* old "create_module" */ | ||
971 | .long sys_init_module | ||
972 | .long sys_delete_module | ||
973 | .long sys_ni_syscall /* 130: old "get_kernel_syms" */ | ||
974 | .long sys_quotactl | ||
975 | .long sys_getpgid | ||
976 | .long sys_fchdir | ||
977 | .long sys_bdflush | ||
978 | .long sys_sysfs /* 135 */ | ||
979 | .long sys_personality | ||
980 | .long sys_ni_syscall /* for afs_syscall */ | ||
981 | .long sys_setfsuid16 | ||
982 | .long sys_setfsgid16 | ||
983 | .long sys_llseek /* 140 */ | ||
984 | .long sys_getdents | ||
985 | .long sys_select | ||
986 | .long sys_flock | ||
987 | .long sys_msync | ||
988 | .long sys_readv /* 145 */ | ||
989 | .long sys_writev | ||
990 | .long sys_getsid | ||
991 | .long sys_fdatasync | ||
992 | .long sys_sysctl | ||
993 | .long sys_mlock /* 150 */ | ||
994 | .long sys_munlock | ||
995 | .long sys_mlockall | ||
996 | .long sys_munlockall | ||
997 | .long sys_sched_setparam | ||
998 | .long sys_sched_getparam /* 155 */ | ||
999 | .long sys_sched_setscheduler | ||
1000 | .long sys_sched_getscheduler | ||
1001 | .long sys_sched_yield | ||
1002 | .long sys_sched_get_priority_max | ||
1003 | .long sys_sched_get_priority_min /* 160 */ | ||
1004 | .long sys_sched_rr_get_interval | ||
1005 | .long sys_nanosleep | ||
1006 | .long sys_mremap | ||
1007 | .long sys_setresuid16 | ||
1008 | .long sys_getresuid16 /* 165 */ | ||
1009 | .long sys_ni_syscall /* vm86 */ | ||
1010 | .long sys_ni_syscall /* old "query_module" */ | ||
1011 | .long sys_poll | ||
1012 | .long sys_nfsservctl | ||
1013 | .long sys_setresgid16 /* 170 */ | ||
1014 | .long sys_getresgid16 | ||
1015 | .long sys_prctl | ||
1016 | .long sys_rt_sigreturn | ||
1017 | .long sys_rt_sigaction | ||
1018 | .long sys_rt_sigprocmask /* 175 */ | ||
1019 | .long sys_rt_sigpending | ||
1020 | .long sys_rt_sigtimedwait | ||
1021 | .long sys_rt_sigqueueinfo | ||
1022 | .long sys_rt_sigsuspend | ||
1023 | .long sys_pread_wrapper /* 180 */ | ||
1024 | .long sys_pwrite_wrapper | ||
1025 | .long sys_chown16 | ||
1026 | .long sys_getcwd | ||
1027 | .long sys_capget | ||
1028 | .long sys_capset /* 185 */ | ||
1029 | .long sys_sigaltstack | ||
1030 | .long sys_sendfile | ||
1031 | .long sys_ni_syscall /* streams1 */ | ||
1032 | .long sys_ni_syscall /* streams2 */ | ||
1033 | .long sys_vfork /* 190 */ | ||
1034 | .long sys_getrlimit | ||
1035 | .long sys_mmap2 | ||
1036 | .long sys_truncate64 | ||
1037 | .long sys_ftruncate64 | ||
1038 | .long sys_stat64 /* 195 */ | ||
1039 | .long sys_lstat64 | ||
1040 | .long sys_fstat64 | ||
1041 | .long sys_lchown | ||
1042 | .long sys_getuid | ||
1043 | .long sys_getgid /* 200 */ | ||
1044 | .long sys_geteuid | ||
1045 | .long sys_getegid | ||
1046 | .long sys_setreuid | ||
1047 | .long sys_setregid | ||
1048 | .long sys_getgroups /* 205 */ | ||
1049 | .long sys_setgroups | ||
1050 | .long sys_fchown | ||
1051 | .long sys_setresuid | ||
1052 | .long sys_getresuid | ||
1053 | .long sys_setresgid /* 210 */ | ||
1054 | .long sys_getresgid | ||
1055 | .long sys_chown | ||
1056 | .long sys_setuid | ||
1057 | .long sys_setgid | ||
1058 | .long sys_setfsuid /* 215 */ | ||
1059 | .long sys_setfsgid | ||
1060 | .long sys_pivot_root | ||
1061 | .long sys_mincore | ||
1062 | .long sys_madvise | ||
1063 | .long sys_getdents64 /* 220 */ | ||
1064 | .long sys_fcntl64 | ||
1065 | .long sys_ni_syscall /* reserved for TUX */ | ||
1066 | .long sys_ni_syscall /* Reserved for Security */ | ||
1067 | .long sys_gettid | ||
1068 | .long sys_readahead /* 225 */ | ||
1069 | .long sys_setxattr | ||
1070 | .long sys_lsetxattr | ||
1071 | .long sys_fsetxattr | ||
1072 | .long sys_getxattr | ||
1073 | .long sys_lgetxattr /* 230 */ | ||
1074 | .long sys_fgetxattr | ||
1075 | .long sys_listxattr | ||
1076 | .long sys_llistxattr | ||
1077 | .long sys_flistxattr | ||
1078 | .long sys_removexattr /* 235 */ | ||
1079 | .long sys_lremovexattr | ||
1080 | .long sys_fremovexattr | ||
1081 | .long sys_tkill | ||
1082 | .long sys_sendfile64 | ||
1083 | .long sys_futex /* 240 */ | ||
1084 | .long sys_sched_setaffinity | ||
1085 | .long sys_sched_getaffinity | ||
1086 | .long sys_ni_syscall | ||
1087 | .long sys_ni_syscall | ||
1088 | .long sys_io_setup /* 245 */ | ||
1089 | .long sys_io_destroy | ||
1090 | .long sys_io_getevents | ||
1091 | .long sys_io_submit | ||
1092 | .long sys_io_cancel | ||
1093 | .long sys_fadvise64 /* 250 */ | ||
1094 | .long sys_ni_syscall | ||
1095 | .long sys_exit_group | ||
1096 | .long sys_lookup_dcookie | ||
1097 | .long sys_epoll_create | ||
1098 | .long sys_epoll_ctl /* 255 */ | ||
1099 | .long sys_epoll_wait | ||
1100 | .long sys_remap_file_pages | ||
1101 | .long sys_set_tid_address | ||
1102 | .long sys_timer_create | ||
1103 | .long sys_timer_settime /* 260 */ | ||
1104 | .long sys_timer_gettime | ||
1105 | .long sys_timer_getoverrun | ||
1106 | .long sys_timer_delete | ||
1107 | .long sys_clock_settime | ||
1108 | .long sys_clock_gettime /* 265 */ | ||
1109 | .long sys_clock_getres | ||
1110 | .long sys_clock_nanosleep | ||
1111 | .long sys_statfs64 | ||
1112 | .long sys_fstatfs64 | ||
1113 | .long sys_tgkill /* 270 */ | ||
1114 | .long sys_utimes | ||
1115 | .long sys_fadvise64_64_wrapper | ||
1116 | .long sys_ni_syscall /* Reserved for vserver */ | ||
1117 | .long sys_ni_syscall /* Reserved for mbind */ | ||
1118 | .long sys_ni_syscall /* 275 - get_mempolicy */ | ||
1119 | .long sys_ni_syscall /* set_mempolicy */ | ||
1120 | .long sys_mq_open | ||
1121 | .long sys_mq_unlink | ||
1122 | .long sys_mq_timedsend | ||
1123 | .long sys_mq_timedreceive /* 280 */ | ||
1124 | .long sys_mq_notify | ||
1125 | .long sys_mq_getsetattr | ||
1126 | .long sys_ni_syscall /* Reserved for kexec */ | ||
1127 | .long sys_waitid | ||
1128 | .long sys_add_key /* 285 */ | ||
1129 | .long sys_request_key | ||
1130 | .long sys_keyctl | ||
1131 | .long sys_ioprio_set | ||
1132 | .long sys_ioprio_get | ||
1133 | .long sys_inotify_init /* 290 */ | ||
1134 | .long sys_inotify_add_watch | ||
1135 | .long sys_inotify_rm_watch | ||
1136 | |||
1137 | /* End of entry.S */ | ||
diff --git a/arch/sh/kernel/head.S b/arch/sh/kernel/head.S index 9b9e6ef626ce..f5f53d14f245 100644 --- a/arch/sh/kernel/head.S +++ b/arch/sh/kernel/head.S | |||
@@ -11,6 +11,18 @@ | |||
11 | * Head.S contains the SH exception handlers and startup code. | 11 | * Head.S contains the SH exception handlers and startup code. |
12 | */ | 12 | */ |
13 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
14 | #include <asm/thread_info.h> | ||
15 | |||
16 | #ifdef CONFIG_CPU_SH4A | ||
17 | #define SYNCO() synco | ||
18 | |||
19 | #define PREFI(label, reg) \ | ||
20 | mov.l label, reg; \ | ||
21 | prefi @reg | ||
22 | #else | ||
23 | #define SYNCO() | ||
24 | #define PREFI(label, reg) | ||
25 | #endif | ||
14 | 26 | ||
15 | .section .empty_zero_page, "aw" | 27 | .section .empty_zero_page, "aw" |
16 | ENTRY(empty_zero_page) | 28 | ENTRY(empty_zero_page) |
@@ -42,18 +54,25 @@ ENTRY(_stext) | |||
42 | ! Initialize global interrupt mask | 54 | ! Initialize global interrupt mask |
43 | mov #0, r0 | 55 | mov #0, r0 |
44 | ldc r0, r6_bank | 56 | ldc r0, r6_bank |
57 | |||
58 | /* | ||
59 | * Prefetch if possible to reduce cache miss penalty. | ||
60 | * | ||
61 | * We do this early on for SH-4A as a micro-optimization, | ||
62 | * as later on we will have speculative execution enabled | ||
63 | * and this will become less of an issue. | ||
64 | */ | ||
65 | PREFI(5f, r0) | ||
66 | PREFI(6f, r0) | ||
67 | |||
45 | ! | 68 | ! |
46 | mov.l 2f, r0 | 69 | mov.l 2f, r0 |
47 | mov r0, r15 ! Set initial r15 (stack pointer) | 70 | mov r0, r15 ! Set initial r15 (stack pointer) |
48 | mov #0x20, r1 ! | 71 | mov #(THREAD_SIZE >> 8), r1 |
49 | shll8 r1 ! r1 = 8192 | 72 | shll8 r1 ! r1 = THREAD_SIZE |
50 | sub r1, r0 ! | 73 | sub r1, r0 ! |
51 | ldc r0, r7_bank ! ... and initial thread_info | 74 | ldc r0, r7_bank ! ... and initial thread_info |
52 | ! | 75 | |
53 | ! Additional CPU initialization | ||
54 | mov.l 6f, r0 | ||
55 | jsr @r0 | ||
56 | nop | ||
57 | ! Clear BSS area | 76 | ! Clear BSS area |
58 | mov.l 3f, r1 | 77 | mov.l 3f, r1 |
59 | add #4, r1 | 78 | add #4, r1 |
@@ -62,6 +81,14 @@ ENTRY(_stext) | |||
62 | 9: cmp/hs r2, r1 | 81 | 9: cmp/hs r2, r1 |
63 | bf/s 9b ! while (r1 < r2) | 82 | bf/s 9b ! while (r1 < r2) |
64 | mov.l r0,@-r2 | 83 | mov.l r0,@-r2 |
84 | |||
85 | ! Additional CPU initialization | ||
86 | mov.l 6f, r0 | ||
87 | jsr @r0 | ||
88 | nop | ||
89 | |||
90 | SYNCO() ! Wait for pending instructions.. | ||
91 | |||
65 | ! Start kernel | 92 | ! Start kernel |
66 | mov.l 5f, r0 | 93 | mov.l 5f, r0 |
67 | jmp @r0 | 94 | jmp @r0 |
@@ -69,7 +96,7 @@ ENTRY(_stext) | |||
69 | 96 | ||
70 | .balign 4 | 97 | .balign 4 |
71 | 1: .long 0x400080F0 ! MD=1, RB=0, BL=0, FD=1, IMASK=0xF | 98 | 1: .long 0x400080F0 ! MD=1, RB=0, BL=0, FD=1, IMASK=0xF |
72 | 2: .long stack | 99 | 2: .long init_thread_union+THREAD_SIZE |
73 | 3: .long __bss_start | 100 | 3: .long __bss_start |
74 | 4: .long _end | 101 | 4: .long _end |
75 | 5: .long start_kernel | 102 | 5: .long start_kernel |
diff --git a/arch/sh/kernel/io.c b/arch/sh/kernel/io.c index 71c9fde2fd90..501fe03e3715 100644 --- a/arch/sh/kernel/io.c +++ b/arch/sh/kernel/io.c | |||
@@ -61,6 +61,73 @@ void memset_io(volatile void __iomem *dst, int c, unsigned long count) | |||
61 | } | 61 | } |
62 | EXPORT_SYMBOL(memset_io); | 62 | EXPORT_SYMBOL(memset_io); |
63 | 63 | ||
64 | void __raw_readsl(unsigned long addr, void *datap, int len) | ||
65 | { | ||
66 | u32 *data; | ||
67 | |||
68 | for (data = datap; (len != 0) && (((u32)data & 0x1f) != 0); len--) | ||
69 | *data++ = ctrl_inl(addr); | ||
70 | |||
71 | if (likely(len >= (0x20 >> 2))) { | ||
72 | int tmp2, tmp3, tmp4, tmp5, tmp6; | ||
73 | |||
74 | __asm__ __volatile__( | ||
75 | "1: \n\t" | ||
76 | "mov.l @%7, r0 \n\t" | ||
77 | "mov.l @%7, %2 \n\t" | ||
78 | #ifdef CONFIG_CPU_SH4 | ||
79 | "movca.l r0, @%0 \n\t" | ||
80 | #else | ||
81 | "mov.l r0, @%0 \n\t" | ||
82 | #endif | ||
83 | "mov.l @%7, %3 \n\t" | ||
84 | "mov.l @%7, %4 \n\t" | ||
85 | "mov.l @%7, %5 \n\t" | ||
86 | "mov.l @%7, %6 \n\t" | ||
87 | "mov.l @%7, r7 \n\t" | ||
88 | "mov.l @%7, r0 \n\t" | ||
89 | "mov.l %2, @(0x04,%0) \n\t" | ||
90 | "mov #0x20>>2, %2 \n\t" | ||
91 | "mov.l %3, @(0x08,%0) \n\t" | ||
92 | "sub %2, %1 \n\t" | ||
93 | "mov.l %4, @(0x0c,%0) \n\t" | ||
94 | "cmp/hi %1, %2 ! T if 32 > len \n\t" | ||
95 | "mov.l %5, @(0x10,%0) \n\t" | ||
96 | "mov.l %6, @(0x14,%0) \n\t" | ||
97 | "mov.l r7, @(0x18,%0) \n\t" | ||
98 | "mov.l r0, @(0x1c,%0) \n\t" | ||
99 | "bf.s 1b \n\t" | ||
100 | " add #0x20, %0 \n\t" | ||
101 | : "=&r" (data), "=&r" (len), | ||
102 | "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4), | ||
103 | "=&r" (tmp5), "=&r" (tmp6) | ||
104 | : "r"(addr), "0" (data), "1" (len) | ||
105 | : "r0", "r7", "t", "memory"); | ||
106 | } | ||
107 | |||
108 | for (; len != 0; len--) | ||
109 | *data++ = ctrl_inl(addr); | ||
110 | } | ||
111 | EXPORT_SYMBOL(__raw_readsl); | ||
112 | |||
113 | void __raw_writesl(unsigned long addr, const void *data, int len) | ||
114 | { | ||
115 | if (likely(len != 0)) { | ||
116 | int tmp1; | ||
117 | |||
118 | __asm__ __volatile__ ( | ||
119 | "1: \n\t" | ||
120 | "mov.l @%0+, %1 \n\t" | ||
121 | "dt %3 \n\t" | ||
122 | "bf.s 1b \n\t" | ||
123 | " mov.l %1, @%4 \n\t" | ||
124 | : "=&r" (data), "=&r" (tmp1) | ||
125 | : "0" (data), "r" (len), "r"(addr) | ||
126 | : "t", "memory"); | ||
127 | } | ||
128 | } | ||
129 | EXPORT_SYMBOL(__raw_writesl); | ||
130 | |||
64 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | 131 | void __iomem *ioport_map(unsigned long port, unsigned int nr) |
65 | { | 132 | { |
66 | return sh_mv.mv_ioport_map(port, nr); | 133 | return sh_mv.mv_ioport_map(port, nr); |
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index c2e07f7f3496..c7ebd6aec951 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* $Id: irq.c,v 1.20 2004/01/13 05:52:11 kkojima Exp $ | 1 | /* |
2 | * | ||
3 | * linux/arch/sh/kernel/irq.c | 2 | * linux/arch/sh/kernel/irq.c |
4 | * | 3 | * |
5 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar | 4 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar |
@@ -7,13 +6,15 @@ | |||
7 | * | 6 | * |
8 | * SuperH version: Copyright (C) 1999 Niibe Yutaka | 7 | * SuperH version: Copyright (C) 1999 Niibe Yutaka |
9 | */ | 8 | */ |
10 | |||
11 | #include <linux/irq.h> | 9 | #include <linux/irq.h> |
12 | #include <linux/interrupt.h> | 10 | #include <linux/interrupt.h> |
11 | #include <linux/module.h> | ||
13 | #include <linux/kernel_stat.h> | 12 | #include <linux/kernel_stat.h> |
14 | #include <linux/seq_file.h> | 13 | #include <linux/seq_file.h> |
15 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
16 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
16 | #include <asm/uaccess.h> | ||
17 | #include <asm/thread_info.h> | ||
17 | #include <asm/cpu/mmu_context.h> | 18 | #include <asm/cpu/mmu_context.h> |
18 | 19 | ||
19 | /* | 20 | /* |
@@ -60,15 +61,46 @@ unlock: | |||
60 | } | 61 | } |
61 | #endif | 62 | #endif |
62 | 63 | ||
64 | #ifdef CONFIG_4KSTACKS | ||
65 | /* | ||
66 | * per-CPU IRQ handling contexts (thread information and stack) | ||
67 | */ | ||
68 | union irq_ctx { | ||
69 | struct thread_info tinfo; | ||
70 | u32 stack[THREAD_SIZE/sizeof(u32)]; | ||
71 | }; | ||
72 | |||
73 | static union irq_ctx *hardirq_ctx[NR_CPUS]; | ||
74 | static union irq_ctx *softirq_ctx[NR_CPUS]; | ||
75 | #endif | ||
63 | 76 | ||
64 | asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | 77 | asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, |
65 | unsigned long r6, unsigned long r7, | 78 | unsigned long r6, unsigned long r7, |
66 | struct pt_regs regs) | 79 | struct pt_regs regs) |
67 | { | 80 | { |
68 | int irq = r4; | 81 | int irq = r4; |
82 | #ifdef CONFIG_4KSTACKS | ||
83 | union irq_ctx *curctx, *irqctx; | ||
84 | #endif | ||
69 | 85 | ||
70 | irq_enter(); | 86 | irq_enter(); |
71 | 87 | ||
88 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | ||
89 | /* Debugging check for stack overflow: is there less than 1KB free? */ | ||
90 | { | ||
91 | long sp; | ||
92 | |||
93 | __asm__ __volatile__ ("and r15, %0" : | ||
94 | "=r" (sp) : "0" (THREAD_SIZE - 1)); | ||
95 | |||
96 | if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) { | ||
97 | printk("do_IRQ: stack overflow: %ld\n", | ||
98 | sp - sizeof(struct thread_info)); | ||
99 | dump_stack(); | ||
100 | } | ||
101 | } | ||
102 | #endif | ||
103 | |||
72 | #ifdef CONFIG_CPU_HAS_INTEVT | 104 | #ifdef CONFIG_CPU_HAS_INTEVT |
73 | __asm__ __volatile__ ( | 105 | __asm__ __volatile__ ( |
74 | #ifdef CONFIG_CPU_HAS_SR_RB | 106 | #ifdef CONFIG_CPU_HAS_SR_RB |
@@ -87,7 +119,135 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | |||
87 | #endif | 119 | #endif |
88 | 120 | ||
89 | irq = irq_demux(irq); | 121 | irq = irq_demux(irq); |
90 | __do_IRQ(irq, ®s); | 122 | |
123 | #ifdef CONFIG_4KSTACKS | ||
124 | curctx = (union irq_ctx *)current_thread_info(); | ||
125 | irqctx = hardirq_ctx[smp_processor_id()]; | ||
126 | |||
127 | /* | ||
128 | * this is where we switch to the IRQ stack. However, if we are | ||
129 | * already using the IRQ stack (because we interrupted a hardirq | ||
130 | * handler) we can't do that and just have to keep using the | ||
131 | * current stack (which is the irq stack already after all) | ||
132 | */ | ||
133 | if (curctx != irqctx) { | ||
134 | u32 *isp; | ||
135 | |||
136 | isp = (u32 *)((char *)irqctx + sizeof(*irqctx)); | ||
137 | irqctx->tinfo.task = curctx->tinfo.task; | ||
138 | irqctx->tinfo.previous_sp = current_stack_pointer; | ||
139 | |||
140 | __asm__ __volatile__ ( | ||
141 | "mov %0, r4 \n" | ||
142 | "mov %1, r5 \n" | ||
143 | "mov r15, r9 \n" | ||
144 | "jsr @%2 \n" | ||
145 | /* swith to the irq stack */ | ||
146 | " mov %3, r15 \n" | ||
147 | /* restore the stack (ring zero) */ | ||
148 | "mov r9, r15 \n" | ||
149 | : /* no outputs */ | ||
150 | : "r" (irq), "r" (®s), "r" (__do_IRQ), "r" (isp) | ||
151 | /* XXX: A somewhat excessive clobber list? -PFM */ | ||
152 | : "memory", "r0", "r1", "r2", "r3", "r4", | ||
153 | "r5", "r6", "r7", "r8", "t", "pr" | ||
154 | ); | ||
155 | } else | ||
156 | #endif | ||
157 | __do_IRQ(irq, ®s); | ||
158 | |||
91 | irq_exit(); | 159 | irq_exit(); |
160 | |||
92 | return 1; | 161 | return 1; |
93 | } | 162 | } |
163 | |||
164 | #ifdef CONFIG_4KSTACKS | ||
165 | /* | ||
166 | * These should really be __section__(".bss.page_aligned") as well, but | ||
167 | * gcc's 3.0 and earlier don't handle that correctly. | ||
168 | */ | ||
169 | static char softirq_stack[NR_CPUS * THREAD_SIZE] | ||
170 | __attribute__((__aligned__(THREAD_SIZE))); | ||
171 | |||
172 | static char hardirq_stack[NR_CPUS * THREAD_SIZE] | ||
173 | __attribute__((__aligned__(THREAD_SIZE))); | ||
174 | |||
175 | /* | ||
176 | * allocate per-cpu stacks for hardirq and for softirq processing | ||
177 | */ | ||
178 | void irq_ctx_init(int cpu) | ||
179 | { | ||
180 | union irq_ctx *irqctx; | ||
181 | |||
182 | if (hardirq_ctx[cpu]) | ||
183 | return; | ||
184 | |||
185 | irqctx = (union irq_ctx *)&hardirq_stack[cpu * THREAD_SIZE]; | ||
186 | irqctx->tinfo.task = NULL; | ||
187 | irqctx->tinfo.exec_domain = NULL; | ||
188 | irqctx->tinfo.cpu = cpu; | ||
189 | irqctx->tinfo.preempt_count = HARDIRQ_OFFSET; | ||
190 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); | ||
191 | |||
192 | hardirq_ctx[cpu] = irqctx; | ||
193 | |||
194 | irqctx = (union irq_ctx *)&softirq_stack[cpu * THREAD_SIZE]; | ||
195 | irqctx->tinfo.task = NULL; | ||
196 | irqctx->tinfo.exec_domain = NULL; | ||
197 | irqctx->tinfo.cpu = cpu; | ||
198 | irqctx->tinfo.preempt_count = SOFTIRQ_OFFSET; | ||
199 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); | ||
200 | |||
201 | softirq_ctx[cpu] = irqctx; | ||
202 | |||
203 | printk("CPU %u irqstacks, hard=%p soft=%p\n", | ||
204 | cpu, hardirq_ctx[cpu], softirq_ctx[cpu]); | ||
205 | } | ||
206 | |||
207 | void irq_ctx_exit(int cpu) | ||
208 | { | ||
209 | hardirq_ctx[cpu] = NULL; | ||
210 | } | ||
211 | |||
212 | extern asmlinkage void __do_softirq(void); | ||
213 | |||
214 | asmlinkage void do_softirq(void) | ||
215 | { | ||
216 | unsigned long flags; | ||
217 | struct thread_info *curctx; | ||
218 | union irq_ctx *irqctx; | ||
219 | u32 *isp; | ||
220 | |||
221 | if (in_interrupt()) | ||
222 | return; | ||
223 | |||
224 | local_irq_save(flags); | ||
225 | |||
226 | if (local_softirq_pending()) { | ||
227 | curctx = current_thread_info(); | ||
228 | irqctx = softirq_ctx[smp_processor_id()]; | ||
229 | irqctx->tinfo.task = curctx->task; | ||
230 | irqctx->tinfo.previous_sp = current_stack_pointer; | ||
231 | |||
232 | /* build the stack frame on the softirq stack */ | ||
233 | isp = (u32 *)((char *)irqctx + sizeof(*irqctx)); | ||
234 | |||
235 | __asm__ __volatile__ ( | ||
236 | "mov r15, r9 \n" | ||
237 | "jsr @%0 \n" | ||
238 | /* switch to the softirq stack */ | ||
239 | " mov %1, r15 \n" | ||
240 | /* restore the thread stack */ | ||
241 | "mov r9, r15 \n" | ||
242 | : /* no outputs */ | ||
243 | : "r" (__do_softirq), "r" (isp) | ||
244 | /* XXX: A somewhat excessive clobber list? -PFM */ | ||
245 | : "memory", "r0", "r1", "r2", "r3", "r4", | ||
246 | "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr" | ||
247 | ); | ||
248 | } | ||
249 | |||
250 | local_irq_restore(flags); | ||
251 | } | ||
252 | EXPORT_SYMBOL(do_softirq); | ||
253 | #endif | ||
diff --git a/arch/sh/kernel/kgdb_stub.c b/arch/sh/kernel/kgdb_stub.c index 42638b92b51c..9c6315f0335d 100644 --- a/arch/sh/kernel/kgdb_stub.c +++ b/arch/sh/kernel/kgdb_stub.c | |||
@@ -101,16 +101,17 @@ | |||
101 | #include <linux/linkage.h> | 101 | #include <linux/linkage.h> |
102 | #include <linux/init.h> | 102 | #include <linux/init.h> |
103 | 103 | ||
104 | #ifdef CONFIG_SH_KGDB_CONSOLE | ||
105 | #include <linux/console.h> | ||
106 | #endif | ||
107 | |||
104 | #include <asm/system.h> | 108 | #include <asm/system.h> |
105 | #include <asm/current.h> | 109 | #include <asm/current.h> |
106 | #include <asm/signal.h> | 110 | #include <asm/signal.h> |
107 | #include <asm/pgtable.h> | 111 | #include <asm/pgtable.h> |
108 | #include <asm/ptrace.h> | 112 | #include <asm/ptrace.h> |
109 | #include <asm/kgdb.h> | 113 | #include <asm/kgdb.h> |
110 | 114 | #include <asm/io.h> | |
111 | #ifdef CONFIG_SH_KGDB_CONSOLE | ||
112 | #include <linux/console.h> | ||
113 | #endif | ||
114 | 115 | ||
115 | /* Function pointers for linkage */ | 116 | /* Function pointers for linkage */ |
116 | kgdb_debug_hook_t *kgdb_debug_hook; | 117 | kgdb_debug_hook_t *kgdb_debug_hook; |
@@ -240,7 +241,6 @@ static jmp_buf rem_com_env; | |||
240 | /* Misc static */ | 241 | /* Misc static */ |
241 | static int stepped_address; | 242 | static int stepped_address; |
242 | static short stepped_opcode; | 243 | static short stepped_opcode; |
243 | static const char hexchars[] = "0123456789abcdef"; | ||
244 | static char in_buffer[BUFMAX]; | 244 | static char in_buffer[BUFMAX]; |
245 | static char out_buffer[OUTBUFMAX]; | 245 | static char out_buffer[OUTBUFMAX]; |
246 | 246 | ||
@@ -253,29 +253,6 @@ typedef unsigned char threadref[8]; | |||
253 | #define BUF_THREAD_ID_SIZE 16 | 253 | #define BUF_THREAD_ID_SIZE 16 |
254 | #endif | 254 | #endif |
255 | 255 | ||
256 | /* Return addr as a real volatile address */ | ||
257 | static inline unsigned int ctrl_inl(const unsigned long addr) | ||
258 | { | ||
259 | return *(volatile unsigned long *) addr; | ||
260 | } | ||
261 | |||
262 | /* Correctly set *addr using volatile */ | ||
263 | static inline void ctrl_outl(const unsigned int b, unsigned long addr) | ||
264 | { | ||
265 | *(volatile unsigned long *) addr = b; | ||
266 | } | ||
267 | |||
268 | /* Get high hex bits */ | ||
269 | static char highhex(const int x) | ||
270 | { | ||
271 | return hexchars[(x >> 4) & 0xf]; | ||
272 | } | ||
273 | |||
274 | /* Get low hex bits */ | ||
275 | static char lowhex(const int x) | ||
276 | { | ||
277 | return hexchars[x & 0xf]; | ||
278 | } | ||
279 | 256 | ||
280 | /* Convert ch to hex */ | 257 | /* Convert ch to hex */ |
281 | static int hex(const char ch) | 258 | static int hex(const char ch) |
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c index 6bcd8d92399f..08587cdb64d6 100644 --- a/arch/sh/kernel/machine_kexec.c +++ b/arch/sh/kernel/machine_kexec.c | |||
@@ -29,12 +29,6 @@ extern const unsigned char relocate_new_kernel[]; | |||
29 | extern const unsigned int relocate_new_kernel_size; | 29 | extern const unsigned int relocate_new_kernel_size; |
30 | extern void *gdb_vbr_vector; | 30 | extern void *gdb_vbr_vector; |
31 | 31 | ||
32 | /* | ||
33 | * Provide a dummy crash_notes definition while crash dump arrives to ppc. | ||
34 | * This prevents breakage of crash_notes attribute in kernel/ksysfs.c. | ||
35 | */ | ||
36 | void *crash_notes = NULL; | ||
37 | |||
38 | void machine_shutdown(void) | 32 | void machine_shutdown(void) |
39 | { | 33 | { |
40 | } | 34 | } |
diff --git a/arch/sh/kernel/pm.c b/arch/sh/kernel/pm.c new file mode 100644 index 000000000000..10ab62c9aede --- /dev/null +++ b/arch/sh/kernel/pm.c | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * Generic Power Management Routine | ||
3 | * | ||
4 | * Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License. | ||
8 | */ | ||
9 | #include <linux/suspend.h> | ||
10 | #include <linux/delay.h> | ||
11 | #include <linux/gfp.h> | ||
12 | #include <asm/freq.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/watchdog.h> | ||
15 | #include <asm/pm.h> | ||
16 | |||
17 | #define INTR_OFFSET 0x600 | ||
18 | |||
19 | #define STBCR 0xffffff82 | ||
20 | #define STBCR2 0xffffff88 | ||
21 | |||
22 | #define STBCR_STBY 0x80 | ||
23 | #define STBCR_MSTP2 0x04 | ||
24 | |||
25 | #define MCR 0xffffff68 | ||
26 | #define RTCNT 0xffffff70 | ||
27 | |||
28 | #define MCR_RMODE 2 | ||
29 | #define MCR_RFSH 4 | ||
30 | |||
31 | void pm_enter(void) | ||
32 | { | ||
33 | u8 stbcr, csr; | ||
34 | u16 frqcr, mcr; | ||
35 | u32 vbr_new, vbr_old; | ||
36 | |||
37 | set_bl_bit(); | ||
38 | |||
39 | /* set wdt */ | ||
40 | csr = sh_wdt_read_csr(); | ||
41 | csr &= ~WTCSR_TME; | ||
42 | csr |= WTCSR_CKS_4096; | ||
43 | sh_wdt_write_csr(csr); | ||
44 | csr = sh_wdt_read_csr(); | ||
45 | sh_wdt_write_cnt(0); | ||
46 | |||
47 | /* disable PLL1 */ | ||
48 | frqcr = ctrl_inw(FRQCR); | ||
49 | frqcr &= ~(FRQCR_PLLEN | FRQCR_PSTBY); | ||
50 | ctrl_outw(frqcr, FRQCR); | ||
51 | |||
52 | /* enable standby */ | ||
53 | stbcr = ctrl_inb(STBCR); | ||
54 | ctrl_outb(stbcr | STBCR_STBY | STBCR_MSTP2, STBCR); | ||
55 | |||
56 | /* set self-refresh */ | ||
57 | mcr = ctrl_inw(MCR); | ||
58 | ctrl_outw(mcr & ~MCR_RFSH, MCR); | ||
59 | |||
60 | /* set interrupt handler */ | ||
61 | asm volatile("stc vbr, %0" : "=r" (vbr_old)); | ||
62 | vbr_new = get_zeroed_page(GFP_ATOMIC); | ||
63 | udelay(50); | ||
64 | memcpy((void*)(vbr_new + INTR_OFFSET), | ||
65 | &wakeup_start, &wakeup_end - &wakeup_start); | ||
66 | asm volatile("ldc %0, vbr" : : "r" (vbr_new)); | ||
67 | |||
68 | ctrl_outw(0, RTCNT); | ||
69 | ctrl_outw(mcr | MCR_RFSH | MCR_RMODE, MCR); | ||
70 | |||
71 | cpu_sleep(); | ||
72 | |||
73 | asm volatile("ldc %0, vbr" : : "r" (vbr_old)); | ||
74 | |||
75 | free_page(vbr_new); | ||
76 | |||
77 | /* enable PLL1 */ | ||
78 | frqcr = ctrl_inw(FRQCR); | ||
79 | frqcr |= FRQCR_PSTBY; | ||
80 | ctrl_outw(frqcr, FRQCR); | ||
81 | udelay(50); | ||
82 | frqcr |= FRQCR_PLLEN; | ||
83 | ctrl_outw(frqcr, FRQCR); | ||
84 | |||
85 | ctrl_outb(stbcr, STBCR); | ||
86 | |||
87 | clear_bl_bit(); | ||
88 | } | ||
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index f2031314cb2b..0b1d5dd7a93b 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c | |||
@@ -81,16 +81,6 @@ void cpu_idle(void) | |||
81 | 81 | ||
82 | void machine_restart(char * __unused) | 82 | void machine_restart(char * __unused) |
83 | { | 83 | { |
84 | |||
85 | #ifdef CONFIG_KEXEC | ||
86 | struct kimage *image; | ||
87 | image = xchg(&kexec_image, 0); | ||
88 | if (image) { | ||
89 | machine_shutdown(); | ||
90 | machine_kexec(image); | ||
91 | } | ||
92 | #endif | ||
93 | |||
94 | /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ | 84 | /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ |
95 | asm volatile("ldc %0, sr\n\t" | 85 | asm volatile("ldc %0, sr\n\t" |
96 | "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); | 86 | "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); |
@@ -263,6 +253,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
263 | unsigned long unused, | 253 | unsigned long unused, |
264 | struct task_struct *p, struct pt_regs *regs) | 254 | struct task_struct *p, struct pt_regs *regs) |
265 | { | 255 | { |
256 | struct thread_info *ti = task_thread_info(p); | ||
266 | struct pt_regs *childregs; | 257 | struct pt_regs *childregs; |
267 | #if defined(CONFIG_SH_FPU) | 258 | #if defined(CONFIG_SH_FPU) |
268 | struct task_struct *tsk = current; | 259 | struct task_struct *tsk = current; |
@@ -277,8 +268,10 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
277 | 268 | ||
278 | if (user_mode(regs)) { | 269 | if (user_mode(regs)) { |
279 | childregs->regs[15] = usp; | 270 | childregs->regs[15] = usp; |
271 | ti->addr_limit = USER_DS; | ||
280 | } else { | 272 | } else { |
281 | childregs->regs[15] = (unsigned long)task_stack_page(p) + THREAD_SIZE; | 273 | childregs->regs[15] = (unsigned long)task_stack_page(p) + THREAD_SIZE; |
274 | ti->addr_limit = KERNEL_DS; | ||
282 | } | 275 | } |
283 | if (clone_flags & CLONE_SETTLS) { | 276 | if (clone_flags & CLONE_SETTLS) { |
284 | childregs->gbr = childregs->regs[0]; | 277 | childregs->gbr = childregs->regs[0]; |
@@ -299,13 +292,15 @@ ubc_set_tracing(int asid, unsigned long pc) | |||
299 | { | 292 | { |
300 | ctrl_outl(pc, UBC_BARA); | 293 | ctrl_outl(pc, UBC_BARA); |
301 | 294 | ||
295 | #ifdef CONFIG_MMU | ||
302 | /* We don't have any ASID settings for the SH-2! */ | 296 | /* We don't have any ASID settings for the SH-2! */ |
303 | if (cpu_data->type != CPU_SH7604) | 297 | if (cpu_data->type != CPU_SH7604) |
304 | ctrl_outb(asid, UBC_BASRA); | 298 | ctrl_outb(asid, UBC_BASRA); |
299 | #endif | ||
305 | 300 | ||
306 | ctrl_outl(0, UBC_BAMRA); | 301 | ctrl_outl(0, UBC_BAMRA); |
307 | 302 | ||
308 | if (cpu_data->type == CPU_SH7729) { | 303 | if (cpu_data->type == CPU_SH7729 || cpu_data->type == CPU_SH7710) { |
309 | ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA); | 304 | ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA); |
310 | ctrl_outl(BRCR_PCBA | BRCR_PCTE, UBC_BRCR); | 305 | ctrl_outl(BRCR_PCBA | BRCR_PCTE, UBC_BRCR); |
311 | } else { | 306 | } else { |
@@ -344,6 +339,7 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *ne | |||
344 | } | 339 | } |
345 | #endif | 340 | #endif |
346 | 341 | ||
342 | #ifdef CONFIG_MMU | ||
347 | /* | 343 | /* |
348 | * Restore the kernel mode register | 344 | * Restore the kernel mode register |
349 | * k7 (r7_bank1) | 345 | * k7 (r7_bank1) |
@@ -351,19 +347,21 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *ne | |||
351 | asm volatile("ldc %0, r7_bank" | 347 | asm volatile("ldc %0, r7_bank" |
352 | : /* no output */ | 348 | : /* no output */ |
353 | : "r" (task_thread_info(next))); | 349 | : "r" (task_thread_info(next))); |
350 | #endif | ||
354 | 351 | ||
355 | #ifdef CONFIG_MMU | ||
356 | /* If no tasks are using the UBC, we're done */ | 352 | /* If no tasks are using the UBC, we're done */ |
357 | if (ubc_usercnt == 0) | 353 | if (ubc_usercnt == 0) |
358 | /* If no tasks are using the UBC, we're done */; | 354 | /* If no tasks are using the UBC, we're done */; |
359 | else if (next->thread.ubc_pc && next->mm) { | 355 | else if (next->thread.ubc_pc && next->mm) { |
360 | ubc_set_tracing(next->mm->context & MMU_CONTEXT_ASID_MASK, | 356 | int asid = 0; |
361 | next->thread.ubc_pc); | 357 | #ifdef CONFIG_MMU |
358 | asid |= next->mm->context.id & MMU_CONTEXT_ASID_MASK; | ||
359 | #endif | ||
360 | ubc_set_tracing(asid, next->thread.ubc_pc); | ||
362 | } else { | 361 | } else { |
363 | ctrl_outw(0, UBC_BBRA); | 362 | ctrl_outw(0, UBC_BBRA); |
364 | ctrl_outw(0, UBC_BBRB); | 363 | ctrl_outw(0, UBC_BBRB); |
365 | } | 364 | } |
366 | #endif | ||
367 | 365 | ||
368 | return prev; | 366 | return prev; |
369 | } | 367 | } |
diff --git a/arch/sh/kernel/ptrace.c b/arch/sh/kernel/ptrace.c index f7eebbde3291..04ca13a041c1 100644 --- a/arch/sh/kernel/ptrace.c +++ b/arch/sh/kernel/ptrace.c | |||
@@ -224,7 +224,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
224 | 224 | ||
225 | case PTRACE_SETDSPREGS: { | 225 | case PTRACE_SETDSPREGS: { |
226 | unsigned long dp; | 226 | unsigned long dp; |
227 | int i; | ||
228 | 227 | ||
229 | ret = -EIO; | 228 | ret = -EIO; |
230 | dp = ((unsigned long) child) + THREAD_SIZE - | 229 | dp = ((unsigned long) child) + THREAD_SIZE - |
diff --git a/arch/sh/kernel/semaphore.c b/arch/sh/kernel/semaphore.c index a3c24dcbf01d..184119eeae56 100644 --- a/arch/sh/kernel/semaphore.c +++ b/arch/sh/kernel/semaphore.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <asm/semaphore.h> | 14 | #include <asm/semaphore.h> |
15 | #include <asm/semaphore-helper.h> | 15 | #include <asm/semaphore-helper.h> |
16 | 16 | ||
17 | spinlock_t semaphore_wake_lock; | 17 | DEFINE_SPINLOCK(semaphore_wake_lock); |
18 | 18 | ||
19 | /* | 19 | /* |
20 | * Semaphores are implemented using a two-way counter: | 20 | * Semaphores are implemented using a two-way counter: |
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index e75189cb1db7..5f587332234a 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -43,27 +43,14 @@ extern void * __rd_start, * __rd_end; | |||
43 | * The bigger value means no problem. | 43 | * The bigger value means no problem. |
44 | */ | 44 | */ |
45 | struct sh_cpuinfo boot_cpu_data = { CPU_SH_NONE, 10000000, }; | 45 | struct sh_cpuinfo boot_cpu_data = { CPU_SH_NONE, 10000000, }; |
46 | #ifdef CONFIG_VT | ||
46 | struct screen_info screen_info; | 47 | struct screen_info screen_info; |
48 | #endif | ||
47 | 49 | ||
48 | #if defined(CONFIG_SH_UNKNOWN) | 50 | #if defined(CONFIG_SH_UNKNOWN) |
49 | struct sh_machine_vector sh_mv; | 51 | struct sh_machine_vector sh_mv; |
50 | #endif | 52 | #endif |
51 | 53 | ||
52 | /* We need this to satisfy some external references. */ | ||
53 | struct screen_info screen_info = { | ||
54 | 0, 25, /* orig-x, orig-y */ | ||
55 | 0, /* unused */ | ||
56 | 0, /* orig-video-page */ | ||
57 | 0, /* orig-video-mode */ | ||
58 | 80, /* orig-video-cols */ | ||
59 | 0,0,0, /* ega_ax, ega_bx, ega_cx */ | ||
60 | 25, /* orig-video-lines */ | ||
61 | 0, /* orig-video-isVGA */ | ||
62 | 16 /* orig-video-points */ | ||
63 | }; | ||
64 | |||
65 | extern void platform_setup(void); | ||
66 | extern char *get_system_type(void); | ||
67 | extern int root_mountflags; | 54 | extern int root_mountflags; |
68 | 55 | ||
69 | #define MV_NAME_SIZE 32 | 56 | #define MV_NAME_SIZE 32 |
@@ -90,29 +77,8 @@ static struct sh_machine_vector* __init get_mv_byname(const char* name); | |||
90 | 77 | ||
91 | static char command_line[COMMAND_LINE_SIZE] = { 0, }; | 78 | static char command_line[COMMAND_LINE_SIZE] = { 0, }; |
92 | 79 | ||
93 | struct resource standard_io_resources[] = { | 80 | static struct resource code_resource = { .name = "Kernel code", }; |
94 | { "dma1", 0x00, 0x1f }, | 81 | static struct resource data_resource = { .name = "Kernel data", }; |
95 | { "pic1", 0x20, 0x3f }, | ||
96 | { "timer", 0x40, 0x5f }, | ||
97 | { "keyboard", 0x60, 0x6f }, | ||
98 | { "dma page reg", 0x80, 0x8f }, | ||
99 | { "pic2", 0xa0, 0xbf }, | ||
100 | { "dma2", 0xc0, 0xdf }, | ||
101 | { "fpu", 0xf0, 0xff } | ||
102 | }; | ||
103 | |||
104 | #define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource)) | ||
105 | |||
106 | /* System RAM - interrupted by the 640kB-1M hole */ | ||
107 | #define code_resource (ram_resources[3]) | ||
108 | #define data_resource (ram_resources[4]) | ||
109 | static struct resource ram_resources[] = { | ||
110 | { "System RAM", 0x000000, 0x09ffff, IORESOURCE_BUSY }, | ||
111 | { "System RAM", 0x100000, 0x100000, IORESOURCE_BUSY }, | ||
112 | { "Video RAM area", 0x0a0000, 0x0bffff }, | ||
113 | { "Kernel code", 0x100000, 0 }, | ||
114 | { "Kernel data", 0, 0 } | ||
115 | }; | ||
116 | 82 | ||
117 | unsigned long memory_start, memory_end; | 83 | unsigned long memory_start, memory_end; |
118 | 84 | ||
@@ -145,6 +111,24 @@ static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE], | |||
145 | memory_end = memory_start + mem_size; | 111 | memory_end = memory_start + mem_size; |
146 | } | 112 | } |
147 | } | 113 | } |
114 | |||
115 | #ifdef CONFIG_EARLY_PRINTK | ||
116 | if (c == ' ' && !memcmp(from, "earlyprintk=", 12)) { | ||
117 | char *ep_end; | ||
118 | |||
119 | if (to != command_line) | ||
120 | to--; | ||
121 | |||
122 | from += 12; | ||
123 | ep_end = strchr(from, ' '); | ||
124 | |||
125 | setup_early_printk(from); | ||
126 | printk("early console enabled\n"); | ||
127 | |||
128 | from = ep_end; | ||
129 | } | ||
130 | #endif | ||
131 | |||
148 | if (c == ' ' && !memcmp(from, "sh_mv=", 6)) { | 132 | if (c == ' ' && !memcmp(from, "sh_mv=", 6)) { |
149 | char* mv_end; | 133 | char* mv_end; |
150 | char* mv_comma; | 134 | char* mv_comma; |
@@ -237,6 +221,9 @@ static int __init sh_mv_setup(char **cmdline_p) | |||
237 | __set_io_port_base(mv_io_base); | 221 | __set_io_port_base(mv_io_base); |
238 | #endif | 222 | #endif |
239 | 223 | ||
224 | if (!sh_mv.mv_nr_irqs) | ||
225 | sh_mv.mv_nr_irqs = NR_IRQS; | ||
226 | |||
240 | return 0; | 227 | return 0; |
241 | } | 228 | } |
242 | 229 | ||
@@ -245,11 +232,6 @@ void __init setup_arch(char **cmdline_p) | |||
245 | unsigned long bootmap_size; | 232 | unsigned long bootmap_size; |
246 | unsigned long start_pfn, max_pfn, max_low_pfn; | 233 | unsigned long start_pfn, max_pfn, max_low_pfn; |
247 | 234 | ||
248 | #ifdef CONFIG_EARLY_PRINTK | ||
249 | extern void enable_early_printk(void); | ||
250 | |||
251 | enable_early_printk(); | ||
252 | #endif | ||
253 | #ifdef CONFIG_CMDLINE_BOOL | 235 | #ifdef CONFIG_CMDLINE_BOOL |
254 | strcpy(COMMAND_LINE, CONFIG_CMDLINE); | 236 | strcpy(COMMAND_LINE, CONFIG_CMDLINE); |
255 | #endif | 237 | #endif |
@@ -368,14 +350,14 @@ void __init setup_arch(char **cmdline_p) | |||
368 | #endif | 350 | #endif |
369 | 351 | ||
370 | /* Perform the machine specific initialisation */ | 352 | /* Perform the machine specific initialisation */ |
371 | platform_setup(); | 353 | if (likely(sh_mv.mv_setup)) |
354 | sh_mv.mv_setup(cmdline_p); | ||
372 | 355 | ||
373 | paging_init(); | 356 | paging_init(); |
374 | } | 357 | } |
375 | 358 | ||
376 | struct sh_machine_vector* __init get_mv_byname(const char* name) | 359 | struct sh_machine_vector* __init get_mv_byname(const char* name) |
377 | { | 360 | { |
378 | extern int strcasecmp(const char *, const char *); | ||
379 | extern long __machvec_start, __machvec_end; | 361 | extern long __machvec_start, __machvec_end; |
380 | struct sh_machine_vector *all_vecs = | 362 | struct sh_machine_vector *all_vecs = |
381 | (struct sh_machine_vector *)&__machvec_start; | 363 | (struct sh_machine_vector *)&__machvec_start; |
@@ -410,25 +392,18 @@ static int __init topology_init(void) | |||
410 | subsys_initcall(topology_init); | 392 | subsys_initcall(topology_init); |
411 | 393 | ||
412 | static const char *cpu_name[] = { | 394 | static const char *cpu_name[] = { |
413 | [CPU_SH7604] = "SH7604", | 395 | [CPU_SH7604] = "SH7604", [CPU_SH7300] = "SH7300", |
414 | [CPU_SH7705] = "SH7705", | 396 | [CPU_SH7705] = "SH7705", [CPU_SH7706] = "SH7706", |
415 | [CPU_SH7708] = "SH7708", | 397 | [CPU_SH7707] = "SH7707", [CPU_SH7708] = "SH7708", |
416 | [CPU_SH7729] = "SH7729", | 398 | [CPU_SH7709] = "SH7709", [CPU_SH7710] = "SH7710", |
417 | [CPU_SH7300] = "SH7300", | 399 | [CPU_SH7729] = "SH7729", [CPU_SH7750] = "SH7750", |
418 | [CPU_SH7750] = "SH7750", | 400 | [CPU_SH7750S] = "SH7750S", [CPU_SH7750R] = "SH7750R", |
419 | [CPU_SH7750S] = "SH7750S", | 401 | [CPU_SH7751] = "SH7751", [CPU_SH7751R] = "SH7751R", |
420 | [CPU_SH7750R] = "SH7750R", | 402 | [CPU_SH7760] = "SH7760", [CPU_SH73180] = "SH73180", |
421 | [CPU_SH7751] = "SH7751", | 403 | [CPU_ST40RA] = "ST40RA", [CPU_ST40GX1] = "ST40GX1", |
422 | [CPU_SH7751R] = "SH7751R", | 404 | [CPU_SH4_202] = "SH4-202", [CPU_SH4_501] = "SH4-501", |
423 | [CPU_SH7760] = "SH7760", | 405 | [CPU_SH7770] = "SH7770", [CPU_SH7780] = "SH7780", |
424 | [CPU_SH73180] = "SH73180", | 406 | [CPU_SH7781] = "SH7781", [CPU_SH7343] = "SH7343", |
425 | [CPU_ST40RA] = "ST40RA", | ||
426 | [CPU_ST40GX1] = "ST40GX1", | ||
427 | [CPU_SH4_202] = "SH4-202", | ||
428 | [CPU_SH4_501] = "SH4-501", | ||
429 | [CPU_SH7770] = "SH7770", | ||
430 | [CPU_SH7780] = "SH7780", | ||
431 | [CPU_SH7781] = "SH7781", | ||
432 | [CPU_SH_NONE] = "Unknown" | 407 | [CPU_SH_NONE] = "Unknown" |
433 | }; | 408 | }; |
434 | 409 | ||
@@ -438,8 +413,10 @@ const char *get_cpu_subtype(void) | |||
438 | } | 413 | } |
439 | 414 | ||
440 | #ifdef CONFIG_PROC_FS | 415 | #ifdef CONFIG_PROC_FS |
416 | /* Symbolic CPU flags, keep in sync with asm/cpu-features.h */ | ||
441 | static const char *cpu_flags[] = { | 417 | static const char *cpu_flags[] = { |
442 | "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr", "ptea", NULL | 418 | "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr", |
419 | "ptea", "llsc", "l2", NULL | ||
443 | }; | 420 | }; |
444 | 421 | ||
445 | static void show_cpuflags(struct seq_file *m) | 422 | static void show_cpuflags(struct seq_file *m) |
@@ -460,7 +437,8 @@ static void show_cpuflags(struct seq_file *m) | |||
460 | seq_printf(m, "\n"); | 437 | seq_printf(m, "\n"); |
461 | } | 438 | } |
462 | 439 | ||
463 | static void show_cacheinfo(struct seq_file *m, const char *type, struct cache_info info) | 440 | static void show_cacheinfo(struct seq_file *m, const char *type, |
441 | struct cache_info info) | ||
464 | { | 442 | { |
465 | unsigned int cache_size; | 443 | unsigned int cache_size; |
466 | 444 | ||
@@ -493,7 +471,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
493 | * unified cache on the SH-2 and SH-3, as well as the harvard | 471 | * unified cache on the SH-2 and SH-3, as well as the harvard |
494 | * style cache on the SH-4. | 472 | * style cache on the SH-4. |
495 | */ | 473 | */ |
496 | if (test_bit(SH_CACHE_COMBINED, &(boot_cpu_data.icache.flags))) { | 474 | if (boot_cpu_data.icache.flags & SH_CACHE_COMBINED) { |
497 | seq_printf(m, "unified\n"); | 475 | seq_printf(m, "unified\n"); |
498 | show_cacheinfo(m, "cache", boot_cpu_data.icache); | 476 | show_cacheinfo(m, "cache", boot_cpu_data.icache); |
499 | } else { | 477 | } else { |
@@ -502,6 +480,10 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
502 | show_cacheinfo(m, "dcache", boot_cpu_data.dcache); | 480 | show_cacheinfo(m, "dcache", boot_cpu_data.dcache); |
503 | } | 481 | } |
504 | 482 | ||
483 | /* Optional secondary cache */ | ||
484 | if (boot_cpu_data.flags & CPU_HAS_L2_CACHE) | ||
485 | show_cacheinfo(m, "scache", boot_cpu_data.scache); | ||
486 | |||
505 | seq_printf(m, "bogomips\t: %lu.%02lu\n", | 487 | seq_printf(m, "bogomips\t: %lu.%02lu\n", |
506 | boot_cpu_data.loops_per_jiffy/(500000/HZ), | 488 | boot_cpu_data.loops_per_jiffy/(500000/HZ), |
507 | (boot_cpu_data.loops_per_jiffy/(5000/HZ)) % 100); | 489 | (boot_cpu_data.loops_per_jiffy/(5000/HZ)) % 100); |
@@ -617,4 +599,3 @@ static int __init kgdb_parse_options(char *options) | |||
617 | } | 599 | } |
618 | __setup("kgdb=", kgdb_parse_options); | 600 | __setup("kgdb=", kgdb_parse_options); |
619 | #endif /* CONFIG_SH_KGDB */ | 601 | #endif /* CONFIG_SH_KGDB */ |
620 | |||
diff --git a/arch/sh/kernel/sh_ksyms.c b/arch/sh/kernel/sh_ksyms.c index 245ed8f945e8..d3cbfa2ad4a7 100644 --- a/arch/sh/kernel/sh_ksyms.c +++ b/arch/sh/kernel/sh_ksyms.c | |||
@@ -27,21 +27,11 @@ EXPORT_SYMBOL(sh_mv); | |||
27 | 27 | ||
28 | /* platform dependent support */ | 28 | /* platform dependent support */ |
29 | EXPORT_SYMBOL(dump_fpu); | 29 | EXPORT_SYMBOL(dump_fpu); |
30 | EXPORT_SYMBOL(iounmap); | ||
31 | EXPORT_SYMBOL(enable_irq); | ||
32 | EXPORT_SYMBOL(disable_irq); | ||
33 | EXPORT_SYMBOL(probe_irq_mask); | ||
34 | EXPORT_SYMBOL(kernel_thread); | 30 | EXPORT_SYMBOL(kernel_thread); |
35 | EXPORT_SYMBOL(disable_irq_nosync); | ||
36 | EXPORT_SYMBOL(irq_desc); | 31 | EXPORT_SYMBOL(irq_desc); |
37 | EXPORT_SYMBOL(no_irq_type); | 32 | EXPORT_SYMBOL(no_irq_type); |
38 | 33 | ||
39 | EXPORT_SYMBOL(strstr); | ||
40 | EXPORT_SYMBOL(strlen); | 34 | EXPORT_SYMBOL(strlen); |
41 | EXPORT_SYMBOL(strnlen); | ||
42 | EXPORT_SYMBOL(strchr); | ||
43 | EXPORT_SYMBOL(strcat); | ||
44 | EXPORT_SYMBOL(strncat); | ||
45 | 35 | ||
46 | /* PCI exports */ | 36 | /* PCI exports */ |
47 | #ifdef CONFIG_PCI | 37 | #ifdef CONFIG_PCI |
@@ -52,13 +42,8 @@ EXPORT_SYMBOL(pci_free_consistent); | |||
52 | /* mem exports */ | 42 | /* mem exports */ |
53 | EXPORT_SYMBOL(memchr); | 43 | EXPORT_SYMBOL(memchr); |
54 | EXPORT_SYMBOL(memcpy); | 44 | EXPORT_SYMBOL(memcpy); |
55 | EXPORT_SYMBOL(memcpy_fromio); | ||
56 | EXPORT_SYMBOL(memcpy_toio); | ||
57 | EXPORT_SYMBOL(memset); | 45 | EXPORT_SYMBOL(memset); |
58 | EXPORT_SYMBOL(memset_io); | ||
59 | EXPORT_SYMBOL(memmove); | 46 | EXPORT_SYMBOL(memmove); |
60 | EXPORT_SYMBOL(memcmp); | ||
61 | EXPORT_SYMBOL(memscan); | ||
62 | EXPORT_SYMBOL(__copy_user); | 47 | EXPORT_SYMBOL(__copy_user); |
63 | EXPORT_SYMBOL(boot_cpu_data); | 48 | EXPORT_SYMBOL(boot_cpu_data); |
64 | 49 | ||
@@ -94,7 +79,9 @@ EXPORT_SYMBOL(strcpy); | |||
94 | DECLARE_EXPORT(__movstr_i4_even); | 79 | DECLARE_EXPORT(__movstr_i4_even); |
95 | DECLARE_EXPORT(__movstr_i4_odd); | 80 | DECLARE_EXPORT(__movstr_i4_odd); |
96 | DECLARE_EXPORT(__movstrSI12_i4); | 81 | DECLARE_EXPORT(__movstrSI12_i4); |
82 | #endif | ||
97 | 83 | ||
84 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_SH7705_CACHE_32KB) | ||
98 | /* needed by some modules */ | 85 | /* needed by some modules */ |
99 | EXPORT_SYMBOL(flush_cache_all); | 86 | EXPORT_SYMBOL(flush_cache_all); |
100 | EXPORT_SYMBOL(flush_cache_range); | 87 | EXPORT_SYMBOL(flush_cache_range); |
@@ -102,11 +89,9 @@ EXPORT_SYMBOL(flush_dcache_page); | |||
102 | EXPORT_SYMBOL(__flush_purge_region); | 89 | EXPORT_SYMBOL(__flush_purge_region); |
103 | #endif | 90 | #endif |
104 | 91 | ||
105 | #if defined(CONFIG_SH7705_CACHE_32KB) | 92 | #if defined(CONFIG_MMU) && (defined(CONFIG_CPU_SH4) || \ |
106 | EXPORT_SYMBOL(flush_cache_all); | 93 | defined(CONFIG_SH7705_CACHE_32KB)) |
107 | EXPORT_SYMBOL(flush_cache_range); | 94 | EXPORT_SYMBOL(clear_user_page); |
108 | EXPORT_SYMBOL(flush_dcache_page); | ||
109 | EXPORT_SYMBOL(__flush_purge_region); | ||
110 | #endif | 95 | #endif |
111 | 96 | ||
112 | EXPORT_SYMBOL(flush_tlb_page); | 97 | EXPORT_SYMBOL(flush_tlb_page); |
@@ -116,7 +101,12 @@ EXPORT_SYMBOL(__down_trylock); | |||
116 | EXPORT_SYMBOL(synchronize_irq); | 101 | EXPORT_SYMBOL(synchronize_irq); |
117 | #endif | 102 | #endif |
118 | 103 | ||
104 | #ifdef CONFIG_PM | ||
105 | EXPORT_SYMBOL(pm_suspend); | ||
106 | #endif | ||
107 | |||
119 | EXPORT_SYMBOL(csum_partial); | 108 | EXPORT_SYMBOL(csum_partial); |
109 | #ifdef CONFIG_IPV6 | ||
120 | EXPORT_SYMBOL(csum_ipv6_magic); | 110 | EXPORT_SYMBOL(csum_ipv6_magic); |
121 | EXPORT_SYMBOL(consistent_sync); | 111 | #endif |
122 | EXPORT_SYMBOL(clear_page); | 112 | EXPORT_SYMBOL(clear_page); |
diff --git a/arch/sh/kernel/signal.c b/arch/sh/kernel/signal.c index b475c4d2405f..5213f5bc6ce0 100644 --- a/arch/sh/kernel/signal.c +++ b/arch/sh/kernel/signal.c | |||
@@ -8,7 +8,6 @@ | |||
8 | * SuperH version: Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima | 8 | * SuperH version: Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | |||
12 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
13 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
14 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
@@ -21,6 +20,7 @@ | |||
21 | #include <linux/unistd.h> | 20 | #include <linux/unistd.h> |
22 | #include <linux/stddef.h> | 21 | #include <linux/stddef.h> |
23 | #include <linux/tty.h> | 22 | #include <linux/tty.h> |
23 | #include <linux/elf.h> | ||
24 | #include <linux/personality.h> | 24 | #include <linux/personality.h> |
25 | #include <linux/binfmts.h> | 25 | #include <linux/binfmts.h> |
26 | 26 | ||
@@ -29,12 +29,8 @@ | |||
29 | #include <asm/pgtable.h> | 29 | #include <asm/pgtable.h> |
30 | #include <asm/cacheflush.h> | 30 | #include <asm/cacheflush.h> |
31 | 31 | ||
32 | #define DEBUG_SIG 0 | ||
33 | |||
34 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 32 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
35 | 33 | ||
36 | asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset); | ||
37 | |||
38 | /* | 34 | /* |
39 | * Atomically swap in the new signal mask, and wait for a signal. | 35 | * Atomically swap in the new signal mask, and wait for a signal. |
40 | */ | 36 | */ |
@@ -43,51 +39,17 @@ sys_sigsuspend(old_sigset_t mask, | |||
43 | unsigned long r5, unsigned long r6, unsigned long r7, | 39 | unsigned long r5, unsigned long r6, unsigned long r7, |
44 | struct pt_regs regs) | 40 | struct pt_regs regs) |
45 | { | 41 | { |
46 | sigset_t saveset; | ||
47 | |||
48 | mask &= _BLOCKABLE; | 42 | mask &= _BLOCKABLE; |
49 | spin_lock_irq(¤t->sighand->siglock); | 43 | spin_lock_irq(¤t->sighand->siglock); |
50 | saveset = current->blocked; | 44 | current->saved_sigmask = current->blocked; |
51 | siginitset(¤t->blocked, mask); | 45 | siginitset(¤t->blocked, mask); |
52 | recalc_sigpending(); | 46 | recalc_sigpending(); |
53 | spin_unlock_irq(¤t->sighand->siglock); | 47 | spin_unlock_irq(¤t->sighand->siglock); |
54 | 48 | ||
55 | regs.regs[0] = -EINTR; | 49 | current->state = TASK_INTERRUPTIBLE; |
56 | while (1) { | 50 | schedule(); |
57 | current->state = TASK_INTERRUPTIBLE; | 51 | set_thread_flag(TIF_RESTORE_SIGMASK); |
58 | schedule(); | 52 | return -ERESTARTNOHAND; |
59 | if (do_signal(®s, &saveset)) | ||
60 | return -EINTR; | ||
61 | } | ||
62 | } | ||
63 | |||
64 | asmlinkage int | ||
65 | sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, | ||
66 | unsigned long r6, unsigned long r7, | ||
67 | struct pt_regs regs) | ||
68 | { | ||
69 | sigset_t saveset, newset; | ||
70 | |||
71 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
72 | if (sigsetsize != sizeof(sigset_t)) | ||
73 | return -EINVAL; | ||
74 | |||
75 | if (copy_from_user(&newset, unewset, sizeof(newset))) | ||
76 | return -EFAULT; | ||
77 | sigdelsetmask(&newset, ~_BLOCKABLE); | ||
78 | spin_lock_irq(¤t->sighand->siglock); | ||
79 | saveset = current->blocked; | ||
80 | current->blocked = newset; | ||
81 | recalc_sigpending(); | ||
82 | spin_unlock_irq(¤t->sighand->siglock); | ||
83 | |||
84 | regs.regs[0] = -EINTR; | ||
85 | while (1) { | ||
86 | current->state = TASK_INTERRUPTIBLE; | ||
87 | schedule(); | ||
88 | if (do_signal(®s, &saveset)) | ||
89 | return -EINTR; | ||
90 | } | ||
91 | } | 53 | } |
92 | 54 | ||
93 | asmlinkage int | 55 | asmlinkage int |
@@ -348,7 +310,12 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) | |||
348 | return (void __user *)((sp - frame_size) & -8ul); | 310 | return (void __user *)((sp - frame_size) & -8ul); |
349 | } | 311 | } |
350 | 312 | ||
351 | static void setup_frame(int sig, struct k_sigaction *ka, | 313 | /* These symbols are defined with the addresses in the vsyscall page. |
314 | See vsyscall-trapa.S. */ | ||
315 | extern void __user __kernel_sigreturn; | ||
316 | extern void __user __kernel_rt_sigreturn; | ||
317 | |||
318 | static int setup_frame(int sig, struct k_sigaction *ka, | ||
352 | sigset_t *set, struct pt_regs *regs) | 319 | sigset_t *set, struct pt_regs *regs) |
353 | { | 320 | { |
354 | struct sigframe __user *frame; | 321 | struct sigframe __user *frame; |
@@ -368,15 +335,18 @@ static void setup_frame(int sig, struct k_sigaction *ka, | |||
368 | 335 | ||
369 | err |= setup_sigcontext(&frame->sc, regs, set->sig[0]); | 336 | err |= setup_sigcontext(&frame->sc, regs, set->sig[0]); |
370 | 337 | ||
371 | if (_NSIG_WORDS > 1) { | 338 | if (_NSIG_WORDS > 1) |
372 | err |= __copy_to_user(frame->extramask, &set->sig[1], | 339 | err |= __copy_to_user(frame->extramask, &set->sig[1], |
373 | sizeof(frame->extramask)); | 340 | sizeof(frame->extramask)); |
374 | } | ||
375 | 341 | ||
376 | /* Set up to return from userspace. If provided, use a stub | 342 | /* Set up to return from userspace. If provided, use a stub |
377 | already in userspace. */ | 343 | already in userspace. */ |
378 | if (ka->sa.sa_flags & SA_RESTORER) { | 344 | if (ka->sa.sa_flags & SA_RESTORER) { |
379 | regs->pr = (unsigned long) ka->sa.sa_restorer; | 345 | regs->pr = (unsigned long) ka->sa.sa_restorer; |
346 | #ifdef CONFIG_VSYSCALL | ||
347 | } else if (likely(current->mm->context.vdso)) { | ||
348 | regs->pr = VDSO_SYM(&__kernel_sigreturn); | ||
349 | #endif | ||
380 | } else { | 350 | } else { |
381 | /* Generate return code (system call to sigreturn) */ | 351 | /* Generate return code (system call to sigreturn) */ |
382 | err |= __put_user(MOVW(7), &frame->retcode[0]); | 352 | err |= __put_user(MOVW(7), &frame->retcode[0]); |
@@ -402,21 +372,22 @@ static void setup_frame(int sig, struct k_sigaction *ka, | |||
402 | 372 | ||
403 | set_fs(USER_DS); | 373 | set_fs(USER_DS); |
404 | 374 | ||
405 | #if DEBUG_SIG | 375 | pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n", |
406 | printk("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n", | 376 | current->comm, current->pid, frame, regs->pc, regs->pr); |
407 | current->comm, current->pid, frame, regs->pc, regs->pr); | ||
408 | #endif | ||
409 | 377 | ||
410 | flush_cache_sigtramp(regs->pr); | 378 | flush_cache_sigtramp(regs->pr); |
379 | |||
411 | if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode)) | 380 | if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode)) |
412 | flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES); | 381 | flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES); |
413 | return; | 382 | |
383 | return 0; | ||
414 | 384 | ||
415 | give_sigsegv: | 385 | give_sigsegv: |
416 | force_sigsegv(sig, current); | 386 | force_sigsegv(sig, current); |
387 | return -EFAULT; | ||
417 | } | 388 | } |
418 | 389 | ||
419 | static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 390 | static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
420 | sigset_t *set, struct pt_regs *regs) | 391 | sigset_t *set, struct pt_regs *regs) |
421 | { | 392 | { |
422 | struct rt_sigframe __user *frame; | 393 | struct rt_sigframe __user *frame; |
@@ -452,6 +423,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
452 | already in userspace. */ | 423 | already in userspace. */ |
453 | if (ka->sa.sa_flags & SA_RESTORER) { | 424 | if (ka->sa.sa_flags & SA_RESTORER) { |
454 | regs->pr = (unsigned long) ka->sa.sa_restorer; | 425 | regs->pr = (unsigned long) ka->sa.sa_restorer; |
426 | #ifdef CONFIG_VSYSCALL | ||
427 | } else if (likely(current->mm->context.vdso)) { | ||
428 | regs->pr = VDSO_SYM(&__kernel_rt_sigreturn); | ||
429 | #endif | ||
455 | } else { | 430 | } else { |
456 | /* Generate return code (system call to rt_sigreturn) */ | 431 | /* Generate return code (system call to rt_sigreturn) */ |
457 | err |= __put_user(MOVW(7), &frame->retcode[0]); | 432 | err |= __put_user(MOVW(7), &frame->retcode[0]); |
@@ -477,28 +452,31 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
477 | 452 | ||
478 | set_fs(USER_DS); | 453 | set_fs(USER_DS); |
479 | 454 | ||
480 | #if DEBUG_SIG | 455 | pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n", |
481 | printk("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n", | 456 | current->comm, current->pid, frame, regs->pc, regs->pr); |
482 | current->comm, current->pid, frame, regs->pc, regs->pr); | ||
483 | #endif | ||
484 | 457 | ||
485 | flush_cache_sigtramp(regs->pr); | 458 | flush_cache_sigtramp(regs->pr); |
459 | |||
486 | if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode)) | 460 | if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode)) |
487 | flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES); | 461 | flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES); |
488 | return; | 462 | |
463 | return 0; | ||
489 | 464 | ||
490 | give_sigsegv: | 465 | give_sigsegv: |
491 | force_sigsegv(sig, current); | 466 | force_sigsegv(sig, current); |
467 | return -EFAULT; | ||
492 | } | 468 | } |
493 | 469 | ||
494 | /* | 470 | /* |
495 | * OK, we're invoking a handler | 471 | * OK, we're invoking a handler |
496 | */ | 472 | */ |
497 | 473 | ||
498 | static void | 474 | static int |
499 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | 475 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, |
500 | sigset_t *oldset, struct pt_regs *regs) | 476 | sigset_t *oldset, struct pt_regs *regs) |
501 | { | 477 | { |
478 | int ret; | ||
479 | |||
502 | /* Are we from a system call? */ | 480 | /* Are we from a system call? */ |
503 | if (regs->tra >= 0) { | 481 | if (regs->tra >= 0) { |
504 | /* If so, check system call restarting.. */ | 482 | /* If so, check system call restarting.. */ |
@@ -539,19 +517,23 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
539 | 517 | ||
540 | /* Set up the stack frame */ | 518 | /* Set up the stack frame */ |
541 | if (ka->sa.sa_flags & SA_SIGINFO) | 519 | if (ka->sa.sa_flags & SA_SIGINFO) |
542 | setup_rt_frame(sig, ka, info, oldset, regs); | 520 | ret = setup_rt_frame(sig, ka, info, oldset, regs); |
543 | else | 521 | else |
544 | setup_frame(sig, ka, oldset, regs); | 522 | ret = setup_frame(sig, ka, oldset, regs); |
545 | 523 | ||
546 | if (ka->sa.sa_flags & SA_ONESHOT) | 524 | if (ka->sa.sa_flags & SA_ONESHOT) |
547 | ka->sa.sa_handler = SIG_DFL; | 525 | ka->sa.sa_handler = SIG_DFL; |
548 | 526 | ||
549 | spin_lock_irq(¤t->sighand->siglock); | 527 | if (ret == 0) { |
550 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 528 | spin_lock_irq(¤t->sighand->siglock); |
551 | if (!(ka->sa.sa_flags & SA_NODEFER)) | 529 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
552 | sigaddset(¤t->blocked,sig); | 530 | if (!(ka->sa.sa_flags & SA_NODEFER)) |
553 | recalc_sigpending(); | 531 | sigaddset(¤t->blocked,sig); |
554 | spin_unlock_irq(¤t->sighand->siglock); | 532 | recalc_sigpending(); |
533 | spin_unlock_irq(¤t->sighand->siglock); | ||
534 | } | ||
535 | |||
536 | return ret; | ||
555 | } | 537 | } |
556 | 538 | ||
557 | /* | 539 | /* |
@@ -563,11 +545,12 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
563 | * the kernel can handle, and then we build all the user-level signal handling | 545 | * the kernel can handle, and then we build all the user-level signal handling |
564 | * stack-frames in one go after that. | 546 | * stack-frames in one go after that. |
565 | */ | 547 | */ |
566 | int do_signal(struct pt_regs *regs, sigset_t *oldset) | 548 | static void do_signal(struct pt_regs *regs, unsigned int save_r0) |
567 | { | 549 | { |
568 | siginfo_t info; | 550 | siginfo_t info; |
569 | int signr; | 551 | int signr; |
570 | struct k_sigaction ka; | 552 | struct k_sigaction ka; |
553 | sigset_t *oldset; | ||
571 | 554 | ||
572 | /* | 555 | /* |
573 | * We want the common case to go fast, which | 556 | * We want the common case to go fast, which |
@@ -576,19 +559,27 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | |||
576 | * if so. | 559 | * if so. |
577 | */ | 560 | */ |
578 | if (!user_mode(regs)) | 561 | if (!user_mode(regs)) |
579 | return 1; | 562 | return; |
580 | 563 | ||
581 | if (try_to_freeze()) | 564 | if (try_to_freeze()) |
582 | goto no_signal; | 565 | goto no_signal; |
583 | 566 | ||
584 | if (!oldset) | 567 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
568 | oldset = ¤t->saved_sigmask; | ||
569 | else | ||
585 | oldset = ¤t->blocked; | 570 | oldset = ¤t->blocked; |
586 | 571 | ||
587 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 572 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
588 | if (signr > 0) { | 573 | if (signr > 0) { |
589 | /* Whee! Actually deliver the signal. */ | 574 | /* Whee! Actually deliver the signal. */ |
590 | handle_signal(signr, &ka, &info, oldset, regs); | 575 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) { |
591 | return 1; | 576 | /* a signal was successfully delivered; the saved |
577 | * sigmask will have been stored in the signal frame, | ||
578 | * and will be restored by sigreturn, so we can simply | ||
579 | * clear the TIF_RESTORE_SIGMASK flag */ | ||
580 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
581 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
582 | } | ||
592 | } | 583 | } |
593 | 584 | ||
594 | no_signal: | 585 | no_signal: |
@@ -597,10 +588,27 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | |||
597 | /* Restart the system call - no handlers present */ | 588 | /* Restart the system call - no handlers present */ |
598 | if (regs->regs[0] == -ERESTARTNOHAND || | 589 | if (regs->regs[0] == -ERESTARTNOHAND || |
599 | regs->regs[0] == -ERESTARTSYS || | 590 | regs->regs[0] == -ERESTARTSYS || |
600 | regs->regs[0] == -ERESTARTNOINTR || | 591 | regs->regs[0] == -ERESTARTNOINTR) { |
601 | regs->regs[0] == -ERESTART_RESTARTBLOCK) { | 592 | regs->regs[0] = save_r0; |
593 | regs->pc -= 2; | ||
594 | } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) { | ||
602 | regs->pc -= 2; | 595 | regs->pc -= 2; |
596 | regs->regs[3] = __NR_restart_syscall; | ||
603 | } | 597 | } |
604 | } | 598 | } |
605 | return 0; | 599 | |
600 | /* if there's no signal to deliver, we just put the saved sigmask | ||
601 | * back */ | ||
602 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
603 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
604 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
605 | } | ||
606 | } | ||
607 | |||
608 | asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned int save_r0, | ||
609 | __u32 thread_info_flags) | ||
610 | { | ||
611 | /* deal with pending signal delivery */ | ||
612 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | ||
613 | do_signal(regs, save_r0); | ||
606 | } | 614 | } |
diff --git a/arch/sh/kernel/sys_sh.c b/arch/sh/kernel/sys_sh.c index 917b2f32f260..b68ff705f067 100644 --- a/arch/sh/kernel/sys_sh.c +++ b/arch/sh/kernel/sys_sh.c | |||
@@ -21,7 +21,8 @@ | |||
21 | #include <linux/mman.h> | 21 | #include <linux/mman.h> |
22 | #include <linux/file.h> | 22 | #include <linux/file.h> |
23 | #include <linux/utsname.h> | 23 | #include <linux/utsname.h> |
24 | 24 | #include <linux/module.h> | |
25 | #include <asm/cacheflush.h> | ||
25 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
26 | #include <asm/ipc.h> | 27 | #include <asm/ipc.h> |
27 | 28 | ||
@@ -44,11 +45,16 @@ asmlinkage int sys_pipe(unsigned long r4, unsigned long r5, | |||
44 | return error; | 45 | return error; |
45 | } | 46 | } |
46 | 47 | ||
47 | #if defined(HAVE_ARCH_UNMAPPED_AREA) | 48 | unsigned long shm_align_mask = PAGE_SIZE - 1; /* Sane caches */ |
49 | |||
50 | EXPORT_SYMBOL(shm_align_mask); | ||
51 | |||
48 | /* | 52 | /* |
49 | * To avoid cache alias, we map the shard page with same color. | 53 | * To avoid cache aliases, we map the shared page with same color. |
50 | */ | 54 | */ |
51 | #define COLOUR_ALIGN(addr) (((addr)+SHMLBA-1)&~(SHMLBA-1)) | 55 | #define COLOUR_ALIGN(addr, pgoff) \ |
56 | ((((addr) + shm_align_mask) & ~shm_align_mask) + \ | ||
57 | (((pgoff) << PAGE_SHIFT) & shm_align_mask)) | ||
52 | 58 | ||
53 | unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | 59 | unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, |
54 | unsigned long len, unsigned long pgoff, unsigned long flags) | 60 | unsigned long len, unsigned long pgoff, unsigned long flags) |
@@ -56,43 +62,52 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
56 | struct mm_struct *mm = current->mm; | 62 | struct mm_struct *mm = current->mm; |
57 | struct vm_area_struct *vma; | 63 | struct vm_area_struct *vma; |
58 | unsigned long start_addr; | 64 | unsigned long start_addr; |
65 | int do_colour_align; | ||
59 | 66 | ||
60 | if (flags & MAP_FIXED) { | 67 | if (flags & MAP_FIXED) { |
61 | /* We do not accept a shared mapping if it would violate | 68 | /* We do not accept a shared mapping if it would violate |
62 | * cache aliasing constraints. | 69 | * cache aliasing constraints. |
63 | */ | 70 | */ |
64 | if ((flags & MAP_SHARED) && (addr & (SHMLBA - 1))) | 71 | if ((flags & MAP_SHARED) && (addr & shm_align_mask)) |
65 | return -EINVAL; | 72 | return -EINVAL; |
66 | return addr; | 73 | return addr; |
67 | } | 74 | } |
68 | 75 | ||
69 | if (len > TASK_SIZE) | 76 | if (unlikely(len > TASK_SIZE)) |
70 | return -ENOMEM; | 77 | return -ENOMEM; |
71 | 78 | ||
79 | do_colour_align = 0; | ||
80 | if (filp || (flags & MAP_SHARED)) | ||
81 | do_colour_align = 1; | ||
82 | |||
72 | if (addr) { | 83 | if (addr) { |
73 | if (flags & MAP_PRIVATE) | 84 | if (do_colour_align) |
74 | addr = PAGE_ALIGN(addr); | 85 | addr = COLOUR_ALIGN(addr, pgoff); |
75 | else | 86 | else |
76 | addr = COLOUR_ALIGN(addr); | 87 | addr = PAGE_ALIGN(addr); |
88 | |||
77 | vma = find_vma(mm, addr); | 89 | vma = find_vma(mm, addr); |
78 | if (TASK_SIZE - len >= addr && | 90 | if (TASK_SIZE - len >= addr && |
79 | (!vma || addr + len <= vma->vm_start)) | 91 | (!vma || addr + len <= vma->vm_start)) |
80 | return addr; | 92 | return addr; |
81 | } | 93 | } |
82 | if (len <= mm->cached_hole_size) { | 94 | |
95 | if (len > mm->cached_hole_size) { | ||
96 | start_addr = addr = mm->free_area_cache; | ||
97 | } else { | ||
83 | mm->cached_hole_size = 0; | 98 | mm->cached_hole_size = 0; |
84 | mm->free_area_cache = TASK_UNMAPPED_BASE; | 99 | start_addr = addr = TASK_UNMAPPED_BASE; |
85 | } | 100 | } |
86 | if (flags & MAP_PRIVATE) | ||
87 | addr = PAGE_ALIGN(mm->free_area_cache); | ||
88 | else | ||
89 | addr = COLOUR_ALIGN(mm->free_area_cache); | ||
90 | start_addr = addr; | ||
91 | 101 | ||
92 | full_search: | 102 | full_search: |
103 | if (do_colour_align) | ||
104 | addr = COLOUR_ALIGN(addr, pgoff); | ||
105 | else | ||
106 | addr = PAGE_ALIGN(mm->free_area_cache); | ||
107 | |||
93 | for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { | 108 | for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { |
94 | /* At this point: (!vma || addr < vma->vm_end). */ | 109 | /* At this point: (!vma || addr < vma->vm_end). */ |
95 | if (TASK_SIZE - len < addr) { | 110 | if (unlikely(TASK_SIZE - len < addr)) { |
96 | /* | 111 | /* |
97 | * Start a new search - just in case we missed | 112 | * Start a new search - just in case we missed |
98 | * some holes. | 113 | * some holes. |
@@ -104,7 +119,7 @@ full_search: | |||
104 | } | 119 | } |
105 | return -ENOMEM; | 120 | return -ENOMEM; |
106 | } | 121 | } |
107 | if (!vma || addr + len <= vma->vm_start) { | 122 | if (likely(!vma || addr + len <= vma->vm_start)) { |
108 | /* | 123 | /* |
109 | * Remember the place where we stopped the search: | 124 | * Remember the place where we stopped the search: |
110 | */ | 125 | */ |
@@ -115,11 +130,10 @@ full_search: | |||
115 | mm->cached_hole_size = vma->vm_start - addr; | 130 | mm->cached_hole_size = vma->vm_start - addr; |
116 | 131 | ||
117 | addr = vma->vm_end; | 132 | addr = vma->vm_end; |
118 | if (!(flags & MAP_PRIVATE)) | 133 | if (do_colour_align) |
119 | addr = COLOUR_ALIGN(addr); | 134 | addr = COLOUR_ALIGN(addr, pgoff); |
120 | } | 135 | } |
121 | } | 136 | } |
122 | #endif | ||
123 | 137 | ||
124 | static inline long | 138 | static inline long |
125 | do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, | 139 | do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, |
diff --git a/arch/sh/kernel/syscalls.S b/arch/sh/kernel/syscalls.S new file mode 100644 index 000000000000..768334e95075 --- /dev/null +++ b/arch/sh/kernel/syscalls.S | |||
@@ -0,0 +1,353 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/syscalls.S | ||
3 | * | ||
4 | * System call table for SuperH | ||
5 | * | ||
6 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | ||
7 | * Copyright (C) 2003 Paul Mundt | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | * | ||
13 | */ | ||
14 | #include <linux/sys.h> | ||
15 | #include <linux/linkage.h> | ||
16 | |||
17 | #if !defined(CONFIG_NFSD) && !defined(CONFIG_NFSD_MODULE) | ||
18 | #define sys_nfsservctl sys_ni_syscall | ||
19 | #endif | ||
20 | |||
21 | #if !defined(CONFIG_MMU) | ||
22 | #define sys_madvise sys_ni_syscall | ||
23 | #define sys_readahead sys_ni_syscall | ||
24 | #define sys_mprotect sys_ni_syscall | ||
25 | #define sys_msync sys_ni_syscall | ||
26 | #define sys_mlock sys_ni_syscall | ||
27 | #define sys_munlock sys_ni_syscall | ||
28 | #define sys_mlockall sys_ni_syscall | ||
29 | #define sys_munlockall sys_ni_syscall | ||
30 | #define sys_mremap sys_ni_syscall | ||
31 | #define sys_mincore sys_ni_syscall | ||
32 | #define sys_remap_file_pages sys_ni_syscall | ||
33 | #endif | ||
34 | |||
35 | .data | ||
36 | ENTRY(sys_call_table) | ||
37 | .long sys_restart_syscall /* 0 - old "setup()" system call*/ | ||
38 | .long sys_exit | ||
39 | .long sys_fork | ||
40 | .long sys_read | ||
41 | .long sys_write | ||
42 | .long sys_open /* 5 */ | ||
43 | .long sys_close | ||
44 | .long sys_waitpid | ||
45 | .long sys_creat | ||
46 | .long sys_link | ||
47 | .long sys_unlink /* 10 */ | ||
48 | .long sys_execve | ||
49 | .long sys_chdir | ||
50 | .long sys_time | ||
51 | .long sys_mknod | ||
52 | .long sys_chmod /* 15 */ | ||
53 | .long sys_lchown16 | ||
54 | .long sys_ni_syscall /* old break syscall holder */ | ||
55 | .long sys_stat | ||
56 | .long sys_lseek | ||
57 | .long sys_getpid /* 20 */ | ||
58 | .long sys_mount | ||
59 | .long sys_oldumount | ||
60 | .long sys_setuid16 | ||
61 | .long sys_getuid16 | ||
62 | .long sys_stime /* 25 */ | ||
63 | .long sys_ptrace | ||
64 | .long sys_alarm | ||
65 | .long sys_fstat | ||
66 | .long sys_pause | ||
67 | .long sys_utime /* 30 */ | ||
68 | .long sys_ni_syscall /* old stty syscall holder */ | ||
69 | .long sys_ni_syscall /* old gtty syscall holder */ | ||
70 | .long sys_access | ||
71 | .long sys_nice | ||
72 | .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */ | ||
73 | .long sys_sync | ||
74 | .long sys_kill | ||
75 | .long sys_rename | ||
76 | .long sys_mkdir | ||
77 | .long sys_rmdir /* 40 */ | ||
78 | .long sys_dup | ||
79 | .long sys_pipe | ||
80 | .long sys_times | ||
81 | .long sys_ni_syscall /* old prof syscall holder */ | ||
82 | .long sys_brk /* 45 */ | ||
83 | .long sys_setgid16 | ||
84 | .long sys_getgid16 | ||
85 | .long sys_signal | ||
86 | .long sys_geteuid16 | ||
87 | .long sys_getegid16 /* 50 */ | ||
88 | .long sys_acct | ||
89 | .long sys_umount /* recycled never used phys() */ | ||
90 | .long sys_ni_syscall /* old lock syscall holder */ | ||
91 | .long sys_ioctl | ||
92 | .long sys_fcntl /* 55 */ | ||
93 | .long sys_ni_syscall /* old mpx syscall holder */ | ||
94 | .long sys_setpgid | ||
95 | .long sys_ni_syscall /* old ulimit syscall holder */ | ||
96 | .long sys_ni_syscall /* sys_olduname */ | ||
97 | .long sys_umask /* 60 */ | ||
98 | .long sys_chroot | ||
99 | .long sys_ustat | ||
100 | .long sys_dup2 | ||
101 | .long sys_getppid | ||
102 | .long sys_getpgrp /* 65 */ | ||
103 | .long sys_setsid | ||
104 | .long sys_sigaction | ||
105 | .long sys_sgetmask | ||
106 | .long sys_ssetmask | ||
107 | .long sys_setreuid16 /* 70 */ | ||
108 | .long sys_setregid16 | ||
109 | .long sys_sigsuspend | ||
110 | .long sys_sigpending | ||
111 | .long sys_sethostname | ||
112 | .long sys_setrlimit /* 75 */ | ||
113 | .long sys_old_getrlimit | ||
114 | .long sys_getrusage | ||
115 | .long sys_gettimeofday | ||
116 | .long sys_settimeofday | ||
117 | .long sys_getgroups16 /* 80 */ | ||
118 | .long sys_setgroups16 | ||
119 | .long sys_ni_syscall /* sys_oldselect */ | ||
120 | .long sys_symlink | ||
121 | .long sys_lstat | ||
122 | .long sys_readlink /* 85 */ | ||
123 | .long sys_uselib | ||
124 | .long sys_swapon | ||
125 | .long sys_reboot | ||
126 | .long old_readdir | ||
127 | .long old_mmap /* 90 */ | ||
128 | .long sys_munmap | ||
129 | .long sys_truncate | ||
130 | .long sys_ftruncate | ||
131 | .long sys_fchmod | ||
132 | .long sys_fchown16 /* 95 */ | ||
133 | .long sys_getpriority | ||
134 | .long sys_setpriority | ||
135 | .long sys_ni_syscall /* old profil syscall holder */ | ||
136 | .long sys_statfs | ||
137 | .long sys_fstatfs /* 100 */ | ||
138 | .long sys_ni_syscall /* ioperm */ | ||
139 | .long sys_socketcall | ||
140 | .long sys_syslog | ||
141 | .long sys_setitimer | ||
142 | .long sys_getitimer /* 105 */ | ||
143 | .long sys_newstat | ||
144 | .long sys_newlstat | ||
145 | .long sys_newfstat | ||
146 | .long sys_uname | ||
147 | .long sys_ni_syscall /* 110 */ /* iopl */ | ||
148 | .long sys_vhangup | ||
149 | .long sys_ni_syscall /* idle */ | ||
150 | .long sys_ni_syscall /* vm86old */ | ||
151 | .long sys_wait4 | ||
152 | .long sys_swapoff /* 115 */ | ||
153 | .long sys_sysinfo | ||
154 | .long sys_ipc | ||
155 | .long sys_fsync | ||
156 | .long sys_sigreturn | ||
157 | .long sys_clone /* 120 */ | ||
158 | .long sys_setdomainname | ||
159 | .long sys_newuname | ||
160 | .long sys_ni_syscall /* sys_modify_ldt */ | ||
161 | .long sys_adjtimex | ||
162 | .long sys_mprotect /* 125 */ | ||
163 | .long sys_sigprocmask | ||
164 | .long sys_ni_syscall /* old "create_module" */ | ||
165 | .long sys_init_module | ||
166 | .long sys_delete_module | ||
167 | .long sys_ni_syscall /* 130: old "get_kernel_syms" */ | ||
168 | .long sys_quotactl | ||
169 | .long sys_getpgid | ||
170 | .long sys_fchdir | ||
171 | .long sys_bdflush | ||
172 | .long sys_sysfs /* 135 */ | ||
173 | .long sys_personality | ||
174 | .long sys_ni_syscall /* for afs_syscall */ | ||
175 | .long sys_setfsuid16 | ||
176 | .long sys_setfsgid16 | ||
177 | .long sys_llseek /* 140 */ | ||
178 | .long sys_getdents | ||
179 | .long sys_select | ||
180 | .long sys_flock | ||
181 | .long sys_msync | ||
182 | .long sys_readv /* 145 */ | ||
183 | .long sys_writev | ||
184 | .long sys_getsid | ||
185 | .long sys_fdatasync | ||
186 | .long sys_sysctl | ||
187 | .long sys_mlock /* 150 */ | ||
188 | .long sys_munlock | ||
189 | .long sys_mlockall | ||
190 | .long sys_munlockall | ||
191 | .long sys_sched_setparam | ||
192 | .long sys_sched_getparam /* 155 */ | ||
193 | .long sys_sched_setscheduler | ||
194 | .long sys_sched_getscheduler | ||
195 | .long sys_sched_yield | ||
196 | .long sys_sched_get_priority_max | ||
197 | .long sys_sched_get_priority_min /* 160 */ | ||
198 | .long sys_sched_rr_get_interval | ||
199 | .long sys_nanosleep | ||
200 | .long sys_mremap | ||
201 | .long sys_setresuid16 | ||
202 | .long sys_getresuid16 /* 165 */ | ||
203 | .long sys_ni_syscall /* vm86 */ | ||
204 | .long sys_ni_syscall /* old "query_module" */ | ||
205 | .long sys_poll | ||
206 | .long sys_nfsservctl | ||
207 | .long sys_setresgid16 /* 170 */ | ||
208 | .long sys_getresgid16 | ||
209 | .long sys_prctl | ||
210 | .long sys_rt_sigreturn | ||
211 | .long sys_rt_sigaction | ||
212 | .long sys_rt_sigprocmask /* 175 */ | ||
213 | .long sys_rt_sigpending | ||
214 | .long sys_rt_sigtimedwait | ||
215 | .long sys_rt_sigqueueinfo | ||
216 | .long sys_rt_sigsuspend | ||
217 | .long sys_pread_wrapper /* 180 */ | ||
218 | .long sys_pwrite_wrapper | ||
219 | .long sys_chown16 | ||
220 | .long sys_getcwd | ||
221 | .long sys_capget | ||
222 | .long sys_capset /* 185 */ | ||
223 | .long sys_sigaltstack | ||
224 | .long sys_sendfile | ||
225 | .long sys_ni_syscall /* streams1 */ | ||
226 | .long sys_ni_syscall /* streams2 */ | ||
227 | .long sys_vfork /* 190 */ | ||
228 | .long sys_getrlimit | ||
229 | .long sys_mmap2 | ||
230 | .long sys_truncate64 | ||
231 | .long sys_ftruncate64 | ||
232 | .long sys_stat64 /* 195 */ | ||
233 | .long sys_lstat64 | ||
234 | .long sys_fstat64 | ||
235 | .long sys_lchown | ||
236 | .long sys_getuid | ||
237 | .long sys_getgid /* 200 */ | ||
238 | .long sys_geteuid | ||
239 | .long sys_getegid | ||
240 | .long sys_setreuid | ||
241 | .long sys_setregid | ||
242 | .long sys_getgroups /* 205 */ | ||
243 | .long sys_setgroups | ||
244 | .long sys_fchown | ||
245 | .long sys_setresuid | ||
246 | .long sys_getresuid | ||
247 | .long sys_setresgid /* 210 */ | ||
248 | .long sys_getresgid | ||
249 | .long sys_chown | ||
250 | .long sys_setuid | ||
251 | .long sys_setgid | ||
252 | .long sys_setfsuid /* 215 */ | ||
253 | .long sys_setfsgid | ||
254 | .long sys_pivot_root | ||
255 | .long sys_mincore | ||
256 | .long sys_madvise | ||
257 | .long sys_getdents64 /* 220 */ | ||
258 | .long sys_fcntl64 | ||
259 | .long sys_ni_syscall /* reserved for TUX */ | ||
260 | .long sys_ni_syscall /* Reserved for Security */ | ||
261 | .long sys_gettid | ||
262 | .long sys_readahead /* 225 */ | ||
263 | .long sys_setxattr | ||
264 | .long sys_lsetxattr | ||
265 | .long sys_fsetxattr | ||
266 | .long sys_getxattr | ||
267 | .long sys_lgetxattr /* 230 */ | ||
268 | .long sys_fgetxattr | ||
269 | .long sys_listxattr | ||
270 | .long sys_llistxattr | ||
271 | .long sys_flistxattr | ||
272 | .long sys_removexattr /* 235 */ | ||
273 | .long sys_lremovexattr | ||
274 | .long sys_fremovexattr | ||
275 | .long sys_tkill | ||
276 | .long sys_sendfile64 | ||
277 | .long sys_futex /* 240 */ | ||
278 | .long sys_sched_setaffinity | ||
279 | .long sys_sched_getaffinity | ||
280 | .long sys_ni_syscall | ||
281 | .long sys_ni_syscall | ||
282 | .long sys_io_setup /* 245 */ | ||
283 | .long sys_io_destroy | ||
284 | .long sys_io_getevents | ||
285 | .long sys_io_submit | ||
286 | .long sys_io_cancel | ||
287 | .long sys_fadvise64 /* 250 */ | ||
288 | .long sys_ni_syscall | ||
289 | .long sys_exit_group | ||
290 | .long sys_lookup_dcookie | ||
291 | .long sys_epoll_create | ||
292 | .long sys_epoll_ctl /* 255 */ | ||
293 | .long sys_epoll_wait | ||
294 | .long sys_remap_file_pages | ||
295 | .long sys_set_tid_address | ||
296 | .long sys_timer_create | ||
297 | .long sys_timer_settime /* 260 */ | ||
298 | .long sys_timer_gettime | ||
299 | .long sys_timer_getoverrun | ||
300 | .long sys_timer_delete | ||
301 | .long sys_clock_settime | ||
302 | .long sys_clock_gettime /* 265 */ | ||
303 | .long sys_clock_getres | ||
304 | .long sys_clock_nanosleep | ||
305 | .long sys_statfs64 | ||
306 | .long sys_fstatfs64 | ||
307 | .long sys_tgkill /* 270 */ | ||
308 | .long sys_utimes | ||
309 | .long sys_fadvise64_64_wrapper | ||
310 | .long sys_ni_syscall /* Reserved for vserver */ | ||
311 | .long sys_ni_syscall /* Reserved for mbind */ | ||
312 | .long sys_ni_syscall /* 275 - get_mempolicy */ | ||
313 | .long sys_ni_syscall /* set_mempolicy */ | ||
314 | .long sys_mq_open | ||
315 | .long sys_mq_unlink | ||
316 | .long sys_mq_timedsend | ||
317 | .long sys_mq_timedreceive /* 280 */ | ||
318 | .long sys_mq_notify | ||
319 | .long sys_mq_getsetattr | ||
320 | .long sys_kexec_load | ||
321 | .long sys_waitid | ||
322 | .long sys_ni_syscall /* 285 */ | ||
323 | .long sys_add_key | ||
324 | .long sys_request_key | ||
325 | .long sys_keyctl | ||
326 | .long sys_ioprio_set | ||
327 | .long sys_ioprio_get /* 290 */ | ||
328 | .long sys_inotify_init | ||
329 | .long sys_inotify_add_watch | ||
330 | .long sys_inotify_rm_watch | ||
331 | .long sys_migrate_pages | ||
332 | .long sys_openat /* 295 */ | ||
333 | .long sys_mkdirat | ||
334 | .long sys_mknodat | ||
335 | .long sys_fchownat | ||
336 | .long sys_futimesat | ||
337 | .long sys_fstatat64 /* 300 */ | ||
338 | .long sys_unlinkat | ||
339 | .long sys_renameat | ||
340 | .long sys_linkat | ||
341 | .long sys_symlinkat | ||
342 | .long sys_readlinkat /* 305 */ | ||
343 | .long sys_fchmodat | ||
344 | .long sys_faccessat | ||
345 | .long sys_pselect6 | ||
346 | .long sys_ppoll | ||
347 | .long sys_unshare /* 310 */ | ||
348 | .long sys_set_robust_list | ||
349 | .long sys_get_robust_list | ||
350 | .long sys_splice | ||
351 | .long sys_sync_file_range | ||
352 | .long sys_tee /* 315 */ | ||
353 | .long sys_vmsplice | ||
diff --git a/arch/sh/kernel/time.c b/arch/sh/kernel/time.c index a1589f85499d..149d9713eddf 100644 --- a/arch/sh/kernel/time.c +++ b/arch/sh/kernel/time.c | |||
@@ -3,13 +3,12 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka | 4 | * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka |
5 | * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> | 5 | * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> |
6 | * Copyright (C) 2002, 2003, 2004, 2005 Paul Mundt | 6 | * Copyright (C) 2002 - 2006 Paul Mundt |
7 | * Copyright (C) 2002 M. R. Brown <mrbrown@linux-sh.org> | 7 | * Copyright (C) 2002 M. R. Brown <mrbrown@linux-sh.org> |
8 | * | 8 | * |
9 | * Some code taken from i386 version. | 9 | * Some code taken from i386 version. |
10 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | 10 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds |
11 | */ | 11 | */ |
12 | |||
13 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
14 | #include <linux/module.h> | 13 | #include <linux/module.h> |
15 | #include <linux/init.h> | 14 | #include <linux/init.h> |
@@ -26,15 +25,20 @@ struct sys_timer *sys_timer; | |||
26 | DEFINE_SPINLOCK(rtc_lock); | 25 | DEFINE_SPINLOCK(rtc_lock); |
27 | EXPORT_SYMBOL(rtc_lock); | 26 | EXPORT_SYMBOL(rtc_lock); |
28 | 27 | ||
29 | /* XXX: Can we initialize this in a routine somewhere? Dreamcast doesn't want | 28 | /* Dummy RTC ops */ |
30 | * these routines anywhere... */ | 29 | static void null_rtc_get_time(struct timespec *tv) |
31 | #ifdef CONFIG_SH_RTC | 30 | { |
32 | void (*rtc_get_time)(struct timespec *) = sh_rtc_gettimeofday; | 31 | tv->tv_sec = mktime(2000, 1, 1, 0, 0, 0); |
33 | int (*rtc_set_time)(const time_t) = sh_rtc_settimeofday; | 32 | tv->tv_nsec = 0; |
34 | #else | 33 | } |
35 | void (*rtc_get_time)(struct timespec *); | 34 | |
36 | int (*rtc_set_time)(const time_t); | 35 | static int null_rtc_set_time(const time_t secs) |
37 | #endif | 36 | { |
37 | return 0; | ||
38 | } | ||
39 | |||
40 | void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time; | ||
41 | int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time; | ||
38 | 42 | ||
39 | /* | 43 | /* |
40 | * Scheduler clock - returns current time in nanosec units. | 44 | * Scheduler clock - returns current time in nanosec units. |
@@ -70,7 +74,6 @@ void do_gettimeofday(struct timeval *tv) | |||
70 | tv->tv_sec = sec; | 74 | tv->tv_sec = sec; |
71 | tv->tv_usec = usec; | 75 | tv->tv_usec = usec; |
72 | } | 76 | } |
73 | |||
74 | EXPORT_SYMBOL(do_gettimeofday); | 77 | EXPORT_SYMBOL(do_gettimeofday); |
75 | 78 | ||
76 | int do_settimeofday(struct timespec *tv) | 79 | int do_settimeofday(struct timespec *tv) |
@@ -103,7 +106,6 @@ int do_settimeofday(struct timespec *tv) | |||
103 | 106 | ||
104 | return 0; | 107 | return 0; |
105 | } | 108 | } |
106 | |||
107 | EXPORT_SYMBOL(do_settimeofday); | 109 | EXPORT_SYMBOL(do_settimeofday); |
108 | 110 | ||
109 | /* last time the RTC clock got updated */ | 111 | /* last time the RTC clock got updated */ |
@@ -135,7 +137,7 @@ void handle_timer_tick(struct pt_regs *regs) | |||
135 | xtime.tv_sec > last_rtc_update + 660 && | 137 | xtime.tv_sec > last_rtc_update + 660 && |
136 | (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 && | 138 | (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 && |
137 | (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) { | 139 | (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) { |
138 | if (rtc_set_time(xtime.tv_sec) == 0) | 140 | if (rtc_sh_set_time(xtime.tv_sec) == 0) |
139 | last_rtc_update = xtime.tv_sec; | 141 | last_rtc_update = xtime.tv_sec; |
140 | else | 142 | else |
141 | /* do it again in 60s */ | 143 | /* do it again in 60s */ |
@@ -143,8 +145,33 @@ void handle_timer_tick(struct pt_regs *regs) | |||
143 | } | 145 | } |
144 | } | 146 | } |
145 | 147 | ||
148 | #ifdef CONFIG_PM | ||
149 | int timer_suspend(struct sys_device *dev, pm_message_t state) | ||
150 | { | ||
151 | struct sys_timer *sys_timer = container_of(dev, struct sys_timer, dev); | ||
152 | |||
153 | sys_timer->ops->stop(); | ||
154 | |||
155 | return 0; | ||
156 | } | ||
157 | |||
158 | int timer_resume(struct sys_device *dev) | ||
159 | { | ||
160 | struct sys_timer *sys_timer = container_of(dev, struct sys_timer, dev); | ||
161 | |||
162 | sys_timer->ops->start(); | ||
163 | |||
164 | return 0; | ||
165 | } | ||
166 | #else | ||
167 | #define timer_suspend NULL | ||
168 | #define timer_resume NULL | ||
169 | #endif | ||
170 | |||
146 | static struct sysdev_class timer_sysclass = { | 171 | static struct sysdev_class timer_sysclass = { |
147 | set_kset_name("timer"), | 172 | set_kset_name("timer"), |
173 | .suspend = timer_suspend, | ||
174 | .resume = timer_resume, | ||
148 | }; | 175 | }; |
149 | 176 | ||
150 | static int __init timer_init_sysfs(void) | 177 | static int __init timer_init_sysfs(void) |
@@ -156,7 +183,6 @@ static int __init timer_init_sysfs(void) | |||
156 | sys_timer->dev.cls = &timer_sysclass; | 183 | sys_timer->dev.cls = &timer_sysclass; |
157 | return sysdev_register(&sys_timer->dev); | 184 | return sysdev_register(&sys_timer->dev); |
158 | } | 185 | } |
159 | |||
160 | device_initcall(timer_init_sysfs); | 186 | device_initcall(timer_init_sysfs); |
161 | 187 | ||
162 | void (*board_time_init)(void); | 188 | void (*board_time_init)(void); |
@@ -168,15 +194,9 @@ void __init time_init(void) | |||
168 | 194 | ||
169 | clk_init(); | 195 | clk_init(); |
170 | 196 | ||
171 | if (rtc_get_time) { | 197 | rtc_sh_get_time(&xtime); |
172 | rtc_get_time(&xtime); | 198 | set_normalized_timespec(&wall_to_monotonic, |
173 | } else { | 199 | -xtime.tv_sec, -xtime.tv_nsec); |
174 | xtime.tv_sec = mktime(2000, 1, 1, 0, 0, 0); | ||
175 | xtime.tv_nsec = 0; | ||
176 | } | ||
177 | |||
178 | set_normalized_timespec(&wall_to_monotonic, | ||
179 | -xtime.tv_sec, -xtime.tv_nsec); | ||
180 | 200 | ||
181 | /* | 201 | /* |
182 | * Find the timer to use as the system timer, it will be | 202 | * Find the timer to use as the system timer, it will be |
diff --git a/arch/sh/kernel/timers/timer-tmu.c b/arch/sh/kernel/timers/timer-tmu.c index d4212add53b2..205816fcf0da 100644 --- a/arch/sh/kernel/timers/timer-tmu.c +++ b/arch/sh/kernel/timers/timer-tmu.c | |||
@@ -132,17 +132,17 @@ static unsigned long tmu_timer_get_frequency(void) | |||
132 | ctrl_outl(0xffffffff, TMU0_TCOR); | 132 | ctrl_outl(0xffffffff, TMU0_TCOR); |
133 | ctrl_outl(0xffffffff, TMU0_TCNT); | 133 | ctrl_outl(0xffffffff, TMU0_TCNT); |
134 | 134 | ||
135 | rtc_get_time(&ts2); | 135 | rtc_sh_get_time(&ts2); |
136 | 136 | ||
137 | do { | 137 | do { |
138 | rtc_get_time(&ts1); | 138 | rtc_sh_get_time(&ts1); |
139 | } while (ts1.tv_nsec == ts2.tv_nsec && ts1.tv_sec == ts2.tv_sec); | 139 | } while (ts1.tv_nsec == ts2.tv_nsec && ts1.tv_sec == ts2.tv_sec); |
140 | 140 | ||
141 | /* actually start the timer */ | 141 | /* actually start the timer */ |
142 | ctrl_outb(TMU_TSTR_INIT, TMU_TSTR); | 142 | ctrl_outb(TMU_TSTR_INIT, TMU_TSTR); |
143 | 143 | ||
144 | do { | 144 | do { |
145 | rtc_get_time(&ts2); | 145 | rtc_sh_get_time(&ts2); |
146 | } while (ts1.tv_nsec == ts2.tv_nsec && ts1.tv_sec == ts2.tv_sec); | 146 | } while (ts1.tv_nsec == ts2.tv_nsec && ts1.tv_sec == ts2.tv_sec); |
147 | 147 | ||
148 | freq = 0xffffffff - ctrl_inl(TMU0_TCNT); | 148 | freq = 0xffffffff - ctrl_inl(TMU0_TCNT); |
@@ -188,6 +188,18 @@ static struct clk tmu0_clk = { | |||
188 | .ops = &tmu_clk_ops, | 188 | .ops = &tmu_clk_ops, |
189 | }; | 189 | }; |
190 | 190 | ||
191 | static int tmu_timer_start(void) | ||
192 | { | ||
193 | ctrl_outb(TMU_TSTR_INIT, TMU_TSTR); | ||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | static int tmu_timer_stop(void) | ||
198 | { | ||
199 | ctrl_outb(0, TMU_TSTR); | ||
200 | return 0; | ||
201 | } | ||
202 | |||
191 | static int tmu_timer_init(void) | 203 | static int tmu_timer_init(void) |
192 | { | 204 | { |
193 | unsigned long interval; | 205 | unsigned long interval; |
@@ -197,7 +209,7 @@ static int tmu_timer_init(void) | |||
197 | tmu0_clk.parent = clk_get("module_clk"); | 209 | tmu0_clk.parent = clk_get("module_clk"); |
198 | 210 | ||
199 | /* Start TMU0 */ | 211 | /* Start TMU0 */ |
200 | ctrl_outb(0, TMU_TSTR); | 212 | tmu_timer_stop(); |
201 | #if !defined(CONFIG_CPU_SUBTYPE_SH7300) && !defined(CONFIG_CPU_SUBTYPE_SH7760) | 213 | #if !defined(CONFIG_CPU_SUBTYPE_SH7300) && !defined(CONFIG_CPU_SUBTYPE_SH7760) |
202 | ctrl_outb(TMU_TOCR_INIT, TMU_TOCR); | 214 | ctrl_outb(TMU_TOCR_INIT, TMU_TOCR); |
203 | #endif | 215 | #endif |
@@ -211,13 +223,15 @@ static int tmu_timer_init(void) | |||
211 | ctrl_outl(interval, TMU0_TCOR); | 223 | ctrl_outl(interval, TMU0_TCOR); |
212 | ctrl_outl(interval, TMU0_TCNT); | 224 | ctrl_outl(interval, TMU0_TCNT); |
213 | 225 | ||
214 | ctrl_outb(TMU_TSTR_INIT, TMU_TSTR); | 226 | tmu_timer_start(); |
215 | 227 | ||
216 | return 0; | 228 | return 0; |
217 | } | 229 | } |
218 | 230 | ||
219 | struct sys_timer_ops tmu_timer_ops = { | 231 | struct sys_timer_ops tmu_timer_ops = { |
220 | .init = tmu_timer_init, | 232 | .init = tmu_timer_init, |
233 | .start = tmu_timer_start, | ||
234 | .stop = tmu_timer_stop, | ||
221 | .get_frequency = tmu_timer_get_frequency, | 235 | .get_frequency = tmu_timer_get_frequency, |
222 | .get_offset = tmu_timer_get_offset, | 236 | .get_offset = tmu_timer_get_offset, |
223 | }; | 237 | }; |
diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index d9db1180f770..c2c597e09482 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c | |||
@@ -36,40 +36,15 @@ | |||
36 | 36 | ||
37 | #ifdef CONFIG_SH_KGDB | 37 | #ifdef CONFIG_SH_KGDB |
38 | #include <asm/kgdb.h> | 38 | #include <asm/kgdb.h> |
39 | #define CHK_REMOTE_DEBUG(regs) \ | 39 | #define CHK_REMOTE_DEBUG(regs) \ |
40 | { \ | 40 | { \ |
41 | if ((kgdb_debug_hook != (kgdb_debug_hook_t *) NULL) && (!user_mode(regs))) \ | 41 | if (kgdb_debug_hook && !user_mode(regs))\ |
42 | { \ | 42 | (*kgdb_debug_hook)(regs); \ |
43 | (*kgdb_debug_hook)(regs); \ | ||
44 | } \ | ||
45 | } | 43 | } |
46 | #else | 44 | #else |
47 | #define CHK_REMOTE_DEBUG(regs) | 45 | #define CHK_REMOTE_DEBUG(regs) |
48 | #endif | 46 | #endif |
49 | 47 | ||
50 | #define DO_ERROR(trapnr, signr, str, name, tsk) \ | ||
51 | asmlinkage void do_##name(unsigned long r4, unsigned long r5, \ | ||
52 | unsigned long r6, unsigned long r7, \ | ||
53 | struct pt_regs regs) \ | ||
54 | { \ | ||
55 | unsigned long error_code; \ | ||
56 | \ | ||
57 | /* Check if it's a DSP instruction */ \ | ||
58 | if (is_dsp_inst(®s)) { \ | ||
59 | /* Enable DSP mode, and restart instruction. */ \ | ||
60 | regs.sr |= SR_DSP; \ | ||
61 | return; \ | ||
62 | } \ | ||
63 | \ | ||
64 | asm volatile("stc r2_bank, %0": "=r" (error_code)); \ | ||
65 | local_irq_enable(); \ | ||
66 | tsk->thread.error_code = error_code; \ | ||
67 | tsk->thread.trap_no = trapnr; \ | ||
68 | CHK_REMOTE_DEBUG(®s); \ | ||
69 | force_sig(signr, tsk); \ | ||
70 | die_if_no_fixup(str,®s,error_code); \ | ||
71 | } | ||
72 | |||
73 | #ifdef CONFIG_CPU_SH2 | 48 | #ifdef CONFIG_CPU_SH2 |
74 | #define TRAP_RESERVED_INST 4 | 49 | #define TRAP_RESERVED_INST 4 |
75 | #define TRAP_ILLEGAL_SLOT_INST 6 | 50 | #define TRAP_ILLEGAL_SLOT_INST 6 |
@@ -86,7 +61,7 @@ asmlinkage void do_##name(unsigned long r4, unsigned long r5, \ | |||
86 | #define VMALLOC_OFFSET (8*1024*1024) | 61 | #define VMALLOC_OFFSET (8*1024*1024) |
87 | #define MODULE_RANGE (8*1024*1024) | 62 | #define MODULE_RANGE (8*1024*1024) |
88 | 63 | ||
89 | spinlock_t die_lock; | 64 | DEFINE_SPINLOCK(die_lock); |
90 | 65 | ||
91 | void die(const char * str, struct pt_regs * regs, long err) | 66 | void die(const char * str, struct pt_regs * regs, long err) |
92 | { | 67 | { |
@@ -575,8 +550,117 @@ int is_dsp_inst(struct pt_regs *regs) | |||
575 | #define is_dsp_inst(regs) (0) | 550 | #define is_dsp_inst(regs) (0) |
576 | #endif /* CONFIG_SH_DSP */ | 551 | #endif /* CONFIG_SH_DSP */ |
577 | 552 | ||
578 | DO_ERROR(TRAP_RESERVED_INST, SIGILL, "reserved instruction", reserved_inst, current) | 553 | extern int do_fpu_inst(unsigned short, struct pt_regs*); |
579 | DO_ERROR(TRAP_ILLEGAL_SLOT_INST, SIGILL, "illegal slot instruction", illegal_slot_inst, current) | 554 | |
555 | asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5, | ||
556 | unsigned long r6, unsigned long r7, | ||
557 | struct pt_regs regs) | ||
558 | { | ||
559 | unsigned long error_code; | ||
560 | struct task_struct *tsk = current; | ||
561 | |||
562 | #ifdef CONFIG_SH_FPU_EMU | ||
563 | unsigned short inst; | ||
564 | int err; | ||
565 | |||
566 | get_user(inst, (unsigned short*)regs.pc); | ||
567 | |||
568 | err = do_fpu_inst(inst, ®s); | ||
569 | if (!err) { | ||
570 | regs.pc += 2; | ||
571 | return; | ||
572 | } | ||
573 | /* not a FPU inst. */ | ||
574 | #endif | ||
575 | |||
576 | #ifdef CONFIG_SH_DSP | ||
577 | /* Check if it's a DSP instruction */ | ||
578 | if (is_dsp_inst(®s)) { | ||
579 | /* Enable DSP mode, and restart instruction. */ | ||
580 | regs.sr |= SR_DSP; | ||
581 | return; | ||
582 | } | ||
583 | #endif | ||
584 | |||
585 | asm volatile("stc r2_bank, %0": "=r" (error_code)); | ||
586 | local_irq_enable(); | ||
587 | tsk->thread.error_code = error_code; | ||
588 | tsk->thread.trap_no = TRAP_RESERVED_INST; | ||
589 | CHK_REMOTE_DEBUG(®s); | ||
590 | force_sig(SIGILL, tsk); | ||
591 | die_if_no_fixup("reserved instruction", ®s, error_code); | ||
592 | } | ||
593 | |||
594 | #ifdef CONFIG_SH_FPU_EMU | ||
595 | static int emulate_branch(unsigned short inst, struct pt_regs* regs) | ||
596 | { | ||
597 | /* | ||
598 | * bfs: 8fxx: PC+=d*2+4; | ||
599 | * bts: 8dxx: PC+=d*2+4; | ||
600 | * bra: axxx: PC+=D*2+4; | ||
601 | * bsr: bxxx: PC+=D*2+4 after PR=PC+4; | ||
602 | * braf:0x23: PC+=Rn*2+4; | ||
603 | * bsrf:0x03: PC+=Rn*2+4 after PR=PC+4; | ||
604 | * jmp: 4x2b: PC=Rn; | ||
605 | * jsr: 4x0b: PC=Rn after PR=PC+4; | ||
606 | * rts: 000b: PC=PR; | ||
607 | */ | ||
608 | if ((inst & 0xfd00) == 0x8d00) { | ||
609 | regs->pc += SH_PC_8BIT_OFFSET(inst); | ||
610 | return 0; | ||
611 | } | ||
612 | |||
613 | if ((inst & 0xe000) == 0xa000) { | ||
614 | regs->pc += SH_PC_12BIT_OFFSET(inst); | ||
615 | return 0; | ||
616 | } | ||
617 | |||
618 | if ((inst & 0xf0df) == 0x0003) { | ||
619 | regs->pc += regs->regs[(inst & 0x0f00) >> 8] + 4; | ||
620 | return 0; | ||
621 | } | ||
622 | |||
623 | if ((inst & 0xf0df) == 0x400b) { | ||
624 | regs->pc = regs->regs[(inst & 0x0f00) >> 8]; | ||
625 | return 0; | ||
626 | } | ||
627 | |||
628 | if ((inst & 0xffff) == 0x000b) { | ||
629 | regs->pc = regs->pr; | ||
630 | return 0; | ||
631 | } | ||
632 | |||
633 | return 1; | ||
634 | } | ||
635 | #endif | ||
636 | |||
637 | asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5, | ||
638 | unsigned long r6, unsigned long r7, | ||
639 | struct pt_regs regs) | ||
640 | { | ||
641 | unsigned long error_code; | ||
642 | struct task_struct *tsk = current; | ||
643 | #ifdef CONFIG_SH_FPU_EMU | ||
644 | unsigned short inst; | ||
645 | |||
646 | get_user(inst, (unsigned short *)regs.pc + 1); | ||
647 | if (!do_fpu_inst(inst, ®s)) { | ||
648 | get_user(inst, (unsigned short *)regs.pc); | ||
649 | if (!emulate_branch(inst, ®s)) | ||
650 | return; | ||
651 | /* fault in branch.*/ | ||
652 | } | ||
653 | /* not a FPU inst. */ | ||
654 | #endif | ||
655 | |||
656 | asm volatile("stc r2_bank, %0": "=r" (error_code)); | ||
657 | local_irq_enable(); | ||
658 | tsk->thread.error_code = error_code; | ||
659 | tsk->thread.trap_no = TRAP_RESERVED_INST; | ||
660 | CHK_REMOTE_DEBUG(®s); | ||
661 | force_sig(SIGILL, tsk); | ||
662 | die_if_no_fixup("illegal slot instruction", ®s, error_code); | ||
663 | } | ||
580 | 664 | ||
581 | asmlinkage void do_exception_error(unsigned long r4, unsigned long r5, | 665 | asmlinkage void do_exception_error(unsigned long r4, unsigned long r5, |
582 | unsigned long r6, unsigned long r7, | 666 | unsigned long r6, unsigned long r7, |
@@ -634,14 +718,16 @@ void __init trap_init(void) | |||
634 | exception_handling_table[TRAP_ILLEGAL_SLOT_INST] | 718 | exception_handling_table[TRAP_ILLEGAL_SLOT_INST] |
635 | = (void *)do_illegal_slot_inst; | 719 | = (void *)do_illegal_slot_inst; |
636 | 720 | ||
637 | #ifdef CONFIG_CPU_SH4 | 721 | #if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_FPU) || \ |
638 | if (!(cpu_data->flags & CPU_HAS_FPU)) { | 722 | defined(CONFIG_SH_FPU_EMU) |
639 | /* For SH-4 lacking an FPU, treat floating point instructions | 723 | /* |
640 | as reserved. */ | 724 | * For SH-4 lacking an FPU, treat floating point instructions as |
641 | /* entry 64 corresponds to EXPEVT=0x800 */ | 725 | * reserved. They'll be handled in the math-emu case, or faulted on |
642 | exception_handling_table[64] = (void *)do_reserved_inst; | 726 | * otherwise. |
643 | exception_handling_table[65] = (void *)do_illegal_slot_inst; | 727 | */ |
644 | } | 728 | /* entry 64 corresponds to EXPEVT=0x800 */ |
729 | exception_handling_table[64] = (void *)do_reserved_inst; | ||
730 | exception_handling_table[65] = (void *)do_illegal_slot_inst; | ||
645 | #endif | 731 | #endif |
646 | 732 | ||
647 | /* Setup VBR for boot cpu */ | 733 | /* Setup VBR for boot cpu */ |
@@ -655,20 +741,12 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) | |||
655 | unsigned long module_end = VMALLOC_END; | 741 | unsigned long module_end = VMALLOC_END; |
656 | int i = 1; | 742 | int i = 1; |
657 | 743 | ||
658 | if (tsk && !sp) { | 744 | if (!tsk) |
745 | tsk = current; | ||
746 | if (tsk == current) | ||
747 | sp = (unsigned long *)current_stack_pointer; | ||
748 | else | ||
659 | sp = (unsigned long *)tsk->thread.sp; | 749 | sp = (unsigned long *)tsk->thread.sp; |
660 | } | ||
661 | |||
662 | if (!sp) { | ||
663 | __asm__ __volatile__ ( | ||
664 | "mov r15, %0\n\t" | ||
665 | "stc r7_bank, %1\n\t" | ||
666 | : "=r" (module_start), | ||
667 | "=r" (module_end) | ||
668 | ); | ||
669 | |||
670 | sp = (unsigned long *)module_start; | ||
671 | } | ||
672 | 750 | ||
673 | stack = sp; | 751 | stack = sp; |
674 | 752 | ||
diff --git a/arch/sh/kernel/vmlinux.lds.S b/arch/sh/kernel/vmlinux.lds.S index 95fdd9135fcf..5eb930918186 100644 --- a/arch/sh/kernel/vmlinux.lds.S +++ b/arch/sh/kernel/vmlinux.lds.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * ld script to make SuperH Linux kernel | 2 | * ld script to make SuperH Linux kernel |
3 | * Written by Niibe Yutaka | 3 | * Written by Niibe Yutaka |
4 | */ | 4 | */ |
5 | #include <asm/thread_info.h> | ||
5 | #include <asm-generic/vmlinux.lds.h> | 6 | #include <asm-generic/vmlinux.lds.h> |
6 | 7 | ||
7 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | 8 | #ifdef CONFIG_CPU_LITTLE_ENDIAN |
@@ -13,7 +14,7 @@ OUTPUT_ARCH(sh) | |||
13 | ENTRY(_start) | 14 | ENTRY(_start) |
14 | SECTIONS | 15 | SECTIONS |
15 | { | 16 | { |
16 | . = 0x80000000 + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET; | 17 | . = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET; |
17 | _text = .; /* Text and read-only data */ | 18 | _text = .; /* Text and read-only data */ |
18 | text = .; /* Text and read-only data */ | 19 | text = .; /* Text and read-only data */ |
19 | .empty_zero_page : { | 20 | .empty_zero_page : { |
@@ -40,16 +41,16 @@ SECTIONS | |||
40 | *(.data) | 41 | *(.data) |
41 | 42 | ||
42 | /* Align the initial ramdisk image (INITRD) on page boundaries. */ | 43 | /* Align the initial ramdisk image (INITRD) on page boundaries. */ |
43 | . = ALIGN(4096); | 44 | . = ALIGN(PAGE_SIZE); |
44 | __rd_start = .; | 45 | __rd_start = .; |
45 | *(.initrd) | 46 | *(.initrd) |
46 | . = ALIGN(4096); | 47 | . = ALIGN(PAGE_SIZE); |
47 | __rd_end = .; | 48 | __rd_end = .; |
48 | 49 | ||
49 | CONSTRUCTORS | 50 | CONSTRUCTORS |
50 | } | 51 | } |
51 | 52 | ||
52 | . = ALIGN(4096); | 53 | . = ALIGN(PAGE_SIZE); |
53 | .data.page_aligned : { *(.data.idt) } | 54 | .data.page_aligned : { *(.data.idt) } |
54 | 55 | ||
55 | . = ALIGN(32); | 56 | . = ALIGN(32); |
@@ -60,12 +61,10 @@ SECTIONS | |||
60 | 61 | ||
61 | _edata = .; /* End of data section */ | 62 | _edata = .; /* End of data section */ |
62 | 63 | ||
63 | . = ALIGN(8192); /* init_task */ | 64 | . = ALIGN(THREAD_SIZE); /* init_task */ |
64 | .data.init_task : { *(.data.init_task) } | 65 | .data.init_task : { *(.data.init_task) } |
65 | /* stack */ | ||
66 | .stack : { stack = .; _stack = .; } | ||
67 | 66 | ||
68 | . = ALIGN(4096); /* Init code and data */ | 67 | . = ALIGN(PAGE_SIZE); /* Init code and data */ |
69 | __init_begin = .; | 68 | __init_begin = .; |
70 | _sinittext = .; | 69 | _sinittext = .; |
71 | .init.text : { *(.init.text) } | 70 | .init.text : { *(.init.text) } |
@@ -96,7 +95,7 @@ SECTIONS | |||
96 | __machvec_start = .; | 95 | __machvec_start = .; |
97 | .init.machvec : { *(.init.machvec) } | 96 | .init.machvec : { *(.init.machvec) } |
98 | __machvec_end = .; | 97 | __machvec_end = .; |
99 | . = ALIGN(4096); | 98 | . = ALIGN(PAGE_SIZE); |
100 | __init_end = .; | 99 | __init_end = .; |
101 | 100 | ||
102 | . = ALIGN(4); | 101 | . = ALIGN(4); |
diff --git a/arch/sh/kernel/vsyscall/Makefile b/arch/sh/kernel/vsyscall/Makefile new file mode 100644 index 000000000000..4bbce1cfa359 --- /dev/null +++ b/arch/sh/kernel/vsyscall/Makefile | |||
@@ -0,0 +1,36 @@ | |||
1 | obj-y += vsyscall.o vsyscall-syscall.o | ||
2 | |||
3 | $(obj)/vsyscall-syscall.o: \ | ||
4 | $(foreach F,trapa,$(obj)/vsyscall-$F.so) | ||
5 | |||
6 | # Teach kbuild about targets | ||
7 | targets += $(foreach F,trapa,vsyscall-$F.o vsyscall-$F.so) | ||
8 | targets += vsyscall-note.o vsyscall.lds | ||
9 | |||
10 | # The DSO images are built using a special linker script | ||
11 | quiet_cmd_syscall = SYSCALL $@ | ||
12 | cmd_syscall = $(CC) -nostdlib $(SYSCFLAGS_$(@F)) \ | ||
13 | -Wl,-T,$(filter-out FORCE,$^) -o $@ | ||
14 | |||
15 | export CPPFLAGS_vsyscall.lds += -P -C -Ush | ||
16 | |||
17 | vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 \ | ||
18 | $(call ld-option, -Wl$(comma)--hash-style=sysv) | ||
19 | |||
20 | SYSCFLAGS_vsyscall-trapa.so = $(vsyscall-flags) | ||
21 | |||
22 | $(obj)/vsyscall-trapa.so: \ | ||
23 | $(obj)/vsyscall-%.so: $(src)/vsyscall.lds $(obj)/vsyscall-%.o FORCE | ||
24 | $(call if_changed,syscall) | ||
25 | |||
26 | # We also create a special relocatable object that should mirror the symbol | ||
27 | # table and layout of the linked DSO. With ld -R we can then refer to | ||
28 | # these symbols in the kernel code rather than hand-coded addresses. | ||
29 | extra-y += vsyscall-syms.o | ||
30 | $(obj)/built-in.o: $(obj)/vsyscall-syms.o | ||
31 | $(obj)/built-in.o: ld_flags += -R $(obj)/vsyscall-syms.o | ||
32 | |||
33 | SYSCFLAGS_vsyscall-syms.o = -r | ||
34 | $(obj)/vsyscall-syms.o: $(src)/vsyscall.lds \ | ||
35 | $(obj)/vsyscall-trapa.o $(obj)/vsyscall-note.o FORCE | ||
36 | $(call if_changed,syscall) | ||
diff --git a/arch/sh/kernel/vsyscall/vsyscall-note.S b/arch/sh/kernel/vsyscall/vsyscall-note.S new file mode 100644 index 000000000000..d4b5be4f3d5f --- /dev/null +++ b/arch/sh/kernel/vsyscall/vsyscall-note.S | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * This supplies .note.* sections to go into the PT_NOTE inside the vDSO text. | ||
3 | * Here we can supply some information useful to userland. | ||
4 | */ | ||
5 | |||
6 | #include <linux/uts.h> | ||
7 | #include <linux/version.h> | ||
8 | |||
9 | #define ASM_ELF_NOTE_BEGIN(name, flags, vendor, type) \ | ||
10 | .section name, flags; \ | ||
11 | .balign 4; \ | ||
12 | .long 1f - 0f; /* name length */ \ | ||
13 | .long 3f - 2f; /* data length */ \ | ||
14 | .long type; /* note type */ \ | ||
15 | 0: .asciz vendor; /* vendor name */ \ | ||
16 | 1: .balign 4; \ | ||
17 | 2: | ||
18 | |||
19 | #define ASM_ELF_NOTE_END \ | ||
20 | 3: .balign 4; /* pad out section */ \ | ||
21 | .previous | ||
22 | |||
23 | ASM_ELF_NOTE_BEGIN(".note.kernel-version", "a", UTS_SYSNAME, 0) | ||
24 | .long LINUX_VERSION_CODE | ||
25 | ASM_ELF_NOTE_END | ||
diff --git a/arch/sh/kernel/vsyscall/vsyscall-sigreturn.S b/arch/sh/kernel/vsyscall/vsyscall-sigreturn.S new file mode 100644 index 000000000000..555a64f124ca --- /dev/null +++ b/arch/sh/kernel/vsyscall/vsyscall-sigreturn.S | |||
@@ -0,0 +1,39 @@ | |||
1 | #include <asm/unistd.h> | ||
2 | |||
3 | .text | ||
4 | .balign 32 | ||
5 | .globl __kernel_sigreturn | ||
6 | .type __kernel_sigreturn,@function | ||
7 | __kernel_sigreturn: | ||
8 | .LSTART_sigreturn: | ||
9 | mov.w 1f, r3 | ||
10 | trapa #0x10 | ||
11 | or r0, r0 | ||
12 | or r0, r0 | ||
13 | or r0, r0 | ||
14 | or r0, r0 | ||
15 | or r0, r0 | ||
16 | |||
17 | 1: .short __NR_sigreturn | ||
18 | .LEND_sigreturn: | ||
19 | .size __kernel_sigreturn,.-.LSTART_sigreturn | ||
20 | |||
21 | .balign 32 | ||
22 | .globl __kernel_rt_sigreturn | ||
23 | .type __kernel_rt_sigreturn,@function | ||
24 | __kernel_rt_sigreturn: | ||
25 | .LSTART_rt_sigreturn: | ||
26 | mov.w 1f, r3 | ||
27 | trapa #0x10 | ||
28 | or r0, r0 | ||
29 | or r0, r0 | ||
30 | or r0, r0 | ||
31 | or r0, r0 | ||
32 | or r0, r0 | ||
33 | |||
34 | 1: .short __NR_rt_sigreturn | ||
35 | .LEND_rt_sigreturn: | ||
36 | .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn | ||
37 | |||
38 | .section .eh_frame,"a",@progbits | ||
39 | .previous | ||
diff --git a/arch/sh/kernel/vsyscall/vsyscall-syscall.S b/arch/sh/kernel/vsyscall/vsyscall-syscall.S new file mode 100644 index 000000000000..c2ac7f0282b3 --- /dev/null +++ b/arch/sh/kernel/vsyscall/vsyscall-syscall.S | |||
@@ -0,0 +1,10 @@ | |||
1 | #include <linux/init.h> | ||
2 | |||
3 | __INITDATA | ||
4 | |||
5 | .globl vsyscall_trapa_start, vsyscall_trapa_end | ||
6 | vsyscall_trapa_start: | ||
7 | .incbin "arch/sh/kernel/vsyscall/vsyscall-trapa.so" | ||
8 | vsyscall_trapa_end: | ||
9 | |||
10 | __FINIT | ||
diff --git a/arch/sh/kernel/vsyscall/vsyscall-trapa.S b/arch/sh/kernel/vsyscall/vsyscall-trapa.S new file mode 100644 index 000000000000..3b6eb34c43fa --- /dev/null +++ b/arch/sh/kernel/vsyscall/vsyscall-trapa.S | |||
@@ -0,0 +1,42 @@ | |||
1 | .text | ||
2 | .globl __kernel_vsyscall | ||
3 | .type __kernel_vsyscall,@function | ||
4 | __kernel_vsyscall: | ||
5 | .LSTART_vsyscall: | ||
6 | /* XXX: We'll have to do something here once we opt to use the vDSO | ||
7 | * page for something other than the signal trampoline.. as well as | ||
8 | * fill out .eh_frame -- PFM. */ | ||
9 | .LEND_vsyscall: | ||
10 | .size __kernel_vsyscall,.-.LSTART_vsyscall | ||
11 | .previous | ||
12 | |||
13 | .section .eh_frame,"a",@progbits | ||
14 | .LCIE: | ||
15 | .ualong .LCIE_end - .LCIE_start | ||
16 | .LCIE_start: | ||
17 | .ualong 0 /* CIE ID */ | ||
18 | .byte 0x1 /* Version number */ | ||
19 | .string "zRS" /* NUL-terminated augmentation string */ | ||
20 | .uleb128 0x1 /* Code alignment factor */ | ||
21 | .sleb128 -4 /* Data alignment factor */ | ||
22 | .byte 0x11 /* Return address register column */ | ||
23 | /* Augmentation length and data (none) */ | ||
24 | .byte 0xc /* DW_CFA_def_cfa */ | ||
25 | .uleb128 0xf /* r15 */ | ||
26 | .uleb128 0x0 /* offset 0 */ | ||
27 | |||
28 | .align 2 | ||
29 | .LCIE_end: | ||
30 | |||
31 | .ualong .LFDE_end-.LFDE_start /* Length FDE */ | ||
32 | .LFDE_start: | ||
33 | .ualong .LCIE /* CIE pointer */ | ||
34 | .ualong .LSTART_vsyscall-. /* start address */ | ||
35 | .ualong .LEND_vsyscall-.LSTART_vsyscall | ||
36 | .uleb128 0 | ||
37 | .align 2 | ||
38 | .LFDE_end: | ||
39 | .previous | ||
40 | |||
41 | /* Get the common code for the sigreturn entry points */ | ||
42 | #include "vsyscall-sigreturn.S" | ||
diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c new file mode 100644 index 000000000000..075d6cc1a2d7 --- /dev/null +++ b/arch/sh/kernel/vsyscall/vsyscall.c | |||
@@ -0,0 +1,150 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/vsyscall.c | ||
3 | * | ||
4 | * Copyright (C) 2006 Paul Mundt | ||
5 | * | ||
6 | * vDSO randomization | ||
7 | * Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | */ | ||
13 | #include <linux/mm.h> | ||
14 | #include <linux/slab.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/gfp.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/elf.h> | ||
20 | |||
21 | /* | ||
22 | * Should the kernel map a VDSO page into processes and pass its | ||
23 | * address down to glibc upon exec()? | ||
24 | */ | ||
25 | unsigned int __read_mostly vdso_enabled = 1; | ||
26 | EXPORT_SYMBOL_GPL(vdso_enabled); | ||
27 | |||
28 | static int __init vdso_setup(char *s) | ||
29 | { | ||
30 | vdso_enabled = simple_strtoul(s, NULL, 0); | ||
31 | return 1; | ||
32 | } | ||
33 | __setup("vdso=", vdso_setup); | ||
34 | |||
35 | /* | ||
36 | * These symbols are defined by vsyscall.o to mark the bounds | ||
37 | * of the ELF DSO images included therein. | ||
38 | */ | ||
39 | extern const char vsyscall_trapa_start, vsyscall_trapa_end; | ||
40 | static void *syscall_page; | ||
41 | |||
42 | int __init vsyscall_init(void) | ||
43 | { | ||
44 | syscall_page = (void *)get_zeroed_page(GFP_ATOMIC); | ||
45 | |||
46 | /* | ||
47 | * XXX: Map this page to a fixmap entry if we get around | ||
48 | * to adding the page to ELF core dumps | ||
49 | */ | ||
50 | |||
51 | memcpy(syscall_page, | ||
52 | &vsyscall_trapa_start, | ||
53 | &vsyscall_trapa_end - &vsyscall_trapa_start); | ||
54 | |||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | static struct page *syscall_vma_nopage(struct vm_area_struct *vma, | ||
59 | unsigned long address, int *type) | ||
60 | { | ||
61 | unsigned long offset = address - vma->vm_start; | ||
62 | struct page *page; | ||
63 | |||
64 | if (address < vma->vm_start || address > vma->vm_end) | ||
65 | return NOPAGE_SIGBUS; | ||
66 | |||
67 | page = virt_to_page(syscall_page + offset); | ||
68 | |||
69 | get_page(page); | ||
70 | |||
71 | return page; | ||
72 | } | ||
73 | |||
74 | /* Prevent VMA merging */ | ||
75 | static void syscall_vma_close(struct vm_area_struct *vma) | ||
76 | { | ||
77 | } | ||
78 | |||
79 | static struct vm_operations_struct syscall_vm_ops = { | ||
80 | .nopage = syscall_vma_nopage, | ||
81 | .close = syscall_vma_close, | ||
82 | }; | ||
83 | |||
84 | /* Setup a VMA at program startup for the vsyscall page */ | ||
85 | int arch_setup_additional_pages(struct linux_binprm *bprm, | ||
86 | int executable_stack) | ||
87 | { | ||
88 | struct vm_area_struct *vma; | ||
89 | struct mm_struct *mm = current->mm; | ||
90 | unsigned long addr; | ||
91 | int ret; | ||
92 | |||
93 | down_write(&mm->mmap_sem); | ||
94 | addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0); | ||
95 | if (IS_ERR_VALUE(addr)) { | ||
96 | ret = addr; | ||
97 | goto up_fail; | ||
98 | } | ||
99 | |||
100 | vma = kmem_cache_zalloc(vm_area_cachep, SLAB_KERNEL); | ||
101 | if (!vma) { | ||
102 | ret = -ENOMEM; | ||
103 | goto up_fail; | ||
104 | } | ||
105 | |||
106 | vma->vm_start = addr; | ||
107 | vma->vm_end = addr + PAGE_SIZE; | ||
108 | /* MAYWRITE to allow gdb to COW and set breakpoints */ | ||
109 | vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE; | ||
110 | vma->vm_flags |= mm->def_flags; | ||
111 | vma->vm_page_prot = protection_map[vma->vm_flags & 7]; | ||
112 | vma->vm_ops = &syscall_vm_ops; | ||
113 | vma->vm_mm = mm; | ||
114 | |||
115 | ret = insert_vm_struct(mm, vma); | ||
116 | if (unlikely(ret)) { | ||
117 | kmem_cache_free(vm_area_cachep, vma); | ||
118 | goto up_fail; | ||
119 | } | ||
120 | |||
121 | current->mm->context.vdso = (void *)addr; | ||
122 | |||
123 | mm->total_vm++; | ||
124 | up_fail: | ||
125 | up_write(&mm->mmap_sem); | ||
126 | return ret; | ||
127 | } | ||
128 | |||
129 | const char *arch_vma_name(struct vm_area_struct *vma) | ||
130 | { | ||
131 | if (vma->vm_mm && vma->vm_start == (long)vma->vm_mm->context.vdso) | ||
132 | return "[vdso]"; | ||
133 | |||
134 | return NULL; | ||
135 | } | ||
136 | |||
137 | struct vm_area_struct *get_gate_vma(struct task_struct *task) | ||
138 | { | ||
139 | return NULL; | ||
140 | } | ||
141 | |||
142 | int in_gate_area(struct task_struct *task, unsigned long address) | ||
143 | { | ||
144 | return 0; | ||
145 | } | ||
146 | |||
147 | int in_gate_area_no_task(unsigned long address) | ||
148 | { | ||
149 | return 0; | ||
150 | } | ||
diff --git a/arch/sh/kernel/vsyscall/vsyscall.lds.S b/arch/sh/kernel/vsyscall/vsyscall.lds.S new file mode 100644 index 000000000000..b13c3d439fee --- /dev/null +++ b/arch/sh/kernel/vsyscall/vsyscall.lds.S | |||
@@ -0,0 +1,74 @@ | |||
1 | /* | ||
2 | * Linker script for vsyscall DSO. The vsyscall page is an ELF shared | ||
3 | * object prelinked to its virtual address, and with only one read-only | ||
4 | * segment (that fits in one page). This script controls its layout. | ||
5 | */ | ||
6 | #include <asm/asm-offsets.h> | ||
7 | |||
8 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | ||
9 | OUTPUT_FORMAT("elf32-sh-linux", "elf32-sh-linux", "elf32-sh-linux") | ||
10 | #else | ||
11 | OUTPUT_FORMAT("elf32-shbig-linux", "elf32-shbig-linux", "elf32-shbig-linux") | ||
12 | #endif | ||
13 | OUTPUT_ARCH(sh) | ||
14 | |||
15 | /* The ELF entry point can be used to set the AT_SYSINFO value. */ | ||
16 | ENTRY(__kernel_vsyscall); | ||
17 | |||
18 | SECTIONS | ||
19 | { | ||
20 | . = SIZEOF_HEADERS; | ||
21 | |||
22 | .hash : { *(.hash) } :text | ||
23 | .gnu.hash : { *(.gnu.hash) } | ||
24 | .dynsym : { *(.dynsym) } | ||
25 | .dynstr : { *(.dynstr) } | ||
26 | .gnu.version : { *(.gnu.version) } | ||
27 | .gnu.version_d : { *(.gnu.version_d) } | ||
28 | .gnu.version_r : { *(.gnu.version_r) } | ||
29 | |||
30 | /* This linker script is used both with -r and with -shared. | ||
31 | For the layouts to match, we need to skip more than enough | ||
32 | space for the dynamic symbol table et al. If this amount | ||
33 | is insufficient, ld -shared will barf. Just increase it here. */ | ||
34 | . = 0x400; | ||
35 | |||
36 | .text : { *(.text) } :text =0x90909090 | ||
37 | .note : { *(.note.*) } :text :note | ||
38 | .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr | ||
39 | .eh_frame : { KEEP (*(.eh_frame)) } :text | ||
40 | .dynamic : { *(.dynamic) } :text :dynamic | ||
41 | .useless : { | ||
42 | *(.got.plt) *(.got) | ||
43 | *(.data .data.* .gnu.linkonce.d.*) | ||
44 | *(.dynbss) | ||
45 | *(.bss .bss.* .gnu.linkonce.b.*) | ||
46 | } :text | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | * We must supply the ELF program headers explicitly to get just one | ||
51 | * PT_LOAD segment, and set the flags explicitly to make segments read-only. | ||
52 | */ | ||
53 | PHDRS | ||
54 | { | ||
55 | text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */ | ||
56 | dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ | ||
57 | note PT_NOTE FLAGS(4); /* PF_R */ | ||
58 | eh_frame_hdr 0x6474e550; /* PT_GNU_EH_FRAME, but ld doesn't match the name */ | ||
59 | } | ||
60 | |||
61 | /* | ||
62 | * This controls what symbols we export from the DSO. | ||
63 | */ | ||
64 | VERSION | ||
65 | { | ||
66 | LINUX_2.6 { | ||
67 | global: | ||
68 | __kernel_vsyscall; | ||
69 | __kernel_sigreturn; | ||
70 | __kernel_rt_sigreturn; | ||
71 | |||
72 | local: *; | ||
73 | }; | ||
74 | } | ||
diff --git a/arch/sh/lib/checksum.S b/arch/sh/lib/checksum.S index 7c50dfe68c07..cbdd0d40e545 100644 --- a/arch/sh/lib/checksum.S +++ b/arch/sh/lib/checksum.S | |||
@@ -202,8 +202,9 @@ ENTRY(csum_partial_copy_generic) | |||
202 | cmp/pz r6 ! Jump if we had at least two bytes. | 202 | cmp/pz r6 ! Jump if we had at least two bytes. |
203 | bt/s 1f | 203 | bt/s 1f |
204 | clrt | 204 | clrt |
205 | add #2,r6 ! r6 was < 2. Deal with it. | ||
205 | bra 4f | 206 | bra 4f |
206 | add #2,r6 ! r6 was < 2. Deal with it. | 207 | mov r6,r2 |
207 | 208 | ||
208 | 3: ! Handle different src and dest alignments. | 209 | 3: ! Handle different src and dest alignments. |
209 | ! This is not common, so simple byte by byte copy will do. | 210 | ! This is not common, so simple byte by byte copy will do. |
diff --git a/arch/sh/lib/memcpy-sh4.S b/arch/sh/lib/memcpy-sh4.S index db6b736537ad..560bc17eebdd 100644 --- a/arch/sh/lib/memcpy-sh4.S +++ b/arch/sh/lib/memcpy-sh4.S | |||
@@ -727,8 +727,8 @@ ENTRY(memcpy) | |||
727 | mov.l @(0x04,r5), r11 ! 18 LS (latency=2) | 727 | mov.l @(0x04,r5), r11 ! 18 LS (latency=2) |
728 | xtrct r9, r8 ! 48 EX | 728 | xtrct r9, r8 ! 48 EX |
729 | 729 | ||
730 | mov.w @(0x02,r5), r12 ! 18 LS (latency=2) | 730 | mov.l @(0x00,r5), r12 ! 18 LS (latency=2) |
731 | xtrct r10, r9 ! 48 EX | 731 | xtrct r10, r9 ! 48 EX |
732 | 732 | ||
733 | movca.l r0,@r1 ! 40 LS (latency=3-7) | 733 | movca.l r0,@r1 ! 40 LS (latency=3-7) |
734 | add #-0x1c, r1 ! 50 EX | 734 | add #-0x1c, r1 ! 50 EX |
diff --git a/arch/sh/lib/memset.S b/arch/sh/lib/memset.S index 95670090680e..af91fe2b72a6 100644 --- a/arch/sh/lib/memset.S +++ b/arch/sh/lib/memset.S | |||
@@ -29,6 +29,7 @@ ENTRY(memset) | |||
29 | bf/s 1b | 29 | bf/s 1b |
30 | mov.b r5,@-r4 | 30 | mov.b r5,@-r4 |
31 | 2: ! make VVVV | 31 | 2: ! make VVVV |
32 | extu.b r5,r5 | ||
32 | swap.b r5,r0 ! V0 | 33 | swap.b r5,r0 ! V0 |
33 | or r0,r5 ! VV | 34 | or r0,r5 ! VV |
34 | swap.w r5,r0 ! VV00 | 35 | swap.w r5,r0 ! VV00 |
diff --git a/arch/sh/math-emu/Makefile b/arch/sh/math-emu/Makefile new file mode 100644 index 000000000000..638b342c781a --- /dev/null +++ b/arch/sh/math-emu/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-y := math.o | |||
diff --git a/arch/sh/math-emu/math.c b/arch/sh/math-emu/math.c new file mode 100644 index 000000000000..26b6046814fd --- /dev/null +++ b/arch/sh/math-emu/math.c | |||
@@ -0,0 +1,624 @@ | |||
1 | /* | ||
2 | * arch/sh/math-emu/math.c | ||
3 | * | ||
4 | * Copyright (C) 2006 Takashi YOSHII <takasi-y@ops.dti.ne.jp> | ||
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/config.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/signal.h> | ||
16 | |||
17 | #include <asm/system.h> | ||
18 | #include <asm/uaccess.h> | ||
19 | #include <asm/processor.h> | ||
20 | #include <asm/io.h> | ||
21 | |||
22 | #include "sfp-util.h" | ||
23 | #include <math-emu/soft-fp.h> | ||
24 | #include <math-emu/single.h> | ||
25 | #include <math-emu/double.h> | ||
26 | |||
27 | #define FPUL (fregs->fpul) | ||
28 | #define FPSCR (fregs->fpscr) | ||
29 | #define FPSCR_RM (FPSCR&3) | ||
30 | #define FPSCR_DN ((FPSCR>>18)&1) | ||
31 | #define FPSCR_PR ((FPSCR>>19)&1) | ||
32 | #define FPSCR_SZ ((FPSCR>>20)&1) | ||
33 | #define FPSCR_FR ((FPSCR>>21)&1) | ||
34 | #define FPSCR_MASK 0x003fffffUL | ||
35 | |||
36 | #define BANK(n) (n^(FPSCR_FR?16:0)) | ||
37 | #define FR ((unsigned long*)(fregs->fp_regs)) | ||
38 | #define FR0 (FR[BANK(0)]) | ||
39 | #define FRn (FR[BANK(n)]) | ||
40 | #define FRm (FR[BANK(m)]) | ||
41 | #define DR ((unsigned long long*)(fregs->fp_regs)) | ||
42 | #define DRn (DR[BANK(n)/2]) | ||
43 | #define DRm (DR[BANK(m)/2]) | ||
44 | |||
45 | #define XREG(n) (n^16) | ||
46 | #define XFn (FR[BANK(XREG(n))]) | ||
47 | #define XFm (FR[BANK(XREG(m))]) | ||
48 | #define XDn (DR[BANK(XREG(n))/2]) | ||
49 | #define XDm (DR[BANK(XREG(m))/2]) | ||
50 | |||
51 | #define R0 (regs->regs[0]) | ||
52 | #define Rn (regs->regs[n]) | ||
53 | #define Rm (regs->regs[m]) | ||
54 | |||
55 | #define WRITE(d,a) ({if(put_user(d, (typeof (d)*)a)) return -EFAULT;}) | ||
56 | #define READ(d,a) ({if(get_user(d, (typeof (d)*)a)) return -EFAULT;}) | ||
57 | |||
58 | #define PACK_S(r,f) FP_PACK_SP(&r,f) | ||
59 | #define UNPACK_S(f,r) FP_UNPACK_SP(f,&r) | ||
60 | #define PACK_D(r,f) \ | ||
61 | {u32 t[2]; FP_PACK_DP(t,f); ((u32*)&r)[0]=t[1]; ((u32*)&r)[1]=t[0];} | ||
62 | #define UNPACK_D(f,r) \ | ||
63 | {u32 t[2]; t[0]=((u32*)&r)[1]; t[1]=((u32*)&r)[0]; FP_UNPACK_DP(f,t);} | ||
64 | |||
65 | // 2 args instructions. | ||
66 | #define BOTH_PRmn(op,x) \ | ||
67 | FP_DECL_EX; if(FPSCR_PR) op(D,x,DRm,DRn); else op(S,x,FRm,FRn); | ||
68 | |||
69 | #define CMP_X(SZ,R,M,N) do{ \ | ||
70 | FP_DECL_##SZ(Fm); FP_DECL_##SZ(Fn); \ | ||
71 | UNPACK_##SZ(Fm, M); UNPACK_##SZ(Fn, N); \ | ||
72 | FP_CMP_##SZ(R, Fn, Fm, 2); }while(0) | ||
73 | #define EQ_X(SZ,R,M,N) do{ \ | ||
74 | FP_DECL_##SZ(Fm); FP_DECL_##SZ(Fn); \ | ||
75 | UNPACK_##SZ(Fm, M); UNPACK_##SZ(Fn, N); \ | ||
76 | FP_CMP_EQ_##SZ(R, Fn, Fm); }while(0) | ||
77 | #define CMP(OP) ({ int r; BOTH_PRmn(OP##_X,r); r; }) | ||
78 | |||
79 | static int | ||
80 | fcmp_gt(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
81 | { | ||
82 | if (CMP(CMP) > 0) | ||
83 | regs->sr |= 1; | ||
84 | else | ||
85 | regs->sr &= ~1; | ||
86 | |||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | static int | ||
91 | fcmp_eq(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
92 | { | ||
93 | if (CMP(CMP /*EQ*/) == 0) | ||
94 | regs->sr |= 1; | ||
95 | else | ||
96 | regs->sr &= ~1; | ||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | #define ARITH_X(SZ,OP,M,N) do{ \ | ||
101 | FP_DECL_##SZ(Fm); FP_DECL_##SZ(Fn); FP_DECL_##SZ(Fr); \ | ||
102 | UNPACK_##SZ(Fm, M); UNPACK_##SZ(Fn, N); \ | ||
103 | FP_##OP##_##SZ(Fr, Fn, Fm); \ | ||
104 | PACK_##SZ(N, Fr); }while(0) | ||
105 | |||
106 | static int | ||
107 | fadd(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
108 | { | ||
109 | BOTH_PRmn(ARITH_X, ADD); | ||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | static int | ||
114 | fsub(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
115 | { | ||
116 | BOTH_PRmn(ARITH_X, SUB); | ||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | static int | ||
121 | fmul(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
122 | { | ||
123 | BOTH_PRmn(ARITH_X, MUL); | ||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | static int | ||
128 | fdiv(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
129 | { | ||
130 | BOTH_PRmn(ARITH_X, DIV); | ||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | static int | ||
135 | fmac(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
136 | { | ||
137 | FP_DECL_EX; | ||
138 | FP_DECL_S(Fr); | ||
139 | FP_DECL_S(Ft); | ||
140 | FP_DECL_S(F0); | ||
141 | FP_DECL_S(Fm); | ||
142 | FP_DECL_S(Fn); | ||
143 | UNPACK_S(F0, FR0); | ||
144 | UNPACK_S(Fm, FRm); | ||
145 | UNPACK_S(Fn, FRn); | ||
146 | FP_MUL_S(Ft, Fm, F0); | ||
147 | FP_ADD_S(Fr, Fn, Ft); | ||
148 | PACK_S(FRn, Fr); | ||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | // to process fmov's extention (odd n for DR access XD). | ||
153 | #define FMOV_EXT(x) if(x&1) x+=16-1 | ||
154 | |||
155 | static int | ||
156 | fmov_idx_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, | ||
157 | int n) | ||
158 | { | ||
159 | if (FPSCR_SZ) { | ||
160 | FMOV_EXT(n); | ||
161 | READ(FRn, Rm + R0 + 4); | ||
162 | n++; | ||
163 | READ(FRn, Rm + R0); | ||
164 | } else { | ||
165 | READ(FRn, Rm + R0); | ||
166 | } | ||
167 | |||
168 | return 0; | ||
169 | } | ||
170 | |||
171 | static int | ||
172 | fmov_mem_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, | ||
173 | int n) | ||
174 | { | ||
175 | if (FPSCR_SZ) { | ||
176 | FMOV_EXT(n); | ||
177 | READ(FRn, Rm + 4); | ||
178 | n++; | ||
179 | READ(FRn, Rm); | ||
180 | } else { | ||
181 | READ(FRn, Rm); | ||
182 | } | ||
183 | |||
184 | return 0; | ||
185 | } | ||
186 | |||
187 | static int | ||
188 | fmov_inc_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, | ||
189 | int n) | ||
190 | { | ||
191 | if (FPSCR_SZ) { | ||
192 | FMOV_EXT(n); | ||
193 | READ(FRn, Rm + 4); | ||
194 | n++; | ||
195 | READ(FRn, Rm); | ||
196 | Rm += 8; | ||
197 | } else { | ||
198 | READ(FRn, Rm); | ||
199 | Rm += 4; | ||
200 | } | ||
201 | |||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | static int | ||
206 | fmov_reg_idx(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, | ||
207 | int n) | ||
208 | { | ||
209 | if (FPSCR_SZ) { | ||
210 | FMOV_EXT(m); | ||
211 | WRITE(FRm, Rn + R0 + 4); | ||
212 | m++; | ||
213 | WRITE(FRm, Rn + R0); | ||
214 | } else { | ||
215 | WRITE(FRm, Rn + R0); | ||
216 | } | ||
217 | |||
218 | return 0; | ||
219 | } | ||
220 | |||
221 | static int | ||
222 | fmov_reg_mem(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, | ||
223 | int n) | ||
224 | { | ||
225 | if (FPSCR_SZ) { | ||
226 | FMOV_EXT(m); | ||
227 | WRITE(FRm, Rn + 4); | ||
228 | m++; | ||
229 | WRITE(FRm, Rn); | ||
230 | } else { | ||
231 | WRITE(FRm, Rn); | ||
232 | } | ||
233 | |||
234 | return 0; | ||
235 | } | ||
236 | |||
237 | static int | ||
238 | fmov_reg_dec(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, | ||
239 | int n) | ||
240 | { | ||
241 | if (FPSCR_SZ) { | ||
242 | FMOV_EXT(m); | ||
243 | Rn -= 8; | ||
244 | WRITE(FRm, Rn + 4); | ||
245 | m++; | ||
246 | WRITE(FRm, Rn); | ||
247 | } else { | ||
248 | Rn -= 4; | ||
249 | WRITE(FRm, Rn); | ||
250 | } | ||
251 | |||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | static int | ||
256 | fmov_reg_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, | ||
257 | int n) | ||
258 | { | ||
259 | if (FPSCR_SZ) { | ||
260 | FMOV_EXT(m); | ||
261 | FMOV_EXT(n); | ||
262 | DRn = DRm; | ||
263 | } else { | ||
264 | FRn = FRm; | ||
265 | } | ||
266 | |||
267 | return 0; | ||
268 | } | ||
269 | |||
270 | static int | ||
271 | fnop_mn(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n) | ||
272 | { | ||
273 | return -EINVAL; | ||
274 | } | ||
275 | |||
276 | // 1 arg instructions. | ||
277 | #define NOTYETn(i) static int i(struct sh_fpu_soft_struct *fregs, int n) \ | ||
278 | { printk( #i " not yet done.\n"); return 0; } | ||
279 | |||
280 | NOTYETn(ftrv) | ||
281 | NOTYETn(fsqrt) | ||
282 | NOTYETn(fipr) | ||
283 | NOTYETn(fsca) | ||
284 | NOTYETn(fsrra) | ||
285 | |||
286 | #define EMU_FLOAT_X(SZ,N) do { \ | ||
287 | FP_DECL_##SZ(Fn); \ | ||
288 | FP_FROM_INT_##SZ(Fn, FPUL, 32, int); \ | ||
289 | PACK_##SZ(N, Fn); }while(0) | ||
290 | static int ffloat(struct sh_fpu_soft_struct *fregs, int n) | ||
291 | { | ||
292 | FP_DECL_EX; | ||
293 | |||
294 | if (FPSCR_PR) | ||
295 | EMU_FLOAT_X(D, DRn); | ||
296 | else | ||
297 | EMU_FLOAT_X(S, FRn); | ||
298 | |||
299 | return 0; | ||
300 | } | ||
301 | |||
302 | #define EMU_FTRC_X(SZ,N) do { \ | ||
303 | FP_DECL_##SZ(Fn); \ | ||
304 | UNPACK_##SZ(Fn, N); \ | ||
305 | FP_TO_INT_##SZ(FPUL, Fn, 32, 1); }while(0) | ||
306 | static int ftrc(struct sh_fpu_soft_struct *fregs, int n) | ||
307 | { | ||
308 | FP_DECL_EX; | ||
309 | |||
310 | if (FPSCR_PR) | ||
311 | EMU_FTRC_X(D, DRn); | ||
312 | else | ||
313 | EMU_FTRC_X(S, FRn); | ||
314 | |||
315 | return 0; | ||
316 | } | ||
317 | |||
318 | static int fcnvsd(struct sh_fpu_soft_struct *fregs, int n) | ||
319 | { | ||
320 | FP_DECL_EX; | ||
321 | FP_DECL_S(Fn); | ||
322 | FP_DECL_D(Fr); | ||
323 | UNPACK_S(Fn, FPUL); | ||
324 | FP_CONV(D, S, 2, 1, Fr, Fn); | ||
325 | PACK_D(DRn, Fr); | ||
326 | return 0; | ||
327 | } | ||
328 | |||
329 | static int fcnvds(struct sh_fpu_soft_struct *fregs, int n) | ||
330 | { | ||
331 | FP_DECL_EX; | ||
332 | FP_DECL_D(Fn); | ||
333 | FP_DECL_S(Fr); | ||
334 | UNPACK_D(Fn, DRn); | ||
335 | FP_CONV(S, D, 1, 2, Fr, Fn); | ||
336 | PACK_S(FPUL, Fr); | ||
337 | return 0; | ||
338 | } | ||
339 | |||
340 | static int fxchg(struct sh_fpu_soft_struct *fregs, int flag) | ||
341 | { | ||
342 | FPSCR ^= flag; | ||
343 | return 0; | ||
344 | } | ||
345 | |||
346 | static int fsts(struct sh_fpu_soft_struct *fregs, int n) | ||
347 | { | ||
348 | FRn = FPUL; | ||
349 | return 0; | ||
350 | } | ||
351 | |||
352 | static int flds(struct sh_fpu_soft_struct *fregs, int n) | ||
353 | { | ||
354 | FPUL = FRn; | ||
355 | return 0; | ||
356 | } | ||
357 | |||
358 | static int fneg(struct sh_fpu_soft_struct *fregs, int n) | ||
359 | { | ||
360 | FRn ^= (1 << (_FP_W_TYPE_SIZE - 1)); | ||
361 | return 0; | ||
362 | } | ||
363 | |||
364 | static int fabs(struct sh_fpu_soft_struct *fregs, int n) | ||
365 | { | ||
366 | FRn &= ~(1 << (_FP_W_TYPE_SIZE - 1)); | ||
367 | return 0; | ||
368 | } | ||
369 | |||
370 | static int fld0(struct sh_fpu_soft_struct *fregs, int n) | ||
371 | { | ||
372 | FRn = 0; | ||
373 | return 0; | ||
374 | } | ||
375 | |||
376 | static int fld1(struct sh_fpu_soft_struct *fregs, int n) | ||
377 | { | ||
378 | FRn = (_FP_EXPBIAS_S << (_FP_FRACBITS_S - 1)); | ||
379 | return 0; | ||
380 | } | ||
381 | |||
382 | static int fnop_n(struct sh_fpu_soft_struct *fregs, int n) | ||
383 | { | ||
384 | return -EINVAL; | ||
385 | } | ||
386 | |||
387 | /// Instruction decoders. | ||
388 | |||
389 | static int id_fxfd(struct sh_fpu_soft_struct *, int); | ||
390 | static int id_fnxd(struct sh_fpu_soft_struct *, struct pt_regs *, int, int); | ||
391 | |||
392 | static int (*fnxd[])(struct sh_fpu_soft_struct *, int) = { | ||
393 | fsts, flds, ffloat, ftrc, fneg, fabs, fsqrt, fsrra, | ||
394 | fld0, fld1, fcnvsd, fcnvds, fnop_n, fnop_n, fipr, id_fxfd | ||
395 | }; | ||
396 | |||
397 | static int (*fnmx[])(struct sh_fpu_soft_struct *, struct pt_regs *, int, int) = { | ||
398 | fadd, fsub, fmul, fdiv, fcmp_eq, fcmp_gt, fmov_idx_reg, fmov_reg_idx, | ||
399 | fmov_mem_reg, fmov_inc_reg, fmov_reg_mem, fmov_reg_dec, | ||
400 | fmov_reg_reg, id_fnxd, fmac, fnop_mn}; | ||
401 | |||
402 | static int id_fxfd(struct sh_fpu_soft_struct *fregs, int x) | ||
403 | { | ||
404 | const int flag[] = { FPSCR_SZ, FPSCR_PR, FPSCR_FR, 0 }; | ||
405 | switch (x & 3) { | ||
406 | case 3: | ||
407 | fxchg(fregs, flag[x >> 2]); | ||
408 | break; | ||
409 | case 1: | ||
410 | ftrv(fregs, x - 1); | ||
411 | break; | ||
412 | default: | ||
413 | fsca(fregs, x); | ||
414 | } | ||
415 | return 0; | ||
416 | } | ||
417 | |||
418 | static int | ||
419 | id_fnxd(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int x, int n) | ||
420 | { | ||
421 | return (fnxd[x])(fregs, n); | ||
422 | } | ||
423 | |||
424 | static int | ||
425 | id_fnmx(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, u16 code) | ||
426 | { | ||
427 | int n = (code >> 8) & 0xf, m = (code >> 4) & 0xf, x = code & 0xf; | ||
428 | return (fnmx[x])(fregs, regs, m, n); | ||
429 | } | ||
430 | |||
431 | static int | ||
432 | id_sys(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, u16 code) | ||
433 | { | ||
434 | int n = ((code >> 8) & 0xf); | ||
435 | unsigned long *reg = (code & 0x0010) ? &FPUL : &FPSCR; | ||
436 | |||
437 | switch (code & 0xf0ff) { | ||
438 | case 0x005a: | ||
439 | case 0x006a: | ||
440 | Rn = *reg; | ||
441 | break; | ||
442 | case 0x405a: | ||
443 | case 0x406a: | ||
444 | *reg = Rn; | ||
445 | break; | ||
446 | case 0x4052: | ||
447 | case 0x4062: | ||
448 | Rn -= 4; | ||
449 | WRITE(*reg, Rn); | ||
450 | break; | ||
451 | case 0x4056: | ||
452 | case 0x4066: | ||
453 | READ(*reg, Rn); | ||
454 | Rn += 4; | ||
455 | break; | ||
456 | default: | ||
457 | return -EINVAL; | ||
458 | } | ||
459 | |||
460 | return 0; | ||
461 | } | ||
462 | |||
463 | static int fpu_emulate(u16 code, struct sh_fpu_soft_struct *fregs, struct pt_regs *regs) | ||
464 | { | ||
465 | if ((code & 0xf000) == 0xf000) | ||
466 | return id_fnmx(fregs, regs, code); | ||
467 | else | ||
468 | return id_sys(fregs, regs, code); | ||
469 | } | ||
470 | |||
471 | /** | ||
472 | * denormal_to_double - Given denormalized float number, | ||
473 | * store double float | ||
474 | * | ||
475 | * @fpu: Pointer to sh_fpu_hard structure | ||
476 | * @n: Index to FP register | ||
477 | */ | ||
478 | static void denormal_to_double(struct sh_fpu_hard_struct *fpu, int n) | ||
479 | { | ||
480 | unsigned long du, dl; | ||
481 | unsigned long x = fpu->fpul; | ||
482 | int exp = 1023 - 126; | ||
483 | |||
484 | if (x != 0 && (x & 0x7f800000) == 0) { | ||
485 | du = (x & 0x80000000); | ||
486 | while ((x & 0x00800000) == 0) { | ||
487 | x <<= 1; | ||
488 | exp--; | ||
489 | } | ||
490 | x &= 0x007fffff; | ||
491 | du |= (exp << 20) | (x >> 3); | ||
492 | dl = x << 29; | ||
493 | |||
494 | fpu->fp_regs[n] = du; | ||
495 | fpu->fp_regs[n+1] = dl; | ||
496 | } | ||
497 | } | ||
498 | |||
499 | /** | ||
500 | * ieee_fpe_handler - Handle denormalized number exception | ||
501 | * | ||
502 | * @regs: Pointer to register structure | ||
503 | * | ||
504 | * Returns 1 when it's handled (should not cause exception). | ||
505 | */ | ||
506 | static int ieee_fpe_handler(struct pt_regs *regs) | ||
507 | { | ||
508 | unsigned short insn = *(unsigned short *)regs->pc; | ||
509 | unsigned short finsn; | ||
510 | unsigned long nextpc; | ||
511 | int nib[4] = { | ||
512 | (insn >> 12) & 0xf, | ||
513 | (insn >> 8) & 0xf, | ||
514 | (insn >> 4) & 0xf, | ||
515 | insn & 0xf}; | ||
516 | |||
517 | if (nib[0] == 0xb || | ||
518 | (nib[0] == 0x4 && nib[2] == 0x0 && nib[3] == 0xb)) /* bsr & jsr */ | ||
519 | regs->pr = regs->pc + 4; | ||
520 | |||
521 | if (nib[0] == 0xa || nib[0] == 0xb) { /* bra & bsr */ | ||
522 | nextpc = regs->pc + 4 + ((short) ((insn & 0xfff) << 4) >> 3); | ||
523 | finsn = *(unsigned short *) (regs->pc + 2); | ||
524 | } else if (nib[0] == 0x8 && nib[1] == 0xd) { /* bt/s */ | ||
525 | if (regs->sr & 1) | ||
526 | nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1); | ||
527 | else | ||
528 | nextpc = regs->pc + 4; | ||
529 | finsn = *(unsigned short *) (regs->pc + 2); | ||
530 | } else if (nib[0] == 0x8 && nib[1] == 0xf) { /* bf/s */ | ||
531 | if (regs->sr & 1) | ||
532 | nextpc = regs->pc + 4; | ||
533 | else | ||
534 | nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1); | ||
535 | finsn = *(unsigned short *) (regs->pc + 2); | ||
536 | } else if (nib[0] == 0x4 && nib[3] == 0xb && | ||
537 | (nib[2] == 0x0 || nib[2] == 0x2)) { /* jmp & jsr */ | ||
538 | nextpc = regs->regs[nib[1]]; | ||
539 | finsn = *(unsigned short *) (regs->pc + 2); | ||
540 | } else if (nib[0] == 0x0 && nib[3] == 0x3 && | ||
541 | (nib[2] == 0x0 || nib[2] == 0x2)) { /* braf & bsrf */ | ||
542 | nextpc = regs->pc + 4 + regs->regs[nib[1]]; | ||
543 | finsn = *(unsigned short *) (regs->pc + 2); | ||
544 | } else if (insn == 0x000b) { /* rts */ | ||
545 | nextpc = regs->pr; | ||
546 | finsn = *(unsigned short *) (regs->pc + 2); | ||
547 | } else { | ||
548 | nextpc = regs->pc + 2; | ||
549 | finsn = insn; | ||
550 | } | ||
551 | |||
552 | if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ | ||
553 | struct task_struct *tsk = current; | ||
554 | |||
555 | if ((tsk->thread.fpu.hard.fpscr & (1 << 17))) { | ||
556 | /* FPU error */ | ||
557 | denormal_to_double (&tsk->thread.fpu.hard, | ||
558 | (finsn >> 8) & 0xf); | ||
559 | tsk->thread.fpu.hard.fpscr &= | ||
560 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); | ||
561 | set_tsk_thread_flag(tsk, TIF_USEDFPU); | ||
562 | } else { | ||
563 | tsk->thread.trap_no = 11; | ||
564 | tsk->thread.error_code = 0; | ||
565 | force_sig(SIGFPE, tsk); | ||
566 | } | ||
567 | |||
568 | regs->pc = nextpc; | ||
569 | return 1; | ||
570 | } | ||
571 | |||
572 | return 0; | ||
573 | } | ||
574 | |||
575 | asmlinkage void do_fpu_error(unsigned long r4, unsigned long r5, | ||
576 | unsigned long r6, unsigned long r7, | ||
577 | struct pt_regs regs) | ||
578 | { | ||
579 | struct task_struct *tsk = current; | ||
580 | |||
581 | if (ieee_fpe_handler (®s)) | ||
582 | return; | ||
583 | |||
584 | regs.pc += 2; | ||
585 | tsk->thread.trap_no = 11; | ||
586 | tsk->thread.error_code = 0; | ||
587 | force_sig(SIGFPE, tsk); | ||
588 | } | ||
589 | |||
590 | /** | ||
591 | * fpu_init - Initialize FPU registers | ||
592 | * @fpu: Pointer to software emulated FPU registers. | ||
593 | */ | ||
594 | static void fpu_init(struct sh_fpu_soft_struct *fpu) | ||
595 | { | ||
596 | int i; | ||
597 | |||
598 | fpu->fpscr = FPSCR_INIT; | ||
599 | fpu->fpul = 0; | ||
600 | |||
601 | for (i = 0; i < 16; i++) { | ||
602 | fpu->fp_regs[i] = 0; | ||
603 | fpu->xfp_regs[i]= 0; | ||
604 | } | ||
605 | } | ||
606 | |||
607 | /** | ||
608 | * do_fpu_inst - Handle reserved instructions for FPU emulation | ||
609 | * @inst: instruction code. | ||
610 | * @regs: registers on stack. | ||
611 | */ | ||
612 | int do_fpu_inst(unsigned short inst, struct pt_regs *regs) | ||
613 | { | ||
614 | struct task_struct *tsk = current; | ||
615 | struct sh_fpu_soft_struct *fpu = &(tsk->thread.fpu.soft); | ||
616 | |||
617 | if (!test_tsk_thread_flag(tsk, TIF_USEDFPU)) { | ||
618 | /* initialize once. */ | ||
619 | fpu_init(fpu); | ||
620 | set_tsk_thread_flag(tsk, TIF_USEDFPU); | ||
621 | } | ||
622 | |||
623 | return fpu_emulate(inst, fpu, regs); | ||
624 | } | ||
diff --git a/arch/sh/math-emu/sfp-util.h b/arch/sh/math-emu/sfp-util.h new file mode 100644 index 000000000000..8ae1bd310ad0 --- /dev/null +++ b/arch/sh/math-emu/sfp-util.h | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * These are copied from glibc/stdlib/longlong.h | ||
3 | */ | ||
4 | |||
5 | #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ | ||
6 | do { \ | ||
7 | UWtype __x; \ | ||
8 | __x = (al) + (bl); \ | ||
9 | (sh) = (ah) + (bh) + (__x < (al)); \ | ||
10 | (sl) = __x; \ | ||
11 | } while (0) | ||
12 | |||
13 | #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ | ||
14 | do { \ | ||
15 | UWtype __x; \ | ||
16 | __x = (al) - (bl); \ | ||
17 | (sh) = (ah) - (bh) - (__x > (al)); \ | ||
18 | (sl) = __x; \ | ||
19 | } while (0) | ||
20 | |||
21 | #define umul_ppmm(w1, w0, u, v) \ | ||
22 | __asm__ ("dmulu.l %2,%3\n\tsts macl,%1\n\tsts mach,%0" \ | ||
23 | : "=r" ((u32)(w1)), "=r" ((u32)(w0)) \ | ||
24 | : "r" ((u32)(u)), "r" ((u32)(v)) \ | ||
25 | : "macl", "mach") | ||
26 | |||
27 | #define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) | ||
28 | #define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) | ||
29 | #define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) | ||
30 | |||
31 | #define udiv_qrnnd(q, r, n1, n0, d) \ | ||
32 | do { \ | ||
33 | UWtype __d1, __d0, __q1, __q0; \ | ||
34 | UWtype __r1, __r0, __m; \ | ||
35 | __d1 = __ll_highpart (d); \ | ||
36 | __d0 = __ll_lowpart (d); \ | ||
37 | \ | ||
38 | __r1 = (n1) % __d1; \ | ||
39 | __q1 = (n1) / __d1; \ | ||
40 | __m = (UWtype) __q1 * __d0; \ | ||
41 | __r1 = __r1 * __ll_B | __ll_highpart (n0); \ | ||
42 | if (__r1 < __m) \ | ||
43 | { \ | ||
44 | __q1--, __r1 += (d); \ | ||
45 | if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ | ||
46 | if (__r1 < __m) \ | ||
47 | __q1--, __r1 += (d); \ | ||
48 | } \ | ||
49 | __r1 -= __m; \ | ||
50 | \ | ||
51 | __r0 = __r1 % __d1; \ | ||
52 | __q0 = __r1 / __d1; \ | ||
53 | __m = (UWtype) __q0 * __d0; \ | ||
54 | __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ | ||
55 | if (__r0 < __m) \ | ||
56 | { \ | ||
57 | __q0--, __r0 += (d); \ | ||
58 | if (__r0 >= (d)) \ | ||
59 | if (__r0 < __m) \ | ||
60 | __q0--, __r0 += (d); \ | ||
61 | } \ | ||
62 | __r0 -= __m; \ | ||
63 | \ | ||
64 | (q) = (UWtype) __q1 * __ll_B | __q0; \ | ||
65 | (r) = __r0; \ | ||
66 | } while (0) | ||
67 | |||
68 | #define abort() return 0 | ||
69 | |||
70 | #define __BYTE_ORDER __LITTLE_ENDIAN | ||
71 | |||
72 | |||
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index fb586b1cf8bb..9dd606464d23 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -20,7 +20,10 @@ config CPU_SH4 | |||
20 | config CPU_SH4A | 20 | config CPU_SH4A |
21 | bool | 21 | bool |
22 | select CPU_SH4 | 22 | select CPU_SH4 |
23 | select CPU_HAS_INTC2_IRQ | 23 | |
24 | config CPU_SH4AL_DSP | ||
25 | bool | ||
26 | select CPU_SH4A | ||
24 | 27 | ||
25 | config CPU_SUBTYPE_ST40 | 28 | config CPU_SUBTYPE_ST40 |
26 | bool | 29 | bool |
@@ -48,6 +51,12 @@ config CPU_SUBTYPE_SH7705 | |||
48 | select CPU_SH3 | 51 | select CPU_SH3 |
49 | select CPU_HAS_PINT_IRQ | 52 | select CPU_HAS_PINT_IRQ |
50 | 53 | ||
54 | config CPU_SUBTYPE_SH7706 | ||
55 | bool "Support SH7706 processor" | ||
56 | select CPU_SH3 | ||
57 | help | ||
58 | Select SH7706 if you have a 133 Mhz SH-3 HD6417706 CPU. | ||
59 | |||
51 | config CPU_SUBTYPE_SH7707 | 60 | config CPU_SUBTYPE_SH7707 |
52 | bool "Support SH7707 processor" | 61 | bool "Support SH7707 processor" |
53 | select CPU_SH3 | 62 | select CPU_SH3 |
@@ -69,6 +78,12 @@ config CPU_SUBTYPE_SH7709 | |||
69 | help | 78 | help |
70 | Select SH7709 if you have a 80 Mhz SH-3 HD6417709 CPU. | 79 | Select SH7709 if you have a 80 Mhz SH-3 HD6417709 CPU. |
71 | 80 | ||
81 | config CPU_SUBTYPE_SH7710 | ||
82 | bool "Support SH7710 processor" | ||
83 | select CPU_SH3 | ||
84 | help | ||
85 | Select SH7710 if you have a SH3-DSP SH7710 CPU. | ||
86 | |||
72 | comment "SH-4 Processor Support" | 87 | comment "SH-4 Processor Support" |
73 | 88 | ||
74 | config CPU_SUBTYPE_SH7750 | 89 | config CPU_SUBTYPE_SH7750 |
@@ -133,10 +148,6 @@ config CPU_SUBTYPE_ST40GX1 | |||
133 | 148 | ||
134 | comment "SH-4A Processor Support" | 149 | comment "SH-4A Processor Support" |
135 | 150 | ||
136 | config CPU_SUBTYPE_SH73180 | ||
137 | bool "Support SH73180 processor" | ||
138 | select CPU_SH4A | ||
139 | |||
140 | config CPU_SUBTYPE_SH7770 | 151 | config CPU_SUBTYPE_SH7770 |
141 | bool "Support SH7770 processor" | 152 | bool "Support SH7770 processor" |
142 | select CPU_SH4A | 153 | select CPU_SH4A |
@@ -144,6 +155,17 @@ config CPU_SUBTYPE_SH7770 | |||
144 | config CPU_SUBTYPE_SH7780 | 155 | config CPU_SUBTYPE_SH7780 |
145 | bool "Support SH7780 processor" | 156 | bool "Support SH7780 processor" |
146 | select CPU_SH4A | 157 | select CPU_SH4A |
158 | select CPU_HAS_INTC2_IRQ | ||
159 | |||
160 | comment "SH4AL-DSP Processor Support" | ||
161 | |||
162 | config CPU_SUBTYPE_SH73180 | ||
163 | bool "Support SH73180 processor" | ||
164 | select CPU_SH4AL_DSP | ||
165 | |||
166 | config CPU_SUBTYPE_SH7343 | ||
167 | bool "Support SH7343 processor" | ||
168 | select CPU_SH4AL_DSP | ||
147 | 169 | ||
148 | endmenu | 170 | endmenu |
149 | 171 | ||
@@ -161,15 +183,59 @@ config MMU | |||
161 | turning this off will boot the kernel on these machines with the | 183 | turning this off will boot the kernel on these machines with the |
162 | MMU implicitly switched off. | 184 | MMU implicitly switched off. |
163 | 185 | ||
186 | config PAGE_OFFSET | ||
187 | hex | ||
188 | default "0x80000000" if MMU | ||
189 | default "0x00000000" | ||
190 | |||
191 | config MEMORY_START | ||
192 | hex "Physical memory start address" | ||
193 | default "0x08000000" | ||
194 | ---help--- | ||
195 | Computers built with Hitachi SuperH processors always | ||
196 | map the ROM starting at address zero. But the processor | ||
197 | does not specify the range that RAM takes. | ||
198 | |||
199 | The physical memory (RAM) start address will be automatically | ||
200 | set to 08000000. Other platforms, such as the Solution Engine | ||
201 | boards typically map RAM at 0C000000. | ||
202 | |||
203 | Tweak this only when porting to a new machine which does not | ||
204 | already have a defconfig. Changing it from the known correct | ||
205 | value on any of the known systems will only lead to disaster. | ||
206 | |||
207 | config MEMORY_SIZE | ||
208 | hex "Physical memory size" | ||
209 | default "0x00400000" | ||
210 | help | ||
211 | This sets the default memory size assumed by your SH kernel. It can | ||
212 | be overridden as normal by the 'mem=' argument on the kernel command | ||
213 | line. If unsure, consult your board specifications or just leave it | ||
214 | as 0x00400000 which was the default value before this became | ||
215 | configurable. | ||
216 | |||
164 | config 32BIT | 217 | config 32BIT |
165 | bool "Support 32-bit physical addressing through PMB" | 218 | bool "Support 32-bit physical addressing through PMB" |
166 | depends on CPU_SH4A | 219 | depends on CPU_SH4A && MMU |
167 | default y | 220 | default y |
168 | help | 221 | help |
169 | If you say Y here, physical addressing will be extended to | 222 | If you say Y here, physical addressing will be extended to |
170 | 32-bits through the SH-4A PMB. If this is not set, legacy | 223 | 32-bits through the SH-4A PMB. If this is not set, legacy |
171 | 29-bit physical addressing will be used. | 224 | 29-bit physical addressing will be used. |
172 | 225 | ||
226 | config VSYSCALL | ||
227 | bool "Support vsyscall page" | ||
228 | depends on MMU | ||
229 | default y | ||
230 | help | ||
231 | This will enable support for the kernel mapping a vDSO page | ||
232 | in process space, and subsequently handing down the entry point | ||
233 | to the libc through the ELF auxiliary vector. | ||
234 | |||
235 | From the kernel side this is used for the signal trampoline. | ||
236 | For systems with an MMU that can afford to give up a page, | ||
237 | (the default value) say Y. | ||
238 | |||
173 | choice | 239 | choice |
174 | prompt "HugeTLB page size" | 240 | prompt "HugeTLB page size" |
175 | depends on HUGETLB_PAGE && CPU_SH4 && MMU | 241 | depends on HUGETLB_PAGE && CPU_SH4 && MMU |
diff --git a/arch/sh/mm/Makefile b/arch/sh/mm/Makefile index 9489a1424644..3ffd7f68c0a2 100644 --- a/arch/sh/mm/Makefile +++ b/arch/sh/mm/Makefile | |||
@@ -6,20 +6,26 @@ obj-y := init.o extable.o consistent.o | |||
6 | 6 | ||
7 | obj-$(CONFIG_CPU_SH2) += cache-sh2.o | 7 | obj-$(CONFIG_CPU_SH2) += cache-sh2.o |
8 | obj-$(CONFIG_CPU_SH3) += cache-sh3.o | 8 | obj-$(CONFIG_CPU_SH3) += cache-sh3.o |
9 | obj-$(CONFIG_CPU_SH4) += cache-sh4.o pg-sh4.o | 9 | obj-$(CONFIG_CPU_SH4) += cache-sh4.o |
10 | 10 | ||
11 | obj-$(CONFIG_DMA_PAGE_OPS) += pg-dma.o | 11 | obj-$(CONFIG_DMA_PAGE_OPS) += pg-dma.o |
12 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 12 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
13 | 13 | ||
14 | mmu-y := fault-nommu.o tlb-nommu.o pg-nommu.o | 14 | mmu-y := fault-nommu.o tlb-nommu.o pg-nommu.o |
15 | mmu-$(CONFIG_MMU) := fault.o clear_page.o copy_page.o | 15 | mmu-$(CONFIG_MMU) := fault.o clear_page.o copy_page.o tlb-flush.o \ |
16 | ioremap.o | ||
16 | 17 | ||
17 | obj-y += $(mmu-y) | 18 | obj-y += $(mmu-y) |
18 | 19 | ||
20 | ifdef CONFIG_DEBUG_FS | ||
21 | obj-$(CONFIG_CPU_SH4) += cache-debugfs.o | ||
22 | endif | ||
23 | |||
19 | ifdef CONFIG_MMU | 24 | ifdef CONFIG_MMU |
20 | obj-$(CONFIG_CPU_SH3) += tlb-sh3.o | 25 | obj-$(CONFIG_CPU_SH3) += tlb-sh3.o |
21 | obj-$(CONFIG_CPU_SH4) += tlb-sh4.o ioremap.o | 26 | obj-$(CONFIG_CPU_SH4) += tlb-sh4.o pg-sh4.o |
22 | obj-$(CONFIG_SH7705_CACHE_32KB) += pg-sh7705.o | 27 | obj-$(CONFIG_SH7705_CACHE_32KB) += pg-sh7705.o |
23 | endif | 28 | endif |
24 | 29 | ||
25 | obj-$(CONFIG_SH7705_CACHE_32KB) += cache-sh7705.o | 30 | obj-$(CONFIG_SH7705_CACHE_32KB) += cache-sh7705.o |
31 | obj-$(CONFIG_32BIT) += pmb.o | ||
diff --git a/arch/sh/mm/cache-debugfs.c b/arch/sh/mm/cache-debugfs.c new file mode 100644 index 000000000000..a22d914e4d15 --- /dev/null +++ b/arch/sh/mm/cache-debugfs.c | |||
@@ -0,0 +1,147 @@ | |||
1 | /* | ||
2 | * debugfs ops for the L1 cache | ||
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/init.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/debugfs.h> | ||
13 | #include <linux/seq_file.h> | ||
14 | #include <asm/processor.h> | ||
15 | #include <asm/uaccess.h> | ||
16 | #include <asm/cache.h> | ||
17 | #include <asm/io.h> | ||
18 | |||
19 | enum cache_type { | ||
20 | CACHE_TYPE_ICACHE, | ||
21 | CACHE_TYPE_DCACHE, | ||
22 | CACHE_TYPE_UNIFIED, | ||
23 | }; | ||
24 | |||
25 | static int cache_seq_show(struct seq_file *file, void *iter) | ||
26 | { | ||
27 | unsigned int cache_type = (unsigned int)file->private; | ||
28 | struct cache_info *cache; | ||
29 | unsigned int waysize, way, cache_size; | ||
30 | unsigned long ccr, base; | ||
31 | static unsigned long addrstart = 0; | ||
32 | |||
33 | /* | ||
34 | * Go uncached immediately so we don't skew the results any | ||
35 | * more than we already are.. | ||
36 | */ | ||
37 | jump_to_P2(); | ||
38 | |||
39 | ccr = ctrl_inl(CCR); | ||
40 | if ((ccr & CCR_CACHE_ENABLE) == 0) { | ||
41 | back_to_P1(); | ||
42 | |||
43 | seq_printf(file, "disabled\n"); | ||
44 | return 0; | ||
45 | } | ||
46 | |||
47 | if (cache_type == CACHE_TYPE_DCACHE) { | ||
48 | base = CACHE_OC_ADDRESS_ARRAY; | ||
49 | cache = &cpu_data->dcache; | ||
50 | } else { | ||
51 | base = CACHE_IC_ADDRESS_ARRAY; | ||
52 | cache = &cpu_data->icache; | ||
53 | } | ||
54 | |||
55 | /* | ||
56 | * Due to the amount of data written out (depending on the cache size), | ||
57 | * we may be iterated over multiple times. In this case, keep track of | ||
58 | * the entry position in addrstart, and rewind it when we've hit the | ||
59 | * end of the cache. | ||
60 | * | ||
61 | * Likewise, the same code is used for multiple caches, so care must | ||
62 | * be taken for bouncing addrstart back and forth so the appropriate | ||
63 | * cache is hit. | ||
64 | */ | ||
65 | cache_size = cache->ways * cache->sets * cache->linesz; | ||
66 | if (((addrstart & 0xff000000) != base) || | ||
67 | (addrstart & 0x00ffffff) > cache_size) | ||
68 | addrstart = base; | ||
69 | |||
70 | waysize = cache->sets; | ||
71 | |||
72 | /* | ||
73 | * If the OC is already in RAM mode, we only have | ||
74 | * half of the entries to consider.. | ||
75 | */ | ||
76 | if ((ccr & CCR_CACHE_ORA) && cache_type == CACHE_TYPE_DCACHE) | ||
77 | waysize >>= 1; | ||
78 | |||
79 | waysize <<= cache->entry_shift; | ||
80 | |||
81 | for (way = 0; way < cache->ways; way++) { | ||
82 | unsigned long addr; | ||
83 | unsigned int line; | ||
84 | |||
85 | seq_printf(file, "-----------------------------------------\n"); | ||
86 | seq_printf(file, "Way %d\n", way); | ||
87 | seq_printf(file, "-----------------------------------------\n"); | ||
88 | |||
89 | for (addr = addrstart, line = 0; | ||
90 | addr < addrstart + waysize; | ||
91 | addr += cache->linesz, line++) { | ||
92 | unsigned long data = ctrl_inl(addr); | ||
93 | |||
94 | /* Check the V bit, ignore invalid cachelines */ | ||
95 | if ((data & 1) == 0) | ||
96 | continue; | ||
97 | |||
98 | /* U: Dirty, cache tag is 10 bits up */ | ||
99 | seq_printf(file, "%3d: %c 0x%lx\n", | ||
100 | line, data & 2 ? 'U' : ' ', | ||
101 | data & 0x1ffffc00); | ||
102 | } | ||
103 | |||
104 | addrstart += cache->way_incr; | ||
105 | } | ||
106 | |||
107 | back_to_P1(); | ||
108 | |||
109 | return 0; | ||
110 | } | ||
111 | |||
112 | static int cache_debugfs_open(struct inode *inode, struct file *file) | ||
113 | { | ||
114 | return single_open(file, cache_seq_show, inode->u.generic_ip); | ||
115 | } | ||
116 | |||
117 | static struct file_operations cache_debugfs_fops = { | ||
118 | .owner = THIS_MODULE, | ||
119 | .open = cache_debugfs_open, | ||
120 | .read = seq_read, | ||
121 | .llseek = seq_lseek, | ||
122 | .release = seq_release, | ||
123 | }; | ||
124 | |||
125 | static int __init cache_debugfs_init(void) | ||
126 | { | ||
127 | struct dentry *dcache_dentry, *icache_dentry; | ||
128 | |||
129 | dcache_dentry = debugfs_create_file("dcache", S_IRUSR, NULL, | ||
130 | (unsigned int *)CACHE_TYPE_DCACHE, | ||
131 | &cache_debugfs_fops); | ||
132 | if (IS_ERR(dcache_dentry)) | ||
133 | return PTR_ERR(dcache_dentry); | ||
134 | |||
135 | icache_dentry = debugfs_create_file("icache", S_IRUSR, NULL, | ||
136 | (unsigned int *)CACHE_TYPE_ICACHE, | ||
137 | &cache_debugfs_fops); | ||
138 | if (IS_ERR(icache_dentry)) { | ||
139 | debugfs_remove(dcache_dentry); | ||
140 | return PTR_ERR(icache_dentry); | ||
141 | } | ||
142 | |||
143 | return 0; | ||
144 | } | ||
145 | module_init(cache_debugfs_init); | ||
146 | |||
147 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c index 524cea5b47f9..e48cc22724d9 100644 --- a/arch/sh/mm/cache-sh4.c +++ b/arch/sh/mm/cache-sh4.c | |||
@@ -2,49 +2,120 @@ | |||
2 | * arch/sh/mm/cache-sh4.c | 2 | * arch/sh/mm/cache-sh4.c |
3 | * | 3 | * |
4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | 4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka |
5 | * Copyright (C) 2001, 2002, 2003, 2004 Paul Mundt | 5 | * Copyright (C) 2001 - 2006 Paul Mundt |
6 | * Copyright (C) 2003 Richard Curnow | 6 | * Copyright (C) 2003 Richard Curnow |
7 | * | 7 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
10 | * for more details. | 10 | * for more details. |
11 | */ | 11 | */ |
12 | |||
13 | #include <linux/init.h> | 12 | #include <linux/init.h> |
14 | #include <linux/mman.h> | ||
15 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
16 | #include <linux/threads.h> | ||
17 | #include <asm/addrspace.h> | 14 | #include <asm/addrspace.h> |
18 | #include <asm/page.h> | ||
19 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable.h> |
20 | #include <asm/processor.h> | 16 | #include <asm/processor.h> |
21 | #include <asm/cache.h> | 17 | #include <asm/cache.h> |
22 | #include <asm/io.h> | 18 | #include <asm/io.h> |
23 | #include <asm/uaccess.h> | ||
24 | #include <asm/pgalloc.h> | 19 | #include <asm/pgalloc.h> |
25 | #include <asm/mmu_context.h> | 20 | #include <asm/mmu_context.h> |
26 | #include <asm/cacheflush.h> | 21 | #include <asm/cacheflush.h> |
27 | 22 | ||
28 | extern void __flush_cache_4096_all(unsigned long start); | 23 | /* |
29 | static void __flush_cache_4096_all_ex(unsigned long start); | 24 | * The maximum number of pages we support up to when doing ranged dcache |
30 | extern void __flush_dcache_all(void); | 25 | * flushing. Anything exceeding this will simply flush the dcache in its |
31 | static void __flush_dcache_all_ex(void); | 26 | * entirety. |
27 | */ | ||
28 | #define MAX_DCACHE_PAGES 64 /* XXX: Tune for ways */ | ||
29 | |||
30 | static void __flush_dcache_segment_1way(unsigned long start, | ||
31 | unsigned long extent); | ||
32 | static void __flush_dcache_segment_2way(unsigned long start, | ||
33 | unsigned long extent); | ||
34 | static void __flush_dcache_segment_4way(unsigned long start, | ||
35 | unsigned long extent); | ||
36 | |||
37 | static void __flush_cache_4096(unsigned long addr, unsigned long phys, | ||
38 | unsigned long exec_offset); | ||
39 | |||
40 | /* | ||
41 | * This is initialised here to ensure that it is not placed in the BSS. If | ||
42 | * that were to happen, note that cache_init gets called before the BSS is | ||
43 | * cleared, so this would get nulled out which would be hopeless. | ||
44 | */ | ||
45 | static void (*__flush_dcache_segment_fn)(unsigned long, unsigned long) = | ||
46 | (void (*)(unsigned long, unsigned long))0xdeadbeef; | ||
47 | |||
48 | static void compute_alias(struct cache_info *c) | ||
49 | { | ||
50 | c->alias_mask = ((c->sets - 1) << c->entry_shift) & ~(PAGE_SIZE - 1); | ||
51 | c->n_aliases = (c->alias_mask >> PAGE_SHIFT) + 1; | ||
52 | } | ||
53 | |||
54 | static void __init emit_cache_params(void) | ||
55 | { | ||
56 | printk("PVR=%08x CVR=%08x PRR=%08x\n", | ||
57 | ctrl_inl(CCN_PVR), | ||
58 | ctrl_inl(CCN_CVR), | ||
59 | ctrl_inl(CCN_PRR)); | ||
60 | printk("I-cache : n_ways=%d n_sets=%d way_incr=%d\n", | ||
61 | cpu_data->icache.ways, | ||
62 | cpu_data->icache.sets, | ||
63 | cpu_data->icache.way_incr); | ||
64 | printk("I-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n", | ||
65 | cpu_data->icache.entry_mask, | ||
66 | cpu_data->icache.alias_mask, | ||
67 | cpu_data->icache.n_aliases); | ||
68 | printk("D-cache : n_ways=%d n_sets=%d way_incr=%d\n", | ||
69 | cpu_data->dcache.ways, | ||
70 | cpu_data->dcache.sets, | ||
71 | cpu_data->dcache.way_incr); | ||
72 | printk("D-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n", | ||
73 | cpu_data->dcache.entry_mask, | ||
74 | cpu_data->dcache.alias_mask, | ||
75 | cpu_data->dcache.n_aliases); | ||
76 | |||
77 | if (!__flush_dcache_segment_fn) | ||
78 | panic("unknown number of cache ways\n"); | ||
79 | } | ||
32 | 80 | ||
33 | /* | 81 | /* |
34 | * SH-4 has virtually indexed and physically tagged cache. | 82 | * SH-4 has virtually indexed and physically tagged cache. |
35 | */ | 83 | */ |
36 | 84 | ||
37 | struct semaphore p3map_sem[4]; | 85 | /* Worst case assumed to be 64k cache, direct-mapped i.e. 4 synonym bits. */ |
86 | #define MAX_P3_SEMAPHORES 16 | ||
87 | |||
88 | struct semaphore p3map_sem[MAX_P3_SEMAPHORES]; | ||
38 | 89 | ||
39 | void __init p3_cache_init(void) | 90 | void __init p3_cache_init(void) |
40 | { | 91 | { |
41 | if (remap_area_pages(P3SEG, 0, PAGE_SIZE*4, _PAGE_CACHABLE)) | 92 | int i; |
93 | |||
94 | compute_alias(&cpu_data->icache); | ||
95 | compute_alias(&cpu_data->dcache); | ||
96 | |||
97 | switch (cpu_data->dcache.ways) { | ||
98 | case 1: | ||
99 | __flush_dcache_segment_fn = __flush_dcache_segment_1way; | ||
100 | break; | ||
101 | case 2: | ||
102 | __flush_dcache_segment_fn = __flush_dcache_segment_2way; | ||
103 | break; | ||
104 | case 4: | ||
105 | __flush_dcache_segment_fn = __flush_dcache_segment_4way; | ||
106 | break; | ||
107 | default: | ||
108 | __flush_dcache_segment_fn = NULL; | ||
109 | break; | ||
110 | } | ||
111 | |||
112 | emit_cache_params(); | ||
113 | |||
114 | if (remap_area_pages(P3SEG, 0, PAGE_SIZE * 4, _PAGE_CACHABLE)) | ||
42 | panic("%s failed.", __FUNCTION__); | 115 | panic("%s failed.", __FUNCTION__); |
43 | 116 | ||
44 | sema_init (&p3map_sem[0], 1); | 117 | for (i = 0; i < cpu_data->dcache.n_aliases; i++) |
45 | sema_init (&p3map_sem[1], 1); | 118 | sema_init(&p3map_sem[i], 1); |
46 | sema_init (&p3map_sem[2], 1); | ||
47 | sema_init (&p3map_sem[3], 1); | ||
48 | } | 119 | } |
49 | 120 | ||
50 | /* | 121 | /* |
@@ -89,7 +160,6 @@ void __flush_purge_region(void *start, int size) | |||
89 | } | 160 | } |
90 | } | 161 | } |
91 | 162 | ||
92 | |||
93 | /* | 163 | /* |
94 | * No write back please | 164 | * No write back please |
95 | */ | 165 | */ |
@@ -108,40 +178,6 @@ void __flush_invalidate_region(void *start, int size) | |||
108 | } | 178 | } |
109 | } | 179 | } |
110 | 180 | ||
111 | static void __flush_dcache_all_ex(void) | ||
112 | { | ||
113 | unsigned long addr, end_addr, entry_offset; | ||
114 | |||
115 | end_addr = CACHE_OC_ADDRESS_ARRAY + (cpu_data->dcache.sets << cpu_data->dcache.entry_shift) * cpu_data->dcache.ways; | ||
116 | entry_offset = 1 << cpu_data->dcache.entry_shift; | ||
117 | for (addr = CACHE_OC_ADDRESS_ARRAY; addr < end_addr; addr += entry_offset) { | ||
118 | ctrl_outl(0, addr); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | static void __flush_cache_4096_all_ex(unsigned long start) | ||
123 | { | ||
124 | unsigned long addr, entry_offset; | ||
125 | int i; | ||
126 | |||
127 | entry_offset = 1 << cpu_data->dcache.entry_shift; | ||
128 | for (i = 0; i < cpu_data->dcache.ways; i++, start += cpu_data->dcache.way_incr) { | ||
129 | for (addr = CACHE_OC_ADDRESS_ARRAY + start; | ||
130 | addr < CACHE_OC_ADDRESS_ARRAY + 4096 + start; | ||
131 | addr += entry_offset) { | ||
132 | ctrl_outl(0, addr); | ||
133 | } | ||
134 | } | ||
135 | } | ||
136 | |||
137 | void flush_cache_4096_all(unsigned long start) | ||
138 | { | ||
139 | if (cpu_data->dcache.ways == 1) | ||
140 | __flush_cache_4096_all(start); | ||
141 | else | ||
142 | __flush_cache_4096_all_ex(start); | ||
143 | } | ||
144 | |||
145 | /* | 181 | /* |
146 | * Write back the range of D-cache, and purge the I-cache. | 182 | * Write back the range of D-cache, and purge the I-cache. |
147 | * | 183 | * |
@@ -153,14 +189,14 @@ void flush_icache_range(unsigned long start, unsigned long end) | |||
153 | } | 189 | } |
154 | 190 | ||
155 | /* | 191 | /* |
156 | * Write back the D-cache and purge the I-cache for signal trampoline. | 192 | * Write back the D-cache and purge the I-cache for signal trampoline. |
157 | * .. which happens to be the same behavior as flush_icache_range(). | 193 | * .. which happens to be the same behavior as flush_icache_range(). |
158 | * So, we simply flush out a line. | 194 | * So, we simply flush out a line. |
159 | */ | 195 | */ |
160 | void flush_cache_sigtramp(unsigned long addr) | 196 | void flush_cache_sigtramp(unsigned long addr) |
161 | { | 197 | { |
162 | unsigned long v, index; | 198 | unsigned long v, index; |
163 | unsigned long flags; | 199 | unsigned long flags; |
164 | int i; | 200 | int i; |
165 | 201 | ||
166 | v = addr & ~(L1_CACHE_BYTES-1); | 202 | v = addr & ~(L1_CACHE_BYTES-1); |
@@ -172,30 +208,33 @@ void flush_cache_sigtramp(unsigned long addr) | |||
172 | 208 | ||
173 | local_irq_save(flags); | 209 | local_irq_save(flags); |
174 | jump_to_P2(); | 210 | jump_to_P2(); |
175 | for(i = 0; i < cpu_data->icache.ways; i++, index += cpu_data->icache.way_incr) | 211 | |
212 | for (i = 0; i < cpu_data->icache.ways; | ||
213 | i++, index += cpu_data->icache.way_incr) | ||
176 | ctrl_outl(0, index); /* Clear out Valid-bit */ | 214 | ctrl_outl(0, index); /* Clear out Valid-bit */ |
215 | |||
177 | back_to_P1(); | 216 | back_to_P1(); |
217 | wmb(); | ||
178 | local_irq_restore(flags); | 218 | local_irq_restore(flags); |
179 | } | 219 | } |
180 | 220 | ||
181 | static inline void flush_cache_4096(unsigned long start, | 221 | static inline void flush_cache_4096(unsigned long start, |
182 | unsigned long phys) | 222 | unsigned long phys) |
183 | { | 223 | { |
184 | unsigned long flags; | 224 | unsigned long flags, exec_offset = 0; |
185 | extern void __flush_cache_4096(unsigned long addr, unsigned long phys, unsigned long exec_offset); | ||
186 | 225 | ||
187 | /* | 226 | /* |
188 | * SH7751, SH7751R, and ST40 have no restriction to handle cache. | 227 | * All types of SH-4 require PC to be in P2 to operate on the I-cache. |
189 | * (While SH7750 must do that at P2 area.) | 228 | * Some types of SH-4 require PC to be in P2 to operate on the D-cache. |
190 | */ | 229 | */ |
191 | if ((cpu_data->flags & CPU_HAS_P2_FLUSH_BUG) | 230 | if ((cpu_data->flags & CPU_HAS_P2_FLUSH_BUG) || |
192 | || start < CACHE_OC_ADDRESS_ARRAY) { | 231 | (start < CACHE_OC_ADDRESS_ARRAY)) |
193 | local_irq_save(flags); | 232 | exec_offset = 0x20000000; |
194 | __flush_cache_4096(start | SH_CACHE_ASSOC, P1SEGADDR(phys), 0x20000000); | 233 | |
195 | local_irq_restore(flags); | 234 | local_irq_save(flags); |
196 | } else { | 235 | __flush_cache_4096(start | SH_CACHE_ASSOC, |
197 | __flush_cache_4096(start | SH_CACHE_ASSOC, P1SEGADDR(phys), 0); | 236 | P1SEGADDR(phys), exec_offset); |
198 | } | 237 | local_irq_restore(flags); |
199 | } | 238 | } |
200 | 239 | ||
201 | /* | 240 | /* |
@@ -206,15 +245,19 @@ void flush_dcache_page(struct page *page) | |||
206 | { | 245 | { |
207 | if (test_bit(PG_mapped, &page->flags)) { | 246 | if (test_bit(PG_mapped, &page->flags)) { |
208 | unsigned long phys = PHYSADDR(page_address(page)); | 247 | unsigned long phys = PHYSADDR(page_address(page)); |
248 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY; | ||
249 | int i, n; | ||
209 | 250 | ||
210 | /* Loop all the D-cache */ | 251 | /* Loop all the D-cache */ |
211 | flush_cache_4096(CACHE_OC_ADDRESS_ARRAY, phys); | 252 | n = cpu_data->dcache.n_aliases; |
212 | flush_cache_4096(CACHE_OC_ADDRESS_ARRAY | 0x1000, phys); | 253 | for (i = 0; i < n; i++, addr += PAGE_SIZE) |
213 | flush_cache_4096(CACHE_OC_ADDRESS_ARRAY | 0x2000, phys); | 254 | flush_cache_4096(addr, phys); |
214 | flush_cache_4096(CACHE_OC_ADDRESS_ARRAY | 0x3000, phys); | ||
215 | } | 255 | } |
256 | |||
257 | wmb(); | ||
216 | } | 258 | } |
217 | 259 | ||
260 | /* TODO: Selective icache invalidation through IC address array.. */ | ||
218 | static inline void flush_icache_all(void) | 261 | static inline void flush_icache_all(void) |
219 | { | 262 | { |
220 | unsigned long flags, ccr; | 263 | unsigned long flags, ccr; |
@@ -227,34 +270,142 @@ static inline void flush_icache_all(void) | |||
227 | ccr |= CCR_CACHE_ICI; | 270 | ccr |= CCR_CACHE_ICI; |
228 | ctrl_outl(ccr, CCR); | 271 | ctrl_outl(ccr, CCR); |
229 | 272 | ||
273 | /* | ||
274 | * back_to_P1() will take care of the barrier for us, don't add | ||
275 | * another one! | ||
276 | */ | ||
277 | |||
230 | back_to_P1(); | 278 | back_to_P1(); |
231 | local_irq_restore(flags); | 279 | local_irq_restore(flags); |
232 | } | 280 | } |
233 | 281 | ||
282 | void flush_dcache_all(void) | ||
283 | { | ||
284 | (*__flush_dcache_segment_fn)(0UL, cpu_data->dcache.way_size); | ||
285 | wmb(); | ||
286 | } | ||
287 | |||
234 | void flush_cache_all(void) | 288 | void flush_cache_all(void) |
235 | { | 289 | { |
236 | if (cpu_data->dcache.ways == 1) | 290 | flush_dcache_all(); |
237 | __flush_dcache_all(); | ||
238 | else | ||
239 | __flush_dcache_all_ex(); | ||
240 | flush_icache_all(); | 291 | flush_icache_all(); |
241 | } | 292 | } |
242 | 293 | ||
294 | static void __flush_cache_mm(struct mm_struct *mm, unsigned long start, | ||
295 | unsigned long end) | ||
296 | { | ||
297 | unsigned long d = 0, p = start & PAGE_MASK; | ||
298 | unsigned long alias_mask = cpu_data->dcache.alias_mask; | ||
299 | unsigned long n_aliases = cpu_data->dcache.n_aliases; | ||
300 | unsigned long select_bit; | ||
301 | unsigned long all_aliases_mask; | ||
302 | unsigned long addr_offset; | ||
303 | pgd_t *dir; | ||
304 | pmd_t *pmd; | ||
305 | pud_t *pud; | ||
306 | pte_t *pte; | ||
307 | int i; | ||
308 | |||
309 | dir = pgd_offset(mm, p); | ||
310 | pud = pud_offset(dir, p); | ||
311 | pmd = pmd_offset(pud, p); | ||
312 | end = PAGE_ALIGN(end); | ||
313 | |||
314 | all_aliases_mask = (1 << n_aliases) - 1; | ||
315 | |||
316 | do { | ||
317 | if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd))) { | ||
318 | p &= PMD_MASK; | ||
319 | p += PMD_SIZE; | ||
320 | pmd++; | ||
321 | |||
322 | continue; | ||
323 | } | ||
324 | |||
325 | pte = pte_offset_kernel(pmd, p); | ||
326 | |||
327 | do { | ||
328 | unsigned long phys; | ||
329 | pte_t entry = *pte; | ||
330 | |||
331 | if (!(pte_val(entry) & _PAGE_PRESENT)) { | ||
332 | pte++; | ||
333 | p += PAGE_SIZE; | ||
334 | continue; | ||
335 | } | ||
336 | |||
337 | phys = pte_val(entry) & PTE_PHYS_MASK; | ||
338 | |||
339 | if ((p ^ phys) & alias_mask) { | ||
340 | d |= 1 << ((p & alias_mask) >> PAGE_SHIFT); | ||
341 | d |= 1 << ((phys & alias_mask) >> PAGE_SHIFT); | ||
342 | |||
343 | if (d == all_aliases_mask) | ||
344 | goto loop_exit; | ||
345 | } | ||
346 | |||
347 | pte++; | ||
348 | p += PAGE_SIZE; | ||
349 | } while (p < end && ((unsigned long)pte & ~PAGE_MASK)); | ||
350 | pmd++; | ||
351 | } while (p < end); | ||
352 | |||
353 | loop_exit: | ||
354 | addr_offset = 0; | ||
355 | select_bit = 1; | ||
356 | |||
357 | for (i = 0; i < n_aliases; i++) { | ||
358 | if (d & select_bit) { | ||
359 | (*__flush_dcache_segment_fn)(addr_offset, PAGE_SIZE); | ||
360 | wmb(); | ||
361 | } | ||
362 | |||
363 | select_bit <<= 1; | ||
364 | addr_offset += PAGE_SIZE; | ||
365 | } | ||
366 | } | ||
367 | |||
368 | /* | ||
369 | * Note : (RPC) since the caches are physically tagged, the only point | ||
370 | * of flush_cache_mm for SH-4 is to get rid of aliases from the | ||
371 | * D-cache. The assumption elsewhere, e.g. flush_cache_range, is that | ||
372 | * lines can stay resident so long as the virtual address they were | ||
373 | * accessed with (hence cache set) is in accord with the physical | ||
374 | * address (i.e. tag). It's no different here. So I reckon we don't | ||
375 | * need to flush the I-cache, since aliases don't matter for that. We | ||
376 | * should try that. | ||
377 | * | ||
378 | * Caller takes mm->mmap_sem. | ||
379 | */ | ||
243 | void flush_cache_mm(struct mm_struct *mm) | 380 | void flush_cache_mm(struct mm_struct *mm) |
244 | { | 381 | { |
245 | /* Is there any good way? */ | 382 | /* |
246 | /* XXX: possibly call flush_cache_range for each vm area */ | 383 | * If cache is only 4k-per-way, there are never any 'aliases'. Since |
247 | /* | 384 | * the cache is physically tagged, the data can just be left in there. |
248 | * FIXME: Really, the optimal solution here would be able to flush out | ||
249 | * individual lines created by the specified context, but this isn't | ||
250 | * feasible for a number of architectures (such as MIPS, and some | ||
251 | * SPARC) .. is this possible for SuperH? | ||
252 | * | ||
253 | * In the meantime, we'll just flush all of the caches.. this | ||
254 | * seems to be the simplest way to avoid at least a few wasted | ||
255 | * cache flushes. -Lethal | ||
256 | */ | 385 | */ |
257 | flush_cache_all(); | 386 | if (cpu_data->dcache.n_aliases == 0) |
387 | return; | ||
388 | |||
389 | /* | ||
390 | * Don't bother groveling around the dcache for the VMA ranges | ||
391 | * if there are too many PTEs to make it worthwhile. | ||
392 | */ | ||
393 | if (mm->nr_ptes >= MAX_DCACHE_PAGES) | ||
394 | flush_dcache_all(); | ||
395 | else { | ||
396 | struct vm_area_struct *vma; | ||
397 | |||
398 | /* | ||
399 | * In this case there are reasonably sized ranges to flush, | ||
400 | * iterate through the VMA list and take care of any aliases. | ||
401 | */ | ||
402 | for (vma = mm->mmap; vma; vma = vma->vm_next) | ||
403 | __flush_cache_mm(mm, vma->vm_start, vma->vm_end); | ||
404 | } | ||
405 | |||
406 | /* Only touch the icache if one of the VMAs has VM_EXEC set. */ | ||
407 | if (mm->exec_vm) | ||
408 | flush_icache_all(); | ||
258 | } | 409 | } |
259 | 410 | ||
260 | /* | 411 | /* |
@@ -263,27 +414,40 @@ void flush_cache_mm(struct mm_struct *mm) | |||
263 | * ADDR: Virtual Address (U0 address) | 414 | * ADDR: Virtual Address (U0 address) |
264 | * PFN: Physical page number | 415 | * PFN: Physical page number |
265 | */ | 416 | */ |
266 | void flush_cache_page(struct vm_area_struct *vma, unsigned long address, unsigned long pfn) | 417 | void flush_cache_page(struct vm_area_struct *vma, unsigned long address, |
418 | unsigned long pfn) | ||
267 | { | 419 | { |
268 | unsigned long phys = pfn << PAGE_SHIFT; | 420 | unsigned long phys = pfn << PAGE_SHIFT; |
421 | unsigned int alias_mask; | ||
422 | |||
423 | alias_mask = cpu_data->dcache.alias_mask; | ||
269 | 424 | ||
270 | /* We only need to flush D-cache when we have alias */ | 425 | /* We only need to flush D-cache when we have alias */ |
271 | if ((address^phys) & CACHE_ALIAS) { | 426 | if ((address^phys) & alias_mask) { |
272 | /* Loop 4K of the D-cache */ | 427 | /* Loop 4K of the D-cache */ |
273 | flush_cache_4096( | 428 | flush_cache_4096( |
274 | CACHE_OC_ADDRESS_ARRAY | (address & CACHE_ALIAS), | 429 | CACHE_OC_ADDRESS_ARRAY | (address & alias_mask), |
275 | phys); | 430 | phys); |
276 | /* Loop another 4K of the D-cache */ | 431 | /* Loop another 4K of the D-cache */ |
277 | flush_cache_4096( | 432 | flush_cache_4096( |
278 | CACHE_OC_ADDRESS_ARRAY | (phys & CACHE_ALIAS), | 433 | CACHE_OC_ADDRESS_ARRAY | (phys & alias_mask), |
279 | phys); | 434 | phys); |
280 | } | 435 | } |
281 | 436 | ||
282 | if (vma->vm_flags & VM_EXEC) | 437 | alias_mask = cpu_data->icache.alias_mask; |
283 | /* Loop 4K (half) of the I-cache */ | 438 | if (vma->vm_flags & VM_EXEC) { |
439 | /* | ||
440 | * Evict entries from the portion of the cache from which code | ||
441 | * may have been executed at this address (virtual). There's | ||
442 | * no need to evict from the portion corresponding to the | ||
443 | * physical address as for the D-cache, because we know the | ||
444 | * kernel has never executed the code through its identity | ||
445 | * translation. | ||
446 | */ | ||
284 | flush_cache_4096( | 447 | flush_cache_4096( |
285 | CACHE_IC_ADDRESS_ARRAY | (address & 0x1000), | 448 | CACHE_IC_ADDRESS_ARRAY | (address & alias_mask), |
286 | phys); | 449 | phys); |
450 | } | ||
287 | } | 451 | } |
288 | 452 | ||
289 | /* | 453 | /* |
@@ -298,52 +462,31 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long address, unsigne | |||
298 | void flush_cache_range(struct vm_area_struct *vma, unsigned long start, | 462 | void flush_cache_range(struct vm_area_struct *vma, unsigned long start, |
299 | unsigned long end) | 463 | unsigned long end) |
300 | { | 464 | { |
301 | unsigned long p = start & PAGE_MASK; | 465 | /* |
302 | pgd_t *dir; | 466 | * If cache is only 4k-per-way, there are never any 'aliases'. Since |
303 | pmd_t *pmd; | 467 | * the cache is physically tagged, the data can just be left in there. |
304 | pte_t *pte; | 468 | */ |
305 | pte_t entry; | 469 | if (cpu_data->dcache.n_aliases == 0) |
306 | unsigned long phys; | 470 | return; |
307 | unsigned long d = 0; | ||
308 | |||
309 | dir = pgd_offset(vma->vm_mm, p); | ||
310 | pmd = pmd_offset(dir, p); | ||
311 | 471 | ||
312 | do { | 472 | /* |
313 | if (pmd_none(*pmd) || pmd_bad(*pmd)) { | 473 | * Don't bother with the lookup and alias check if we have a |
314 | p &= ~((1 << PMD_SHIFT) -1); | 474 | * wide range to cover, just blow away the dcache in its |
315 | p += (1 << PMD_SHIFT); | 475 | * entirety instead. -- PFM. |
316 | pmd++; | 476 | */ |
317 | continue; | 477 | if (((end - start) >> PAGE_SHIFT) >= MAX_DCACHE_PAGES) |
318 | } | 478 | flush_dcache_all(); |
319 | pte = pte_offset_kernel(pmd, p); | 479 | else |
320 | do { | 480 | __flush_cache_mm(vma->vm_mm, start, end); |
321 | entry = *pte; | 481 | |
322 | if ((pte_val(entry) & _PAGE_PRESENT)) { | 482 | if (vma->vm_flags & VM_EXEC) { |
323 | phys = pte_val(entry)&PTE_PHYS_MASK; | 483 | /* |
324 | if ((p^phys) & CACHE_ALIAS) { | 484 | * TODO: Is this required??? Need to look at how I-cache |
325 | d |= 1 << ((p & CACHE_ALIAS)>>12); | 485 | * coherency is assured when new programs are loaded to see if |
326 | d |= 1 << ((phys & CACHE_ALIAS)>>12); | 486 | * this matters. |
327 | if (d == 0x0f) | 487 | */ |
328 | goto loop_exit; | ||
329 | } | ||
330 | } | ||
331 | pte++; | ||
332 | p += PAGE_SIZE; | ||
333 | } while (p < end && ((unsigned long)pte & ~PAGE_MASK)); | ||
334 | pmd++; | ||
335 | } while (p < end); | ||
336 | loop_exit: | ||
337 | if (d & 1) | ||
338 | flush_cache_4096_all(0); | ||
339 | if (d & 2) | ||
340 | flush_cache_4096_all(0x1000); | ||
341 | if (d & 4) | ||
342 | flush_cache_4096_all(0x2000); | ||
343 | if (d & 8) | ||
344 | flush_cache_4096_all(0x3000); | ||
345 | if (vma->vm_flags & VM_EXEC) | ||
346 | flush_icache_all(); | 488 | flush_icache_all(); |
489 | } | ||
347 | } | 490 | } |
348 | 491 | ||
349 | /* | 492 | /* |
@@ -357,5 +500,273 @@ void flush_icache_user_range(struct vm_area_struct *vma, | |||
357 | struct page *page, unsigned long addr, int len) | 500 | struct page *page, unsigned long addr, int len) |
358 | { | 501 | { |
359 | flush_cache_page(vma, addr, page_to_pfn(page)); | 502 | flush_cache_page(vma, addr, page_to_pfn(page)); |
503 | mb(); | ||
504 | } | ||
505 | |||
506 | /** | ||
507 | * __flush_cache_4096 | ||
508 | * | ||
509 | * @addr: address in memory mapped cache array | ||
510 | * @phys: P1 address to flush (has to match tags if addr has 'A' bit | ||
511 | * set i.e. associative write) | ||
512 | * @exec_offset: set to 0x20000000 if flush has to be executed from P2 | ||
513 | * region else 0x0 | ||
514 | * | ||
515 | * The offset into the cache array implied by 'addr' selects the | ||
516 | * 'colour' of the virtual address range that will be flushed. The | ||
517 | * operation (purge/write-back) is selected by the lower 2 bits of | ||
518 | * 'phys'. | ||
519 | */ | ||
520 | static void __flush_cache_4096(unsigned long addr, unsigned long phys, | ||
521 | unsigned long exec_offset) | ||
522 | { | ||
523 | int way_count; | ||
524 | unsigned long base_addr = addr; | ||
525 | struct cache_info *dcache; | ||
526 | unsigned long way_incr; | ||
527 | unsigned long a, ea, p; | ||
528 | unsigned long temp_pc; | ||
529 | |||
530 | dcache = &cpu_data->dcache; | ||
531 | /* Write this way for better assembly. */ | ||
532 | way_count = dcache->ways; | ||
533 | way_incr = dcache->way_incr; | ||
534 | |||
535 | /* | ||
536 | * Apply exec_offset (i.e. branch to P2 if required.). | ||
537 | * | ||
538 | * FIXME: | ||
539 | * | ||
540 | * If I write "=r" for the (temp_pc), it puts this in r6 hence | ||
541 | * trashing exec_offset before it's been added on - why? Hence | ||
542 | * "=&r" as a 'workaround' | ||
543 | */ | ||
544 | asm volatile("mov.l 1f, %0\n\t" | ||
545 | "add %1, %0\n\t" | ||
546 | "jmp @%0\n\t" | ||
547 | "nop\n\t" | ||
548 | ".balign 4\n\t" | ||
549 | "1: .long 2f\n\t" | ||
550 | "2:\n" : "=&r" (temp_pc) : "r" (exec_offset)); | ||
551 | |||
552 | /* | ||
553 | * We know there will be >=1 iteration, so write as do-while to avoid | ||
554 | * pointless nead-of-loop check for 0 iterations. | ||
555 | */ | ||
556 | do { | ||
557 | ea = base_addr + PAGE_SIZE; | ||
558 | a = base_addr; | ||
559 | p = phys; | ||
560 | |||
561 | do { | ||
562 | *(volatile unsigned long *)a = p; | ||
563 | /* | ||
564 | * Next line: intentionally not p+32, saves an add, p | ||
565 | * will do since only the cache tag bits need to | ||
566 | * match. | ||
567 | */ | ||
568 | *(volatile unsigned long *)(a+32) = p; | ||
569 | a += 64; | ||
570 | p += 64; | ||
571 | } while (a < ea); | ||
572 | |||
573 | base_addr += way_incr; | ||
574 | } while (--way_count != 0); | ||
360 | } | 575 | } |
361 | 576 | ||
577 | /* | ||
578 | * Break the 1, 2 and 4 way variants of this out into separate functions to | ||
579 | * avoid nearly all the overhead of having the conditional stuff in the function | ||
580 | * bodies (+ the 1 and 2 way cases avoid saving any registers too). | ||
581 | */ | ||
582 | static void __flush_dcache_segment_1way(unsigned long start, | ||
583 | unsigned long extent_per_way) | ||
584 | { | ||
585 | unsigned long orig_sr, sr_with_bl; | ||
586 | unsigned long base_addr; | ||
587 | unsigned long way_incr, linesz, way_size; | ||
588 | struct cache_info *dcache; | ||
589 | register unsigned long a0, a0e; | ||
590 | |||
591 | asm volatile("stc sr, %0" : "=r" (orig_sr)); | ||
592 | sr_with_bl = orig_sr | (1<<28); | ||
593 | base_addr = ((unsigned long)&empty_zero_page[0]); | ||
594 | |||
595 | /* | ||
596 | * The previous code aligned base_addr to 16k, i.e. the way_size of all | ||
597 | * existing SH-4 D-caches. Whilst I don't see a need to have this | ||
598 | * aligned to any better than the cache line size (which it will be | ||
599 | * anyway by construction), let's align it to at least the way_size of | ||
600 | * any existing or conceivable SH-4 D-cache. -- RPC | ||
601 | */ | ||
602 | base_addr = ((base_addr >> 16) << 16); | ||
603 | base_addr |= start; | ||
604 | |||
605 | dcache = &cpu_data->dcache; | ||
606 | linesz = dcache->linesz; | ||
607 | way_incr = dcache->way_incr; | ||
608 | way_size = dcache->way_size; | ||
609 | |||
610 | a0 = base_addr; | ||
611 | a0e = base_addr + extent_per_way; | ||
612 | do { | ||
613 | asm volatile("ldc %0, sr" : : "r" (sr_with_bl)); | ||
614 | asm volatile("movca.l r0, @%0\n\t" | ||
615 | "ocbi @%0" : : "r" (a0)); | ||
616 | a0 += linesz; | ||
617 | asm volatile("movca.l r0, @%0\n\t" | ||
618 | "ocbi @%0" : : "r" (a0)); | ||
619 | a0 += linesz; | ||
620 | asm volatile("movca.l r0, @%0\n\t" | ||
621 | "ocbi @%0" : : "r" (a0)); | ||
622 | a0 += linesz; | ||
623 | asm volatile("movca.l r0, @%0\n\t" | ||
624 | "ocbi @%0" : : "r" (a0)); | ||
625 | asm volatile("ldc %0, sr" : : "r" (orig_sr)); | ||
626 | a0 += linesz; | ||
627 | } while (a0 < a0e); | ||
628 | } | ||
629 | |||
630 | static void __flush_dcache_segment_2way(unsigned long start, | ||
631 | unsigned long extent_per_way) | ||
632 | { | ||
633 | unsigned long orig_sr, sr_with_bl; | ||
634 | unsigned long base_addr; | ||
635 | unsigned long way_incr, linesz, way_size; | ||
636 | struct cache_info *dcache; | ||
637 | register unsigned long a0, a1, a0e; | ||
638 | |||
639 | asm volatile("stc sr, %0" : "=r" (orig_sr)); | ||
640 | sr_with_bl = orig_sr | (1<<28); | ||
641 | base_addr = ((unsigned long)&empty_zero_page[0]); | ||
642 | |||
643 | /* See comment under 1-way above */ | ||
644 | base_addr = ((base_addr >> 16) << 16); | ||
645 | base_addr |= start; | ||
646 | |||
647 | dcache = &cpu_data->dcache; | ||
648 | linesz = dcache->linesz; | ||
649 | way_incr = dcache->way_incr; | ||
650 | way_size = dcache->way_size; | ||
651 | |||
652 | a0 = base_addr; | ||
653 | a1 = a0 + way_incr; | ||
654 | a0e = base_addr + extent_per_way; | ||
655 | do { | ||
656 | asm volatile("ldc %0, sr" : : "r" (sr_with_bl)); | ||
657 | asm volatile("movca.l r0, @%0\n\t" | ||
658 | "movca.l r0, @%1\n\t" | ||
659 | "ocbi @%0\n\t" | ||
660 | "ocbi @%1" : : | ||
661 | "r" (a0), "r" (a1)); | ||
662 | a0 += linesz; | ||
663 | a1 += linesz; | ||
664 | asm volatile("movca.l r0, @%0\n\t" | ||
665 | "movca.l r0, @%1\n\t" | ||
666 | "ocbi @%0\n\t" | ||
667 | "ocbi @%1" : : | ||
668 | "r" (a0), "r" (a1)); | ||
669 | a0 += linesz; | ||
670 | a1 += linesz; | ||
671 | asm volatile("movca.l r0, @%0\n\t" | ||
672 | "movca.l r0, @%1\n\t" | ||
673 | "ocbi @%0\n\t" | ||
674 | "ocbi @%1" : : | ||
675 | "r" (a0), "r" (a1)); | ||
676 | a0 += linesz; | ||
677 | a1 += linesz; | ||
678 | asm volatile("movca.l r0, @%0\n\t" | ||
679 | "movca.l r0, @%1\n\t" | ||
680 | "ocbi @%0\n\t" | ||
681 | "ocbi @%1" : : | ||
682 | "r" (a0), "r" (a1)); | ||
683 | asm volatile("ldc %0, sr" : : "r" (orig_sr)); | ||
684 | a0 += linesz; | ||
685 | a1 += linesz; | ||
686 | } while (a0 < a0e); | ||
687 | } | ||
688 | |||
689 | static void __flush_dcache_segment_4way(unsigned long start, | ||
690 | unsigned long extent_per_way) | ||
691 | { | ||
692 | unsigned long orig_sr, sr_with_bl; | ||
693 | unsigned long base_addr; | ||
694 | unsigned long way_incr, linesz, way_size; | ||
695 | struct cache_info *dcache; | ||
696 | register unsigned long a0, a1, a2, a3, a0e; | ||
697 | |||
698 | asm volatile("stc sr, %0" : "=r" (orig_sr)); | ||
699 | sr_with_bl = orig_sr | (1<<28); | ||
700 | base_addr = ((unsigned long)&empty_zero_page[0]); | ||
701 | |||
702 | /* See comment under 1-way above */ | ||
703 | base_addr = ((base_addr >> 16) << 16); | ||
704 | base_addr |= start; | ||
705 | |||
706 | dcache = &cpu_data->dcache; | ||
707 | linesz = dcache->linesz; | ||
708 | way_incr = dcache->way_incr; | ||
709 | way_size = dcache->way_size; | ||
710 | |||
711 | a0 = base_addr; | ||
712 | a1 = a0 + way_incr; | ||
713 | a2 = a1 + way_incr; | ||
714 | a3 = a2 + way_incr; | ||
715 | a0e = base_addr + extent_per_way; | ||
716 | do { | ||
717 | asm volatile("ldc %0, sr" : : "r" (sr_with_bl)); | ||
718 | asm volatile("movca.l r0, @%0\n\t" | ||
719 | "movca.l r0, @%1\n\t" | ||
720 | "movca.l r0, @%2\n\t" | ||
721 | "movca.l r0, @%3\n\t" | ||
722 | "ocbi @%0\n\t" | ||
723 | "ocbi @%1\n\t" | ||
724 | "ocbi @%2\n\t" | ||
725 | "ocbi @%3\n\t" : : | ||
726 | "r" (a0), "r" (a1), "r" (a2), "r" (a3)); | ||
727 | a0 += linesz; | ||
728 | a1 += linesz; | ||
729 | a2 += linesz; | ||
730 | a3 += linesz; | ||
731 | asm volatile("movca.l r0, @%0\n\t" | ||
732 | "movca.l r0, @%1\n\t" | ||
733 | "movca.l r0, @%2\n\t" | ||
734 | "movca.l r0, @%3\n\t" | ||
735 | "ocbi @%0\n\t" | ||
736 | "ocbi @%1\n\t" | ||
737 | "ocbi @%2\n\t" | ||
738 | "ocbi @%3\n\t" : : | ||
739 | "r" (a0), "r" (a1), "r" (a2), "r" (a3)); | ||
740 | a0 += linesz; | ||
741 | a1 += linesz; | ||
742 | a2 += linesz; | ||
743 | a3 += linesz; | ||
744 | asm volatile("movca.l r0, @%0\n\t" | ||
745 | "movca.l r0, @%1\n\t" | ||
746 | "movca.l r0, @%2\n\t" | ||
747 | "movca.l r0, @%3\n\t" | ||
748 | "ocbi @%0\n\t" | ||
749 | "ocbi @%1\n\t" | ||
750 | "ocbi @%2\n\t" | ||
751 | "ocbi @%3\n\t" : : | ||
752 | "r" (a0), "r" (a1), "r" (a2), "r" (a3)); | ||
753 | a0 += linesz; | ||
754 | a1 += linesz; | ||
755 | a2 += linesz; | ||
756 | a3 += linesz; | ||
757 | asm volatile("movca.l r0, @%0\n\t" | ||
758 | "movca.l r0, @%1\n\t" | ||
759 | "movca.l r0, @%2\n\t" | ||
760 | "movca.l r0, @%3\n\t" | ||
761 | "ocbi @%0\n\t" | ||
762 | "ocbi @%1\n\t" | ||
763 | "ocbi @%2\n\t" | ||
764 | "ocbi @%3\n\t" : : | ||
765 | "r" (a0), "r" (a1), "r" (a2), "r" (a3)); | ||
766 | asm volatile("ldc %0, sr" : : "r" (orig_sr)); | ||
767 | a0 += linesz; | ||
768 | a1 += linesz; | ||
769 | a2 += linesz; | ||
770 | a3 += linesz; | ||
771 | } while (a0 < a0e); | ||
772 | } | ||
diff --git a/arch/sh/mm/cache-sh7705.c b/arch/sh/mm/cache-sh7705.c index bf94eedb0a8e..045abdf078f5 100644 --- a/arch/sh/mm/cache-sh7705.c +++ b/arch/sh/mm/cache-sh7705.c | |||
@@ -9,7 +9,6 @@ | |||
9 | * for more details. | 9 | * for more details. |
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | |||
13 | #include <linux/init.h> | 12 | #include <linux/init.h> |
14 | #include <linux/mman.h> | 13 | #include <linux/mman.h> |
15 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
@@ -25,14 +24,10 @@ | |||
25 | #include <asm/mmu_context.h> | 24 | #include <asm/mmu_context.h> |
26 | #include <asm/cacheflush.h> | 25 | #include <asm/cacheflush.h> |
27 | 26 | ||
28 | /* The 32KB cache on the SH7705 suffers from the same synonym problem | 27 | /* |
29 | * as SH4 CPUs */ | 28 | * The 32KB cache on the SH7705 suffers from the same synonym problem |
30 | 29 | * as SH4 CPUs | |
31 | #define __pte_offset(address) \ | 30 | */ |
32 | ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | ||
33 | #define pte_offset(dir, address) ((pte_t *) pmd_page_vaddr(*(dir)) + \ | ||
34 | __pte_offset(address)) | ||
35 | |||
36 | static inline void cache_wback_all(void) | 31 | static inline void cache_wback_all(void) |
37 | { | 32 | { |
38 | unsigned long ways, waysize, addrstart; | 33 | unsigned long ways, waysize, addrstart; |
@@ -73,7 +68,6 @@ void flush_icache_range(unsigned long start, unsigned long end) | |||
73 | __flush_wback_region((void *)start, end - start); | 68 | __flush_wback_region((void *)start, end - start); |
74 | } | 69 | } |
75 | 70 | ||
76 | |||
77 | /* | 71 | /* |
78 | * Writeback&Invalidate the D-cache of the page | 72 | * Writeback&Invalidate the D-cache of the page |
79 | */ | 73 | */ |
@@ -128,7 +122,6 @@ static void __flush_dcache_page(unsigned long phys) | |||
128 | local_irq_restore(flags); | 122 | local_irq_restore(flags); |
129 | } | 123 | } |
130 | 124 | ||
131 | |||
132 | /* | 125 | /* |
133 | * Write back & invalidate the D-cache of the page. | 126 | * Write back & invalidate the D-cache of the page. |
134 | * (To avoid "alias" issues) | 127 | * (To avoid "alias" issues) |
@@ -186,7 +179,8 @@ void flush_cache_range(struct vm_area_struct *vma, unsigned long start, | |||
186 | * | 179 | * |
187 | * ADDRESS: Virtual Address (U0 address) | 180 | * ADDRESS: Virtual Address (U0 address) |
188 | */ | 181 | */ |
189 | void flush_cache_page(struct vm_area_struct *vma, unsigned long address, unsigned long pfn) | 182 | void flush_cache_page(struct vm_area_struct *vma, unsigned long address, |
183 | unsigned long pfn) | ||
190 | { | 184 | { |
191 | __flush_dcache_page(pfn << PAGE_SHIFT); | 185 | __flush_dcache_page(pfn << PAGE_SHIFT); |
192 | } | 186 | } |
@@ -203,4 +197,3 @@ void flush_icache_page(struct vm_area_struct *vma, struct page *page) | |||
203 | { | 197 | { |
204 | __flush_purge_region(page_address(page), PAGE_SIZE); | 198 | __flush_purge_region(page_address(page), PAGE_SIZE); |
205 | } | 199 | } |
206 | |||
diff --git a/arch/sh/mm/clear_page.S b/arch/sh/mm/clear_page.S index 08acead7b2a1..7b96425ae270 100644 --- a/arch/sh/mm/clear_page.S +++ b/arch/sh/mm/clear_page.S | |||
@@ -193,102 +193,5 @@ ENTRY(__clear_user_page) | |||
193 | nop | 193 | nop |
194 | .L4096: .word 4096 | 194 | .L4096: .word 4096 |
195 | 195 | ||
196 | ENTRY(__flush_cache_4096) | ||
197 | mov.l 1f,r3 | ||
198 | add r6,r3 | ||
199 | mov r4,r0 | ||
200 | mov #64,r2 | ||
201 | shll r2 | ||
202 | mov #64,r6 | ||
203 | jmp @r3 | ||
204 | mov #96,r7 | ||
205 | .align 2 | ||
206 | 1: .long 2f | ||
207 | 2: | ||
208 | .rept 32 | ||
209 | mov.l r5,@r0 | ||
210 | mov.l r5,@(32,r0) | ||
211 | mov.l r5,@(r0,r6) | ||
212 | mov.l r5,@(r0,r7) | ||
213 | add r2,r5 | ||
214 | add r2,r0 | ||
215 | .endr | ||
216 | nop | ||
217 | nop | ||
218 | nop | ||
219 | nop | ||
220 | nop | ||
221 | nop | ||
222 | nop | ||
223 | rts | ||
224 | nop | ||
225 | |||
226 | ENTRY(__flush_dcache_all) | ||
227 | mov.l 2f,r0 | ||
228 | mov.l 3f,r4 | ||
229 | and r0,r4 ! r4 = (unsigned long)&empty_zero_page[0] & ~0xffffc000 | ||
230 | stc sr,r1 ! save SR | ||
231 | mov.l 4f,r2 | ||
232 | or r1,r2 | ||
233 | mov #32,r3 | ||
234 | shll2 r3 | ||
235 | 1: | ||
236 | ldc r2,sr ! set BL bit | ||
237 | movca.l r0,@r4 | ||
238 | ocbi @r4 | ||
239 | add #32,r4 | ||
240 | movca.l r0,@r4 | ||
241 | ocbi @r4 | ||
242 | add #32,r4 | ||
243 | movca.l r0,@r4 | ||
244 | ocbi @r4 | ||
245 | add #32,r4 | ||
246 | movca.l r0,@r4 | ||
247 | ocbi @r4 | ||
248 | ldc r1,sr ! restore SR | ||
249 | dt r3 | ||
250 | bf/s 1b | ||
251 | add #32,r4 | ||
252 | |||
253 | rts | ||
254 | nop | ||
255 | .align 2 | ||
256 | 2: .long 0xffffc000 | ||
257 | 3: .long empty_zero_page | ||
258 | 4: .long 0x10000000 ! BL bit | ||
259 | |||
260 | /* __flush_cache_4096_all(unsigned long addr) */ | ||
261 | ENTRY(__flush_cache_4096_all) | ||
262 | mov.l 2f,r0 | ||
263 | mov.l 3f,r2 | ||
264 | and r0,r2 | ||
265 | or r2,r4 ! r4 = addr | (unsigned long)&empty_zero_page[0] & ~0x3fff | ||
266 | stc sr,r1 ! save SR | ||
267 | mov.l 4f,r2 | ||
268 | or r1,r2 | ||
269 | mov #32,r3 | ||
270 | 1: | ||
271 | ldc r2,sr ! set BL bit | ||
272 | movca.l r0,@r4 | ||
273 | ocbi @r4 | ||
274 | add #32,r4 | ||
275 | movca.l r0,@r4 | ||
276 | ocbi @r4 | ||
277 | add #32,r4 | ||
278 | movca.l r0,@r4 | ||
279 | ocbi @r4 | ||
280 | add #32,r4 | ||
281 | movca.l r0,@r4 | ||
282 | ocbi @r4 | ||
283 | ldc r1,sr ! restore SR | ||
284 | dt r3 | ||
285 | bf/s 1b | ||
286 | add #32,r4 | ||
287 | |||
288 | rts | ||
289 | nop | ||
290 | .align 2 | ||
291 | 2: .long 0xffffc000 | ||
292 | 3: .long empty_zero_page | ||
293 | 4: .long 0x10000000 ! BL bit | ||
294 | #endif | 196 | #endif |
197 | |||
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index ee73e30263af..c81e6b67ad30 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
@@ -9,6 +9,8 @@ | |||
9 | */ | 9 | */ |
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <linux/dma-mapping.h> | 11 | #include <linux/dma-mapping.h> |
12 | #include <asm/cacheflush.h> | ||
13 | #include <asm/addrspace.h> | ||
12 | #include <asm/io.h> | 14 | #include <asm/io.h> |
13 | 15 | ||
14 | void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *handle) | 16 | void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *handle) |
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c index 775f86cd3fe8..c69fd603226a 100644 --- a/arch/sh/mm/fault.c +++ b/arch/sh/mm/fault.c | |||
@@ -1,33 +1,22 @@ | |||
1 | /* $Id: fault.c,v 1.14 2004/01/13 05:52:11 kkojima Exp $ | 1 | /* |
2 | * Page fault handler for SH with an MMU. | ||
2 | * | 3 | * |
3 | * linux/arch/sh/mm/fault.c | ||
4 | * Copyright (C) 1999 Niibe Yutaka | 4 | * Copyright (C) 1999 Niibe Yutaka |
5 | * Copyright (C) 2003 Paul Mundt | 5 | * Copyright (C) 2003 Paul Mundt |
6 | * | 6 | * |
7 | * Based on linux/arch/i386/mm/fault.c: | 7 | * Based on linux/arch/i386/mm/fault.c: |
8 | * Copyright (C) 1995 Linus Torvalds | 8 | * Copyright (C) 1995 Linus Torvalds |
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | ||
11 | * License. See the file "COPYING" in the main directory of this archive | ||
12 | * for more details. | ||
9 | */ | 13 | */ |
10 | |||
11 | #include <linux/signal.h> | ||
12 | #include <linux/sched.h> | ||
13 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
14 | #include <linux/errno.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/ptrace.h> | ||
18 | #include <linux/mman.h> | ||
19 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
20 | #include <linux/smp.h> | 16 | #include <linux/hardirq.h> |
21 | #include <linux/smp_lock.h> | 17 | #include <linux/kprobes.h> |
22 | #include <linux/interrupt.h> | ||
23 | #include <linux/module.h> | ||
24 | |||
25 | #include <asm/system.h> | 18 | #include <asm/system.h> |
26 | #include <asm/io.h> | ||
27 | #include <asm/uaccess.h> | ||
28 | #include <asm/pgalloc.h> | ||
29 | #include <asm/mmu_context.h> | 19 | #include <asm/mmu_context.h> |
30 | #include <asm/cacheflush.h> | ||
31 | #include <asm/kgdb.h> | 20 | #include <asm/kgdb.h> |
32 | 21 | ||
33 | extern void die(const char *,struct pt_regs *,long); | 22 | extern void die(const char *,struct pt_regs *,long); |
@@ -187,18 +176,30 @@ do_sigbus: | |||
187 | goto no_context; | 176 | goto no_context; |
188 | } | 177 | } |
189 | 178 | ||
179 | #ifdef CONFIG_SH_STORE_QUEUES | ||
190 | /* | 180 | /* |
191 | * Called with interrupt disabled. | 181 | * This is a special case for the SH-4 store queues, as pages for this |
182 | * space still need to be faulted in before it's possible to flush the | ||
183 | * store queue cache for writeout to the remapped region. | ||
192 | */ | 184 | */ |
193 | asmlinkage int __do_page_fault(struct pt_regs *regs, unsigned long writeaccess, | 185 | #define P3_ADDR_MAX (P4SEG_STORE_QUE + 0x04000000) |
194 | unsigned long address) | 186 | #else |
187 | #define P3_ADDR_MAX P4SEG | ||
188 | #endif | ||
189 | |||
190 | /* | ||
191 | * Called with interrupts disabled. | ||
192 | */ | ||
193 | asmlinkage int __kprobes __do_page_fault(struct pt_regs *regs, | ||
194 | unsigned long writeaccess, | ||
195 | unsigned long address) | ||
195 | { | 196 | { |
196 | unsigned long addrmax = P4SEG; | ||
197 | pgd_t *pgd; | 197 | pgd_t *pgd; |
198 | pud_t *pud; | ||
198 | pmd_t *pmd; | 199 | pmd_t *pmd; |
199 | pte_t *pte; | 200 | pte_t *pte; |
200 | pte_t entry; | 201 | pte_t entry; |
201 | struct mm_struct *mm; | 202 | struct mm_struct *mm = current->mm; |
202 | spinlock_t *ptl; | 203 | spinlock_t *ptl; |
203 | int ret = 1; | 204 | int ret = 1; |
204 | 205 | ||
@@ -207,31 +208,37 @@ asmlinkage int __do_page_fault(struct pt_regs *regs, unsigned long writeaccess, | |||
207 | kgdb_bus_err_hook(); | 208 | kgdb_bus_err_hook(); |
208 | #endif | 209 | #endif |
209 | 210 | ||
210 | #ifdef CONFIG_SH_STORE_QUEUES | 211 | /* |
211 | addrmax = P4SEG_STORE_QUE + 0x04000000; | 212 | * We don't take page faults for P1, P2, and parts of P4, these |
212 | #endif | 213 | * are always mapped, whether it be due to legacy behaviour in |
213 | 214 | * 29-bit mode, or due to PMB configuration in 32-bit mode. | |
214 | if (address >= P3SEG && address < addrmax) { | 215 | */ |
216 | if (address >= P3SEG && address < P3_ADDR_MAX) { | ||
215 | pgd = pgd_offset_k(address); | 217 | pgd = pgd_offset_k(address); |
216 | mm = NULL; | 218 | mm = NULL; |
217 | } else if (address >= TASK_SIZE) | 219 | } else { |
218 | return 1; | 220 | if (unlikely(address >= TASK_SIZE || !mm)) |
219 | else if (!(mm = current->mm)) | 221 | return 1; |
220 | return 1; | 222 | |
221 | else | ||
222 | pgd = pgd_offset(mm, address); | 223 | pgd = pgd_offset(mm, address); |
224 | } | ||
223 | 225 | ||
224 | pmd = pmd_offset(pgd, address); | 226 | pud = pud_offset(pgd, address); |
227 | if (pud_none_or_clear_bad(pud)) | ||
228 | return 1; | ||
229 | pmd = pmd_offset(pud, address); | ||
225 | if (pmd_none_or_clear_bad(pmd)) | 230 | if (pmd_none_or_clear_bad(pmd)) |
226 | return 1; | 231 | return 1; |
232 | |||
227 | if (mm) | 233 | if (mm) |
228 | pte = pte_offset_map_lock(mm, pmd, address, &ptl); | 234 | pte = pte_offset_map_lock(mm, pmd, address, &ptl); |
229 | else | 235 | else |
230 | pte = pte_offset_kernel(pmd, address); | 236 | pte = pte_offset_kernel(pmd, address); |
231 | 237 | ||
232 | entry = *pte; | 238 | entry = *pte; |
233 | if (pte_none(entry) || pte_not_present(entry) | 239 | if (unlikely(pte_none(entry) || pte_not_present(entry))) |
234 | || (writeaccess && !pte_write(entry))) | 240 | goto unlock; |
241 | if (unlikely(writeaccess && !pte_write(entry))) | ||
235 | goto unlock; | 242 | goto unlock; |
236 | 243 | ||
237 | if (writeaccess) | 244 | if (writeaccess) |
@@ -243,13 +250,7 @@ asmlinkage int __do_page_fault(struct pt_regs *regs, unsigned long writeaccess, | |||
243 | * ITLB is not affected by "ldtlb" instruction. | 250 | * ITLB is not affected by "ldtlb" instruction. |
244 | * So, we need to flush the entry by ourselves. | 251 | * So, we need to flush the entry by ourselves. |
245 | */ | 252 | */ |
246 | 253 | __flush_tlb_page(get_asid(), address & PAGE_MASK); | |
247 | { | ||
248 | unsigned long flags; | ||
249 | local_irq_save(flags); | ||
250 | __flush_tlb_page(get_asid(), address&PAGE_MASK); | ||
251 | local_irq_restore(flags); | ||
252 | } | ||
253 | #endif | 254 | #endif |
254 | 255 | ||
255 | set_pte(pte, entry); | 256 | set_pte(pte, entry); |
@@ -260,121 +261,3 @@ unlock: | |||
260 | pte_unmap_unlock(pte, ptl); | 261 | pte_unmap_unlock(pte, ptl); |
261 | return ret; | 262 | return ret; |
262 | } | 263 | } |
263 | |||
264 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long page) | ||
265 | { | ||
266 | if (vma->vm_mm && vma->vm_mm->context != NO_CONTEXT) { | ||
267 | unsigned long flags; | ||
268 | unsigned long asid; | ||
269 | unsigned long saved_asid = MMU_NO_ASID; | ||
270 | |||
271 | asid = vma->vm_mm->context & MMU_CONTEXT_ASID_MASK; | ||
272 | page &= PAGE_MASK; | ||
273 | |||
274 | local_irq_save(flags); | ||
275 | if (vma->vm_mm != current->mm) { | ||
276 | saved_asid = get_asid(); | ||
277 | set_asid(asid); | ||
278 | } | ||
279 | __flush_tlb_page(asid, page); | ||
280 | if (saved_asid != MMU_NO_ASID) | ||
281 | set_asid(saved_asid); | ||
282 | local_irq_restore(flags); | ||
283 | } | ||
284 | } | ||
285 | |||
286 | void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | ||
287 | unsigned long end) | ||
288 | { | ||
289 | struct mm_struct *mm = vma->vm_mm; | ||
290 | |||
291 | if (mm->context != NO_CONTEXT) { | ||
292 | unsigned long flags; | ||
293 | int size; | ||
294 | |||
295 | local_irq_save(flags); | ||
296 | size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
297 | if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */ | ||
298 | mm->context = NO_CONTEXT; | ||
299 | if (mm == current->mm) | ||
300 | activate_context(mm); | ||
301 | } else { | ||
302 | unsigned long asid = mm->context&MMU_CONTEXT_ASID_MASK; | ||
303 | unsigned long saved_asid = MMU_NO_ASID; | ||
304 | |||
305 | start &= PAGE_MASK; | ||
306 | end += (PAGE_SIZE - 1); | ||
307 | end &= PAGE_MASK; | ||
308 | if (mm != current->mm) { | ||
309 | saved_asid = get_asid(); | ||
310 | set_asid(asid); | ||
311 | } | ||
312 | while (start < end) { | ||
313 | __flush_tlb_page(asid, start); | ||
314 | start += PAGE_SIZE; | ||
315 | } | ||
316 | if (saved_asid != MMU_NO_ASID) | ||
317 | set_asid(saved_asid); | ||
318 | } | ||
319 | local_irq_restore(flags); | ||
320 | } | ||
321 | } | ||
322 | |||
323 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | ||
324 | { | ||
325 | unsigned long flags; | ||
326 | int size; | ||
327 | |||
328 | local_irq_save(flags); | ||
329 | size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
330 | if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */ | ||
331 | flush_tlb_all(); | ||
332 | } else { | ||
333 | unsigned long asid = init_mm.context&MMU_CONTEXT_ASID_MASK; | ||
334 | unsigned long saved_asid = get_asid(); | ||
335 | |||
336 | start &= PAGE_MASK; | ||
337 | end += (PAGE_SIZE - 1); | ||
338 | end &= PAGE_MASK; | ||
339 | set_asid(asid); | ||
340 | while (start < end) { | ||
341 | __flush_tlb_page(asid, start); | ||
342 | start += PAGE_SIZE; | ||
343 | } | ||
344 | set_asid(saved_asid); | ||
345 | } | ||
346 | local_irq_restore(flags); | ||
347 | } | ||
348 | |||
349 | void flush_tlb_mm(struct mm_struct *mm) | ||
350 | { | ||
351 | /* Invalidate all TLB of this process. */ | ||
352 | /* Instead of invalidating each TLB, we get new MMU context. */ | ||
353 | if (mm->context != NO_CONTEXT) { | ||
354 | unsigned long flags; | ||
355 | |||
356 | local_irq_save(flags); | ||
357 | mm->context = NO_CONTEXT; | ||
358 | if (mm == current->mm) | ||
359 | activate_context(mm); | ||
360 | local_irq_restore(flags); | ||
361 | } | ||
362 | } | ||
363 | |||
364 | void flush_tlb_all(void) | ||
365 | { | ||
366 | unsigned long flags, status; | ||
367 | |||
368 | /* | ||
369 | * Flush all the TLB. | ||
370 | * | ||
371 | * Write to the MMU control register's bit: | ||
372 | * TF-bit for SH-3, TI-bit for SH-4. | ||
373 | * It's same position, bit #2. | ||
374 | */ | ||
375 | local_irq_save(flags); | ||
376 | status = ctrl_inl(MMUCR); | ||
377 | status |= 0x04; | ||
378 | ctrl_outl(status, MMUCR); | ||
379 | local_irq_restore(flags); | ||
380 | } | ||
diff --git a/arch/sh/mm/hugetlbpage.c b/arch/sh/mm/hugetlbpage.c index 2a85bc15a412..329059d6b54a 100644 --- a/arch/sh/mm/hugetlbpage.c +++ b/arch/sh/mm/hugetlbpage.c | |||
@@ -26,61 +26,41 @@ | |||
26 | pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) | 26 | pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) |
27 | { | 27 | { |
28 | pgd_t *pgd; | 28 | pgd_t *pgd; |
29 | pud_t *pud; | ||
29 | pmd_t *pmd; | 30 | pmd_t *pmd; |
30 | pte_t *pte = NULL; | 31 | pte_t *pte = NULL; |
31 | 32 | ||
32 | pgd = pgd_offset(mm, addr); | 33 | pgd = pgd_offset(mm, addr); |
33 | if (pgd) { | 34 | if (pgd) { |
34 | pmd = pmd_alloc(mm, pgd, addr); | 35 | pud = pud_alloc(mm, pgd, addr); |
35 | if (pmd) | 36 | if (pud) { |
36 | pte = pte_alloc_map(mm, pmd, addr); | 37 | pmd = pmd_alloc(mm, pud, addr); |
38 | if (pmd) | ||
39 | pte = pte_alloc_map(mm, pmd, addr); | ||
40 | } | ||
37 | } | 41 | } |
42 | |||
38 | return pte; | 43 | return pte; |
39 | } | 44 | } |
40 | 45 | ||
41 | pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) | 46 | pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) |
42 | { | 47 | { |
43 | pgd_t *pgd; | 48 | pgd_t *pgd; |
49 | pud_t *pud; | ||
44 | pmd_t *pmd; | 50 | pmd_t *pmd; |
45 | pte_t *pte = NULL; | 51 | pte_t *pte = NULL; |
46 | 52 | ||
47 | pgd = pgd_offset(mm, addr); | 53 | pgd = pgd_offset(mm, addr); |
48 | if (pgd) { | 54 | if (pgd) { |
49 | pmd = pmd_offset(pgd, addr); | 55 | pud = pud_offset(pgd, addr); |
50 | if (pmd) | 56 | if (pud) { |
51 | pte = pte_offset_map(pmd, addr); | 57 | pmd = pmd_offset(pud, addr); |
52 | } | 58 | if (pmd) |
53 | return pte; | 59 | pte = pte_offset_map(pmd, addr); |
54 | } | 60 | } |
55 | |||
56 | void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, | ||
57 | pte_t *ptep, pte_t entry) | ||
58 | { | ||
59 | int i; | ||
60 | |||
61 | for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { | ||
62 | set_pte_at(mm, addr, ptep, entry); | ||
63 | ptep++; | ||
64 | addr += PAGE_SIZE; | ||
65 | pte_val(entry) += PAGE_SIZE; | ||
66 | } | 61 | } |
67 | } | ||
68 | |||
69 | pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, | ||
70 | pte_t *ptep) | ||
71 | { | ||
72 | pte_t entry; | ||
73 | int i; | ||
74 | |||
75 | entry = *ptep; | ||
76 | 62 | ||
77 | for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { | 63 | return pte; |
78 | pte_clear(mm, addr, ptep); | ||
79 | addr += PAGE_SIZE; | ||
80 | ptep++; | ||
81 | } | ||
82 | |||
83 | return entry; | ||
84 | } | 64 | } |
85 | 65 | ||
86 | struct page *follow_huge_addr(struct mm_struct *mm, | 66 | struct page *follow_huge_addr(struct mm_struct *mm, |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 8ea27ca4b700..7154d1ce9785 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/highmem.h> | 24 | #include <linux/highmem.h> |
25 | #include <linux/bootmem.h> | 25 | #include <linux/bootmem.h> |
26 | #include <linux/pagemap.h> | 26 | #include <linux/pagemap.h> |
27 | 27 | #include <linux/proc_fs.h> | |
28 | #include <asm/processor.h> | 28 | #include <asm/processor.h> |
29 | #include <asm/system.h> | 29 | #include <asm/system.h> |
30 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
@@ -80,6 +80,7 @@ void show_mem(void) | |||
80 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | 80 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) |
81 | { | 81 | { |
82 | pgd_t *pgd; | 82 | pgd_t *pgd; |
83 | pud_t *pud; | ||
83 | pmd_t *pmd; | 84 | pmd_t *pmd; |
84 | pte_t *pte; | 85 | pte_t *pte; |
85 | 86 | ||
@@ -89,7 +90,17 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | |||
89 | return; | 90 | return; |
90 | } | 91 | } |
91 | 92 | ||
92 | pmd = pmd_offset(pgd, addr); | 93 | pud = pud_offset(pgd, addr); |
94 | if (pud_none(*pud)) { | ||
95 | pmd = (pmd_t *)get_zeroed_page(GFP_ATOMIC); | ||
96 | set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER)); | ||
97 | if (pmd != pmd_offset(pud, 0)) { | ||
98 | pud_ERROR(*pud); | ||
99 | return; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | pmd = pmd_offset(pud, addr); | ||
93 | if (pmd_none(*pmd)) { | 104 | if (pmd_none(*pmd)) { |
94 | pte = (pte_t *)get_zeroed_page(GFP_ATOMIC); | 105 | pte = (pte_t *)get_zeroed_page(GFP_ATOMIC); |
95 | set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER)); | 106 | set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER)); |
@@ -212,6 +223,8 @@ void __init paging_init(void) | |||
212 | free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0); | 223 | free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0); |
213 | } | 224 | } |
214 | 225 | ||
226 | static struct kcore_list kcore_mem, kcore_vmalloc; | ||
227 | |||
215 | void __init mem_init(void) | 228 | void __init mem_init(void) |
216 | { | 229 | { |
217 | extern unsigned long empty_zero_page[1024]; | 230 | extern unsigned long empty_zero_page[1024]; |
@@ -237,8 +250,13 @@ void __init mem_init(void) | |||
237 | * Setup wrappers for copy/clear_page(), these will get overridden | 250 | * Setup wrappers for copy/clear_page(), these will get overridden |
238 | * later in the boot process if a better method is available. | 251 | * later in the boot process if a better method is available. |
239 | */ | 252 | */ |
253 | #ifdef CONFIG_MMU | ||
240 | copy_page = copy_page_slow; | 254 | copy_page = copy_page_slow; |
241 | clear_page = clear_page_slow; | 255 | clear_page = clear_page_slow; |
256 | #else | ||
257 | copy_page = copy_page_nommu; | ||
258 | clear_page = clear_page_nommu; | ||
259 | #endif | ||
242 | 260 | ||
243 | /* this will put all low memory onto the freelists */ | 261 | /* this will put all low memory onto the freelists */ |
244 | totalram_pages += free_all_bootmem_node(NODE_DATA(0)); | 262 | totalram_pages += free_all_bootmem_node(NODE_DATA(0)); |
@@ -254,7 +272,12 @@ void __init mem_init(void) | |||
254 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; | 272 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; |
255 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; | 273 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; |
256 | 274 | ||
257 | printk("Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n", | 275 | kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); |
276 | kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, | ||
277 | VMALLOC_END - VMALLOC_START); | ||
278 | |||
279 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, " | ||
280 | "%dk reserved, %dk data, %dk init)\n", | ||
258 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | 281 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), |
259 | max_mapnr << (PAGE_SHIFT-10), | 282 | max_mapnr << (PAGE_SHIFT-10), |
260 | codesize >> 10, | 283 | codesize >> 10, |
@@ -263,6 +286,9 @@ void __init mem_init(void) | |||
263 | initsize >> 10); | 286 | initsize >> 10); |
264 | 287 | ||
265 | p3_cache_init(); | 288 | p3_cache_init(); |
289 | |||
290 | /* Initialize the vDSO */ | ||
291 | vsyscall_init(); | ||
266 | } | 292 | } |
267 | 293 | ||
268 | void free_initmem(void) | 294 | void free_initmem(void) |
diff --git a/arch/sh/mm/ioremap.c b/arch/sh/mm/ioremap.c index 96fa4a999e2a..a9fe80cfc233 100644 --- a/arch/sh/mm/ioremap.c +++ b/arch/sh/mm/ioremap.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/vmalloc.h> | 15 | #include <linux/vmalloc.h> |
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/pci.h> | ||
18 | #include <asm/io.h> | 19 | #include <asm/io.h> |
19 | #include <asm/page.h> | 20 | #include <asm/page.h> |
20 | #include <asm/pgalloc.h> | 21 | #include <asm/pgalloc.h> |
@@ -135,6 +136,20 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
135 | return (void __iomem *)phys_to_virt(phys_addr); | 136 | return (void __iomem *)phys_to_virt(phys_addr); |
136 | 137 | ||
137 | /* | 138 | /* |
139 | * If we're on an SH7751 or SH7780 PCI controller, PCI memory is | ||
140 | * mapped at the end of the address space (typically 0xfd000000) | ||
141 | * in a non-translatable area, so mapping through page tables for | ||
142 | * this area is not only pointless, but also fundamentally | ||
143 | * broken. Just return the physical address instead. | ||
144 | * | ||
145 | * For boards that map a small PCI memory aperture somewhere in | ||
146 | * P1/P2 space, ioremap() will already do the right thing, | ||
147 | * and we'll never get this far. | ||
148 | */ | ||
149 | if (is_pci_memaddr(phys_addr) && is_pci_memaddr(last_addr)) | ||
150 | return (void __iomem *)phys_addr; | ||
151 | |||
152 | /* | ||
138 | * Don't allow anybody to remap normal RAM that we're using.. | 153 | * Don't allow anybody to remap normal RAM that we're using.. |
139 | */ | 154 | */ |
140 | if (phys_addr < virt_to_phys(high_memory)) | 155 | if (phys_addr < virt_to_phys(high_memory)) |
@@ -192,7 +207,7 @@ void __iounmap(void __iomem *addr) | |||
192 | unsigned long vaddr = (unsigned long __force)addr; | 207 | unsigned long vaddr = (unsigned long __force)addr; |
193 | struct vm_struct *p; | 208 | struct vm_struct *p; |
194 | 209 | ||
195 | if (PXSEG(vaddr) < P3SEG) | 210 | if (PXSEG(vaddr) < P3SEG || is_pci_memaddr(vaddr)) |
196 | return; | 211 | return; |
197 | 212 | ||
198 | #ifdef CONFIG_32BIT | 213 | #ifdef CONFIG_32BIT |
diff --git a/arch/sh/mm/pg-nommu.c b/arch/sh/mm/pg-nommu.c index 8f9165a4e333..d15221beaa16 100644 --- a/arch/sh/mm/pg-nommu.c +++ b/arch/sh/mm/pg-nommu.c | |||
@@ -14,23 +14,24 @@ | |||
14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
15 | #include <asm/page.h> | 15 | #include <asm/page.h> |
16 | 16 | ||
17 | static void copy_page_nommu(void *to, void *from) | 17 | void copy_page_nommu(void *to, void *from) |
18 | { | 18 | { |
19 | memcpy(to, from, PAGE_SIZE); | 19 | memcpy(to, from, PAGE_SIZE); |
20 | } | 20 | } |
21 | 21 | ||
22 | static void clear_page_nommu(void *to) | 22 | void clear_page_nommu(void *to) |
23 | { | 23 | { |
24 | memset(to, 0, PAGE_SIZE); | 24 | memset(to, 0, PAGE_SIZE); |
25 | } | 25 | } |
26 | 26 | ||
27 | static int __init pg_nommu_init(void) | 27 | __kernel_size_t __copy_user(void *to, const void *from, __kernel_size_t n) |
28 | { | 28 | { |
29 | copy_page = copy_page_nommu; | 29 | memcpy(to, from, n); |
30 | clear_page = clear_page_nommu; | ||
31 | |||
32 | return 0; | 30 | return 0; |
33 | } | 31 | } |
34 | 32 | ||
35 | subsys_initcall(pg_nommu_init); | 33 | __kernel_size_t __clear_user(void *to, __kernel_size_t n) |
36 | 34 | { | |
35 | memset(to, 0, n); | ||
36 | return 0; | ||
37 | } | ||
diff --git a/arch/sh/mm/pg-sh4.c b/arch/sh/mm/pg-sh4.c index c776b60fc250..07371ed7a313 100644 --- a/arch/sh/mm/pg-sh4.c +++ b/arch/sh/mm/pg-sh4.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/sh/mm/pg-sh4.c | 2 | * arch/sh/mm/pg-sh4.c |
3 | * | 3 | * |
4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | 4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka |
5 | * Copyright (C) 2002 Paul Mundt | 5 | * Copyright (C) 2002 - 2005 Paul Mundt |
6 | * | 6 | * |
7 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
8 | */ | 8 | */ |
@@ -23,6 +23,8 @@ | |||
23 | 23 | ||
24 | extern struct semaphore p3map_sem[]; | 24 | extern struct semaphore p3map_sem[]; |
25 | 25 | ||
26 | #define CACHE_ALIAS (cpu_data->dcache.alias_mask) | ||
27 | |||
26 | /* | 28 | /* |
27 | * clear_user_page | 29 | * clear_user_page |
28 | * @to: P1 address | 30 | * @to: P1 address |
@@ -35,14 +37,15 @@ void clear_user_page(void *to, unsigned long address, struct page *page) | |||
35 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) | 37 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) |
36 | clear_page(to); | 38 | clear_page(to); |
37 | else { | 39 | else { |
38 | pgprot_t pgprot = __pgprot(_PAGE_PRESENT | | 40 | pgprot_t pgprot = __pgprot(_PAGE_PRESENT | |
39 | _PAGE_RW | _PAGE_CACHABLE | | 41 | _PAGE_RW | _PAGE_CACHABLE | |
40 | _PAGE_DIRTY | _PAGE_ACCESSED | | 42 | _PAGE_DIRTY | _PAGE_ACCESSED | |
41 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD); | 43 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD); |
42 | unsigned long phys_addr = PHYSADDR(to); | 44 | unsigned long phys_addr = PHYSADDR(to); |
43 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); | 45 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); |
44 | pgd_t *dir = pgd_offset_k(p3_addr); | 46 | pgd_t *pgd = pgd_offset_k(p3_addr); |
45 | pmd_t *pmd = pmd_offset(dir, p3_addr); | 47 | pud_t *pud = pud_offset(pgd, p3_addr); |
48 | pmd_t *pmd = pmd_offset(pud, p3_addr); | ||
46 | pte_t *pte = pte_offset_kernel(pmd, p3_addr); | 49 | pte_t *pte = pte_offset_kernel(pmd, p3_addr); |
47 | pte_t entry; | 50 | pte_t entry; |
48 | unsigned long flags; | 51 | unsigned long flags; |
@@ -67,21 +70,22 @@ void clear_user_page(void *to, unsigned long address, struct page *page) | |||
67 | * @address: U0 address to be mapped | 70 | * @address: U0 address to be mapped |
68 | * @page: page (virt_to_page(to)) | 71 | * @page: page (virt_to_page(to)) |
69 | */ | 72 | */ |
70 | void copy_user_page(void *to, void *from, unsigned long address, | 73 | void copy_user_page(void *to, void *from, unsigned long address, |
71 | struct page *page) | 74 | struct page *page) |
72 | { | 75 | { |
73 | __set_bit(PG_mapped, &page->flags); | 76 | __set_bit(PG_mapped, &page->flags); |
74 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) | 77 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) |
75 | copy_page(to, from); | 78 | copy_page(to, from); |
76 | else { | 79 | else { |
77 | pgprot_t pgprot = __pgprot(_PAGE_PRESENT | | 80 | pgprot_t pgprot = __pgprot(_PAGE_PRESENT | |
78 | _PAGE_RW | _PAGE_CACHABLE | | 81 | _PAGE_RW | _PAGE_CACHABLE | |
79 | _PAGE_DIRTY | _PAGE_ACCESSED | | 82 | _PAGE_DIRTY | _PAGE_ACCESSED | |
80 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD); | 83 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD); |
81 | unsigned long phys_addr = PHYSADDR(to); | 84 | unsigned long phys_addr = PHYSADDR(to); |
82 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); | 85 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); |
83 | pgd_t *dir = pgd_offset_k(p3_addr); | 86 | pgd_t *pgd = pgd_offset_k(p3_addr); |
84 | pmd_t *pmd = pmd_offset(dir, p3_addr); | 87 | pud_t *pud = pud_offset(pgd, p3_addr); |
88 | pmd_t *pmd = pmd_offset(pud, p3_addr); | ||
85 | pte_t *pte = pte_offset_kernel(pmd, p3_addr); | 89 | pte_t *pte = pte_offset_kernel(pmd, p3_addr); |
86 | pte_t entry; | 90 | pte_t entry; |
87 | unsigned long flags; | 91 | unsigned long flags; |
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c new file mode 100644 index 000000000000..92e745341e4d --- /dev/null +++ b/arch/sh/mm/pmb.c | |||
@@ -0,0 +1,400 @@ | |||
1 | /* | ||
2 | * arch/sh/mm/pmb.c | ||
3 | * | ||
4 | * Privileged Space Mapping Buffer (PMB) Support. | ||
5 | * | ||
6 | * Copyright (C) 2005, 2006 Paul Mundt | ||
7 | * | ||
8 | * P1/P2 Section mapping definitions from map32.h, which was: | ||
9 | * | ||
10 | * Copyright 2003 (c) Lineo Solutions,Inc. | ||
11 | * | ||
12 | * This file is subject to the terms and conditions of the GNU General Public | ||
13 | * License. See the file "COPYING" in the main directory of this archive | ||
14 | * for more details. | ||
15 | */ | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/bitops.h> | ||
21 | #include <linux/debugfs.h> | ||
22 | #include <linux/fs.h> | ||
23 | #include <linux/seq_file.h> | ||
24 | #include <linux/err.h> | ||
25 | #include <asm/system.h> | ||
26 | #include <asm/uaccess.h> | ||
27 | #include <asm/pgtable.h> | ||
28 | #include <asm/mmu.h> | ||
29 | #include <asm/io.h> | ||
30 | |||
31 | #define NR_PMB_ENTRIES 16 | ||
32 | |||
33 | static kmem_cache_t *pmb_cache; | ||
34 | static unsigned long pmb_map; | ||
35 | |||
36 | static struct pmb_entry pmb_init_map[] = { | ||
37 | /* vpn ppn flags (ub/sz/c/wt) */ | ||
38 | |||
39 | /* P1 Section Mappings */ | ||
40 | { 0x80000000, 0x00000000, PMB_SZ_64M | PMB_C, }, | ||
41 | { 0x84000000, 0x04000000, PMB_SZ_64M | PMB_C, }, | ||
42 | { 0x88000000, 0x08000000, PMB_SZ_128M | PMB_C, }, | ||
43 | { 0x90000000, 0x10000000, PMB_SZ_64M | PMB_C, }, | ||
44 | { 0x94000000, 0x14000000, PMB_SZ_64M | PMB_C, }, | ||
45 | { 0x98000000, 0x18000000, PMB_SZ_64M | PMB_C, }, | ||
46 | |||
47 | /* P2 Section Mappings */ | ||
48 | { 0xa0000000, 0x00000000, PMB_UB | PMB_SZ_64M | PMB_WT, }, | ||
49 | { 0xa4000000, 0x04000000, PMB_UB | PMB_SZ_64M | PMB_WT, }, | ||
50 | { 0xa8000000, 0x08000000, PMB_UB | PMB_SZ_128M | PMB_WT, }, | ||
51 | { 0xb0000000, 0x10000000, PMB_UB | PMB_SZ_64M | PMB_WT, }, | ||
52 | { 0xb4000000, 0x14000000, PMB_UB | PMB_SZ_64M | PMB_WT, }, | ||
53 | { 0xb8000000, 0x18000000, PMB_UB | PMB_SZ_64M | PMB_WT, }, | ||
54 | }; | ||
55 | |||
56 | static inline unsigned long mk_pmb_entry(unsigned int entry) | ||
57 | { | ||
58 | return (entry & PMB_E_MASK) << PMB_E_SHIFT; | ||
59 | } | ||
60 | |||
61 | static inline unsigned long mk_pmb_addr(unsigned int entry) | ||
62 | { | ||
63 | return mk_pmb_entry(entry) | PMB_ADDR; | ||
64 | } | ||
65 | |||
66 | static inline unsigned long mk_pmb_data(unsigned int entry) | ||
67 | { | ||
68 | return mk_pmb_entry(entry) | PMB_DATA; | ||
69 | } | ||
70 | |||
71 | struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn, | ||
72 | unsigned long flags) | ||
73 | { | ||
74 | struct pmb_entry *pmbe; | ||
75 | |||
76 | pmbe = kmem_cache_alloc(pmb_cache, GFP_KERNEL); | ||
77 | if (!pmbe) | ||
78 | return ERR_PTR(-ENOMEM); | ||
79 | |||
80 | pmbe->vpn = vpn; | ||
81 | pmbe->ppn = ppn; | ||
82 | pmbe->flags = flags; | ||
83 | |||
84 | return pmbe; | ||
85 | } | ||
86 | |||
87 | void pmb_free(struct pmb_entry *pmbe) | ||
88 | { | ||
89 | kmem_cache_free(pmb_cache, pmbe); | ||
90 | } | ||
91 | |||
92 | /* | ||
93 | * Must be in P2 for __set_pmb_entry() | ||
94 | */ | ||
95 | int __set_pmb_entry(unsigned long vpn, unsigned long ppn, | ||
96 | unsigned long flags, int *entry) | ||
97 | { | ||
98 | unsigned int pos = *entry; | ||
99 | |||
100 | if (unlikely(pos == PMB_NO_ENTRY)) | ||
101 | pos = find_first_zero_bit(&pmb_map, NR_PMB_ENTRIES); | ||
102 | |||
103 | repeat: | ||
104 | if (unlikely(pos > NR_PMB_ENTRIES)) | ||
105 | return -ENOSPC; | ||
106 | |||
107 | if (test_and_set_bit(pos, &pmb_map)) { | ||
108 | pos = find_first_zero_bit(&pmb_map, NR_PMB_ENTRIES); | ||
109 | goto repeat; | ||
110 | } | ||
111 | |||
112 | ctrl_outl(vpn | PMB_V, mk_pmb_addr(pos)); | ||
113 | |||
114 | #ifdef CONFIG_SH_WRITETHROUGH | ||
115 | /* | ||
116 | * When we are in 32-bit address extended mode, CCR.CB becomes | ||
117 | * invalid, so care must be taken to manually adjust cacheable | ||
118 | * translations. | ||
119 | */ | ||
120 | if (likely(flags & PMB_C)) | ||
121 | flags |= PMB_WT; | ||
122 | #endif | ||
123 | |||
124 | ctrl_outl(ppn | flags | PMB_V, mk_pmb_data(pos)); | ||
125 | |||
126 | *entry = pos; | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | int set_pmb_entry(struct pmb_entry *pmbe) | ||
132 | { | ||
133 | int ret; | ||
134 | |||
135 | jump_to_P2(); | ||
136 | ret = __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &pmbe->entry); | ||
137 | back_to_P1(); | ||
138 | |||
139 | return ret; | ||
140 | } | ||
141 | |||
142 | void clear_pmb_entry(struct pmb_entry *pmbe) | ||
143 | { | ||
144 | unsigned int entry = pmbe->entry; | ||
145 | unsigned long addr; | ||
146 | |||
147 | /* | ||
148 | * Don't allow clearing of wired init entries, P1 or P2 access | ||
149 | * without a corresponding mapping in the PMB will lead to reset | ||
150 | * by the TLB. | ||
151 | */ | ||
152 | if (unlikely(entry < ARRAY_SIZE(pmb_init_map) || | ||
153 | entry >= NR_PMB_ENTRIES)) | ||
154 | return; | ||
155 | |||
156 | jump_to_P2(); | ||
157 | |||
158 | /* Clear V-bit */ | ||
159 | addr = mk_pmb_addr(entry); | ||
160 | ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr); | ||
161 | |||
162 | addr = mk_pmb_data(entry); | ||
163 | ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr); | ||
164 | |||
165 | back_to_P1(); | ||
166 | |||
167 | clear_bit(entry, &pmb_map); | ||
168 | } | ||
169 | |||
170 | static DEFINE_SPINLOCK(pmb_list_lock); | ||
171 | static struct pmb_entry *pmb_list; | ||
172 | |||
173 | static inline void pmb_list_add(struct pmb_entry *pmbe) | ||
174 | { | ||
175 | struct pmb_entry **p, *tmp; | ||
176 | |||
177 | p = &pmb_list; | ||
178 | while ((tmp = *p) != NULL) | ||
179 | p = &tmp->next; | ||
180 | |||
181 | pmbe->next = tmp; | ||
182 | *p = pmbe; | ||
183 | } | ||
184 | |||
185 | static inline void pmb_list_del(struct pmb_entry *pmbe) | ||
186 | { | ||
187 | struct pmb_entry **p, *tmp; | ||
188 | |||
189 | for (p = &pmb_list; (tmp = *p); p = &tmp->next) | ||
190 | if (tmp == pmbe) { | ||
191 | *p = tmp->next; | ||
192 | return; | ||
193 | } | ||
194 | } | ||
195 | |||
196 | static struct { | ||
197 | unsigned long size; | ||
198 | int flag; | ||
199 | } pmb_sizes[] = { | ||
200 | { .size = 0x20000000, .flag = PMB_SZ_512M, }, | ||
201 | { .size = 0x08000000, .flag = PMB_SZ_128M, }, | ||
202 | { .size = 0x04000000, .flag = PMB_SZ_64M, }, | ||
203 | { .size = 0x01000000, .flag = PMB_SZ_16M, }, | ||
204 | }; | ||
205 | |||
206 | long pmb_remap(unsigned long vaddr, unsigned long phys, | ||
207 | unsigned long size, unsigned long flags) | ||
208 | { | ||
209 | struct pmb_entry *pmbp; | ||
210 | unsigned long wanted; | ||
211 | int pmb_flags, i; | ||
212 | |||
213 | /* Convert typical pgprot value to the PMB equivalent */ | ||
214 | if (flags & _PAGE_CACHABLE) { | ||
215 | if (flags & _PAGE_WT) | ||
216 | pmb_flags = PMB_WT; | ||
217 | else | ||
218 | pmb_flags = PMB_C; | ||
219 | } else | ||
220 | pmb_flags = PMB_WT | PMB_UB; | ||
221 | |||
222 | pmbp = NULL; | ||
223 | wanted = size; | ||
224 | |||
225 | again: | ||
226 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { | ||
227 | struct pmb_entry *pmbe; | ||
228 | int ret; | ||
229 | |||
230 | if (size < pmb_sizes[i].size) | ||
231 | continue; | ||
232 | |||
233 | pmbe = pmb_alloc(vaddr, phys, pmb_flags | pmb_sizes[i].flag); | ||
234 | if (IS_ERR(pmbe)) | ||
235 | return PTR_ERR(pmbe); | ||
236 | |||
237 | ret = set_pmb_entry(pmbe); | ||
238 | if (ret != 0) { | ||
239 | pmb_free(pmbe); | ||
240 | return -EBUSY; | ||
241 | } | ||
242 | |||
243 | phys += pmb_sizes[i].size; | ||
244 | vaddr += pmb_sizes[i].size; | ||
245 | size -= pmb_sizes[i].size; | ||
246 | |||
247 | /* | ||
248 | * Link adjacent entries that span multiple PMB entries | ||
249 | * for easier tear-down. | ||
250 | */ | ||
251 | if (likely(pmbp)) | ||
252 | pmbp->link = pmbe; | ||
253 | |||
254 | pmbp = pmbe; | ||
255 | } | ||
256 | |||
257 | if (size >= 0x1000000) | ||
258 | goto again; | ||
259 | |||
260 | return wanted - size; | ||
261 | } | ||
262 | |||
263 | void pmb_unmap(unsigned long addr) | ||
264 | { | ||
265 | struct pmb_entry **p, *pmbe; | ||
266 | |||
267 | for (p = &pmb_list; (pmbe = *p); p = &pmbe->next) | ||
268 | if (pmbe->vpn == addr) | ||
269 | break; | ||
270 | |||
271 | if (unlikely(!pmbe)) | ||
272 | return; | ||
273 | |||
274 | WARN_ON(!test_bit(pmbe->entry, &pmb_map)); | ||
275 | |||
276 | do { | ||
277 | struct pmb_entry *pmblink = pmbe; | ||
278 | |||
279 | clear_pmb_entry(pmbe); | ||
280 | pmbe = pmblink->link; | ||
281 | |||
282 | pmb_free(pmblink); | ||
283 | } while (pmbe); | ||
284 | } | ||
285 | |||
286 | static void pmb_cache_ctor(void *pmb, kmem_cache_t *cachep, unsigned long flags) | ||
287 | { | ||
288 | struct pmb_entry *pmbe = pmb; | ||
289 | |||
290 | memset(pmb, 0, sizeof(struct pmb_entry)); | ||
291 | |||
292 | spin_lock_irq(&pmb_list_lock); | ||
293 | |||
294 | pmbe->entry = PMB_NO_ENTRY; | ||
295 | pmb_list_add(pmbe); | ||
296 | |||
297 | spin_unlock_irq(&pmb_list_lock); | ||
298 | } | ||
299 | |||
300 | static void pmb_cache_dtor(void *pmb, kmem_cache_t *cachep, unsigned long flags) | ||
301 | { | ||
302 | spin_lock_irq(&pmb_list_lock); | ||
303 | pmb_list_del(pmb); | ||
304 | spin_unlock_irq(&pmb_list_lock); | ||
305 | } | ||
306 | |||
307 | static int __init pmb_init(void) | ||
308 | { | ||
309 | unsigned int nr_entries = ARRAY_SIZE(pmb_init_map); | ||
310 | unsigned int entry; | ||
311 | |||
312 | BUG_ON(unlikely(nr_entries >= NR_PMB_ENTRIES)); | ||
313 | |||
314 | pmb_cache = kmem_cache_create("pmb", sizeof(struct pmb_entry), | ||
315 | 0, 0, pmb_cache_ctor, pmb_cache_dtor); | ||
316 | BUG_ON(!pmb_cache); | ||
317 | |||
318 | jump_to_P2(); | ||
319 | |||
320 | /* | ||
321 | * Ordering is important, P2 must be mapped in the PMB before we | ||
322 | * can set PMB.SE, and P1 must be mapped before we jump back to | ||
323 | * P1 space. | ||
324 | */ | ||
325 | for (entry = 0; entry < nr_entries; entry++) { | ||
326 | struct pmb_entry *pmbe = pmb_init_map + entry; | ||
327 | |||
328 | __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &entry); | ||
329 | } | ||
330 | |||
331 | ctrl_outl(0, PMB_IRMCR); | ||
332 | |||
333 | /* PMB.SE and UB[7] */ | ||
334 | ctrl_outl((1 << 31) | (1 << 7), PMB_PASCR); | ||
335 | |||
336 | back_to_P1(); | ||
337 | |||
338 | return 0; | ||
339 | } | ||
340 | arch_initcall(pmb_init); | ||
341 | |||
342 | static int pmb_seq_show(struct seq_file *file, void *iter) | ||
343 | { | ||
344 | int i; | ||
345 | |||
346 | seq_printf(file, "V: Valid, C: Cacheable, WT: Write-Through\n" | ||
347 | "CB: Copy-Back, B: Buffered, UB: Unbuffered\n"); | ||
348 | seq_printf(file, "ety vpn ppn size flags\n"); | ||
349 | |||
350 | for (i = 0; i < NR_PMB_ENTRIES; i++) { | ||
351 | unsigned long addr, data; | ||
352 | unsigned int size; | ||
353 | char *sz_str = NULL; | ||
354 | |||
355 | addr = ctrl_inl(mk_pmb_addr(i)); | ||
356 | data = ctrl_inl(mk_pmb_data(i)); | ||
357 | |||
358 | size = data & PMB_SZ_MASK; | ||
359 | sz_str = (size == PMB_SZ_16M) ? " 16MB": | ||
360 | (size == PMB_SZ_64M) ? " 64MB": | ||
361 | (size == PMB_SZ_128M) ? "128MB": | ||
362 | "512MB"; | ||
363 | |||
364 | /* 02: V 0x88 0x08 128MB C CB B */ | ||
365 | seq_printf(file, "%02d: %c 0x%02lx 0x%02lx %s %c %s %s\n", | ||
366 | i, ((addr & PMB_V) && (data & PMB_V)) ? 'V' : ' ', | ||
367 | (addr >> 24) & 0xff, (data >> 24) & 0xff, | ||
368 | sz_str, (data & PMB_C) ? 'C' : ' ', | ||
369 | (data & PMB_WT) ? "WT" : "CB", | ||
370 | (data & PMB_UB) ? "UB" : " B"); | ||
371 | } | ||
372 | |||
373 | return 0; | ||
374 | } | ||
375 | |||
376 | static int pmb_debugfs_open(struct inode *inode, struct file *file) | ||
377 | { | ||
378 | return single_open(file, pmb_seq_show, NULL); | ||
379 | } | ||
380 | |||
381 | static struct file_operations pmb_debugfs_fops = { | ||
382 | .owner = THIS_MODULE, | ||
383 | .open = pmb_debugfs_open, | ||
384 | .read = seq_read, | ||
385 | .llseek = seq_lseek, | ||
386 | .release = seq_release, | ||
387 | }; | ||
388 | |||
389 | static int __init pmb_debugfs_init(void) | ||
390 | { | ||
391 | struct dentry *dentry; | ||
392 | |||
393 | dentry = debugfs_create_file("pmb", S_IFREG | S_IRUGO, | ||
394 | NULL, NULL, &pmb_debugfs_fops); | ||
395 | if (IS_ERR(dentry)) | ||
396 | return PTR_ERR(dentry); | ||
397 | |||
398 | return 0; | ||
399 | } | ||
400 | postcore_initcall(pmb_debugfs_init); | ||
diff --git a/arch/sh/mm/tlb-flush.c b/arch/sh/mm/tlb-flush.c new file mode 100644 index 000000000000..73ec7f6084fa --- /dev/null +++ b/arch/sh/mm/tlb-flush.c | |||
@@ -0,0 +1,134 @@ | |||
1 | /* | ||
2 | * TLB flushing operations for SH with an MMU. | ||
3 | * | ||
4 | * Copyright (C) 1999 Niibe Yutaka | ||
5 | * Copyright (C) 2003 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #include <linux/mm.h> | ||
12 | #include <asm/mmu_context.h> | ||
13 | #include <asm/tlbflush.h> | ||
14 | |||
15 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long page) | ||
16 | { | ||
17 | if (vma->vm_mm && vma->vm_mm->context.id != NO_CONTEXT) { | ||
18 | unsigned long flags; | ||
19 | unsigned long asid; | ||
20 | unsigned long saved_asid = MMU_NO_ASID; | ||
21 | |||
22 | asid = vma->vm_mm->context.id & MMU_CONTEXT_ASID_MASK; | ||
23 | page &= PAGE_MASK; | ||
24 | |||
25 | local_irq_save(flags); | ||
26 | if (vma->vm_mm != current->mm) { | ||
27 | saved_asid = get_asid(); | ||
28 | set_asid(asid); | ||
29 | } | ||
30 | __flush_tlb_page(asid, page); | ||
31 | if (saved_asid != MMU_NO_ASID) | ||
32 | set_asid(saved_asid); | ||
33 | local_irq_restore(flags); | ||
34 | } | ||
35 | } | ||
36 | |||
37 | void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | ||
38 | unsigned long end) | ||
39 | { | ||
40 | struct mm_struct *mm = vma->vm_mm; | ||
41 | |||
42 | if (mm->context.id != NO_CONTEXT) { | ||
43 | unsigned long flags; | ||
44 | int size; | ||
45 | |||
46 | local_irq_save(flags); | ||
47 | size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
48 | if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */ | ||
49 | mm->context.id = NO_CONTEXT; | ||
50 | if (mm == current->mm) | ||
51 | activate_context(mm); | ||
52 | } else { | ||
53 | unsigned long asid; | ||
54 | unsigned long saved_asid = MMU_NO_ASID; | ||
55 | |||
56 | asid = mm->context.id & MMU_CONTEXT_ASID_MASK; | ||
57 | start &= PAGE_MASK; | ||
58 | end += (PAGE_SIZE - 1); | ||
59 | end &= PAGE_MASK; | ||
60 | if (mm != current->mm) { | ||
61 | saved_asid = get_asid(); | ||
62 | set_asid(asid); | ||
63 | } | ||
64 | while (start < end) { | ||
65 | __flush_tlb_page(asid, start); | ||
66 | start += PAGE_SIZE; | ||
67 | } | ||
68 | if (saved_asid != MMU_NO_ASID) | ||
69 | set_asid(saved_asid); | ||
70 | } | ||
71 | local_irq_restore(flags); | ||
72 | } | ||
73 | } | ||
74 | |||
75 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | ||
76 | { | ||
77 | unsigned long flags; | ||
78 | int size; | ||
79 | |||
80 | local_irq_save(flags); | ||
81 | size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
82 | if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */ | ||
83 | flush_tlb_all(); | ||
84 | } else { | ||
85 | unsigned long asid; | ||
86 | unsigned long saved_asid = get_asid(); | ||
87 | |||
88 | asid = init_mm.context.id & MMU_CONTEXT_ASID_MASK; | ||
89 | start &= PAGE_MASK; | ||
90 | end += (PAGE_SIZE - 1); | ||
91 | end &= PAGE_MASK; | ||
92 | set_asid(asid); | ||
93 | while (start < end) { | ||
94 | __flush_tlb_page(asid, start); | ||
95 | start += PAGE_SIZE; | ||
96 | } | ||
97 | set_asid(saved_asid); | ||
98 | } | ||
99 | local_irq_restore(flags); | ||
100 | } | ||
101 | |||
102 | void flush_tlb_mm(struct mm_struct *mm) | ||
103 | { | ||
104 | /* Invalidate all TLB of this process. */ | ||
105 | /* Instead of invalidating each TLB, we get new MMU context. */ | ||
106 | if (mm->context.id != NO_CONTEXT) { | ||
107 | unsigned long flags; | ||
108 | |||
109 | local_irq_save(flags); | ||
110 | mm->context.id = NO_CONTEXT; | ||
111 | if (mm == current->mm) | ||
112 | activate_context(mm); | ||
113 | local_irq_restore(flags); | ||
114 | } | ||
115 | } | ||
116 | |||
117 | void flush_tlb_all(void) | ||
118 | { | ||
119 | unsigned long flags, status; | ||
120 | |||
121 | /* | ||
122 | * Flush all the TLB. | ||
123 | * | ||
124 | * Write to the MMU control register's bit: | ||
125 | * TF-bit for SH-3, TI-bit for SH-4. | ||
126 | * It's same position, bit #2. | ||
127 | */ | ||
128 | local_irq_save(flags); | ||
129 | status = ctrl_inl(MMUCR); | ||
130 | status |= 0x04; | ||
131 | ctrl_outl(status, MMUCR); | ||
132 | ctrl_barrier(); | ||
133 | local_irq_restore(flags); | ||
134 | } | ||
diff --git a/arch/sh/mm/tlb-sh4.c b/arch/sh/mm/tlb-sh4.c index 115b1b6be40b..812b2d567de2 100644 --- a/arch/sh/mm/tlb-sh4.c +++ b/arch/sh/mm/tlb-sh4.c | |||
@@ -36,7 +36,6 @@ void update_mmu_cache(struct vm_area_struct * vma, | |||
36 | unsigned long vpn; | 36 | unsigned long vpn; |
37 | struct page *page; | 37 | struct page *page; |
38 | unsigned long pfn; | 38 | unsigned long pfn; |
39 | unsigned long ptea; | ||
40 | 39 | ||
41 | /* Ptrace may call this routine. */ | 40 | /* Ptrace may call this routine. */ |
42 | if (vma && current->active_mm != vma->vm_mm) | 41 | if (vma && current->active_mm != vma->vm_mm) |
@@ -59,10 +58,11 @@ void update_mmu_cache(struct vm_area_struct * vma, | |||
59 | ctrl_outl(vpn, MMU_PTEH); | 58 | ctrl_outl(vpn, MMU_PTEH); |
60 | 59 | ||
61 | pteval = pte_val(pte); | 60 | pteval = pte_val(pte); |
61 | |||
62 | /* Set PTEA register */ | 62 | /* Set PTEA register */ |
63 | /* TODO: make this look less hacky */ | 63 | if (cpu_data->flags & CPU_HAS_PTEA) |
64 | ptea = ((pteval >> 28) & 0xe) | (pteval & 0x1); | 64 | /* TODO: make this look less hacky */ |
65 | ctrl_outl(ptea, MMU_PTEA); | 65 | ctrl_outl(((pteval >> 28) & 0xe) | (pteval & 0x1), MMU_PTEA); |
66 | 66 | ||
67 | /* Set PTEL register */ | 67 | /* Set PTEL register */ |
68 | pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */ | 68 | pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */ |
diff --git a/arch/sh/oprofile/Makefile b/arch/sh/oprofile/Makefile index 686738d4aa3c..1f25d9bb7538 100644 --- a/arch/sh/oprofile/Makefile +++ b/arch/sh/oprofile/Makefile | |||
@@ -7,7 +7,11 @@ DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \ | |||
7 | timer_int.o ) | 7 | timer_int.o ) |
8 | 8 | ||
9 | profdrvr-y := op_model_null.o | 9 | profdrvr-y := op_model_null.o |
10 | |||
11 | # SH7750-style performance counters exist across 7750/7750S and 7091. | ||
12 | profdrvr-$(CONFIG_CPU_SUBTYPE_SH7750S) := op_model_sh7750.o | ||
10 | profdrvr-$(CONFIG_CPU_SUBTYPE_SH7750) := op_model_sh7750.o | 13 | profdrvr-$(CONFIG_CPU_SUBTYPE_SH7750) := op_model_sh7750.o |
14 | profdrvr-$(CONFIG_CPU_SUBTYPE_SH7091) := op_model_sh7750.o | ||
11 | 15 | ||
12 | oprofile-y := $(DRIVER_OBJS) $(profdrvr-y) | 16 | oprofile-y := $(DRIVER_OBJS) $(profdrvr-y) |
13 | 17 | ||
diff --git a/arch/sh/tools/mach-types b/arch/sh/tools/mach-types index 182fe9092577..ac57638977ee 100644 --- a/arch/sh/tools/mach-types +++ b/arch/sh/tools/mach-types | |||
@@ -8,16 +8,15 @@ | |||
8 | SE SH_SOLUTION_ENGINE | 8 | SE SH_SOLUTION_ENGINE |
9 | 7751SE SH_7751_SOLUTION_ENGINE | 9 | 7751SE SH_7751_SOLUTION_ENGINE |
10 | 7300SE SH_7300_SOLUTION_ENGINE | 10 | 7300SE SH_7300_SOLUTION_ENGINE |
11 | 7343SE SH_7343_SOLUTION_ENGINE | ||
11 | 73180SE SH_73180_SOLUTION_ENGINE | 12 | 73180SE SH_73180_SOLUTION_ENGINE |
12 | 7751SYSTEMH SH_7751_SYSTEMH | 13 | 7751SYSTEMH SH_7751_SYSTEMH |
13 | HP6XX SH_HP6XX | 14 | HP6XX SH_HP6XX |
14 | HD64461 HD64461 | 15 | HD64461 HD64461 |
15 | HD64465 HD64465 | 16 | HD64465 HD64465 |
16 | SH2000 SH_SH2000 | ||
17 | SATURN SH_SATURN | 17 | SATURN SH_SATURN |
18 | DREAMCAST SH_DREAMCAST | 18 | DREAMCAST SH_DREAMCAST |
19 | BIGSUR SH_BIGSUR | 19 | BIGSUR SH_BIGSUR |
20 | ADX SH_ADX | ||
21 | MPC1211 SH_MPC1211 | 20 | MPC1211 SH_MPC1211 |
22 | SNAPGEAR SH_SECUREEDGE5410 | 21 | SNAPGEAR SH_SECUREEDGE5410 |
23 | HS7751RVOIP SH_HS7751RVOIP | 22 | HS7751RVOIP SH_HS7751RVOIP |
@@ -25,4 +24,9 @@ RTS7751R2D SH_RTS7751R2D | |||
25 | EDOSK7705 SH_EDOSK7705 | 24 | EDOSK7705 SH_EDOSK7705 |
26 | SH4202_MICRODEV SH_SH4202_MICRODEV | 25 | SH4202_MICRODEV SH_SH4202_MICRODEV |
27 | SH03 SH_SH03 | 26 | SH03 SH_SH03 |
28 | 27 | LANDISK SH_LANDISK | |
28 | R7780RP SH_R7780RP | ||
29 | R7780MP SH_R7780MP | ||
30 | TITAN SH_TITAN | ||
31 | SHMIN SH_SHMIN | ||
32 | 7710VOIPGW SH_7710VOIPGW | ||