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 */ |
