diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-14 13:00:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-14 13:00:42 -0400 |
commit | 3e862dd5c94cc53ba6494804c7388303e3d25403 (patch) | |
tree | 16cec9fb546f7eb9233a6f7dd7c8be4a300503e3 | |
parent | 2344b5b6851466511663154e517f8b31f70c4bb6 (diff) | |
parent | e588a00fe546695e93077b3f7b7009f0c31d9370 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6:
sh: Add in PCI bus for DMA API debugging.
sh: Pre-allocate a reasonable number of DMA debug entries.
sh: sh7786: modify usb setup timeout judgment bug.
MAINTAINERS: Update sh architecture file patterns.
sh: ap325: use edge control for ov772x camera
sh: Plug in support for ARCH=sh64 using sh SRCARCH.
sh: urquell: Fix up address mapping in board comments.
sh: Add support for DMA API debugging.
sh: Provide cpumask_of_pcibus() to fix NUMA build.
sh: urquell: Add board comment
sh: wire up sys_preadv/sys_pwritev() syscalls.
sh: sh7785lcr: fix PCI address map for 32-bit mode
sh: intc: Added resume from hibernation support to the intc
-rw-r--r-- | MAINTAINERS | 2 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | arch/sh/Kconfig | 18 | ||||
-rw-r--r-- | arch/sh/boards/board-ap325rxa.c | 1 | ||||
-rw-r--r-- | arch/sh/boards/board-urquell.c | 30 | ||||
-rw-r--r-- | arch/sh/drivers/pci/ops-sh7785lcr.c | 5 | ||||
-rw-r--r-- | arch/sh/drivers/pci/pci-sh7780.h | 2 | ||||
-rw-r--r-- | arch/sh/drivers/pci/pci.c | 3 | ||||
-rw-r--r-- | arch/sh/include/asm/dma-mapping.h | 36 | ||||
-rw-r--r-- | arch/sh/include/asm/scatterlist.h | 11 | ||||
-rw-r--r-- | arch/sh/include/asm/topology.h | 7 | ||||
-rw-r--r-- | arch/sh/include/asm/unistd_32.h | 4 | ||||
-rw-r--r-- | arch/sh/include/asm/unistd_64.h | 4 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7786.c | 14 | ||||
-rw-r--r-- | arch/sh/kernel/syscalls_32.S | 2 | ||||
-rw-r--r-- | arch/sh/kernel/syscalls_64.S | 2 | ||||
-rw-r--r-- | arch/sh/mm/consistent.c | 31 | ||||
-rw-r--r-- | drivers/sh/intc.c | 35 |
18 files changed, 179 insertions, 35 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 29d74f47ba86..57969bf67b94 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -5313,7 +5313,9 @@ L: linux-sh@vger.kernel.org | |||
5313 | W: http://www.linux-sh.org | 5313 | W: http://www.linux-sh.org |
5314 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git | 5314 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git |
5315 | S: Supported | 5315 | S: Supported |
5316 | F: Documentation/sh/ | ||
5316 | F: arch/sh/ | 5317 | F: arch/sh/ |
5318 | F: drivers/sh/ | ||
5317 | 5319 | ||
5318 | SUSPEND TO RAM | 5320 | SUSPEND TO RAM |
5319 | P: Len Brown | 5321 | P: Len Brown |
@@ -169,7 +169,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ | |||
169 | -e s/arm.*/arm/ -e s/sa110/arm/ \ | 169 | -e s/arm.*/arm/ -e s/sa110/arm/ \ |
170 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ | 170 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ |
171 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ | 171 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ |
172 | -e s/sh.*/sh/ ) | 172 | -e s/sh[234].*/sh/ ) |
173 | 173 | ||
174 | # Cross compiling and selecting different set of gcc/bin-utils | 174 | # Cross compiling and selecting different set of gcc/bin-utils |
175 | # --------------------------------------------------------------------------- | 175 | # --------------------------------------------------------------------------- |
@@ -210,6 +210,11 @@ ifeq ($(ARCH),sparc64) | |||
210 | SRCARCH := sparc | 210 | SRCARCH := sparc |
211 | endif | 211 | endif |
212 | 212 | ||
213 | # Additional ARCH settings for sh | ||
214 | ifeq ($(ARCH),sh64) | ||
215 | SRCARCH := sh | ||
216 | endif | ||
217 | |||
213 | # Where to locate arch specific headers | 218 | # Where to locate arch specific headers |
214 | hdr-arch := $(SRCARCH) | 219 | hdr-arch := $(SRCARCH) |
215 | 220 | ||
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 5e4babecf934..e7390dd0283d 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -14,6 +14,7 @@ config SUPERH | |||
14 | select HAVE_GENERIC_DMA_COHERENT | 14 | select HAVE_GENERIC_DMA_COHERENT |
15 | select HAVE_IOREMAP_PROT if MMU | 15 | select HAVE_IOREMAP_PROT if MMU |
16 | select HAVE_ARCH_TRACEHOOK | 16 | select HAVE_ARCH_TRACEHOOK |
17 | select HAVE_DMA_API_DEBUG | ||
17 | help | 18 | help |
18 | The SuperH is a RISC processor targeted for use in embedded systems | 19 | The SuperH is a RISC processor targeted for use in embedded systems |
19 | and consumer electronics; it was also used in the Sega Dreamcast | 20 | and consumer electronics; it was also used in the Sega Dreamcast |
@@ -21,7 +22,7 @@ config SUPERH | |||
21 | <http://www.linux-sh.org/>. | 22 | <http://www.linux-sh.org/>. |
22 | 23 | ||
23 | config SUPERH32 | 24 | config SUPERH32 |
24 | def_bool !SUPERH64 | 25 | def_bool ARCH = "sh" |
25 | select HAVE_KPROBES | 26 | select HAVE_KPROBES |
26 | select HAVE_KRETPROBES | 27 | select HAVE_KRETPROBES |
27 | select HAVE_FUNCTION_TRACER | 28 | select HAVE_FUNCTION_TRACER |
@@ -31,7 +32,7 @@ config SUPERH32 | |||
31 | select ARCH_HIBERNATION_POSSIBLE if MMU | 32 | select ARCH_HIBERNATION_POSSIBLE if MMU |
32 | 33 | ||
33 | config SUPERH64 | 34 | config SUPERH64 |
34 | def_bool y if CPU_SH5 | 35 | def_bool ARCH = "sh64" |
35 | 36 | ||
36 | config ARCH_DEFCONFIG | 37 | config ARCH_DEFCONFIG |
37 | string | 38 | string |
@@ -187,6 +188,8 @@ config ARCH_SHMOBILE | |||
187 | bool | 188 | bool |
188 | select ARCH_SUSPEND_POSSIBLE | 189 | select ARCH_SUSPEND_POSSIBLE |
189 | 190 | ||
191 | if SUPERH32 | ||
192 | |||
190 | choice | 193 | choice |
191 | prompt "Processor sub-type selection" | 194 | prompt "Processor sub-type selection" |
192 | 195 | ||
@@ -408,6 +411,15 @@ config CPU_SUBTYPE_SH7366 | |||
408 | select SYS_SUPPORTS_NUMA | 411 | select SYS_SUPPORTS_NUMA |
409 | select SYS_SUPPORTS_CMT | 412 | select SYS_SUPPORTS_CMT |
410 | 413 | ||
414 | endchoice | ||
415 | |||
416 | endif | ||
417 | |||
418 | if SUPERH64 | ||
419 | |||
420 | choice | ||
421 | prompt "Processor sub-type selection" | ||
422 | |||
411 | # SH-5 Processor Support | 423 | # SH-5 Processor Support |
412 | 424 | ||
413 | config CPU_SUBTYPE_SH5_101 | 425 | config CPU_SUBTYPE_SH5_101 |
@@ -420,6 +432,8 @@ config CPU_SUBTYPE_SH5_103 | |||
420 | 432 | ||
421 | endchoice | 433 | endchoice |
422 | 434 | ||
435 | endif | ||
436 | |||
423 | source "arch/sh/mm/Kconfig" | 437 | source "arch/sh/mm/Kconfig" |
424 | 438 | ||
425 | source "arch/sh/Kconfig.cpu" | 439 | source "arch/sh/Kconfig.cpu" |
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 912458f666eb..39e46919df14 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
@@ -349,6 +349,7 @@ static int ov7725_power(struct device *dev, int mode) | |||
349 | static struct ov772x_camera_info ov7725_info = { | 349 | static struct ov772x_camera_info ov7725_info = { |
350 | .buswidth = SOCAM_DATAWIDTH_8, | 350 | .buswidth = SOCAM_DATAWIDTH_8, |
351 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, | 351 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, |
352 | .edgectrl = OV772X_AUTO_EDGECTRL(0xf, 0), | ||
352 | .link = { | 353 | .link = { |
353 | .power = ov7725_power, | 354 | .power = ov7725_power, |
354 | }, | 355 | }, |
diff --git a/arch/sh/boards/board-urquell.c b/arch/sh/boards/board-urquell.c index 8367d1d789c3..beb88c4da2c1 100644 --- a/arch/sh/boards/board-urquell.c +++ b/arch/sh/boards/board-urquell.c | |||
@@ -2,6 +2,8 @@ | |||
2 | * Renesas Technology Corp. SH7786 Urquell Support. | 2 | * Renesas Technology Corp. SH7786 Urquell Support. |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> | 4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> |
5 | * | ||
6 | * Based on board-sh7785lcr.c | ||
5 | * Copyright (C) 2008 Yoshihiro Shimoda | 7 | * Copyright (C) 2008 Yoshihiro Shimoda |
6 | * | 8 | * |
7 | * 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 |
@@ -21,6 +23,32 @@ | |||
21 | #include <asm/heartbeat.h> | 23 | #include <asm/heartbeat.h> |
22 | #include <asm/sizes.h> | 24 | #include <asm/sizes.h> |
23 | 25 | ||
26 | /* | ||
27 | * bit 1234 5678 | ||
28 | *---------------------------- | ||
29 | * SW1 0101 0010 -> Pck 33MHz version | ||
30 | * (1101 0010) Pck 66MHz version | ||
31 | * SW2 0x1x xxxx -> little endian | ||
32 | * 29bit mode | ||
33 | * SW47 0001 1000 -> CS0 : on-board flash | ||
34 | * CS1 : SRAM, registers, LAN, PCMCIA | ||
35 | * 38400 bps for SCIF1 | ||
36 | * | ||
37 | * Address | ||
38 | * 0x00000000 - 0x04000000 (CS0) Nor Flash | ||
39 | * 0x04000000 - 0x04200000 (CS1) SRAM | ||
40 | * 0x05000000 - 0x05800000 (CS1) on board register | ||
41 | * 0x05800000 - 0x06000000 (CS1) LAN91C111 | ||
42 | * 0x06000000 - 0x06400000 (CS1) PCMCIA | ||
43 | * 0x08000000 - 0x10000000 (CS2-CS3) DDR3 | ||
44 | * 0x10000000 - 0x14000000 (CS4) PCIe | ||
45 | * 0x14000000 - 0x14800000 (CS5) Core0 LRAM/URAM | ||
46 | * 0x14800000 - 0x15000000 (CS5) Core1 LRAM/URAM | ||
47 | * 0x18000000 - 0x1C000000 (CS6) ATA/NAND-Flash | ||
48 | * 0x1C000000 - (CS7) SH7786 Control register | ||
49 | */ | ||
50 | |||
51 | /* HeartBeat */ | ||
24 | static struct resource heartbeat_resources[] = { | 52 | static struct resource heartbeat_resources[] = { |
25 | [0] = { | 53 | [0] = { |
26 | .start = BOARDREG(SLEDR), | 54 | .start = BOARDREG(SLEDR), |
@@ -43,6 +71,7 @@ static struct platform_device heartbeat_device = { | |||
43 | .resource = heartbeat_resources, | 71 | .resource = heartbeat_resources, |
44 | }; | 72 | }; |
45 | 73 | ||
74 | /* LAN91C111 */ | ||
46 | static struct smc91x_platdata smc91x_info = { | 75 | static struct smc91x_platdata smc91x_info = { |
47 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | 76 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, |
48 | }; | 77 | }; |
@@ -69,6 +98,7 @@ static struct platform_device smc91x_eth_device = { | |||
69 | }, | 98 | }, |
70 | }; | 99 | }; |
71 | 100 | ||
101 | /* Nor Flash */ | ||
72 | static struct mtd_partition nor_flash_partitions[] = { | 102 | static struct mtd_partition nor_flash_partitions[] = { |
73 | { | 103 | { |
74 | .name = "loader", | 104 | .name = "loader", |
diff --git a/arch/sh/drivers/pci/ops-sh7785lcr.c b/arch/sh/drivers/pci/ops-sh7785lcr.c index e8b7446a7c2b..fb0869f0bef8 100644 --- a/arch/sh/drivers/pci/ops-sh7785lcr.c +++ b/arch/sh/drivers/pci/ops-sh7785lcr.c | |||
@@ -48,8 +48,13 @@ EXPORT_SYMBOL(board_pci_channels); | |||
48 | 48 | ||
49 | static struct sh4_pci_address_map sh7785_pci_map = { | 49 | static struct sh4_pci_address_map sh7785_pci_map = { |
50 | .window0 = { | 50 | .window0 = { |
51 | #if defined(CONFIG_32BIT) | ||
52 | .base = SH7780_32BIT_DDR_BASE_ADDR, | ||
53 | .size = 0x40000000, | ||
54 | #else | ||
51 | .base = SH7780_CS0_BASE_ADDR, | 55 | .base = SH7780_CS0_BASE_ADDR, |
52 | .size = 0x20000000, | 56 | .size = 0x20000000, |
57 | #endif | ||
53 | }, | 58 | }, |
54 | 59 | ||
55 | .flags = SH4_PCIC_NO_RESET, | 60 | .flags = SH4_PCIC_NO_RESET, |
diff --git a/arch/sh/drivers/pci/pci-sh7780.h b/arch/sh/drivers/pci/pci-sh7780.h index 97b2c98f05c4..93adc7119b79 100644 --- a/arch/sh/drivers/pci/pci-sh7780.h +++ b/arch/sh/drivers/pci/pci-sh7780.h | |||
@@ -104,6 +104,8 @@ | |||
104 | #define SH7780_CS5_BASE_ADDR (SH7780_CS4_BASE_ADDR + SH7780_MEM_REGION_SIZE) | 104 | #define SH7780_CS5_BASE_ADDR (SH7780_CS4_BASE_ADDR + SH7780_MEM_REGION_SIZE) |
105 | #define SH7780_CS6_BASE_ADDR (SH7780_CS5_BASE_ADDR + SH7780_MEM_REGION_SIZE) | 105 | #define SH7780_CS6_BASE_ADDR (SH7780_CS5_BASE_ADDR + SH7780_MEM_REGION_SIZE) |
106 | 106 | ||
107 | #define SH7780_32BIT_DDR_BASE_ADDR 0x40000000 | ||
108 | |||
107 | struct sh4_pci_address_map; | 109 | struct sh4_pci_address_map; |
108 | 110 | ||
109 | /* arch/sh/drivers/pci/pci-sh7780.c */ | 111 | /* arch/sh/drivers/pci/pci-sh7780.c */ |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index e36c7b870861..0d6ac7a1db49 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/dma-debug.h> | ||
22 | #include <asm/io.h> | 23 | #include <asm/io.h> |
23 | 24 | ||
24 | static int __init pcibios_init(void) | 25 | static int __init pcibios_init(void) |
@@ -43,6 +44,8 @@ static int __init pcibios_init(void) | |||
43 | 44 | ||
44 | pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq); | 45 | pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq); |
45 | 46 | ||
47 | dma_debug_add_bus(&pci_bus_type); | ||
48 | |||
46 | return 0; | 49 | return 0; |
47 | } | 50 | } |
48 | subsys_initcall(pcibios_init); | 51 | subsys_initcall(pcibios_init); |
diff --git a/arch/sh/include/asm/dma-mapping.h b/arch/sh/include/asm/dma-mapping.h index 627315ecdb52..ea9d4f41c9d2 100644 --- a/arch/sh/include/asm/dma-mapping.h +++ b/arch/sh/include/asm/dma-mapping.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
5 | #include <linux/scatterlist.h> | 5 | #include <linux/scatterlist.h> |
6 | #include <linux/dma-debug.h> | ||
6 | #include <asm/cacheflush.h> | 7 | #include <asm/cacheflush.h> |
7 | #include <asm/io.h> | 8 | #include <asm/io.h> |
8 | #include <asm-generic/dma-coherent.h> | 9 | #include <asm-generic/dma-coherent.h> |
@@ -38,16 +39,26 @@ static inline dma_addr_t dma_map_single(struct device *dev, | |||
38 | void *ptr, size_t size, | 39 | void *ptr, size_t size, |
39 | enum dma_data_direction dir) | 40 | enum dma_data_direction dir) |
40 | { | 41 | { |
42 | dma_addr_t addr = virt_to_phys(ptr); | ||
43 | |||
41 | #if defined(CONFIG_PCI) && !defined(CONFIG_SH_PCIDMA_NONCOHERENT) | 44 | #if defined(CONFIG_PCI) && !defined(CONFIG_SH_PCIDMA_NONCOHERENT) |
42 | if (dev->bus == &pci_bus_type) | 45 | if (dev->bus == &pci_bus_type) |
43 | return virt_to_phys(ptr); | 46 | return addr; |
44 | #endif | 47 | #endif |
45 | dma_cache_sync(dev, ptr, size, dir); | 48 | dma_cache_sync(dev, ptr, size, dir); |
46 | 49 | ||
47 | return virt_to_phys(ptr); | 50 | debug_dma_map_page(dev, virt_to_page(ptr), |
51 | (unsigned long)ptr & ~PAGE_MASK, size, | ||
52 | dir, addr, true); | ||
53 | |||
54 | return addr; | ||
48 | } | 55 | } |
49 | 56 | ||
50 | #define dma_unmap_single(dev, addr, size, dir) do { } while (0) | 57 | static inline void dma_unmap_single(struct device *dev, dma_addr_t addr, |
58 | size_t size, enum dma_data_direction dir) | ||
59 | { | ||
60 | debug_dma_unmap_page(dev, addr, size, dir, true); | ||
61 | } | ||
51 | 62 | ||
52 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | 63 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, |
53 | int nents, enum dma_data_direction dir) | 64 | int nents, enum dma_data_direction dir) |
@@ -59,12 +70,19 @@ static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | |||
59 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); | 70 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); |
60 | #endif | 71 | #endif |
61 | sg[i].dma_address = sg_phys(&sg[i]); | 72 | sg[i].dma_address = sg_phys(&sg[i]); |
73 | sg[i].dma_length = sg[i].length; | ||
62 | } | 74 | } |
63 | 75 | ||
76 | debug_dma_map_sg(dev, sg, nents, i, dir); | ||
77 | |||
64 | return nents; | 78 | return nents; |
65 | } | 79 | } |
66 | 80 | ||
67 | #define dma_unmap_sg(dev, sg, nents, dir) do { } while (0) | 81 | static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, |
82 | int nents, enum dma_data_direction dir) | ||
83 | { | ||
84 | debug_dma_unmap_sg(dev, sg, nents, dir); | ||
85 | } | ||
68 | 86 | ||
69 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | 87 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, |
70 | unsigned long offset, size_t size, | 88 | unsigned long offset, size_t size, |
@@ -111,6 +129,7 @@ static inline void dma_sync_sg(struct device *dev, struct scatterlist *sg, | |||
111 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); | 129 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); |
112 | #endif | 130 | #endif |
113 | sg[i].dma_address = sg_phys(&sg[i]); | 131 | sg[i].dma_address = sg_phys(&sg[i]); |
132 | sg[i].dma_length = sg[i].length; | ||
114 | } | 133 | } |
115 | } | 134 | } |
116 | 135 | ||
@@ -119,6 +138,7 @@ static inline void dma_sync_single_for_cpu(struct device *dev, | |||
119 | enum dma_data_direction dir) | 138 | enum dma_data_direction dir) |
120 | { | 139 | { |
121 | dma_sync_single(dev, dma_handle, size, dir); | 140 | dma_sync_single(dev, dma_handle, size, dir); |
141 | debug_dma_sync_single_for_cpu(dev, dma_handle, size, dir); | ||
122 | } | 142 | } |
123 | 143 | ||
124 | static inline void dma_sync_single_for_device(struct device *dev, | 144 | static inline void dma_sync_single_for_device(struct device *dev, |
@@ -127,6 +147,7 @@ static inline void dma_sync_single_for_device(struct device *dev, | |||
127 | enum dma_data_direction dir) | 147 | enum dma_data_direction dir) |
128 | { | 148 | { |
129 | dma_sync_single(dev, dma_handle, size, dir); | 149 | dma_sync_single(dev, dma_handle, size, dir); |
150 | debug_dma_sync_single_for_device(dev, dma_handle, size, dir); | ||
130 | } | 151 | } |
131 | 152 | ||
132 | static inline void dma_sync_single_range_for_cpu(struct device *dev, | 153 | static inline void dma_sync_single_range_for_cpu(struct device *dev, |
@@ -136,6 +157,8 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, | |||
136 | enum dma_data_direction direction) | 157 | enum dma_data_direction direction) |
137 | { | 158 | { |
138 | dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction); | 159 | dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction); |
160 | debug_dma_sync_single_range_for_cpu(dev, dma_handle, | ||
161 | offset, size, direction); | ||
139 | } | 162 | } |
140 | 163 | ||
141 | static inline void dma_sync_single_range_for_device(struct device *dev, | 164 | static inline void dma_sync_single_range_for_device(struct device *dev, |
@@ -145,6 +168,8 @@ static inline void dma_sync_single_range_for_device(struct device *dev, | |||
145 | enum dma_data_direction direction) | 168 | enum dma_data_direction direction) |
146 | { | 169 | { |
147 | dma_sync_single_for_device(dev, dma_handle+offset, size, direction); | 170 | dma_sync_single_for_device(dev, dma_handle+offset, size, direction); |
171 | debug_dma_sync_single_range_for_device(dev, dma_handle, | ||
172 | offset, size, direction); | ||
148 | } | 173 | } |
149 | 174 | ||
150 | 175 | ||
@@ -153,6 +178,7 @@ static inline void dma_sync_sg_for_cpu(struct device *dev, | |||
153 | enum dma_data_direction dir) | 178 | enum dma_data_direction dir) |
154 | { | 179 | { |
155 | dma_sync_sg(dev, sg, nelems, dir); | 180 | dma_sync_sg(dev, sg, nelems, dir); |
181 | debug_dma_sync_sg_for_cpu(dev, sg, nelems, dir); | ||
156 | } | 182 | } |
157 | 183 | ||
158 | static inline void dma_sync_sg_for_device(struct device *dev, | 184 | static inline void dma_sync_sg_for_device(struct device *dev, |
@@ -160,9 +186,9 @@ static inline void dma_sync_sg_for_device(struct device *dev, | |||
160 | enum dma_data_direction dir) | 186 | enum dma_data_direction dir) |
161 | { | 187 | { |
162 | dma_sync_sg(dev, sg, nelems, dir); | 188 | dma_sync_sg(dev, sg, nelems, dir); |
189 | debug_dma_sync_sg_for_device(dev, sg, nelems, dir); | ||
163 | } | 190 | } |
164 | 191 | ||
165 | |||
166 | static inline int dma_get_cache_alignment(void) | 192 | static inline int dma_get_cache_alignment(void) |
167 | { | 193 | { |
168 | /* | 194 | /* |
diff --git a/arch/sh/include/asm/scatterlist.h b/arch/sh/include/asm/scatterlist.h index 2084d0373693..c693d268a413 100644 --- a/arch/sh/include/asm/scatterlist.h +++ b/arch/sh/include/asm/scatterlist.h | |||
@@ -5,12 +5,13 @@ | |||
5 | 5 | ||
6 | struct scatterlist { | 6 | struct scatterlist { |
7 | #ifdef CONFIG_DEBUG_SG | 7 | #ifdef CONFIG_DEBUG_SG |
8 | unsigned long sg_magic; | 8 | unsigned long sg_magic; |
9 | #endif | 9 | #endif |
10 | unsigned long page_link; | 10 | unsigned long page_link; |
11 | unsigned int offset;/* for highmem, page offset */ | 11 | unsigned int offset; /* for highmem, page offset */ |
12 | dma_addr_t dma_address; | 12 | unsigned int length; |
13 | unsigned int length; | 13 | dma_addr_t dma_address; |
14 | unsigned int dma_length; | ||
14 | }; | 15 | }; |
15 | 16 | ||
16 | #define ISA_DMA_THRESHOLD PHYS_ADDR_MASK | 17 | #define ISA_DMA_THRESHOLD PHYS_ADDR_MASK |
diff --git a/arch/sh/include/asm/topology.h b/arch/sh/include/asm/topology.h index a3f239545897..8489a0905a87 100644 --- a/arch/sh/include/asm/topology.h +++ b/arch/sh/include/asm/topology.h | |||
@@ -37,8 +37,11 @@ | |||
37 | #define pcibus_to_node(bus) ((void)(bus), -1) | 37 | #define pcibus_to_node(bus) ((void)(bus), -1) |
38 | #define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \ | 38 | #define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \ |
39 | CPU_MASK_ALL : \ | 39 | CPU_MASK_ALL : \ |
40 | node_to_cpumask(pcibus_to_node(bus)) \ | 40 | node_to_cpumask(pcibus_to_node(bus))) |
41 | ) | 41 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ |
42 | CPU_MASK_ALL_PTR : \ | ||
43 | cpumask_of_node(pcibus_to_node(bus))) | ||
44 | |||
42 | #endif | 45 | #endif |
43 | 46 | ||
44 | #include <asm-generic/topology.h> | 47 | #include <asm-generic/topology.h> |
diff --git a/arch/sh/include/asm/unistd_32.h b/arch/sh/include/asm/unistd_32.h index d52c000cf924..2efb819e2db3 100644 --- a/arch/sh/include/asm/unistd_32.h +++ b/arch/sh/include/asm/unistd_32.h | |||
@@ -341,8 +341,10 @@ | |||
341 | #define __NR_dup3 330 | 341 | #define __NR_dup3 330 |
342 | #define __NR_pipe2 331 | 342 | #define __NR_pipe2 331 |
343 | #define __NR_inotify_init1 332 | 343 | #define __NR_inotify_init1 332 |
344 | #define __NR_preadv 333 | ||
345 | #define __NR_pwritev 334 | ||
344 | 346 | ||
345 | #define NR_syscalls 333 | 347 | #define NR_syscalls 335 |
346 | 348 | ||
347 | #ifdef __KERNEL__ | 349 | #ifdef __KERNEL__ |
348 | 350 | ||
diff --git a/arch/sh/include/asm/unistd_64.h b/arch/sh/include/asm/unistd_64.h index 7c54e91753c1..6eb9d2934c0f 100644 --- a/arch/sh/include/asm/unistd_64.h +++ b/arch/sh/include/asm/unistd_64.h | |||
@@ -381,10 +381,12 @@ | |||
381 | #define __NR_dup3 358 | 381 | #define __NR_dup3 358 |
382 | #define __NR_pipe2 359 | 382 | #define __NR_pipe2 359 |
383 | #define __NR_inotify_init1 360 | 383 | #define __NR_inotify_init1 360 |
384 | #define __NR_preadv 361 | ||
385 | #define __NR_pwritev 362 | ||
384 | 386 | ||
385 | #ifdef __KERNEL__ | 387 | #ifdef __KERNEL__ |
386 | 388 | ||
387 | #define NR_syscalls 361 | 389 | #define NR_syscalls 363 |
388 | 390 | ||
389 | #define __ARCH_WANT_IPC_PARSE_VERSION | 391 | #define __ARCH_WANT_IPC_PARSE_VERSION |
390 | #define __ARCH_WANT_OLD_READDIR | 392 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 5a47e1cf442e..90e8cfff55fd 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
@@ -143,14 +143,14 @@ static void __init sh7786_usb_setup(void) | |||
143 | * Set the PHY and PLL enable bit | 143 | * Set the PHY and PLL enable bit |
144 | */ | 144 | */ |
145 | __raw_writel(PHY_ENB | PLL_ENB, USBPCTL1); | 145 | __raw_writel(PHY_ENB | PLL_ENB, USBPCTL1); |
146 | while (i-- && | 146 | while (i--) { |
147 | ((__raw_readl(USBST) & ACT_PLL_STATUS) != ACT_PLL_STATUS)) | 147 | if (ACT_PLL_STATUS == (__raw_readl(USBST) & ACT_PLL_STATUS)) { |
148 | /* Set the PHY RST bit */ | ||
149 | __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1); | ||
150 | printk(KERN_INFO "sh7786 usb setup done\n"); | ||
151 | break; | ||
152 | } | ||
148 | cpu_relax(); | 153 | cpu_relax(); |
149 | |||
150 | if (i) { | ||
151 | /* Set the PHY RST bit */ | ||
152 | __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1); | ||
153 | printk(KERN_INFO "sh7786 usb setup done\n"); | ||
154 | } | 154 | } |
155 | } | 155 | } |
156 | 156 | ||
diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index e67c1733e1b9..05202edd8e21 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S | |||
@@ -349,3 +349,5 @@ ENTRY(sys_call_table) | |||
349 | .long sys_dup3 /* 330 */ | 349 | .long sys_dup3 /* 330 */ |
350 | .long sys_pipe2 | 350 | .long sys_pipe2 |
351 | .long sys_inotify_init1 | 351 | .long sys_inotify_init1 |
352 | .long sys_preadv | ||
353 | .long sys_writev | ||
diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index 557cb91f5caf..a083609f9284 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S | |||
@@ -387,3 +387,5 @@ sys_call_table: | |||
387 | .long sys_dup3 | 387 | .long sys_dup3 |
388 | .long sys_pipe2 | 388 | .long sys_pipe2 |
389 | .long sys_inotify_init1 /* 360 */ | 389 | .long sys_inotify_init1 /* 360 */ |
390 | .long sys_preadv | ||
391 | .long sys_pwritev | ||
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index edcd5fbf9651..e098ec158ddb 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
@@ -10,11 +10,22 @@ | |||
10 | * for more details. | 10 | * for more details. |
11 | */ | 11 | */ |
12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
13 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
14 | #include <linux/dma-mapping.h> | 15 | #include <linux/dma-mapping.h> |
16 | #include <linux/dma-debug.h> | ||
17 | #include <linux/io.h> | ||
15 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
16 | #include <asm/addrspace.h> | 19 | #include <asm/addrspace.h> |
17 | #include <asm/io.h> | 20 | |
21 | #define PREALLOC_DMA_DEBUG_ENTRIES 4096 | ||
22 | |||
23 | static int __init dma_init(void) | ||
24 | { | ||
25 | dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); | ||
26 | return 0; | ||
27 | } | ||
28 | fs_initcall(dma_init); | ||
18 | 29 | ||
19 | void *dma_alloc_coherent(struct device *dev, size_t size, | 30 | void *dma_alloc_coherent(struct device *dev, size_t size, |
20 | dma_addr_t *dma_handle, gfp_t gfp) | 31 | dma_addr_t *dma_handle, gfp_t gfp) |
@@ -45,6 +56,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
45 | split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); | 56 | split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); |
46 | 57 | ||
47 | *dma_handle = virt_to_phys(ret); | 58 | *dma_handle = virt_to_phys(ret); |
59 | |||
60 | debug_dma_alloc_coherent(dev, size, *dma_handle, ret_nocache); | ||
61 | |||
48 | return ret_nocache; | 62 | return ret_nocache; |
49 | } | 63 | } |
50 | EXPORT_SYMBOL(dma_alloc_coherent); | 64 | EXPORT_SYMBOL(dma_alloc_coherent); |
@@ -56,12 +70,15 @@ void dma_free_coherent(struct device *dev, size_t size, | |||
56 | unsigned long pfn = dma_handle >> PAGE_SHIFT; | 70 | unsigned long pfn = dma_handle >> PAGE_SHIFT; |
57 | int k; | 71 | int k; |
58 | 72 | ||
59 | if (!dma_release_from_coherent(dev, order, vaddr)) { | 73 | WARN_ON(irqs_disabled()); /* for portability */ |
60 | WARN_ON(irqs_disabled()); /* for portability */ | 74 | |
61 | for (k = 0; k < (1 << order); k++) | 75 | if (dma_release_from_coherent(dev, order, vaddr)) |
62 | __free_pages(pfn_to_page(pfn + k), 0); | 76 | return; |
63 | iounmap(vaddr); | 77 | |
64 | } | 78 | debug_dma_free_coherent(dev, size, vaddr, dma_handle); |
79 | for (k = 0; k < (1 << order); k++) | ||
80 | __free_pages(pfn_to_page(pfn + k), 0); | ||
81 | iounmap(vaddr); | ||
65 | } | 82 | } |
66 | EXPORT_SYMBOL(dma_free_coherent); | 83 | EXPORT_SYMBOL(dma_free_coherent); |
67 | 84 | ||
diff --git a/drivers/sh/intc.c b/drivers/sh/intc.c index 7fb9b5c4669a..12d13d99b6f0 100644 --- a/drivers/sh/intc.c +++ b/drivers/sh/intc.c | |||
@@ -44,6 +44,7 @@ struct intc_handle_int { | |||
44 | struct intc_desc_int { | 44 | struct intc_desc_int { |
45 | struct list_head list; | 45 | struct list_head list; |
46 | struct sys_device sysdev; | 46 | struct sys_device sysdev; |
47 | pm_message_t state; | ||
47 | unsigned long *reg; | 48 | unsigned long *reg; |
48 | #ifdef CONFIG_SMP | 49 | #ifdef CONFIG_SMP |
49 | unsigned long *smp; | 50 | unsigned long *smp; |
@@ -786,18 +787,44 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state) | |||
786 | /* get intc controller associated with this sysdev */ | 787 | /* get intc controller associated with this sysdev */ |
787 | d = container_of(dev, struct intc_desc_int, sysdev); | 788 | d = container_of(dev, struct intc_desc_int, sysdev); |
788 | 789 | ||
789 | /* enable wakeup irqs belonging to this intc controller */ | 790 | switch (state.event) { |
790 | for_each_irq_desc(irq, desc) { | 791 | case PM_EVENT_ON: |
791 | if ((desc->status & IRQ_WAKEUP) && (desc->chip == &d->chip)) | 792 | if (d->state.event != PM_EVENT_FREEZE) |
792 | intc_enable(irq); | 793 | break; |
794 | for_each_irq_desc(irq, desc) { | ||
795 | if (desc->chip != &d->chip) | ||
796 | continue; | ||
797 | if (desc->status & IRQ_DISABLED) | ||
798 | intc_disable(irq); | ||
799 | else | ||
800 | intc_enable(irq); | ||
801 | } | ||
802 | break; | ||
803 | case PM_EVENT_FREEZE: | ||
804 | /* nothing has to be done */ | ||
805 | break; | ||
806 | case PM_EVENT_SUSPEND: | ||
807 | /* enable wakeup irqs belonging to this intc controller */ | ||
808 | for_each_irq_desc(irq, desc) { | ||
809 | if ((desc->status & IRQ_WAKEUP) && (desc->chip == &d->chip)) | ||
810 | intc_enable(irq); | ||
811 | } | ||
812 | break; | ||
793 | } | 813 | } |
814 | d->state = state; | ||
794 | 815 | ||
795 | return 0; | 816 | return 0; |
796 | } | 817 | } |
797 | 818 | ||
819 | static int intc_resume(struct sys_device *dev) | ||
820 | { | ||
821 | return intc_suspend(dev, PMSG_ON); | ||
822 | } | ||
823 | |||
798 | static struct sysdev_class intc_sysdev_class = { | 824 | static struct sysdev_class intc_sysdev_class = { |
799 | .name = "intc", | 825 | .name = "intc", |
800 | .suspend = intc_suspend, | 826 | .suspend = intc_suspend, |
827 | .resume = intc_resume, | ||
801 | }; | 828 | }; |
802 | 829 | ||
803 | /* register this intc as sysdev to allow suspend/resume */ | 830 | /* register this intc as sysdev to allow suspend/resume */ |