diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/include/asm/mman.h | 3 | ||||
-rw-r--r-- | arch/arm/kernel/calls.S | 2 | ||||
-rw-r--r-- | arch/arm/kernel/entry-common.S | 4 | ||||
-rw-r--r-- | arch/arm/kernel/sys_arm.c | 55 | ||||
-rw-r--r-- | arch/arm/mach-msm/Kconfig | 30 | ||||
-rw-r--r-- | arch/arm/mach-msm/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-dream.c | 93 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-dream.h | 5 | ||||
-rw-r--r-- | arch/arm/mach-msm/include/mach/debug-macro.S | 24 | ||||
-rw-r--r-- | arch/arm/mach-msm/include/mach/mmc.h | 26 | ||||
-rw-r--r-- | arch/arm/mach-msm/include/mach/msm_iomap.h | 12 | ||||
-rw-r--r-- | arch/arm/mach-msm/include/mach/uncompress.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-msm/io.c | 3 | ||||
-rw-r--r-- | arch/arm/mm/mmap.c | 3 | ||||
-rw-r--r-- | arch/arm/plat-mxc/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/plat-mxc/ehci.c | 92 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/mxc_ehci.h | 37 |
17 files changed, 333 insertions, 65 deletions
diff --git a/arch/arm/include/asm/mman.h b/arch/arm/include/asm/mman.h index 8eebf89f5ab1..41f99c573b93 100644 --- a/arch/arm/include/asm/mman.h +++ b/arch/arm/include/asm/mman.h | |||
@@ -1 +1,4 @@ | |||
1 | #include <asm-generic/mman.h> | 1 | #include <asm-generic/mman.h> |
2 | |||
3 | #define arch_mmap_check(addr, len, flags) \ | ||
4 | (((flags) & MAP_FIXED && (addr) < FIRST_USER_ADDRESS) ? -EINVAL : 0) | ||
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index f58c1156e779..9314a2d681f1 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -172,7 +172,7 @@ | |||
172 | /* 160 */ CALL(sys_sched_get_priority_min) | 172 | /* 160 */ CALL(sys_sched_get_priority_min) |
173 | CALL(sys_sched_rr_get_interval) | 173 | CALL(sys_sched_rr_get_interval) |
174 | CALL(sys_nanosleep) | 174 | CALL(sys_nanosleep) |
175 | CALL(sys_arm_mremap) | 175 | CALL(sys_mremap) |
176 | CALL(sys_setresuid16) | 176 | CALL(sys_setresuid16) |
177 | /* 165 */ CALL(sys_getresuid16) | 177 | /* 165 */ CALL(sys_getresuid16) |
178 | CALL(sys_ni_syscall) /* vm86 */ | 178 | CALL(sys_ni_syscall) /* vm86 */ |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index f0fe95b7085d..2c1db77d7848 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -416,12 +416,12 @@ sys_mmap2: | |||
416 | tst r5, #PGOFF_MASK | 416 | tst r5, #PGOFF_MASK |
417 | moveq r5, r5, lsr #PAGE_SHIFT - 12 | 417 | moveq r5, r5, lsr #PAGE_SHIFT - 12 |
418 | streq r5, [sp, #4] | 418 | streq r5, [sp, #4] |
419 | beq do_mmap2 | 419 | beq sys_mmap_pgoff |
420 | mov r0, #-EINVAL | 420 | mov r0, #-EINVAL |
421 | mov pc, lr | 421 | mov pc, lr |
422 | #else | 422 | #else |
423 | str r5, [sp, #4] | 423 | str r5, [sp, #4] |
424 | b do_mmap2 | 424 | b sys_mmap_pgoff |
425 | #endif | 425 | #endif |
426 | ENDPROC(sys_mmap2) | 426 | ENDPROC(sys_mmap2) |
427 | 427 | ||
diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index 78ecaac65206..ae4027bd01bd 100644 --- a/arch/arm/kernel/sys_arm.c +++ b/arch/arm/kernel/sys_arm.c | |||
@@ -28,41 +28,6 @@ | |||
28 | #include <linux/ipc.h> | 28 | #include <linux/ipc.h> |
29 | #include <linux/uaccess.h> | 29 | #include <linux/uaccess.h> |
30 | 30 | ||
31 | extern unsigned long do_mremap(unsigned long addr, unsigned long old_len, | ||
32 | unsigned long new_len, unsigned long flags, | ||
33 | unsigned long new_addr); | ||
34 | |||
35 | /* common code for old and new mmaps */ | ||
36 | inline long do_mmap2( | ||
37 | unsigned long addr, unsigned long len, | ||
38 | unsigned long prot, unsigned long flags, | ||
39 | unsigned long fd, unsigned long pgoff) | ||
40 | { | ||
41 | int error = -EINVAL; | ||
42 | struct file * file = NULL; | ||
43 | |||
44 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | ||
45 | |||
46 | if (flags & MAP_FIXED && addr < FIRST_USER_ADDRESS) | ||
47 | goto out; | ||
48 | |||
49 | error = -EBADF; | ||
50 | if (!(flags & MAP_ANONYMOUS)) { | ||
51 | file = fget(fd); | ||
52 | if (!file) | ||
53 | goto out; | ||
54 | } | ||
55 | |||
56 | down_write(¤t->mm->mmap_sem); | ||
57 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | ||
58 | up_write(¤t->mm->mmap_sem); | ||
59 | |||
60 | if (file) | ||
61 | fput(file); | ||
62 | out: | ||
63 | return error; | ||
64 | } | ||
65 | |||
66 | struct mmap_arg_struct { | 31 | struct mmap_arg_struct { |
67 | unsigned long addr; | 32 | unsigned long addr; |
68 | unsigned long len; | 33 | unsigned long len; |
@@ -84,29 +49,11 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg) | |||
84 | if (a.offset & ~PAGE_MASK) | 49 | if (a.offset & ~PAGE_MASK) |
85 | goto out; | 50 | goto out; |
86 | 51 | ||
87 | error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); | 52 | error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); |
88 | out: | 53 | out: |
89 | return error; | 54 | return error; |
90 | } | 55 | } |
91 | 56 | ||
92 | asmlinkage unsigned long | ||
93 | sys_arm_mremap(unsigned long addr, unsigned long old_len, | ||
94 | unsigned long new_len, unsigned long flags, | ||
95 | unsigned long new_addr) | ||
96 | { | ||
97 | unsigned long ret = -EINVAL; | ||
98 | |||
99 | if (flags & MREMAP_FIXED && new_addr < FIRST_USER_ADDRESS) | ||
100 | goto out; | ||
101 | |||
102 | down_write(¤t->mm->mmap_sem); | ||
103 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | ||
104 | up_write(¤t->mm->mmap_sem); | ||
105 | |||
106 | out: | ||
107 | return ret; | ||
108 | } | ||
109 | |||
110 | /* | 57 | /* |
111 | * Perform the select(nd, in, out, ex, tv) and mmap() system | 58 | * Perform the select(nd, in, out, ex, tv) and mmap() system |
112 | * calls. | 59 | * calls. |
diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index d140abca690a..f780086befd7 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig | |||
@@ -3,6 +3,30 @@ if ARCH_MSM | |||
3 | comment "MSM Board Type" | 3 | comment "MSM Board Type" |
4 | depends on ARCH_MSM | 4 | depends on ARCH_MSM |
5 | 5 | ||
6 | config MSM_DEBUG_UART | ||
7 | int | ||
8 | default 1 if MSM_DEBUG_UART1 | ||
9 | default 2 if MSM_DEBUG_UART2 | ||
10 | default 3 if MSM_DEBUG_UART3 | ||
11 | |||
12 | choice | ||
13 | prompt "Debug UART" | ||
14 | |||
15 | default MSM_DEBUG_UART_NONE | ||
16 | |||
17 | config MSM_DEBUG_UART_NONE | ||
18 | bool "None" | ||
19 | |||
20 | config MSM_DEBUG_UART1 | ||
21 | bool "UART1" | ||
22 | |||
23 | config MSM_DEBUG_UART2 | ||
24 | bool "UART2" | ||
25 | |||
26 | config MSM_DEBUG_UART3 | ||
27 | bool "UART3" | ||
28 | endchoice | ||
29 | |||
6 | config MACH_HALIBUT | 30 | config MACH_HALIBUT |
7 | depends on ARCH_MSM | 31 | depends on ARCH_MSM |
8 | default y | 32 | default y |
@@ -10,4 +34,10 @@ config MACH_HALIBUT | |||
10 | help | 34 | help |
11 | Support for the Qualcomm SURF7201A eval board. | 35 | Support for the Qualcomm SURF7201A eval board. |
12 | 36 | ||
37 | config MACH_TROUT | ||
38 | default y | ||
39 | bool "HTC Dream (aka trout)" | ||
40 | help | ||
41 | Support for the HTC Dream, T-Mobile G1, Android ADP1 devices. | ||
42 | |||
13 | endif | 43 | endif |
diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index 1aa47001aa3b..91e6f5c95dc1 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile | |||
@@ -6,3 +6,4 @@ obj-y += clock.o clock-7x01a.o | |||
6 | 6 | ||
7 | obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o | 7 | obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o |
8 | 8 | ||
9 | obj-$(CONFIG_MACH_TROUT) += board-dream.o | ||
diff --git a/arch/arm/mach-msm/board-dream.c b/arch/arm/mach-msm/board-dream.c new file mode 100644 index 000000000000..21afa8513168 --- /dev/null +++ b/arch/arm/mach-msm/board-dream.c | |||
@@ -0,0 +1,93 @@ | |||
1 | /* linux/arch/arm/mach-msm/board-dream.c | ||
2 | * | ||
3 | * Copyright (C) 2009 Google, Inc. | ||
4 | * Author: Brian Swetland <swetland@google.com> | ||
5 | * | ||
6 | * This software is licensed under the terms of the GNU General Public | ||
7 | * License version 2, as published by the Free Software Foundation, and | ||
8 | * may be copied, distributed, and modified under those terms. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | */ | ||
16 | |||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/platform_device.h> | ||
20 | |||
21 | #include <asm/mach-types.h> | ||
22 | #include <asm/mach/arch.h> | ||
23 | #include <asm/mach/map.h> | ||
24 | #include <asm/setup.h> | ||
25 | |||
26 | #include <mach/board.h> | ||
27 | #include <mach/hardware.h> | ||
28 | #include <mach/msm_iomap.h> | ||
29 | |||
30 | #include "devices.h" | ||
31 | #include "board-dream.h" | ||
32 | |||
33 | static struct platform_device *devices[] __initdata = { | ||
34 | &msm_device_uart3, | ||
35 | &msm_device_smd, | ||
36 | &msm_device_nand, | ||
37 | &msm_device_hsusb, | ||
38 | &msm_device_i2c, | ||
39 | }; | ||
40 | |||
41 | extern struct sys_timer msm_timer; | ||
42 | |||
43 | static void __init trout_init_irq(void) | ||
44 | { | ||
45 | msm_init_irq(); | ||
46 | } | ||
47 | |||
48 | static void __init trout_fixup(struct machine_desc *desc, struct tag *tags, | ||
49 | char **cmdline, struct meminfo *mi) | ||
50 | { | ||
51 | mi->nr_banks = 1; | ||
52 | mi->bank[0].start = PHYS_OFFSET; | ||
53 | mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET); | ||
54 | mi->bank[0].size = (101*1024*1024); | ||
55 | } | ||
56 | |||
57 | static void __init trout_init(void) | ||
58 | { | ||
59 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
60 | } | ||
61 | |||
62 | static struct map_desc trout_io_desc[] __initdata = { | ||
63 | { | ||
64 | .virtual = TROUT_CPLD_BASE, | ||
65 | .pfn = __phys_to_pfn(TROUT_CPLD_START), | ||
66 | .length = TROUT_CPLD_SIZE, | ||
67 | .type = MT_DEVICE_NONSHARED | ||
68 | } | ||
69 | }; | ||
70 | |||
71 | static void __init trout_map_io(void) | ||
72 | { | ||
73 | msm_map_common_io(); | ||
74 | iotable_init(trout_io_desc, ARRAY_SIZE(trout_io_desc)); | ||
75 | |||
76 | #ifdef CONFIG_MSM_DEBUG_UART3 | ||
77 | /* route UART3 to the "H2W" extended usb connector */ | ||
78 | writeb(0x80, TROUT_CPLD_BASE + 0x00); | ||
79 | #endif | ||
80 | |||
81 | msm_clock_init(); | ||
82 | } | ||
83 | |||
84 | MACHINE_START(TROUT, "HTC Dream") | ||
85 | .phys_io = MSM_DEBUG_UART_PHYS, | ||
86 | .io_pg_offst = ((MSM_DEBUG_UART_BASE) >> 18) & 0xfffc, | ||
87 | .boot_params = 0x10000100, | ||
88 | .fixup = trout_fixup, | ||
89 | .map_io = trout_map_io, | ||
90 | .init_irq = trout_init_irq, | ||
91 | .init_machine = trout_init, | ||
92 | .timer = &msm_timer, | ||
93 | MACHINE_END | ||
diff --git a/arch/arm/mach-msm/board-dream.h b/arch/arm/mach-msm/board-dream.h new file mode 100644 index 000000000000..4f345a5a0a61 --- /dev/null +++ b/arch/arm/mach-msm/board-dream.h | |||
@@ -0,0 +1,5 @@ | |||
1 | |||
2 | #define TROUT_CPLD_BASE 0xE8100000 | ||
3 | #define TROUT_CPLD_START 0x98000000 | ||
4 | #define TROUT_CPLD_SIZE SZ_4K | ||
5 | |||
diff --git a/arch/arm/mach-msm/include/mach/debug-macro.S b/arch/arm/mach-msm/include/mach/debug-macro.S index 1db3c97dbc49..d48747ebcd3d 100644 --- a/arch/arm/mach-msm/include/mach/debug-macro.S +++ b/arch/arm/mach-msm/include/mach/debug-macro.S | |||
@@ -14,15 +14,18 @@ | |||
14 | * | 14 | * |
15 | */ | 15 | */ |
16 | 16 | ||
17 | |||
18 | |||
17 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
18 | #include <mach/msm_iomap.h> | 20 | #include <mach/msm_iomap.h> |
19 | 21 | ||
22 | #ifdef CONFIG_MSM_DEBUG_UART | ||
20 | .macro addruart,rx | 23 | .macro addruart,rx |
21 | @ see if the MMU is enabled and select appropriate base address | 24 | @ see if the MMU is enabled and select appropriate base address |
22 | mrc p15, 0, \rx, c1, c0 | 25 | mrc p15, 0, \rx, c1, c0 |
23 | tst \rx, #1 | 26 | tst \rx, #1 |
24 | ldreq \rx, =MSM_UART1_PHYS | 27 | ldreq \rx, =MSM_DEBUG_UART_PHYS |
25 | movne \rx, #0 | 28 | ldrne \rx, =MSM_DEBUG_UART_BASE |
26 | .endm | 29 | .endm |
27 | 30 | ||
28 | .macro senduart,rd,rx | 31 | .macro senduart,rd,rx |
@@ -32,13 +35,20 @@ | |||
32 | 35 | ||
33 | .macro waituart,rd,rx | 36 | .macro waituart,rd,rx |
34 | @ wait for TX_READY | 37 | @ wait for TX_READY |
35 | teq \rx, #0 | 38 | 1001: ldr \rd, [\rx, #0x08] |
36 | bne 2f | ||
37 | 1: ldr \rd, [\rx, #0x08] | ||
38 | tst \rd, #0x04 | 39 | tst \rd, #0x04 |
39 | beq 1b | 40 | beq 1001b |
40 | 2: | 41 | .endm |
42 | #else | ||
43 | .macro addruart,rx | ||
44 | .endm | ||
45 | |||
46 | .macro senduart,rd,rx | ||
47 | .endm | ||
48 | |||
49 | .macro waituart,rd,rx | ||
41 | .endm | 50 | .endm |
51 | #endif | ||
42 | 52 | ||
43 | .macro busyuart,rd,rx | 53 | .macro busyuart,rd,rx |
44 | .endm | 54 | .endm |
diff --git a/arch/arm/mach-msm/include/mach/mmc.h b/arch/arm/mach-msm/include/mach/mmc.h new file mode 100644 index 000000000000..0ecf25426284 --- /dev/null +++ b/arch/arm/mach-msm/include/mach/mmc.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/mach/mmc.h | ||
3 | */ | ||
4 | #ifndef ASMARM_MACH_MMC_H | ||
5 | #define ASMARM_MACH_MMC_H | ||
6 | |||
7 | #include <linux/mmc/host.h> | ||
8 | #include <linux/mmc/card.h> | ||
9 | #include <linux/mmc/sdio_func.h> | ||
10 | |||
11 | struct embedded_sdio_data { | ||
12 | struct sdio_cis cis; | ||
13 | struct sdio_cccr cccr; | ||
14 | struct sdio_embedded_func *funcs; | ||
15 | int num_funcs; | ||
16 | }; | ||
17 | |||
18 | struct mmc_platform_data { | ||
19 | unsigned int ocr_mask; /* available voltages */ | ||
20 | u32 (*translate_vdd)(struct device *, unsigned int); | ||
21 | unsigned int (*status)(struct device *); | ||
22 | struct embedded_sdio_data *embedded_sdio; | ||
23 | int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id); | ||
24 | }; | ||
25 | |||
26 | #endif | ||
diff --git a/arch/arm/mach-msm/include/mach/msm_iomap.h b/arch/arm/mach-msm/include/mach/msm_iomap.h index 2f7b4c8620d9..9dae1a98c77a 100644 --- a/arch/arm/mach-msm/include/mach/msm_iomap.h +++ b/arch/arm/mach-msm/include/mach/msm_iomap.h | |||
@@ -84,6 +84,18 @@ | |||
84 | #define MSM_UART3_PHYS 0xA9C00000 | 84 | #define MSM_UART3_PHYS 0xA9C00000 |
85 | #define MSM_UART3_SIZE SZ_4K | 85 | #define MSM_UART3_SIZE SZ_4K |
86 | 86 | ||
87 | #ifdef CONFIG_MSM_DEBUG_UART | ||
88 | #define MSM_DEBUG_UART_BASE 0xE1000000 | ||
89 | #if CONFIG_MSM_DEBUG_UART == 1 | ||
90 | #define MSM_DEBUG_UART_PHYS MSM_UART1_PHYS | ||
91 | #elif CONFIG_MSM_DEBUG_UART == 2 | ||
92 | #define MSM_DEBUG_UART_PHYS MSM_UART2_PHYS | ||
93 | #elif CONFIG_MSM_DEBUG_UART == 3 | ||
94 | #define MSM_DEBUG_UART_PHYS MSM_UART3_PHYS | ||
95 | #endif | ||
96 | #define MSM_DEBUG_UART_SIZE SZ_4K | ||
97 | #endif | ||
98 | |||
87 | #define MSM_SDC1_PHYS 0xA0400000 | 99 | #define MSM_SDC1_PHYS 0xA0400000 |
88 | #define MSM_SDC1_SIZE SZ_4K | 100 | #define MSM_SDC1_SIZE SZ_4K |
89 | 101 | ||
diff --git a/arch/arm/mach-msm/include/mach/uncompress.h b/arch/arm/mach-msm/include/mach/uncompress.h index 026e8955ace9..d94292c29d8e 100644 --- a/arch/arm/mach-msm/include/mach/uncompress.h +++ b/arch/arm/mach-msm/include/mach/uncompress.h | |||
@@ -16,9 +16,16 @@ | |||
16 | #ifndef __ASM_ARCH_MSM_UNCOMPRESS_H | 16 | #ifndef __ASM_ARCH_MSM_UNCOMPRESS_H |
17 | 17 | ||
18 | #include "hardware.h" | 18 | #include "hardware.h" |
19 | #include "linux/io.h" | ||
20 | #include "mach/msm_iomap.h" | ||
19 | 21 | ||
20 | static void putc(int c) | 22 | static void putc(int c) |
21 | { | 23 | { |
24 | #if defined(MSM_DEBUG_UART_PHYS) | ||
25 | unsigned base = MSM_DEBUG_UART_PHYS; | ||
26 | while (!(readl(base + 0x08) & 0x04)) ; | ||
27 | writel(c, base + 0x0c); | ||
28 | #endif | ||
22 | } | 29 | } |
23 | 30 | ||
24 | static inline void flush(void) | 31 | static inline void flush(void) |
diff --git a/arch/arm/mach-msm/io.c b/arch/arm/mach-msm/io.c index 6e7692ff6f2c..1c5e7dac086f 100644 --- a/arch/arm/mach-msm/io.c +++ b/arch/arm/mach-msm/io.c | |||
@@ -42,6 +42,9 @@ static struct map_desc msm_io_desc[] __initdata = { | |||
42 | MSM_DEVICE(GPIO1), | 42 | MSM_DEVICE(GPIO1), |
43 | MSM_DEVICE(GPIO2), | 43 | MSM_DEVICE(GPIO2), |
44 | MSM_DEVICE(CLK_CTL), | 44 | MSM_DEVICE(CLK_CTL), |
45 | #ifdef CONFIG_MSM_DEBUG_UART | ||
46 | MSM_DEVICE(DEBUG_UART), | ||
47 | #endif | ||
45 | { | 48 | { |
46 | .virtual = (unsigned long) MSM_SHARED_RAM_BASE, | 49 | .virtual = (unsigned long) MSM_SHARED_RAM_BASE, |
47 | .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS), | 50 | .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS), |
diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 2b7996401b0f..f5abc51c5a07 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c | |||
@@ -54,7 +54,8 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
54 | * We enforce the MAP_FIXED case. | 54 | * We enforce the MAP_FIXED case. |
55 | */ | 55 | */ |
56 | if (flags & MAP_FIXED) { | 56 | if (flags & MAP_FIXED) { |
57 | if (aliasing && flags & MAP_SHARED && addr & (SHMLBA - 1)) | 57 | if (aliasing && flags & MAP_SHARED && |
58 | (addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1)) | ||
58 | return -EINVAL; | 59 | return -EINVAL; |
59 | return addr; | 60 | return addr; |
60 | } | 61 | } |
diff --git a/arch/arm/plat-mxc/Makefile b/arch/arm/plat-mxc/Makefile index 4cbca9da1505..996cbac6932c 100644 --- a/arch/arm/plat-mxc/Makefile +++ b/arch/arm/plat-mxc/Makefile | |||
@@ -9,6 +9,7 @@ obj-$(CONFIG_ARCH_MX1) += iomux-mx1-mx2.o dma-mx1-mx2.o | |||
9 | obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o | 9 | obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o |
10 | obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o | 10 | obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o |
11 | obj-$(CONFIG_MXC_PWM) += pwm.o | 11 | obj-$(CONFIG_MXC_PWM) += pwm.o |
12 | obj-$(CONFIG_USB_EHCI_MXC) += ehci.o | ||
12 | obj-$(CONFIG_MXC_ULPI) += ulpi.o | 13 | obj-$(CONFIG_MXC_ULPI) += ulpi.o |
13 | obj-$(CONFIG_ARCH_MXC_AUDMUX_V1) += audmux-v1.o | 14 | obj-$(CONFIG_ARCH_MXC_AUDMUX_V1) += audmux-v1.o |
14 | obj-$(CONFIG_ARCH_MXC_AUDMUX_V2) += audmux-v2.o | 15 | obj-$(CONFIG_ARCH_MXC_AUDMUX_V2) += audmux-v2.o |
diff --git a/arch/arm/plat-mxc/ehci.c b/arch/arm/plat-mxc/ehci.c new file mode 100644 index 000000000000..41599be882e8 --- /dev/null +++ b/arch/arm/plat-mxc/ehci.c | |||
@@ -0,0 +1,92 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | ||
11 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
12 | * for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software Foundation, | ||
16 | * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/platform_device.h> | ||
20 | #include <linux/io.h> | ||
21 | |||
22 | #include <mach/hardware.h> | ||
23 | #include <mach/mxc_ehci.h> | ||
24 | |||
25 | #define USBCTRL_OTGBASE_OFFSET 0x600 | ||
26 | |||
27 | #define MX31_OTG_SIC_SHIFT 29 | ||
28 | #define MX31_OTG_SIC_MASK (0xf << MX31_OTG_SIC_SHIFT) | ||
29 | #define MX31_OTG_PM_BIT (1 << 24) | ||
30 | |||
31 | #define MX31_H2_SIC_SHIFT 21 | ||
32 | #define MX31_H2_SIC_MASK (0xf << MX31_H2_SIC_SHIFT) | ||
33 | #define MX31_H2_PM_BIT (1 << 16) | ||
34 | #define MX31_H2_DT_BIT (1 << 5) | ||
35 | |||
36 | #define MX31_H1_SIC_SHIFT 13 | ||
37 | #define MX31_H1_SIC_MASK (0xf << MX31_H1_SIC_SHIFT) | ||
38 | #define MX31_H1_PM_BIT (1 << 8) | ||
39 | #define MX31_H1_DT_BIT (1 << 4) | ||
40 | |||
41 | int mxc_set_usbcontrol(int port, unsigned int flags) | ||
42 | { | ||
43 | unsigned int v; | ||
44 | |||
45 | if (cpu_is_mx31()) { | ||
46 | v = readl(IO_ADDRESS(MX31_OTG_BASE_ADDR + | ||
47 | USBCTRL_OTGBASE_OFFSET)); | ||
48 | |||
49 | switch (port) { | ||
50 | case 0: /* OTG port */ | ||
51 | v &= ~(MX31_OTG_SIC_MASK | MX31_OTG_PM_BIT); | ||
52 | v |= (flags & MXC_EHCI_INTERFACE_MASK) | ||
53 | << MX31_OTG_SIC_SHIFT; | ||
54 | if (flags & MXC_EHCI_POWER_PINS_ENABLED) | ||
55 | v |= MX31_OTG_PM_BIT; | ||
56 | |||
57 | break; | ||
58 | case 1: /* H1 port */ | ||
59 | v &= ~(MX31_H1_SIC_MASK | MX31_H1_PM_BIT); | ||
60 | v |= (flags & MXC_EHCI_INTERFACE_MASK) | ||
61 | << MX31_H1_SIC_SHIFT; | ||
62 | if (flags & MXC_EHCI_POWER_PINS_ENABLED) | ||
63 | v |= MX31_H1_PM_BIT; | ||
64 | |||
65 | if (!(flags & MXC_EHCI_TTL_ENABLED)) | ||
66 | v |= MX31_H1_DT_BIT; | ||
67 | |||
68 | break; | ||
69 | case 2: /* H2 port */ | ||
70 | v &= ~(MX31_H2_SIC_MASK | MX31_H2_PM_BIT); | ||
71 | v |= (flags & MXC_EHCI_INTERFACE_MASK) | ||
72 | << MX31_H2_SIC_SHIFT; | ||
73 | if (!(flags & MXC_EHCI_POWER_PINS_ENABLED)) | ||
74 | v |= MX31_H2_PM_BIT; | ||
75 | |||
76 | if (!(flags & MXC_EHCI_TTL_ENABLED)) | ||
77 | v |= MX31_H2_DT_BIT; | ||
78 | |||
79 | break; | ||
80 | } | ||
81 | |||
82 | writel(v, IO_ADDRESS(MX31_OTG_BASE_ADDR + | ||
83 | USBCTRL_OTGBASE_OFFSET)); | ||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | printk(KERN_WARNING | ||
88 | "%s() unable to setup USBCONTROL for this CPU\n", __func__); | ||
89 | return -EINVAL; | ||
90 | } | ||
91 | EXPORT_SYMBOL(mxc_set_usbcontrol); | ||
92 | |||
diff --git a/arch/arm/plat-mxc/include/mach/mxc_ehci.h b/arch/arm/plat-mxc/include/mach/mxc_ehci.h new file mode 100644 index 000000000000..8f796239393e --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/mxc_ehci.h | |||
@@ -0,0 +1,37 @@ | |||
1 | #ifndef __INCLUDE_ASM_ARCH_MXC_EHCI_H | ||
2 | #define __INCLUDE_ASM_ARCH_MXC_EHCI_H | ||
3 | |||
4 | /* values for portsc field */ | ||
5 | #define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23) | ||
6 | #define MXC_EHCI_FORCE_FS (1 << 24) | ||
7 | #define MXC_EHCI_UTMI_8BIT (0 << 28) | ||
8 | #define MXC_EHCI_UTMI_16BIT (1 << 28) | ||
9 | #define MXC_EHCI_SERIAL (1 << 29) | ||
10 | #define MXC_EHCI_MODE_UTMI (0 << 30) | ||
11 | #define MXC_EHCI_MODE_PHILIPS (1 << 30) | ||
12 | #define MXC_EHCI_MODE_ULPI (2 << 30) | ||
13 | #define MXC_EHCI_MODE_SERIAL (3 << 30) | ||
14 | |||
15 | /* values for flags field */ | ||
16 | #define MXC_EHCI_INTERFACE_DIFF_UNI (0 << 0) | ||
17 | #define MXC_EHCI_INTERFACE_DIFF_BI (1 << 0) | ||
18 | #define MXC_EHCI_INTERFACE_SINGLE_UNI (2 << 0) | ||
19 | #define MXC_EHCI_INTERFACE_SINGLE_BI (3 << 0) | ||
20 | #define MXC_EHCI_INTERFACE_MASK (0xf) | ||
21 | |||
22 | #define MXC_EHCI_POWER_PINS_ENABLED (1 << 5) | ||
23 | #define MXC_EHCI_TTL_ENABLED (1 << 6) | ||
24 | |||
25 | struct mxc_usbh_platform_data { | ||
26 | int (*init)(struct platform_device *pdev); | ||
27 | int (*exit)(struct platform_device *pdev); | ||
28 | |||
29 | unsigned int portsc; | ||
30 | unsigned int flags; | ||
31 | struct otg_transceiver *otg; | ||
32 | }; | ||
33 | |||
34 | int mxc_set_usbcontrol(int port, unsigned int flags); | ||
35 | |||
36 | #endif /* __INCLUDE_ASM_ARCH_MXC_EHCI_H */ | ||
37 | |||