diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-31 18:52:02 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-31 18:52:02 -0500 |
| commit | c5e18af910f4bc2e3d0732ea98b99c0fd884e73c (patch) | |
| tree | f6624e0fb83d482d4fcb265c616ae3f5e5ea53f1 | |
| parent | 878b8619f711280fd05845e21956434b5e588cc4 (diff) | |
| parent | 2d2eca4d11933bd37a4944aae06e6122efffaea8 (diff) | |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (27 commits)
MIPS: Alchemy: time.c build fix
MIPS: RB532: Export rb532_gpio_set_func()
MIPS: RB532: Update headers
MIPS: RB532: Simplify dev3 init
MIPS: RB532: Remove {get,set}_434_reg()
MIPS: RB532: Move dev3 init code to devices.c
MIPS: RB532: Fix set_latch_u5()
MIPS: RB532: Fix init of rb532_dev3_ctl_res
MIPS: RB532: Use driver_data instead of platform_data
MIPS: RB532: Detect uart type, add platform device
MIPS: RB532: remove useless CF GPIO initialisation
MIPS: RB532: Auto disable GPIO alternate function
MIPS: RB532: Add set_type() function to IRQ struct.
MIPS: RC32434: Define io_map_base for PCI controller
MIPS: RB532: Fix bit swapping in rb532_set_bit()
MIPS: Use hardware watchpoints on all R1 and R2 CPUs.
MIPS: Read watch registers with interrupts disabled.
MIPS: Fix a typo in watchpoint register structure.
MIPS: TXx9: Add support for TX4939 internal RTC
MIPS: R2: Fix broken installation of cache error handler.
...
25 files changed, 287 insertions, 174 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 52c80c2a57f2..600eef3f3ac7 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -351,7 +351,7 @@ config SGI_IP27 | |||
| 351 | select ARC64 | 351 | select ARC64 |
| 352 | select BOOT_ELF64 | 352 | select BOOT_ELF64 |
| 353 | select DEFAULT_SGI_PARTITION | 353 | select DEFAULT_SGI_PARTITION |
| 354 | select DMA_IP27 | 354 | select DMA_COHERENT |
| 355 | select SYS_HAS_EARLY_PRINTK | 355 | select SYS_HAS_EARLY_PRINTK |
| 356 | select HW_HAS_PCI | 356 | select HW_HAS_PCI |
| 357 | select NR_CPUS_DEFAULT_64 | 357 | select NR_CPUS_DEFAULT_64 |
| @@ -761,9 +761,6 @@ config CFE | |||
| 761 | config DMA_COHERENT | 761 | config DMA_COHERENT |
| 762 | bool | 762 | bool |
| 763 | 763 | ||
| 764 | config DMA_IP27 | ||
| 765 | bool | ||
| 766 | |||
| 767 | config DMA_NONCOHERENT | 764 | config DMA_NONCOHERENT |
| 768 | bool | 765 | bool |
| 769 | select DMA_NEED_PCI_MAP_STATE | 766 | select DMA_NEED_PCI_MAP_STATE |
| @@ -1368,7 +1365,7 @@ config CPU_SUPPORTS_64BIT_KERNEL | |||
| 1368 | # | 1365 | # |
| 1369 | config HARDWARE_WATCHPOINTS | 1366 | config HARDWARE_WATCHPOINTS |
| 1370 | bool | 1367 | bool |
| 1371 | default y if CPU_MIPS32 || CPU_MIPS64 | 1368 | default y if CPU_MIPSR1 || CPU_MIPSR2 |
| 1372 | 1369 | ||
| 1373 | menu "Kernel type" | 1370 | menu "Kernel type" |
| 1374 | 1371 | ||
diff --git a/arch/mips/alchemy/common/time.c b/arch/mips/alchemy/common/time.c index 32880146cbc1..6fd441d16af5 100644 --- a/arch/mips/alchemy/common/time.c +++ b/arch/mips/alchemy/common/time.c | |||
| @@ -89,7 +89,7 @@ static struct clock_event_device au1x_rtcmatch2_clockdev = { | |||
| 89 | .irq = AU1000_RTC_MATCH2_INT, | 89 | .irq = AU1000_RTC_MATCH2_INT, |
| 90 | .set_next_event = au1x_rtcmatch2_set_next_event, | 90 | .set_next_event = au1x_rtcmatch2_set_next_event, |
| 91 | .set_mode = au1x_rtcmatch2_set_mode, | 91 | .set_mode = au1x_rtcmatch2_set_mode, |
| 92 | .cpumask = CPU_MASK_ALL, | 92 | .cpumask = CPU_MASK_ALL_PTR, |
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | static struct irqaction au1x_rtcmatch2_irqaction = { | 95 | static struct irqaction au1x_rtcmatch2_irqaction = { |
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c index e085feddb4a4..5f4e49ba4713 100644 --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c | |||
| @@ -15,13 +15,11 @@ | |||
| 15 | #include <linux/serial.h> | 15 | #include <linux/serial.h> |
| 16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
| 17 | #include <linux/string.h> /* for memset */ | 17 | #include <linux/string.h> /* for memset */ |
| 18 | #include <linux/serial.h> | ||
| 19 | #include <linux/tty.h> | 18 | #include <linux/tty.h> |
| 20 | #include <linux/time.h> | 19 | #include <linux/time.h> |
| 21 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
| 22 | #include <linux/serial_core.h> | 21 | #include <linux/serial_core.h> |
| 23 | #include <linux/serial_8250.h> | 22 | #include <linux/serial_8250.h> |
| 24 | #include <linux/string.h> | ||
| 25 | 23 | ||
| 26 | #include <asm/processor.h> | 24 | #include <asm/processor.h> |
| 27 | #include <asm/reboot.h> | 25 | #include <asm/reboot.h> |
diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig index 34ea319be94c..f2baea3039bb 100644 --- a/arch/mips/configs/ip27_defconfig +++ b/arch/mips/configs/ip27_defconfig | |||
| @@ -53,7 +53,7 @@ CONFIG_GENERIC_TIME=y | |||
| 53 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | 53 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y |
| 54 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 54 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
| 55 | CONFIG_ARC=y | 55 | CONFIG_ARC=y |
| 56 | CONFIG_DMA_IP27=y | 56 | CONFIG_DMA_COHERENT=y |
| 57 | CONFIG_EARLY_PRINTK=y | 57 | CONFIG_EARLY_PRINTK=y |
| 58 | CONFIG_SYS_HAS_EARLY_PRINTK=y | 58 | CONFIG_SYS_HAS_EARLY_PRINTK=y |
| 59 | # CONFIG_NO_IOPORT is not set | 59 | # CONFIG_NO_IOPORT is not set |
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h index c996c3b4d074..1b332e15ab52 100644 --- a/arch/mips/include/asm/atomic.h +++ b/arch/mips/include/asm/atomic.h | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | static __inline__ void atomic_add(int i, atomic_t * v) | 50 | static __inline__ void atomic_add(int i, atomic_t * v) |
| 51 | { | 51 | { |
| 52 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 52 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 53 | unsigned long temp; | 53 | int temp; |
| 54 | 54 | ||
| 55 | __asm__ __volatile__( | 55 | __asm__ __volatile__( |
| 56 | " .set mips3 \n" | 56 | " .set mips3 \n" |
| @@ -62,7 +62,7 @@ static __inline__ void atomic_add(int i, atomic_t * v) | |||
| 62 | : "=&r" (temp), "=m" (v->counter) | 62 | : "=&r" (temp), "=m" (v->counter) |
| 63 | : "Ir" (i), "m" (v->counter)); | 63 | : "Ir" (i), "m" (v->counter)); |
| 64 | } else if (cpu_has_llsc) { | 64 | } else if (cpu_has_llsc) { |
| 65 | unsigned long temp; | 65 | int temp; |
| 66 | 66 | ||
| 67 | __asm__ __volatile__( | 67 | __asm__ __volatile__( |
| 68 | " .set mips3 \n" | 68 | " .set mips3 \n" |
| @@ -95,7 +95,7 @@ static __inline__ void atomic_add(int i, atomic_t * v) | |||
| 95 | static __inline__ void atomic_sub(int i, atomic_t * v) | 95 | static __inline__ void atomic_sub(int i, atomic_t * v) |
| 96 | { | 96 | { |
| 97 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 97 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 98 | unsigned long temp; | 98 | int temp; |
| 99 | 99 | ||
| 100 | __asm__ __volatile__( | 100 | __asm__ __volatile__( |
| 101 | " .set mips3 \n" | 101 | " .set mips3 \n" |
| @@ -107,7 +107,7 @@ static __inline__ void atomic_sub(int i, atomic_t * v) | |||
| 107 | : "=&r" (temp), "=m" (v->counter) | 107 | : "=&r" (temp), "=m" (v->counter) |
| 108 | : "Ir" (i), "m" (v->counter)); | 108 | : "Ir" (i), "m" (v->counter)); |
| 109 | } else if (cpu_has_llsc) { | 109 | } else if (cpu_has_llsc) { |
| 110 | unsigned long temp; | 110 | int temp; |
| 111 | 111 | ||
| 112 | __asm__ __volatile__( | 112 | __asm__ __volatile__( |
| 113 | " .set mips3 \n" | 113 | " .set mips3 \n" |
| @@ -135,12 +135,12 @@ static __inline__ void atomic_sub(int i, atomic_t * v) | |||
| 135 | */ | 135 | */ |
| 136 | static __inline__ int atomic_add_return(int i, atomic_t * v) | 136 | static __inline__ int atomic_add_return(int i, atomic_t * v) |
| 137 | { | 137 | { |
| 138 | unsigned long result; | 138 | int result; |
| 139 | 139 | ||
| 140 | smp_llsc_mb(); | 140 | smp_llsc_mb(); |
| 141 | 141 | ||
| 142 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 142 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 143 | unsigned long temp; | 143 | int temp; |
| 144 | 144 | ||
| 145 | __asm__ __volatile__( | 145 | __asm__ __volatile__( |
| 146 | " .set mips3 \n" | 146 | " .set mips3 \n" |
| @@ -154,7 +154,7 @@ static __inline__ int atomic_add_return(int i, atomic_t * v) | |||
| 154 | : "Ir" (i), "m" (v->counter) | 154 | : "Ir" (i), "m" (v->counter) |
| 155 | : "memory"); | 155 | : "memory"); |
| 156 | } else if (cpu_has_llsc) { | 156 | } else if (cpu_has_llsc) { |
| 157 | unsigned long temp; | 157 | int temp; |
| 158 | 158 | ||
| 159 | __asm__ __volatile__( | 159 | __asm__ __volatile__( |
| 160 | " .set mips3 \n" | 160 | " .set mips3 \n" |
| @@ -187,12 +187,12 @@ static __inline__ int atomic_add_return(int i, atomic_t * v) | |||
| 187 | 187 | ||
| 188 | static __inline__ int atomic_sub_return(int i, atomic_t * v) | 188 | static __inline__ int atomic_sub_return(int i, atomic_t * v) |
| 189 | { | 189 | { |
| 190 | unsigned long result; | 190 | int result; |
| 191 | 191 | ||
| 192 | smp_llsc_mb(); | 192 | smp_llsc_mb(); |
| 193 | 193 | ||
| 194 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 194 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 195 | unsigned long temp; | 195 | int temp; |
| 196 | 196 | ||
| 197 | __asm__ __volatile__( | 197 | __asm__ __volatile__( |
| 198 | " .set mips3 \n" | 198 | " .set mips3 \n" |
| @@ -206,7 +206,7 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v) | |||
| 206 | : "Ir" (i), "m" (v->counter) | 206 | : "Ir" (i), "m" (v->counter) |
| 207 | : "memory"); | 207 | : "memory"); |
| 208 | } else if (cpu_has_llsc) { | 208 | } else if (cpu_has_llsc) { |
| 209 | unsigned long temp; | 209 | int temp; |
| 210 | 210 | ||
| 211 | __asm__ __volatile__( | 211 | __asm__ __volatile__( |
| 212 | " .set mips3 \n" | 212 | " .set mips3 \n" |
| @@ -247,12 +247,12 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v) | |||
| 247 | */ | 247 | */ |
| 248 | static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) | 248 | static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) |
| 249 | { | 249 | { |
| 250 | unsigned long result; | 250 | int result; |
| 251 | 251 | ||
| 252 | smp_llsc_mb(); | 252 | smp_llsc_mb(); |
| 253 | 253 | ||
| 254 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 254 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 255 | unsigned long temp; | 255 | int temp; |
| 256 | 256 | ||
| 257 | __asm__ __volatile__( | 257 | __asm__ __volatile__( |
| 258 | " .set mips3 \n" | 258 | " .set mips3 \n" |
| @@ -270,7 +270,7 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) | |||
| 270 | : "Ir" (i), "m" (v->counter) | 270 | : "Ir" (i), "m" (v->counter) |
| 271 | : "memory"); | 271 | : "memory"); |
| 272 | } else if (cpu_has_llsc) { | 272 | } else if (cpu_has_llsc) { |
| 273 | unsigned long temp; | 273 | int temp; |
| 274 | 274 | ||
| 275 | __asm__ __volatile__( | 275 | __asm__ __volatile__( |
| 276 | " .set mips3 \n" | 276 | " .set mips3 \n" |
| @@ -429,7 +429,7 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | |||
| 429 | static __inline__ void atomic64_add(long i, atomic64_t * v) | 429 | static __inline__ void atomic64_add(long i, atomic64_t * v) |
| 430 | { | 430 | { |
| 431 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 431 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 432 | unsigned long temp; | 432 | long temp; |
| 433 | 433 | ||
| 434 | __asm__ __volatile__( | 434 | __asm__ __volatile__( |
| 435 | " .set mips3 \n" | 435 | " .set mips3 \n" |
| @@ -441,7 +441,7 @@ static __inline__ void atomic64_add(long i, atomic64_t * v) | |||
| 441 | : "=&r" (temp), "=m" (v->counter) | 441 | : "=&r" (temp), "=m" (v->counter) |
| 442 | : "Ir" (i), "m" (v->counter)); | 442 | : "Ir" (i), "m" (v->counter)); |
| 443 | } else if (cpu_has_llsc) { | 443 | } else if (cpu_has_llsc) { |
| 444 | unsigned long temp; | 444 | long temp; |
| 445 | 445 | ||
| 446 | __asm__ __volatile__( | 446 | __asm__ __volatile__( |
| 447 | " .set mips3 \n" | 447 | " .set mips3 \n" |
| @@ -474,7 +474,7 @@ static __inline__ void atomic64_add(long i, atomic64_t * v) | |||
| 474 | static __inline__ void atomic64_sub(long i, atomic64_t * v) | 474 | static __inline__ void atomic64_sub(long i, atomic64_t * v) |
| 475 | { | 475 | { |
| 476 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 476 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 477 | unsigned long temp; | 477 | long temp; |
| 478 | 478 | ||
| 479 | __asm__ __volatile__( | 479 | __asm__ __volatile__( |
| 480 | " .set mips3 \n" | 480 | " .set mips3 \n" |
| @@ -486,7 +486,7 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v) | |||
| 486 | : "=&r" (temp), "=m" (v->counter) | 486 | : "=&r" (temp), "=m" (v->counter) |
| 487 | : "Ir" (i), "m" (v->counter)); | 487 | : "Ir" (i), "m" (v->counter)); |
| 488 | } else if (cpu_has_llsc) { | 488 | } else if (cpu_has_llsc) { |
| 489 | unsigned long temp; | 489 | long temp; |
| 490 | 490 | ||
| 491 | __asm__ __volatile__( | 491 | __asm__ __volatile__( |
| 492 | " .set mips3 \n" | 492 | " .set mips3 \n" |
| @@ -514,12 +514,12 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v) | |||
| 514 | */ | 514 | */ |
| 515 | static __inline__ long atomic64_add_return(long i, atomic64_t * v) | 515 | static __inline__ long atomic64_add_return(long i, atomic64_t * v) |
| 516 | { | 516 | { |
| 517 | unsigned long result; | 517 | long result; |
| 518 | 518 | ||
| 519 | smp_llsc_mb(); | 519 | smp_llsc_mb(); |
| 520 | 520 | ||
| 521 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 521 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 522 | unsigned long temp; | 522 | long temp; |
| 523 | 523 | ||
| 524 | __asm__ __volatile__( | 524 | __asm__ __volatile__( |
| 525 | " .set mips3 \n" | 525 | " .set mips3 \n" |
| @@ -533,7 +533,7 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v) | |||
| 533 | : "Ir" (i), "m" (v->counter) | 533 | : "Ir" (i), "m" (v->counter) |
| 534 | : "memory"); | 534 | : "memory"); |
| 535 | } else if (cpu_has_llsc) { | 535 | } else if (cpu_has_llsc) { |
| 536 | unsigned long temp; | 536 | long temp; |
| 537 | 537 | ||
| 538 | __asm__ __volatile__( | 538 | __asm__ __volatile__( |
| 539 | " .set mips3 \n" | 539 | " .set mips3 \n" |
| @@ -566,12 +566,12 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v) | |||
| 566 | 566 | ||
| 567 | static __inline__ long atomic64_sub_return(long i, atomic64_t * v) | 567 | static __inline__ long atomic64_sub_return(long i, atomic64_t * v) |
| 568 | { | 568 | { |
| 569 | unsigned long result; | 569 | long result; |
| 570 | 570 | ||
| 571 | smp_llsc_mb(); | 571 | smp_llsc_mb(); |
| 572 | 572 | ||
| 573 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 573 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 574 | unsigned long temp; | 574 | long temp; |
| 575 | 575 | ||
| 576 | __asm__ __volatile__( | 576 | __asm__ __volatile__( |
| 577 | " .set mips3 \n" | 577 | " .set mips3 \n" |
| @@ -585,7 +585,7 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v) | |||
| 585 | : "Ir" (i), "m" (v->counter) | 585 | : "Ir" (i), "m" (v->counter) |
| 586 | : "memory"); | 586 | : "memory"); |
| 587 | } else if (cpu_has_llsc) { | 587 | } else if (cpu_has_llsc) { |
| 588 | unsigned long temp; | 588 | long temp; |
| 589 | 589 | ||
| 590 | __asm__ __volatile__( | 590 | __asm__ __volatile__( |
| 591 | " .set mips3 \n" | 591 | " .set mips3 \n" |
| @@ -626,12 +626,12 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v) | |||
| 626 | */ | 626 | */ |
| 627 | static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) | 627 | static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) |
| 628 | { | 628 | { |
| 629 | unsigned long result; | 629 | long result; |
| 630 | 630 | ||
| 631 | smp_llsc_mb(); | 631 | smp_llsc_mb(); |
| 632 | 632 | ||
| 633 | if (cpu_has_llsc && R10000_LLSC_WAR) { | 633 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
| 634 | unsigned long temp; | 634 | long temp; |
| 635 | 635 | ||
| 636 | __asm__ __volatile__( | 636 | __asm__ __volatile__( |
| 637 | " .set mips3 \n" | 637 | " .set mips3 \n" |
| @@ -649,7 +649,7 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) | |||
| 649 | : "Ir" (i), "m" (v->counter) | 649 | : "Ir" (i), "m" (v->counter) |
| 650 | : "memory"); | 650 | : "memory"); |
| 651 | } else if (cpu_has_llsc) { | 651 | } else if (cpu_has_llsc) { |
| 652 | unsigned long temp; | 652 | long temp; |
| 653 | 653 | ||
| 654 | __asm__ __volatile__( | 654 | __asm__ __volatile__( |
| 655 | " .set mips3 \n" | 655 | " .set mips3 \n" |
diff --git a/arch/mips/include/asm/mach-rc32434/gpio.h b/arch/mips/include/asm/mach-rc32434/gpio.h index b5cf6457305a..3cb50d17b62d 100644 --- a/arch/mips/include/asm/mach-rc32434/gpio.h +++ b/arch/mips/include/asm/mach-rc32434/gpio.h | |||
| @@ -80,11 +80,8 @@ struct rb532_gpio_reg { | |||
| 80 | /* Compact Flash GPIO pin */ | 80 | /* Compact Flash GPIO pin */ |
| 81 | #define CF_GPIO_NUM 13 | 81 | #define CF_GPIO_NUM 13 |
| 82 | 82 | ||
| 83 | extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned val); | ||
| 84 | extern unsigned get_434_reg(unsigned reg_offs); | ||
| 85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); | ||
| 86 | extern unsigned char get_latch_u5(void); | ||
| 87 | extern void rb532_gpio_set_ilevel(int bit, unsigned gpio); | 83 | extern void rb532_gpio_set_ilevel(int bit, unsigned gpio); |
| 88 | extern void rb532_gpio_set_istat(int bit, unsigned gpio); | 84 | extern void rb532_gpio_set_istat(int bit, unsigned gpio); |
| 85 | extern void rb532_gpio_set_func(unsigned gpio); | ||
| 89 | 86 | ||
| 90 | #endif /* _RC32434_GPIO_H_ */ | 87 | #endif /* _RC32434_GPIO_H_ */ |
diff --git a/arch/mips/include/asm/mach-rc32434/irq.h b/arch/mips/include/asm/mach-rc32434/irq.h index 56738d8ec4e2..023a5b100ed0 100644 --- a/arch/mips/include/asm/mach-rc32434/irq.h +++ b/arch/mips/include/asm/mach-rc32434/irq.h | |||
| @@ -30,4 +30,7 @@ | |||
| 30 | #define ETH0_RX_OVR_IRQ (GROUP3_IRQ_BASE + 9) | 30 | #define ETH0_RX_OVR_IRQ (GROUP3_IRQ_BASE + 9) |
| 31 | #define ETH0_TX_UND_IRQ (GROUP3_IRQ_BASE + 10) | 31 | #define ETH0_TX_UND_IRQ (GROUP3_IRQ_BASE + 10) |
| 32 | 32 | ||
| 33 | #define GPIO_MAPPED_IRQ_BASE GROUP4_IRQ_BASE | ||
| 34 | #define GPIO_MAPPED_IRQ_GROUP 4 | ||
| 35 | |||
| 33 | #endif /* __ASM_RC32434_IRQ_H */ | 36 | #endif /* __ASM_RC32434_IRQ_H */ |
diff --git a/arch/mips/include/asm/mach-rc32434/rb.h b/arch/mips/include/asm/mach-rc32434/rb.h index f25a84916703..6dc5f8df1f3e 100644 --- a/arch/mips/include/asm/mach-rc32434/rb.h +++ b/arch/mips/include/asm/mach-rc32434/rb.h | |||
| @@ -83,4 +83,7 @@ struct mpmc_device { | |||
| 83 | void __iomem *base; | 83 | void __iomem *base; |
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); | ||
| 87 | extern unsigned char get_latch_u5(void); | ||
| 88 | |||
| 86 | #endif /* __ASM_RC32434_RB_H */ | 89 | #endif /* __ASM_RC32434_RB_H */ |
diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index 1f30d16d4669..ce47118e52b7 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h | |||
| @@ -105,7 +105,7 @@ struct pt_watch_regs { | |||
| 105 | enum pt_watch_style style; | 105 | enum pt_watch_style style; |
| 106 | union { | 106 | union { |
| 107 | struct mips32_watch_regs mips32; | 107 | struct mips32_watch_regs mips32; |
| 108 | struct mips32_watch_regs mips64; | 108 | struct mips64_watch_regs mips64; |
| 109 | }; | 109 | }; |
| 110 | }; | 110 | }; |
| 111 | 111 | ||
diff --git a/arch/mips/include/asm/termios.h b/arch/mips/include/asm/termios.h index a275661fa7e1..8f77f774a2a0 100644 --- a/arch/mips/include/asm/termios.h +++ b/arch/mips/include/asm/termios.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #ifndef _ASM_TERMIOS_H | 9 | #ifndef _ASM_TERMIOS_H |
| 10 | #define _ASM_TERMIOS_H | 10 | #define _ASM_TERMIOS_H |
| 11 | 11 | ||
| 12 | #include <linux/errno.h> | ||
| 12 | #include <asm/termbits.h> | 13 | #include <asm/termbits.h> |
| 13 | #include <asm/ioctls.h> | 14 | #include <asm/ioctls.h> |
| 14 | 15 | ||
| @@ -94,38 +95,81 @@ struct termio { | |||
| 94 | /* | 95 | /* |
| 95 | * Translate a "termio" structure into a "termios". Ugh. | 96 | * Translate a "termio" structure into a "termios". Ugh. |
| 96 | */ | 97 | */ |
| 97 | #define user_termio_to_kernel_termios(termios, termio) \ | 98 | static inline int user_termio_to_kernel_termios(struct ktermios *termios, |
| 98 | ({ \ | 99 | struct termio __user *termio) |
| 99 | unsigned short tmp; \ | 100 | { |
| 100 | get_user(tmp, &(termio)->c_iflag); \ | 101 | unsigned short iflag, oflag, cflag, lflag; |
| 101 | (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \ | 102 | unsigned int err; |
| 102 | get_user(tmp, &(termio)->c_oflag); \ | 103 | |
| 103 | (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \ | 104 | if (!access_ok(VERIFY_READ, termio, sizeof(struct termio))) |
| 104 | get_user(tmp, &(termio)->c_cflag); \ | 105 | return -EFAULT; |
| 105 | (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \ | 106 | |
| 106 | get_user(tmp, &(termio)->c_lflag); \ | 107 | err = __get_user(iflag, &termio->c_iflag); |
| 107 | (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \ | 108 | termios->c_iflag = (termios->c_iflag & 0xffff0000) | iflag; |
| 108 | get_user((termios)->c_line, &(termio)->c_line); \ | 109 | err |=__get_user(oflag, &termio->c_oflag); |
| 109 | copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ | 110 | termios->c_oflag = (termios->c_oflag & 0xffff0000) | oflag; |
| 110 | }) | 111 | err |=__get_user(cflag, &termio->c_cflag); |
| 112 | termios->c_cflag = (termios->c_cflag & 0xffff0000) | cflag; | ||
| 113 | err |=__get_user(lflag, &termio->c_lflag); | ||
| 114 | termios->c_lflag = (termios->c_lflag & 0xffff0000) | lflag; | ||
| 115 | err |=__get_user(termios->c_line, &termio->c_line); | ||
| 116 | if (err) | ||
| 117 | return -EFAULT; | ||
| 118 | |||
| 119 | if (__copy_from_user(termios->c_cc, termio->c_cc, NCC)) | ||
| 120 | return -EFAULT; | ||
| 121 | |||
| 122 | return 0; | ||
| 123 | } | ||
| 111 | 124 | ||
| 112 | /* | 125 | /* |
| 113 | * Translate a "termios" structure into a "termio". Ugh. | 126 | * Translate a "termios" structure into a "termio". Ugh. |
| 114 | */ | 127 | */ |
| 115 | #define kernel_termios_to_user_termio(termio, termios) \ | 128 | static inline int kernel_termios_to_user_termio(struct termio __user *termio, |
| 116 | ({ \ | 129 | struct ktermios *termios) |
| 117 | put_user((termios)->c_iflag, &(termio)->c_iflag); \ | 130 | { |
| 118 | put_user((termios)->c_oflag, &(termio)->c_oflag); \ | 131 | int err; |
| 119 | put_user((termios)->c_cflag, &(termio)->c_cflag); \ | 132 | |
| 120 | put_user((termios)->c_lflag, &(termio)->c_lflag); \ | 133 | if (!access_ok(VERIFY_WRITE, termio, sizeof(struct termio))) |
| 121 | put_user((termios)->c_line, &(termio)->c_line); \ | 134 | return -EFAULT; |
| 122 | copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ | 135 | |
| 123 | }) | 136 | err = __put_user(termios->c_iflag, &termio->c_iflag); |
| 124 | 137 | err |= __put_user(termios->c_oflag, &termio->c_oflag); | |
| 125 | #define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2)) | 138 | err |= __put_user(termios->c_cflag, &termio->c_cflag); |
| 126 | #define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2)) | 139 | err |= __put_user(termios->c_lflag, &termio->c_lflag); |
| 127 | #define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) | 140 | err |= __put_user(termios->c_line, &termio->c_line); |
| 128 | #define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) | 141 | if (err) |
| 142 | return -EFAULT; | ||
| 143 | |||
| 144 | if (__copy_to_user(termio->c_cc, termios->c_cc, NCC)) | ||
| 145 | return -EFAULT; | ||
| 146 | |||
| 147 | return 0; | ||
| 148 | } | ||
| 149 | |||
| 150 | static inline int user_termios_to_kernel_termios(struct ktermios __user *k, | ||
| 151 | struct termios2 *u) | ||
| 152 | { | ||
| 153 | return copy_from_user(k, u, sizeof(struct termios2)) ? -EFAULT : 0; | ||
| 154 | } | ||
| 155 | |||
| 156 | static inline int kernel_termios_to_user_termios(struct termios2 __user *u, | ||
| 157 | struct ktermios *k) | ||
| 158 | { | ||
| 159 | return copy_to_user(u, k, sizeof(struct termios2)) ? -EFAULT : 0; | ||
| 160 | } | ||
| 161 | |||
| 162 | static inline int user_termios_to_kernel_termios_1(struct ktermios *k, | ||
| 163 | struct termios __user *u) | ||
| 164 | { | ||
| 165 | return copy_from_user(k, u, sizeof(struct termios)) ? -EFAULT : 0; | ||
| 166 | } | ||
| 167 | |||
| 168 | static inline int kernel_termios_to_user_termios_1(struct termios __user *u, | ||
| 169 | struct ktermios *k) | ||
| 170 | { | ||
| 171 | return copy_to_user(u, k, sizeof(struct termios)) ? -EFAULT : 0; | ||
| 172 | } | ||
| 129 | 173 | ||
| 130 | #endif /* defined(__KERNEL__) */ | 174 | #endif /* defined(__KERNEL__) */ |
| 131 | 175 | ||
diff --git a/arch/mips/include/asm/txx9/tx4939.h b/arch/mips/include/asm/txx9/tx4939.h index 88badb423010..964ef7ede268 100644 --- a/arch/mips/include/asm/txx9/tx4939.h +++ b/arch/mips/include/asm/txx9/tx4939.h | |||
| @@ -541,5 +541,6 @@ void tx4939_irq_init(void); | |||
| 541 | int tx4939_irq(void); | 541 | int tx4939_irq(void); |
| 542 | void tx4939_mtd_init(int ch); | 542 | void tx4939_mtd_init(int ch); |
| 543 | void tx4939_ata_init(void); | 543 | void tx4939_ata_init(void); |
| 544 | void tx4939_rtc_init(void); | ||
| 544 | 545 | ||
| 545 | #endif /* __ASM_TXX9_TX4939_H */ | 546 | #endif /* __ASM_TXX9_TX4939_H */ |
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index fb6f73148df2..8882e5766f27 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
| @@ -458,7 +458,11 @@ NESTED(nmi_handler, PT_SIZE, sp) | |||
| 458 | BUILD_HANDLER fpe fpe fpe silent /* #15 */ | 458 | BUILD_HANDLER fpe fpe fpe silent /* #15 */ |
| 459 | BUILD_HANDLER mdmx mdmx sti silent /* #22 */ | 459 | BUILD_HANDLER mdmx mdmx sti silent /* #22 */ |
| 460 | #ifdef CONFIG_HARDWARE_WATCHPOINTS | 460 | #ifdef CONFIG_HARDWARE_WATCHPOINTS |
| 461 | BUILD_HANDLER watch watch sti silent /* #23 */ | 461 | /* |
| 462 | * For watch, interrupts will be enabled after the watch | ||
| 463 | * registers are read. | ||
| 464 | */ | ||
| 465 | BUILD_HANDLER watch watch cli silent /* #23 */ | ||
| 462 | #else | 466 | #else |
| 463 | BUILD_HANDLER watch watch sti verbose /* #23 */ | 467 | BUILD_HANDLER watch watch sti verbose /* #23 */ |
| 464 | #endif | 468 | #endif |
diff --git a/arch/mips/kernel/mips-mt-fpaff.c b/arch/mips/kernel/mips-mt-fpaff.c index 5e77a3a21f98..42461310b185 100644 --- a/arch/mips/kernel/mips-mt-fpaff.c +++ b/arch/mips/kernel/mips-mt-fpaff.c | |||
| @@ -79,7 +79,8 @@ asmlinkage long mipsmt_sys_sched_setaffinity(pid_t pid, unsigned int len, | |||
| 79 | 79 | ||
| 80 | euid = current_euid(); | 80 | euid = current_euid(); |
| 81 | retval = -EPERM; | 81 | retval = -EPERM; |
| 82 | if (euid != p->euid && euid != p->uid && !capable(CAP_SYS_NICE)) { | 82 | if (euid != p->cred->euid && euid != p->cred->uid && |
| 83 | !capable(CAP_SYS_NICE)) { | ||
| 83 | read_unlock(&tasklist_lock); | 84 | read_unlock(&tasklist_lock); |
| 84 | goto out_unlock; | 85 | goto out_unlock; |
| 85 | } | 86 | } |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index f6083c6bfaa4..b2d7041341b8 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -944,6 +944,9 @@ asmlinkage void do_mdmx(struct pt_regs *regs) | |||
| 944 | force_sig(SIGILL, current); | 944 | force_sig(SIGILL, current); |
| 945 | } | 945 | } |
| 946 | 946 | ||
| 947 | /* | ||
| 948 | * Called with interrupts disabled. | ||
| 949 | */ | ||
| 947 | asmlinkage void do_watch(struct pt_regs *regs) | 950 | asmlinkage void do_watch(struct pt_regs *regs) |
| 948 | { | 951 | { |
| 949 | u32 cause; | 952 | u32 cause; |
| @@ -963,9 +966,12 @@ asmlinkage void do_watch(struct pt_regs *regs) | |||
| 963 | */ | 966 | */ |
| 964 | if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) { | 967 | if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) { |
| 965 | mips_read_watch_registers(); | 968 | mips_read_watch_registers(); |
| 969 | local_irq_enable(); | ||
| 966 | force_sig(SIGTRAP, current); | 970 | force_sig(SIGTRAP, current); |
| 967 | } else | 971 | } else { |
| 968 | mips_clear_watch_registers(); | 972 | mips_clear_watch_registers(); |
| 973 | local_irq_enable(); | ||
| 974 | } | ||
| 969 | } | 975 | } |
| 970 | 976 | ||
| 971 | asmlinkage void do_mcheck(struct pt_regs *regs) | 977 | asmlinkage void do_mcheck(struct pt_regs *regs) |
| @@ -1582,7 +1588,11 @@ void __init set_handler(unsigned long offset, void *addr, unsigned long size) | |||
| 1582 | static char panic_null_cerr[] __cpuinitdata = | 1588 | static char panic_null_cerr[] __cpuinitdata = |
| 1583 | "Trying to set NULL cache error exception handler"; | 1589 | "Trying to set NULL cache error exception handler"; |
| 1584 | 1590 | ||
| 1585 | /* Install uncached CPU exception handler */ | 1591 | /* |
| 1592 | * Install uncached CPU exception handler. | ||
| 1593 | * This is suitable only for the cache error exception which is the only | ||
| 1594 | * exception handler that is being run uncached. | ||
| 1595 | */ | ||
| 1586 | void __cpuinit set_uncached_handler(unsigned long offset, void *addr, | 1596 | void __cpuinit set_uncached_handler(unsigned long offset, void *addr, |
| 1587 | unsigned long size) | 1597 | unsigned long size) |
| 1588 | { | 1598 | { |
| @@ -1593,7 +1603,7 @@ void __cpuinit set_uncached_handler(unsigned long offset, void *addr, | |||
| 1593 | unsigned long uncached_ebase = TO_UNCAC(ebase); | 1603 | unsigned long uncached_ebase = TO_UNCAC(ebase); |
| 1594 | #endif | 1604 | #endif |
| 1595 | if (cpu_has_mips_r2) | 1605 | if (cpu_has_mips_r2) |
| 1596 | ebase += (read_c0_ebase() & 0x3ffff000); | 1606 | uncached_ebase += (read_c0_ebase() & 0x3ffff000); |
| 1597 | 1607 | ||
| 1598 | if (!addr) | 1608 | if (!addr) |
| 1599 | panic(panic_null_cerr); | 1609 | panic(panic_null_cerr); |
diff --git a/arch/mips/lib/memcpy-inatomic.S b/arch/mips/lib/memcpy-inatomic.S index 736d0fb56a94..68853a038d3f 100644 --- a/arch/mips/lib/memcpy-inatomic.S +++ b/arch/mips/lib/memcpy-inatomic.S | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | * end of memory on some systems. It's also a seriously bad idea on non | 21 | * end of memory on some systems. It's also a seriously bad idea on non |
| 22 | * dma-coherent systems. | 22 | * dma-coherent systems. |
| 23 | */ | 23 | */ |
| 24 | #if !defined(CONFIG_DMA_COHERENT) || !defined(CONFIG_DMA_IP27) | 24 | #ifdef CONFIG_DMA_NONCOHERENT |
| 25 | #undef CONFIG_CPU_HAS_PREFETCH | 25 | #undef CONFIG_CPU_HAS_PREFETCH |
| 26 | #endif | 26 | #endif |
| 27 | #ifdef CONFIG_MIPS_MALTA | 27 | #ifdef CONFIG_MIPS_MALTA |
diff --git a/arch/mips/lib/memcpy.S b/arch/mips/lib/memcpy.S index c06cccf60bec..56a1f85a1ce8 100644 --- a/arch/mips/lib/memcpy.S +++ b/arch/mips/lib/memcpy.S | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | * end of memory on some systems. It's also a seriously bad idea on non | 21 | * end of memory on some systems. It's also a seriously bad idea on non |
| 22 | * dma-coherent systems. | 22 | * dma-coherent systems. |
| 23 | */ | 23 | */ |
| 24 | #if !defined(CONFIG_DMA_COHERENT) || !defined(CONFIG_DMA_IP27) | 24 | #ifdef CONFIG_DMA_NONCOHERENT |
| 25 | #undef CONFIG_CPU_HAS_PREFETCH | 25 | #undef CONFIG_CPU_HAS_PREFETCH |
| 26 | #endif | 26 | #endif |
| 27 | #ifdef CONFIG_MIPS_MALTA | 27 | #ifdef CONFIG_MIPS_MALTA |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 6e99665ae860..c43f4b26a690 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
| @@ -618,15 +618,35 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size) | |||
| 618 | if (cpu_has_inclusive_pcaches) { | 618 | if (cpu_has_inclusive_pcaches) { |
| 619 | if (size >= scache_size) | 619 | if (size >= scache_size) |
| 620 | r4k_blast_scache(); | 620 | r4k_blast_scache(); |
| 621 | else | 621 | else { |
| 622 | unsigned long lsize = cpu_scache_line_size(); | ||
| 623 | unsigned long almask = ~(lsize - 1); | ||
| 624 | |||
| 625 | /* | ||
| 626 | * There is no clearly documented alignment requirement | ||
| 627 | * for the cache instruction on MIPS processors and | ||
| 628 | * some processors, among them the RM5200 and RM7000 | ||
| 629 | * QED processors will throw an address error for cache | ||
| 630 | * hit ops with insufficient alignment. Solved by | ||
| 631 | * aligning the address to cache line size. | ||
| 632 | */ | ||
| 633 | cache_op(Hit_Writeback_Inv_SD, addr & almask); | ||
| 634 | cache_op(Hit_Writeback_Inv_SD, | ||
| 635 | (addr + size - 1) & almask); | ||
| 622 | blast_inv_scache_range(addr, addr + size); | 636 | blast_inv_scache_range(addr, addr + size); |
| 637 | } | ||
| 623 | return; | 638 | return; |
| 624 | } | 639 | } |
| 625 | 640 | ||
| 626 | if (cpu_has_safe_index_cacheops && size >= dcache_size) { | 641 | if (cpu_has_safe_index_cacheops && size >= dcache_size) { |
| 627 | r4k_blast_dcache(); | 642 | r4k_blast_dcache(); |
| 628 | } else { | 643 | } else { |
| 644 | unsigned long lsize = cpu_dcache_line_size(); | ||
| 645 | unsigned long almask = ~(lsize - 1); | ||
| 646 | |||
| 629 | R4600_HIT_CACHEOP_WAR_IMPL; | 647 | R4600_HIT_CACHEOP_WAR_IMPL; |
| 648 | cache_op(Hit_Writeback_Inv_D, addr & almask); | ||
| 649 | cache_op(Hit_Writeback_Inv_D, (addr + size - 1) & almask); | ||
| 630 | blast_inv_dcache_range(addr, addr + size); | 650 | blast_inv_dcache_range(addr, addr + size); |
| 631 | } | 651 | } |
| 632 | 652 | ||
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index fa636fc6b7b9..55767ad9f00e 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
| @@ -97,7 +97,6 @@ good_area: | |||
| 97 | goto bad_area; | 97 | goto bad_area; |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | survive: | ||
| 101 | /* | 100 | /* |
| 102 | * If for any reason at all we couldn't handle the fault, | 101 | * If for any reason at all we couldn't handle the fault, |
| 103 | * make sure we exit gracefully rather than endlessly redo | 102 | * make sure we exit gracefully rather than endlessly redo |
| @@ -167,21 +166,13 @@ no_context: | |||
| 167 | field, regs->regs[31]); | 166 | field, regs->regs[31]); |
| 168 | die("Oops", regs); | 167 | die("Oops", regs); |
| 169 | 168 | ||
| 170 | /* | ||
| 171 | * We ran out of memory, or some other thing happened to us that made | ||
| 172 | * us unable to handle the page fault gracefully. | ||
| 173 | */ | ||
| 174 | out_of_memory: | 169 | out_of_memory: |
| 175 | up_read(&mm->mmap_sem); | 170 | /* |
| 176 | if (is_global_init(tsk)) { | 171 | * We ran out of memory, call the OOM killer, and return the userspace |
| 177 | yield(); | 172 | * (which will retry the fault, or kill us if we got oom-killed). |
| 178 | down_read(&mm->mmap_sem); | 173 | */ |
| 179 | goto survive; | 174 | pagefault_out_of_memory(); |
| 180 | } | 175 | return; |
| 181 | printk("VM: killing process %s\n", tsk->comm); | ||
| 182 | if (user_mode(regs)) | ||
| 183 | do_group_exit(SIGKILL); | ||
| 184 | goto no_context; | ||
| 185 | 176 | ||
| 186 | do_sigbus: | 177 | do_sigbus: |
| 187 | up_read(&mm->mmap_sem); | 178 | up_read(&mm->mmap_sem); |
diff --git a/arch/mips/pci/pci-rc32434.c b/arch/mips/pci/pci-rc32434.c index 1c2821e2f494..71f7d27b0d4c 100644 --- a/arch/mips/pci/pci-rc32434.c +++ b/arch/mips/pci/pci-rc32434.c | |||
| @@ -205,6 +205,8 @@ static int __init rc32434_pcibridge_init(void) | |||
| 205 | 205 | ||
| 206 | static int __init rc32434_pci_init(void) | 206 | static int __init rc32434_pci_init(void) |
| 207 | { | 207 | { |
| 208 | void __iomem *io_map_base; | ||
| 209 | |||
| 208 | pr_info("PCI: Initializing PCI\n"); | 210 | pr_info("PCI: Initializing PCI\n"); |
| 209 | 211 | ||
| 210 | ioport_resource.start = rc32434_res_pci_io1.start; | 212 | ioport_resource.start = rc32434_res_pci_io1.start; |
| @@ -212,6 +214,15 @@ static int __init rc32434_pci_init(void) | |||
| 212 | 214 | ||
| 213 | rc32434_pcibridge_init(); | 215 | rc32434_pcibridge_init(); |
| 214 | 216 | ||
| 217 | io_map_base = ioremap(rc32434_res_pci_io1.start, | ||
| 218 | rc32434_res_pci_io1.end - rc32434_res_pci_io1.start + 1); | ||
| 219 | |||
| 220 | if (!io_map_base) | ||
| 221 | return -ENOMEM; | ||
| 222 | |||
| 223 | rc32434_controller.io_map_base = | ||
| 224 | (unsigned long)io_map_base - rc32434_res_pci_io1.start; | ||
| 225 | |||
| 215 | register_pci_controller(&rc32434_controller); | 226 | register_pci_controller(&rc32434_controller); |
| 216 | rc32434_sync(); | 227 | rc32434_sync(); |
| 217 | 228 | ||
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c index c1c29181bd46..4a5f05b662ae 100644 --- a/arch/mips/rb532/devices.c +++ b/arch/mips/rb532/devices.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/mtd/partitions.h> | 24 | #include <linux/mtd/partitions.h> |
| 25 | #include <linux/gpio_keys.h> | 25 | #include <linux/gpio_keys.h> |
| 26 | #include <linux/input.h> | 26 | #include <linux/input.h> |
| 27 | #include <linux/serial_8250.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/bootinfo.h> | 29 | #include <asm/bootinfo.h> |
| 29 | 30 | ||
| @@ -39,6 +40,29 @@ | |||
| 39 | #define ETH0_RX_DMA_ADDR (DMA0_BASE_ADDR + 0 * DMA_CHAN_OFFSET) | 40 | #define ETH0_RX_DMA_ADDR (DMA0_BASE_ADDR + 0 * DMA_CHAN_OFFSET) |
| 40 | #define ETH0_TX_DMA_ADDR (DMA0_BASE_ADDR + 1 * DMA_CHAN_OFFSET) | 41 | #define ETH0_TX_DMA_ADDR (DMA0_BASE_ADDR + 1 * DMA_CHAN_OFFSET) |
| 41 | 42 | ||
| 43 | extern unsigned int idt_cpu_freq; | ||
| 44 | |||
| 45 | static struct mpmc_device dev3; | ||
| 46 | |||
| 47 | void set_latch_u5(unsigned char or_mask, unsigned char nand_mask) | ||
| 48 | { | ||
| 49 | unsigned long flags; | ||
| 50 | |||
| 51 | spin_lock_irqsave(&dev3.lock, flags); | ||
| 52 | |||
| 53 | dev3.state = (dev3.state | or_mask) & ~nand_mask; | ||
| 54 | writeb(dev3.state, dev3.base); | ||
| 55 | |||
| 56 | spin_unlock_irqrestore(&dev3.lock, flags); | ||
| 57 | } | ||
| 58 | EXPORT_SYMBOL(set_latch_u5); | ||
| 59 | |||
| 60 | unsigned char get_latch_u5(void) | ||
| 61 | { | ||
| 62 | return dev3.state; | ||
| 63 | } | ||
| 64 | EXPORT_SYMBOL(get_latch_u5); | ||
| 65 | |||
| 42 | static struct resource korina_dev0_res[] = { | 66 | static struct resource korina_dev0_res[] = { |
| 43 | { | 67 | { |
| 44 | .name = "korina_regs", | 68 | .name = "korina_regs", |
| @@ -86,7 +110,7 @@ static struct korina_device korina_dev0_data = { | |||
| 86 | static struct platform_device korina_dev0 = { | 110 | static struct platform_device korina_dev0 = { |
| 87 | .id = -1, | 111 | .id = -1, |
| 88 | .name = "korina", | 112 | .name = "korina", |
| 89 | .dev.platform_data = &korina_dev0_data, | 113 | .dev.driver_data = &korina_dev0_data, |
| 90 | .resource = korina_dev0_res, | 114 | .resource = korina_dev0_res, |
| 91 | .num_resources = ARRAY_SIZE(korina_dev0_res), | 115 | .num_resources = ARRAY_SIZE(korina_dev0_res), |
| 92 | }; | 116 | }; |
| @@ -214,12 +238,32 @@ static struct platform_device rb532_wdt = { | |||
| 214 | .num_resources = ARRAY_SIZE(rb532_wdt_res), | 238 | .num_resources = ARRAY_SIZE(rb532_wdt_res), |
| 215 | }; | 239 | }; |
| 216 | 240 | ||
| 241 | static struct plat_serial8250_port rb532_uart_res[] = { | ||
| 242 | { | ||
| 243 | .membase = (char *)KSEG1ADDR(REGBASE + UART0BASE), | ||
| 244 | .irq = UART0_IRQ, | ||
| 245 | .regshift = 2, | ||
| 246 | .iotype = UPIO_MEM, | ||
| 247 | .flags = UPF_BOOT_AUTOCONF, | ||
| 248 | }, | ||
| 249 | { | ||
| 250 | .flags = 0, | ||
| 251 | } | ||
| 252 | }; | ||
| 253 | |||
| 254 | static struct platform_device rb532_uart = { | ||
| 255 | .name = "serial8250", | ||
| 256 | .id = PLAT8250_DEV_PLATFORM, | ||
| 257 | .dev.platform_data = &rb532_uart_res, | ||
| 258 | }; | ||
| 259 | |||
| 217 | static struct platform_device *rb532_devs[] = { | 260 | static struct platform_device *rb532_devs[] = { |
| 218 | &korina_dev0, | 261 | &korina_dev0, |
| 219 | &nand_slot0, | 262 | &nand_slot0, |
| 220 | &cf_slot0, | 263 | &cf_slot0, |
| 221 | &rb532_led, | 264 | &rb532_led, |
| 222 | &rb532_button, | 265 | &rb532_button, |
| 266 | &rb532_uart, | ||
| 223 | &rb532_wdt | 267 | &rb532_wdt |
| 224 | }; | 268 | }; |
| 225 | 269 | ||
| @@ -291,9 +335,20 @@ static int __init plat_setup_devices(void) | |||
| 291 | nand_slot0_res[0].start = readl(IDT434_REG_BASE + DEV2BASE); | 335 | nand_slot0_res[0].start = readl(IDT434_REG_BASE + DEV2BASE); |
| 292 | nand_slot0_res[0].end = nand_slot0_res[0].start + 0x1000; | 336 | nand_slot0_res[0].end = nand_slot0_res[0].start + 0x1000; |
| 293 | 337 | ||
| 338 | /* Read and map device controller 3 */ | ||
| 339 | dev3.base = ioremap_nocache(readl(IDT434_REG_BASE + DEV3BASE), 1); | ||
| 340 | |||
| 341 | if (!dev3.base) { | ||
| 342 | printk(KERN_ERR "rb532: cannot remap device controller 3\n"); | ||
| 343 | return -ENXIO; | ||
| 344 | } | ||
| 345 | |||
| 294 | /* Initialise the NAND device */ | 346 | /* Initialise the NAND device */ |
| 295 | rb532_nand_setup(); | 347 | rb532_nand_setup(); |
| 296 | 348 | ||
| 349 | /* set the uart clock to the current cpu frequency */ | ||
| 350 | rb532_uart_res[0].uartclk = idt_cpu_freq; | ||
| 351 | |||
| 297 | return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs)); | 352 | return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs)); |
| 298 | } | 353 | } |
| 299 | 354 | ||
diff --git a/arch/mips/rb532/gpio.c b/arch/mips/rb532/gpio.c index 0e84c8ab6a39..37de05d595e7 100644 --- a/arch/mips/rb532/gpio.c +++ b/arch/mips/rb532/gpio.c | |||
| @@ -41,8 +41,6 @@ struct rb532_gpio_chip { | |||
| 41 | void __iomem *regbase; | 41 | void __iomem *regbase; |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | struct mpmc_device dev3; | ||
| 45 | |||
| 46 | static struct resource rb532_gpio_reg0_res[] = { | 44 | static struct resource rb532_gpio_reg0_res[] = { |
| 47 | { | 45 | { |
| 48 | .name = "gpio_reg0", | 46 | .name = "gpio_reg0", |
| @@ -52,61 +50,6 @@ static struct resource rb532_gpio_reg0_res[] = { | |||
| 52 | } | 50 | } |
| 53 | }; | 51 | }; |
| 54 | 52 | ||
| 55 | static struct resource rb532_dev3_ctl_res[] = { | ||
| 56 | { | ||
| 57 | .name = "dev3_ctl", | ||
| 58 | .start = REGBASE + DEV3BASE, | ||
| 59 | .end = REGBASE + DEV3BASE + sizeof(struct dev_reg) - 1, | ||
| 60 | .flags = IORESOURCE_MEM, | ||
| 61 | } | ||
| 62 | }; | ||
| 63 | |||
| 64 | void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned val) | ||
| 65 | { | ||
| 66 | unsigned long flags; | ||
| 67 | unsigned data; | ||
| 68 | unsigned i = 0; | ||
| 69 | |||
| 70 | spin_lock_irqsave(&dev3.lock, flags); | ||
| 71 | |||
| 72 | data = readl(IDT434_REG_BASE + reg_offs); | ||
| 73 | for (i = 0; i != len; ++i) { | ||
| 74 | if (val & (1 << i)) | ||
| 75 | data |= (1 << (i + bit)); | ||
| 76 | else | ||
| 77 | data &= ~(1 << (i + bit)); | ||
| 78 | } | ||
| 79 | writel(data, (IDT434_REG_BASE + reg_offs)); | ||
| 80 | |||
| 81 | spin_unlock_irqrestore(&dev3.lock, flags); | ||
| 82 | } | ||
| 83 | EXPORT_SYMBOL(set_434_reg); | ||
| 84 | |||
| 85 | unsigned get_434_reg(unsigned reg_offs) | ||
| 86 | { | ||
| 87 | return readl(IDT434_REG_BASE + reg_offs); | ||
| 88 | } | ||
| 89 | EXPORT_SYMBOL(get_434_reg); | ||
| 90 | |||
| 91 | void set_latch_u5(unsigned char or_mask, unsigned char nand_mask) | ||
| 92 | { | ||
| 93 | unsigned long flags; | ||
| 94 | |||
| 95 | spin_lock_irqsave(&dev3.lock, flags); | ||
| 96 | |||
| 97 | dev3.state = (dev3.state | or_mask) & ~nand_mask; | ||
| 98 | writel(dev3.state, &dev3.base); | ||
| 99 | |||
| 100 | spin_unlock_irqrestore(&dev3.lock, flags); | ||
| 101 | } | ||
| 102 | EXPORT_SYMBOL(set_latch_u5); | ||
| 103 | |||
| 104 | unsigned char get_latch_u5(void) | ||
| 105 | { | ||
| 106 | return dev3.state; | ||
| 107 | } | ||
| 108 | EXPORT_SYMBOL(get_latch_u5); | ||
| 109 | |||
| 110 | /* rb532_set_bit - sanely set a bit | 53 | /* rb532_set_bit - sanely set a bit |
| 111 | * | 54 | * |
| 112 | * bitval: new value for the bit | 55 | * bitval: new value for the bit |
| @@ -119,13 +62,11 @@ static inline void rb532_set_bit(unsigned bitval, | |||
| 119 | unsigned long flags; | 62 | unsigned long flags; |
| 120 | u32 val; | 63 | u32 val; |
| 121 | 64 | ||
| 122 | bitval = !!bitval; /* map parameter to {0,1} */ | ||
| 123 | |||
| 124 | local_irq_save(flags); | 65 | local_irq_save(flags); |
| 125 | 66 | ||
| 126 | val = readl(ioaddr); | 67 | val = readl(ioaddr); |
| 127 | val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */ | 68 | val &= ~(!bitval << offset); /* unset bit if bitval == 0 */ |
| 128 | val |= ( bitval << offset ); /* set bit if bitval == 1 */ | 69 | val |= (!!bitval << offset); /* set bit if bitval == 1 */ |
| 129 | writel(val, ioaddr); | 70 | writel(val, ioaddr); |
| 130 | 71 | ||
| 131 | local_irq_restore(flags); | 72 | local_irq_restore(flags); |
| @@ -171,8 +112,8 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |||
| 171 | 112 | ||
| 172 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 113 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 173 | 114 | ||
| 174 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) | 115 | /* disable alternate function in case it's set */ |
| 175 | return 1; /* alternate function, GPIOCFG is ignored */ | 116 | rb532_set_bit(0, offset, gpch->regbase + GPIOFUNC); |
| 176 | 117 | ||
| 177 | rb532_set_bit(0, offset, gpch->regbase + GPIOCFG); | 118 | rb532_set_bit(0, offset, gpch->regbase + GPIOCFG); |
| 178 | return 0; | 119 | return 0; |
| @@ -188,8 +129,8 @@ static int rb532_gpio_direction_output(struct gpio_chip *chip, | |||
| 188 | 129 | ||
| 189 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 130 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 190 | 131 | ||
| 191 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) | 132 | /* disable alternate function in case it's set */ |
| 192 | return 1; /* alternate function, GPIOCFG is ignored */ | 133 | rb532_set_bit(0, offset, gpch->regbase + GPIOFUNC); |
| 193 | 134 | ||
| 194 | /* set the initial output value */ | 135 | /* set the initial output value */ |
| 195 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); | 136 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); |
| @@ -233,10 +174,11 @@ EXPORT_SYMBOL(rb532_gpio_set_istat); | |||
| 233 | /* | 174 | /* |
| 234 | * Configure GPIO alternate function | 175 | * Configure GPIO alternate function |
| 235 | */ | 176 | */ |
| 236 | static void rb532_gpio_set_func(int bit, unsigned gpio) | 177 | void rb532_gpio_set_func(unsigned gpio) |
| 237 | { | 178 | { |
| 238 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC); | 179 | rb532_set_bit(1, gpio, rb532_gpio_chip->regbase + GPIOFUNC); |
| 239 | } | 180 | } |
| 181 | EXPORT_SYMBOL(rb532_gpio_set_func); | ||
| 240 | 182 | ||
| 241 | int __init rb532_gpio_init(void) | 183 | int __init rb532_gpio_init(void) |
| 242 | { | 184 | { |
| @@ -253,20 +195,6 @@ int __init rb532_gpio_init(void) | |||
| 253 | /* Register our GPIO chip */ | 195 | /* Register our GPIO chip */ |
| 254 | gpiochip_add(&rb532_gpio_chip->chip); | 196 | gpiochip_add(&rb532_gpio_chip->chip); |
| 255 | 197 | ||
| 256 | r = rb532_dev3_ctl_res; | ||
| 257 | dev3.base = ioremap_nocache(r->start, r->end - r->start); | ||
| 258 | |||
| 259 | if (!dev3.base) { | ||
| 260 | printk(KERN_ERR "rb532: cannot remap device controller 3\n"); | ||
| 261 | return -ENXIO; | ||
| 262 | } | ||
| 263 | |||
| 264 | /* configure CF_GPIO_NUM as CFRDY IRQ source */ | ||
| 265 | rb532_gpio_set_func(0, CF_GPIO_NUM); | ||
| 266 | rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM); | ||
| 267 | rb532_gpio_set_ilevel(1, CF_GPIO_NUM); | ||
| 268 | rb532_gpio_set_istat(0, CF_GPIO_NUM); | ||
| 269 | |||
| 270 | return 0; | 198 | return 0; |
| 271 | } | 199 | } |
| 272 | arch_initcall(rb532_gpio_init); | 200 | arch_initcall(rb532_gpio_init); |
diff --git a/arch/mips/rb532/irq.c b/arch/mips/rb532/irq.c index 549b46d2fcee..53eeb5e7bc5b 100644 --- a/arch/mips/rb532/irq.c +++ b/arch/mips/rb532/irq.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #include <asm/system.h> | 46 | #include <asm/system.h> |
| 47 | 47 | ||
| 48 | #include <asm/mach-rc32434/irq.h> | 48 | #include <asm/mach-rc32434/irq.h> |
| 49 | #include <asm/mach-rc32434/gpio.h> | ||
| 49 | 50 | ||
| 50 | struct intr_group { | 51 | struct intr_group { |
| 51 | u32 mask; /* mask of valid bits in pending/mask registers */ | 52 | u32 mask; /* mask of valid bits in pending/mask registers */ |
| @@ -150,6 +151,9 @@ static void rb532_disable_irq(unsigned int irq_nr) | |||
| 150 | mask |= intr_bit; | 151 | mask |= intr_bit; |
| 151 | WRITE_MASK(addr, mask); | 152 | WRITE_MASK(addr, mask); |
| 152 | 153 | ||
| 154 | if (group == GPIO_MAPPED_IRQ_GROUP) | ||
| 155 | rb532_gpio_set_istat(0, irq_nr - GPIO_MAPPED_IRQ_BASE); | ||
| 156 | |||
| 153 | /* | 157 | /* |
| 154 | * if there are no more interrupts enabled in this | 158 | * if there are no more interrupts enabled in this |
| 155 | * group, disable corresponding IP | 159 | * group, disable corresponding IP |
| @@ -165,12 +169,35 @@ static void rb532_mask_and_ack_irq(unsigned int irq_nr) | |||
| 165 | ack_local_irq(group_to_ip(irq_to_group(irq_nr))); | 169 | ack_local_irq(group_to_ip(irq_to_group(irq_nr))); |
| 166 | } | 170 | } |
| 167 | 171 | ||
| 172 | static int rb532_set_type(unsigned int irq_nr, unsigned type) | ||
| 173 | { | ||
| 174 | int gpio = irq_nr - GPIO_MAPPED_IRQ_BASE; | ||
| 175 | int group = irq_to_group(irq_nr); | ||
| 176 | |||
| 177 | if (group != GPIO_MAPPED_IRQ_GROUP) | ||
| 178 | return (type == IRQ_TYPE_LEVEL_HIGH) ? 0 : -EINVAL; | ||
| 179 | |||
| 180 | switch (type) { | ||
| 181 | case IRQ_TYPE_LEVEL_HIGH: | ||
| 182 | rb532_gpio_set_ilevel(1, gpio); | ||
| 183 | break; | ||
| 184 | case IRQ_TYPE_LEVEL_LOW: | ||
| 185 | rb532_gpio_set_ilevel(0, gpio); | ||
| 186 | break; | ||
| 187 | default: | ||
| 188 | return -EINVAL; | ||
| 189 | } | ||
| 190 | |||
| 191 | return 0; | ||
| 192 | } | ||
| 193 | |||
| 168 | static struct irq_chip rc32434_irq_type = { | 194 | static struct irq_chip rc32434_irq_type = { |
| 169 | .name = "RB532", | 195 | .name = "RB532", |
| 170 | .ack = rb532_disable_irq, | 196 | .ack = rb532_disable_irq, |
| 171 | .mask = rb532_disable_irq, | 197 | .mask = rb532_disable_irq, |
| 172 | .mask_ack = rb532_mask_and_ack_irq, | 198 | .mask_ack = rb532_mask_and_ack_irq, |
| 173 | .unmask = rb532_enable_irq, | 199 | .unmask = rb532_enable_irq, |
| 200 | .set_type = rb532_set_type, | ||
| 174 | }; | 201 | }; |
| 175 | 202 | ||
| 176 | void __init arch_init_irq(void) | 203 | void __init arch_init_irq(void) |
diff --git a/arch/mips/rb532/serial.c b/arch/mips/rb532/serial.c index 3e0d7ec3a579..00ed19f0bdb5 100644 --- a/arch/mips/rb532/serial.c +++ b/arch/mips/rb532/serial.c | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | extern unsigned int idt_cpu_freq; | 36 | extern unsigned int idt_cpu_freq; |
| 37 | 37 | ||
| 38 | static struct uart_port rb532_uart = { | 38 | static struct uart_port rb532_uart = { |
| 39 | .type = PORT_16550A, | 39 | .flags = UPF_BOOT_AUTOCONF, |
| 40 | .line = 0, | 40 | .line = 0, |
| 41 | .irq = UART0_IRQ, | 41 | .irq = UART0_IRQ, |
| 42 | .iotype = UPIO_MEM, | 42 | .iotype = UPIO_MEM, |
diff --git a/arch/mips/txx9/generic/setup_tx4939.c b/arch/mips/txx9/generic/setup_tx4939.c index 6c0049a5bbc1..55440967b3a8 100644 --- a/arch/mips/txx9/generic/setup_tx4939.c +++ b/arch/mips/txx9/generic/setup_tx4939.c | |||
| @@ -435,6 +435,28 @@ void __init tx4939_ata_init(void) | |||
| 435 | platform_device_register(&ata1_dev); | 435 | platform_device_register(&ata1_dev); |
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | void __init tx4939_rtc_init(void) | ||
| 439 | { | ||
| 440 | static struct resource res[] = { | ||
| 441 | { | ||
| 442 | .start = TX4939_RTC_REG & 0xfffffffffULL, | ||
| 443 | .end = (TX4939_RTC_REG & 0xfffffffffULL) + 0x100 - 1, | ||
| 444 | .flags = IORESOURCE_MEM, | ||
| 445 | }, { | ||
| 446 | .start = TXX9_IRQ_BASE + TX4939_IR_RTC, | ||
| 447 | .flags = IORESOURCE_IRQ, | ||
| 448 | }, | ||
| 449 | }; | ||
| 450 | static struct platform_device rtc_dev = { | ||
| 451 | .name = "tx4939rtc", | ||
| 452 | .id = -1, | ||
| 453 | .num_resources = ARRAY_SIZE(res), | ||
| 454 | .resource = res, | ||
| 455 | }; | ||
| 456 | |||
| 457 | platform_device_register(&rtc_dev); | ||
| 458 | } | ||
| 459 | |||
| 438 | static void __init tx4939_stop_unused_modules(void) | 460 | static void __init tx4939_stop_unused_modules(void) |
| 439 | { | 461 | { |
| 440 | __u64 pcfg, rst = 0, ckd = 0; | 462 | __u64 pcfg, rst = 0, ckd = 0; |
diff --git a/arch/mips/txx9/rbtx4939/setup.c b/arch/mips/txx9/rbtx4939/setup.c index 98fbd9391bf8..656603b85b71 100644 --- a/arch/mips/txx9/rbtx4939/setup.c +++ b/arch/mips/txx9/rbtx4939/setup.c | |||
| @@ -336,6 +336,7 @@ static void __init rbtx4939_device_init(void) | |||
| 336 | rbtx4939_led_setup(); | 336 | rbtx4939_led_setup(); |
| 337 | tx4939_wdt_init(); | 337 | tx4939_wdt_init(); |
| 338 | tx4939_ata_init(); | 338 | tx4939_ata_init(); |
| 339 | tx4939_rtc_init(); | ||
| 339 | } | 340 | } |
| 340 | 341 | ||
| 341 | static void __init rbtx4939_setup(void) | 342 | static void __init rbtx4939_setup(void) |
