diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 22:08:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 22:08:06 -0400 |
commit | 411f5c7a502769ccc0377c5ba36cb0b283847ba8 (patch) | |
tree | 2c3a29671e3f923de48c55f94194849264a7bf53 /arch/arm/mach-u300 | |
parent | 6d7ed21d17e640b120b902a314143e5ef4917a70 (diff) | |
parent | 9ced9f03d12d7539e86b0bff5bc750153c976c34 (diff) |
Merge branch 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm: (289 commits)
davinci: DM644x EVM: register MUSB device earlier
davinci: add spi devices on tnetv107x evm
davinci: add ssp config for tnetv107x evm board
davinci: add tnetv107x ssp platform device
spi: add ti-ssp spi master driver
mfd: add driver for sequencer serial port
ARM: EXYNOS4: Implement Clock gating for System MMU
ARM: EXYNOS4: Enhancement of System MMU driver
ARM: EXYNOS4: Add support for gpio interrupts
ARM: S5P: Add function to register gpio interrupt bank data
ARM: S5P: Cleanup S5P gpio interrupt code
ARM: EXYNOS4: Add missing GPYx banks
ARM: S3C64XX: Fix section mismatch from cpufreq init
ARM: EXYNOS4: Add keypad device to the SMDKV310
ARM: EXYNOS4: Update clocks for keypad
ARM: EXYNOS4: Update keypad base address
ARM: EXYNOS4: Add keypad device helpers
ARM: EXYNOS4: Add support for SATA on ARMLEX4210
plat-nomadik: make GPIO interrupts work with cpuidle ApSleep
mach-u300: define a dummy filter function for coh901318
...
Fix up various conflicts in
- arch/arm/mach-exynos4/cpufreq.c
- arch/arm/mach-mxs/gpio.c
- drivers/net/Kconfig
- drivers/tty/serial/Kconfig
- drivers/tty/serial/Makefile
- drivers/usb/gadget/fsl_mxc_udc.c
- drivers/video/Kconfig
Diffstat (limited to 'arch/arm/mach-u300')
-rw-r--r-- | arch/arm/mach-u300/core.c | 179 | ||||
-rw-r--r-- | arch/arm/mach-u300/include/mach/coh901318.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-u300/mmc.c | 160 | ||||
-rw-r--r-- | arch/arm/mach-u300/spi.c | 21 |
4 files changed, 203 insertions, 164 deletions
diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index aa53ee22438f..513d6abec1f5 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * arch/arm/mach-u300/core.c | 3 | * arch/arm/mach-u300/core.c |
4 | * | 4 | * |
5 | * | 5 | * |
6 | * Copyright (C) 2007-2010 ST-Ericsson AB | 6 | * Copyright (C) 2007-2010 ST-Ericsson SA |
7 | * License terms: GNU General Public License (GPL) version 2 | 7 | * License terms: GNU General Public License (GPL) version 2 |
8 | * Core platform support, IRQ handling and device definitions. | 8 | * Core platform support, IRQ handling and device definitions. |
9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
@@ -16,7 +16,9 @@ | |||
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/termios.h> | 18 | #include <linux/termios.h> |
19 | #include <linux/dmaengine.h> | ||
19 | #include <linux/amba/bus.h> | 20 | #include <linux/amba/bus.h> |
21 | #include <linux/amba/serial.h> | ||
20 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
21 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
22 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
@@ -96,10 +98,20 @@ void __init u300_map_io(void) | |||
96 | * Declaration of devices found on the U300 board and | 98 | * Declaration of devices found on the U300 board and |
97 | * their respective memory locations. | 99 | * their respective memory locations. |
98 | */ | 100 | */ |
101 | |||
102 | static struct amba_pl011_data uart0_plat_data = { | ||
103 | #ifdef CONFIG_COH901318 | ||
104 | .dma_filter = coh901318_filter_id, | ||
105 | .dma_rx_param = (void *) U300_DMA_UART0_RX, | ||
106 | .dma_tx_param = (void *) U300_DMA_UART0_TX, | ||
107 | #endif | ||
108 | }; | ||
109 | |||
99 | static struct amba_device uart0_device = { | 110 | static struct amba_device uart0_device = { |
100 | .dev = { | 111 | .dev = { |
112 | .coherent_dma_mask = ~0, | ||
101 | .init_name = "uart0", /* Slow device at 0x3000 offset */ | 113 | .init_name = "uart0", /* Slow device at 0x3000 offset */ |
102 | .platform_data = NULL, | 114 | .platform_data = &uart0_plat_data, |
103 | }, | 115 | }, |
104 | .res = { | 116 | .res = { |
105 | .start = U300_UART0_BASE, | 117 | .start = U300_UART0_BASE, |
@@ -111,10 +123,19 @@ static struct amba_device uart0_device = { | |||
111 | 123 | ||
112 | /* The U335 have an additional UART1 on the APP CPU */ | 124 | /* The U335 have an additional UART1 on the APP CPU */ |
113 | #ifdef CONFIG_MACH_U300_BS335 | 125 | #ifdef CONFIG_MACH_U300_BS335 |
126 | static struct amba_pl011_data uart1_plat_data = { | ||
127 | #ifdef CONFIG_COH901318 | ||
128 | .dma_filter = coh901318_filter_id, | ||
129 | .dma_rx_param = (void *) U300_DMA_UART1_RX, | ||
130 | .dma_tx_param = (void *) U300_DMA_UART1_TX, | ||
131 | #endif | ||
132 | }; | ||
133 | |||
114 | static struct amba_device uart1_device = { | 134 | static struct amba_device uart1_device = { |
115 | .dev = { | 135 | .dev = { |
136 | .coherent_dma_mask = ~0, | ||
116 | .init_name = "uart1", /* Fast device at 0x7000 offset */ | 137 | .init_name = "uart1", /* Fast device at 0x7000 offset */ |
117 | .platform_data = NULL, | 138 | .platform_data = &uart1_plat_data, |
118 | }, | 139 | }, |
119 | .res = { | 140 | .res = { |
120 | .start = U300_UART1_BASE, | 141 | .start = U300_UART1_BASE, |
@@ -960,42 +981,37 @@ const struct coh_dma_channel chan_config[U300_DMA_CHANNELS] = { | |||
960 | .priority_high = 0, | 981 | .priority_high = 0, |
961 | .dev_addr = U300_MSL_BASE + 6 * 0x40 + 0x220, | 982 | .dev_addr = U300_MSL_BASE + 6 * 0x40 + 0x220, |
962 | }, | 983 | }, |
984 | /* | ||
985 | * Don't set up device address, burst count or size of src | ||
986 | * or dst bus for this peripheral - handled by PrimeCell | ||
987 | * DMA extension. | ||
988 | */ | ||
963 | { | 989 | { |
964 | .number = U300_DMA_MMCSD_RX_TX, | 990 | .number = U300_DMA_MMCSD_RX_TX, |
965 | .name = "MMCSD RX TX", | 991 | .name = "MMCSD RX TX", |
966 | .priority_high = 0, | 992 | .priority_high = 0, |
967 | .dev_addr = U300_MMCSD_BASE + 0x080, | ||
968 | .param.config = COH901318_CX_CFG_CH_DISABLE | | 993 | .param.config = COH901318_CX_CFG_CH_DISABLE | |
969 | COH901318_CX_CFG_LCR_DISABLE | | 994 | COH901318_CX_CFG_LCR_DISABLE | |
970 | COH901318_CX_CFG_TC_IRQ_ENABLE | | 995 | COH901318_CX_CFG_TC_IRQ_ENABLE | |
971 | COH901318_CX_CFG_BE_IRQ_ENABLE, | 996 | COH901318_CX_CFG_BE_IRQ_ENABLE, |
972 | .param.ctrl_lli_chained = 0 | | 997 | .param.ctrl_lli_chained = 0 | |
973 | COH901318_CX_CTRL_TC_ENABLE | | 998 | COH901318_CX_CTRL_TC_ENABLE | |
974 | COH901318_CX_CTRL_BURST_COUNT_32_BYTES | | ||
975 | COH901318_CX_CTRL_SRC_BUS_SIZE_32_BITS | | ||
976 | COH901318_CX_CTRL_DST_BUS_SIZE_32_BITS | | ||
977 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | 999 | COH901318_CX_CTRL_MASTER_MODE_M1RW | |
978 | COH901318_CX_CTRL_TCP_ENABLE | | 1000 | COH901318_CX_CTRL_TCP_ENABLE | |
979 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | 1001 | COH901318_CX_CTRL_TC_IRQ_DISABLE | |
980 | COH901318_CX_CTRL_HSP_ENABLE | | 1002 | COH901318_CX_CTRL_HSP_ENABLE | |
981 | COH901318_CX_CTRL_HSS_DISABLE | | 1003 | COH901318_CX_CTRL_HSS_DISABLE | |
982 | COH901318_CX_CTRL_DDMA_LEGACY, | 1004 | COH901318_CX_CTRL_DDMA_LEGACY, |
983 | .param.ctrl_lli = 0 | | 1005 | .param.ctrl_lli = 0 | |
984 | COH901318_CX_CTRL_TC_ENABLE | | 1006 | COH901318_CX_CTRL_TC_ENABLE | |
985 | COH901318_CX_CTRL_BURST_COUNT_32_BYTES | | ||
986 | COH901318_CX_CTRL_SRC_BUS_SIZE_32_BITS | | ||
987 | COH901318_CX_CTRL_DST_BUS_SIZE_32_BITS | | ||
988 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | 1007 | COH901318_CX_CTRL_MASTER_MODE_M1RW | |
989 | COH901318_CX_CTRL_TCP_ENABLE | | 1008 | COH901318_CX_CTRL_TCP_ENABLE | |
990 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | 1009 | COH901318_CX_CTRL_TC_IRQ_DISABLE | |
991 | COH901318_CX_CTRL_HSP_ENABLE | | 1010 | COH901318_CX_CTRL_HSP_ENABLE | |
992 | COH901318_CX_CTRL_HSS_DISABLE | | 1011 | COH901318_CX_CTRL_HSS_DISABLE | |
993 | COH901318_CX_CTRL_DDMA_LEGACY, | 1012 | COH901318_CX_CTRL_DDMA_LEGACY, |
994 | .param.ctrl_lli_last = 0 | | 1013 | .param.ctrl_lli_last = 0 | |
995 | COH901318_CX_CTRL_TC_ENABLE | | 1014 | COH901318_CX_CTRL_TC_ENABLE | |
996 | COH901318_CX_CTRL_BURST_COUNT_32_BYTES | | ||
997 | COH901318_CX_CTRL_SRC_BUS_SIZE_32_BITS | | ||
998 | COH901318_CX_CTRL_DST_BUS_SIZE_32_BITS | | ||
999 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | 1015 | COH901318_CX_CTRL_MASTER_MODE_M1RW | |
1000 | COH901318_CX_CTRL_TCP_DISABLE | | 1016 | COH901318_CX_CTRL_TCP_DISABLE | |
1001 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | 1017 | COH901318_CX_CTRL_TC_IRQ_ENABLE | |
@@ -1014,15 +1030,76 @@ const struct coh_dma_channel chan_config[U300_DMA_CHANNELS] = { | |||
1014 | .name = "MSPRO RX", | 1030 | .name = "MSPRO RX", |
1015 | .priority_high = 0, | 1031 | .priority_high = 0, |
1016 | }, | 1032 | }, |
1033 | /* | ||
1034 | * Don't set up device address, burst count or size of src | ||
1035 | * or dst bus for this peripheral - handled by PrimeCell | ||
1036 | * DMA extension. | ||
1037 | */ | ||
1017 | { | 1038 | { |
1018 | .number = U300_DMA_UART0_TX, | 1039 | .number = U300_DMA_UART0_TX, |
1019 | .name = "UART0 TX", | 1040 | .name = "UART0 TX", |
1020 | .priority_high = 0, | 1041 | .priority_high = 0, |
1042 | .param.config = COH901318_CX_CFG_CH_DISABLE | | ||
1043 | COH901318_CX_CFG_LCR_DISABLE | | ||
1044 | COH901318_CX_CFG_TC_IRQ_ENABLE | | ||
1045 | COH901318_CX_CFG_BE_IRQ_ENABLE, | ||
1046 | .param.ctrl_lli_chained = 0 | | ||
1047 | COH901318_CX_CTRL_TC_ENABLE | | ||
1048 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1049 | COH901318_CX_CTRL_TCP_ENABLE | | ||
1050 | COH901318_CX_CTRL_TC_IRQ_DISABLE | | ||
1051 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1052 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1053 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1054 | .param.ctrl_lli = 0 | | ||
1055 | COH901318_CX_CTRL_TC_ENABLE | | ||
1056 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1057 | COH901318_CX_CTRL_TCP_ENABLE | | ||
1058 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1059 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1060 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1061 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1062 | .param.ctrl_lli_last = 0 | | ||
1063 | COH901318_CX_CTRL_TC_ENABLE | | ||
1064 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1065 | COH901318_CX_CTRL_TCP_ENABLE | | ||
1066 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1067 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1068 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1069 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1021 | }, | 1070 | }, |
1022 | { | 1071 | { |
1023 | .number = U300_DMA_UART0_RX, | 1072 | .number = U300_DMA_UART0_RX, |
1024 | .name = "UART0 RX", | 1073 | .name = "UART0 RX", |
1025 | .priority_high = 0, | 1074 | .priority_high = 0, |
1075 | .param.config = COH901318_CX_CFG_CH_DISABLE | | ||
1076 | COH901318_CX_CFG_LCR_DISABLE | | ||
1077 | COH901318_CX_CFG_TC_IRQ_ENABLE | | ||
1078 | COH901318_CX_CFG_BE_IRQ_ENABLE, | ||
1079 | .param.ctrl_lli_chained = 0 | | ||
1080 | COH901318_CX_CTRL_TC_ENABLE | | ||
1081 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1082 | COH901318_CX_CTRL_TCP_ENABLE | | ||
1083 | COH901318_CX_CTRL_TC_IRQ_DISABLE | | ||
1084 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1085 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1086 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1087 | .param.ctrl_lli = 0 | | ||
1088 | COH901318_CX_CTRL_TC_ENABLE | | ||
1089 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1090 | COH901318_CX_CTRL_TCP_ENABLE | | ||
1091 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1092 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1093 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1094 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1095 | .param.ctrl_lli_last = 0 | | ||
1096 | COH901318_CX_CTRL_TC_ENABLE | | ||
1097 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1098 | COH901318_CX_CTRL_TCP_ENABLE | | ||
1099 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1100 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1101 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1102 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1026 | }, | 1103 | }, |
1027 | { | 1104 | { |
1028 | .number = U300_DMA_APEX_TX, | 1105 | .number = U300_DMA_APEX_TX, |
@@ -1080,7 +1157,7 @@ const struct coh_dma_channel chan_config[U300_DMA_CHANNELS] = { | |||
1080 | COH901318_CX_CTRL_DST_ADDR_INC_DISABLE | | 1157 | COH901318_CX_CTRL_DST_ADDR_INC_DISABLE | |
1081 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | 1158 | COH901318_CX_CTRL_MASTER_MODE_M1RW | |
1082 | COH901318_CX_CTRL_TCP_ENABLE | | 1159 | COH901318_CX_CTRL_TCP_ENABLE | |
1083 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | 1160 | COH901318_CX_CTRL_TC_IRQ_DISABLE | |
1084 | COH901318_CX_CTRL_HSP_ENABLE | | 1161 | COH901318_CX_CTRL_HSP_ENABLE | |
1085 | COH901318_CX_CTRL_HSS_DISABLE | | 1162 | COH901318_CX_CTRL_HSS_DISABLE | |
1086 | COH901318_CX_CTRL_DDMA_LEGACY | | 1163 | COH901318_CX_CTRL_DDMA_LEGACY | |
@@ -1252,15 +1329,77 @@ const struct coh_dma_channel chan_config[U300_DMA_CHANNELS] = { | |||
1252 | .name = "XGAM PDI", | 1329 | .name = "XGAM PDI", |
1253 | .priority_high = 0, | 1330 | .priority_high = 0, |
1254 | }, | 1331 | }, |
1332 | /* | ||
1333 | * Don't set up device address, burst count or size of src | ||
1334 | * or dst bus for this peripheral - handled by PrimeCell | ||
1335 | * DMA extension. | ||
1336 | */ | ||
1255 | { | 1337 | { |
1256 | .number = U300_DMA_SPI_TX, | 1338 | .number = U300_DMA_SPI_TX, |
1257 | .name = "SPI TX", | 1339 | .name = "SPI TX", |
1258 | .priority_high = 0, | 1340 | .priority_high = 0, |
1341 | .param.config = COH901318_CX_CFG_CH_DISABLE | | ||
1342 | COH901318_CX_CFG_LCR_DISABLE | | ||
1343 | COH901318_CX_CFG_TC_IRQ_ENABLE | | ||
1344 | COH901318_CX_CFG_BE_IRQ_ENABLE, | ||
1345 | .param.ctrl_lli_chained = 0 | | ||
1346 | COH901318_CX_CTRL_TC_ENABLE | | ||
1347 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1348 | COH901318_CX_CTRL_TCP_DISABLE | | ||
1349 | COH901318_CX_CTRL_TC_IRQ_DISABLE | | ||
1350 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1351 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1352 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1353 | .param.ctrl_lli = 0 | | ||
1354 | COH901318_CX_CTRL_TC_ENABLE | | ||
1355 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1356 | COH901318_CX_CTRL_TCP_DISABLE | | ||
1357 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1358 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1359 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1360 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1361 | .param.ctrl_lli_last = 0 | | ||
1362 | COH901318_CX_CTRL_TC_ENABLE | | ||
1363 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1364 | COH901318_CX_CTRL_TCP_DISABLE | | ||
1365 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1366 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1367 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1368 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1259 | }, | 1369 | }, |
1260 | { | 1370 | { |
1261 | .number = U300_DMA_SPI_RX, | 1371 | .number = U300_DMA_SPI_RX, |
1262 | .name = "SPI RX", | 1372 | .name = "SPI RX", |
1263 | .priority_high = 0, | 1373 | .priority_high = 0, |
1374 | .param.config = COH901318_CX_CFG_CH_DISABLE | | ||
1375 | COH901318_CX_CFG_LCR_DISABLE | | ||
1376 | COH901318_CX_CFG_TC_IRQ_ENABLE | | ||
1377 | COH901318_CX_CFG_BE_IRQ_ENABLE, | ||
1378 | .param.ctrl_lli_chained = 0 | | ||
1379 | COH901318_CX_CTRL_TC_ENABLE | | ||
1380 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1381 | COH901318_CX_CTRL_TCP_DISABLE | | ||
1382 | COH901318_CX_CTRL_TC_IRQ_DISABLE | | ||
1383 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1384 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1385 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1386 | .param.ctrl_lli = 0 | | ||
1387 | COH901318_CX_CTRL_TC_ENABLE | | ||
1388 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1389 | COH901318_CX_CTRL_TCP_DISABLE | | ||
1390 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1391 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1392 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1393 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1394 | .param.ctrl_lli_last = 0 | | ||
1395 | COH901318_CX_CTRL_TC_ENABLE | | ||
1396 | COH901318_CX_CTRL_MASTER_MODE_M1RW | | ||
1397 | COH901318_CX_CTRL_TCP_DISABLE | | ||
1398 | COH901318_CX_CTRL_TC_IRQ_ENABLE | | ||
1399 | COH901318_CX_CTRL_HSP_ENABLE | | ||
1400 | COH901318_CX_CTRL_HSS_DISABLE | | ||
1401 | COH901318_CX_CTRL_DDMA_LEGACY, | ||
1402 | |||
1264 | }, | 1403 | }, |
1265 | { | 1404 | { |
1266 | .number = U300_DMA_GENERAL_PURPOSE_0, | 1405 | .number = U300_DMA_GENERAL_PURPOSE_0, |
@@ -1617,7 +1756,7 @@ static void __init u300_init_check_chip(void) | |||
1617 | #endif | 1756 | #endif |
1618 | #ifdef CONFIG_MACH_U300_BS335 | 1757 | #ifdef CONFIG_MACH_U300_BS335 |
1619 | if ((val & 0xFF00U) != 0xf000 && (val & 0xFF00U) != 0xf100) { | 1758 | if ((val & 0xFF00U) != 0xf000 && (val & 0xFF00U) != 0xf100) { |
1620 | printk(KERN_ERR "Platform configured for BS365 " \ | 1759 | printk(KERN_ERR "Platform configured for BS335 " \ |
1621 | " with DB3350 but %s detected, expect problems!", | 1760 | " with DB3350 but %s detected, expect problems!", |
1622 | chipname); | 1761 | chipname); |
1623 | } | 1762 | } |
@@ -1692,12 +1831,12 @@ void __init u300_init_devices(void) | |||
1692 | /* Register subdevices on the I2C buses */ | 1831 | /* Register subdevices on the I2C buses */ |
1693 | u300_i2c_register_board_devices(); | 1832 | u300_i2c_register_board_devices(); |
1694 | 1833 | ||
1695 | /* Register subdevices on the SPI bus */ | ||
1696 | u300_spi_register_board_devices(); | ||
1697 | |||
1698 | /* Register the platform devices */ | 1834 | /* Register the platform devices */ |
1699 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); | 1835 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); |
1700 | 1836 | ||
1837 | /* Register subdevices on the SPI bus */ | ||
1838 | u300_spi_register_board_devices(); | ||
1839 | |||
1701 | #ifndef CONFIG_MACH_U300_SEMI_IS_SHARED | 1840 | #ifndef CONFIG_MACH_U300_SEMI_IS_SHARED |
1702 | /* | 1841 | /* |
1703 | * Enable SEMI self refresh. Self-refresh of the SDRAM is entered when | 1842 | * Enable SEMI self refresh. Self-refresh of the SDRAM is entered when |
diff --git a/arch/arm/mach-u300/include/mach/coh901318.h b/arch/arm/mach-u300/include/mach/coh901318.h index 6193aaa47794..7c3b2b2d25b6 100644 --- a/arch/arm/mach-u300/include/mach/coh901318.h +++ b/arch/arm/mach-u300/include/mach/coh901318.h | |||
@@ -102,6 +102,7 @@ struct coh901318_platform { | |||
102 | const int max_channels; | 102 | const int max_channels; |
103 | }; | 103 | }; |
104 | 104 | ||
105 | #ifdef CONFIG_COH901318 | ||
105 | /** | 106 | /** |
106 | * coh901318_filter_id() - DMA channel filter function | 107 | * coh901318_filter_id() - DMA channel filter function |
107 | * @chan: dma channel handle | 108 | * @chan: dma channel handle |
@@ -110,6 +111,12 @@ struct coh901318_platform { | |||
110 | * In dma_request_channel() it specifies what channel id to be requested | 111 | * In dma_request_channel() it specifies what channel id to be requested |
111 | */ | 112 | */ |
112 | bool coh901318_filter_id(struct dma_chan *chan, void *chan_id); | 113 | bool coh901318_filter_id(struct dma_chan *chan, void *chan_id); |
114 | #else | ||
115 | static inline bool coh901318_filter_id(struct dma_chan *chan, void *chan_id) | ||
116 | { | ||
117 | return false; | ||
118 | } | ||
119 | #endif | ||
113 | 120 | ||
114 | /* | 121 | /* |
115 | * DMA Controller - this access the static mappings of the coh901318 dma. | 122 | * DMA Controller - this access the static mappings of the coh901318 dma. |
diff --git a/arch/arm/mach-u300/mmc.c b/arch/arm/mach-u300/mmc.c index de1ac9ad2213..677ccef5cd32 100644 --- a/arch/arm/mach-u300/mmc.c +++ b/arch/arm/mach-u300/mmc.c | |||
@@ -3,159 +3,52 @@ | |||
3 | * arch/arm/mach-u300/mmc.c | 3 | * arch/arm/mach-u300/mmc.c |
4 | * | 4 | * |
5 | * | 5 | * |
6 | * Copyright (C) 2009 ST-Ericsson AB | 6 | * Copyright (C) 2009 ST-Ericsson SA |
7 | * License terms: GNU General Public License (GPL) version 2 | 7 | * License terms: GNU General Public License (GPL) version 2 |
8 | * | 8 | * |
9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
10 | * Author: Johan Lundin <johan.lundin@stericsson.com> | 10 | * Author: Johan Lundin |
11 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> | 11 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> |
12 | */ | 12 | */ |
13 | #include <linux/device.h> | 13 | #include <linux/device.h> |
14 | #include <linux/amba/bus.h> | 14 | #include <linux/amba/bus.h> |
15 | #include <linux/mmc/host.h> | 15 | #include <linux/mmc/host.h> |
16 | #include <linux/input.h> | ||
17 | #include <linux/workqueue.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/regulator/consumer.h> | ||
20 | #include <linux/regulator/machine.h> | ||
21 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
17 | #include <linux/dmaengine.h> | ||
22 | #include <linux/amba/mmci.h> | 18 | #include <linux/amba/mmci.h> |
23 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <mach/coh901318.h> | ||
21 | #include <mach/dma_channels.h> | ||
24 | 22 | ||
25 | #include "mmc.h" | 23 | #include "mmc.h" |
26 | #include "padmux.h" | 24 | #include "padmux.h" |
27 | 25 | ||
28 | struct mmci_card_event { | 26 | static struct mmci_platform_data mmc0_plat_data = { |
29 | struct input_dev *mmc_input; | 27 | /* |
30 | int mmc_inserted; | 28 | * Do not set ocr_mask or voltage translation function, |
31 | struct work_struct workq; | 29 | * we have a regulator we can control instead. |
32 | struct mmci_platform_data mmc0_plat_data; | 30 | */ |
31 | /* Nominally 2.85V on our platform */ | ||
32 | .f_max = 24000000, | ||
33 | .gpio_wp = -1, | ||
34 | .gpio_cd = U300_GPIO_PIN_MMC_CD, | ||
35 | .cd_invert = true, | ||
36 | .capabilities = MMC_CAP_MMC_HIGHSPEED | | ||
37 | MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, | ||
38 | #ifdef CONFIG_COH901318 | ||
39 | .dma_filter = coh901318_filter_id, | ||
40 | .dma_rx_param = (void *) U300_DMA_MMCSD_RX_TX, | ||
41 | /* Don't specify a TX channel, this RX channel is bidirectional */ | ||
42 | #endif | ||
33 | }; | 43 | }; |
34 | 44 | ||
35 | static unsigned int mmc_status(struct device *dev) | ||
36 | { | ||
37 | struct mmci_card_event *mmci_card = container_of( | ||
38 | dev->platform_data, | ||
39 | struct mmci_card_event, mmc0_plat_data); | ||
40 | |||
41 | return mmci_card->mmc_inserted; | ||
42 | } | ||
43 | |||
44 | static int mmci_callback(void *data) | ||
45 | { | ||
46 | struct mmci_card_event *mmci_card = data; | ||
47 | |||
48 | disable_irq_on_gpio_pin(U300_GPIO_PIN_MMC_CD); | ||
49 | schedule_work(&mmci_card->workq); | ||
50 | |||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | |||
55 | static ssize_t gpio_show(struct device *dev, struct device_attribute *attr, | ||
56 | char *buf) | ||
57 | { | ||
58 | struct mmci_card_event *mmci_card = container_of( | ||
59 | dev->platform_data, | ||
60 | struct mmci_card_event, mmc0_plat_data); | ||
61 | |||
62 | |||
63 | return sprintf(buf, "%d\n", !mmci_card->mmc_inserted); | ||
64 | } | ||
65 | |||
66 | static DEVICE_ATTR(mmc_inserted, S_IRUGO, gpio_show, NULL); | ||
67 | |||
68 | static void _mmci_callback(struct work_struct *ws) | ||
69 | { | ||
70 | |||
71 | struct mmci_card_event *mmci_card = container_of( | ||
72 | ws, | ||
73 | struct mmci_card_event, workq); | ||
74 | |||
75 | mdelay(20); | ||
76 | |||
77 | mmci_card->mmc_inserted = !gpio_get_value(U300_GPIO_PIN_MMC_CD); | ||
78 | |||
79 | input_report_switch(mmci_card->mmc_input, KEY_INSERT, | ||
80 | mmci_card->mmc_inserted); | ||
81 | input_sync(mmci_card->mmc_input); | ||
82 | |||
83 | pr_debug("MMC/SD card was %s\n", | ||
84 | mmci_card->mmc_inserted ? "inserted" : "removed"); | ||
85 | |||
86 | enable_irq_on_gpio_pin(U300_GPIO_PIN_MMC_CD, mmci_card->mmc_inserted); | ||
87 | } | ||
88 | |||
89 | int __devinit mmc_init(struct amba_device *adev) | 45 | int __devinit mmc_init(struct amba_device *adev) |
90 | { | 46 | { |
91 | struct mmci_card_event *mmci_card; | ||
92 | struct device *mmcsd_device = &adev->dev; | 47 | struct device *mmcsd_device = &adev->dev; |
93 | struct pmx *pmx; | 48 | struct pmx *pmx; |
94 | int ret = 0; | 49 | int ret = 0; |
95 | 50 | ||
96 | mmci_card = kzalloc(sizeof(struct mmci_card_event), GFP_KERNEL); | 51 | mmcsd_device->platform_data = &mmc0_plat_data; |
97 | if (!mmci_card) | ||
98 | return -ENOMEM; | ||
99 | |||
100 | /* | ||
101 | * Do not set ocr_mask or voltage translation function, | ||
102 | * we have a regulator we can control instead. | ||
103 | */ | ||
104 | /* Nominally 2.85V on our platform */ | ||
105 | mmci_card->mmc0_plat_data.f_max = 24000000; | ||
106 | mmci_card->mmc0_plat_data.status = mmc_status; | ||
107 | mmci_card->mmc0_plat_data.gpio_wp = -1; | ||
108 | mmci_card->mmc0_plat_data.gpio_cd = -1; | ||
109 | mmci_card->mmc0_plat_data.capabilities = MMC_CAP_MMC_HIGHSPEED | | ||
110 | MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA; | ||
111 | |||
112 | mmcsd_device->platform_data = (void *) &mmci_card->mmc0_plat_data; | ||
113 | |||
114 | INIT_WORK(&mmci_card->workq, _mmci_callback); | ||
115 | |||
116 | ret = gpio_request(U300_GPIO_PIN_MMC_CD, "MMC card detection"); | ||
117 | if (ret) { | ||
118 | printk(KERN_CRIT "Could not allocate MMC card detection " \ | ||
119 | "GPIO pin\n"); | ||
120 | goto out; | ||
121 | } | ||
122 | |||
123 | ret = gpio_direction_input(U300_GPIO_PIN_MMC_CD); | ||
124 | if (ret) { | ||
125 | printk(KERN_CRIT "Invalid GPIO pin requested\n"); | ||
126 | goto out; | ||
127 | } | ||
128 | |||
129 | ret = sysfs_create_file(&mmcsd_device->kobj, | ||
130 | &dev_attr_mmc_inserted.attr); | ||
131 | if (ret) | ||
132 | goto out; | ||
133 | |||
134 | mmci_card->mmc_input = input_allocate_device(); | ||
135 | if (!mmci_card->mmc_input) { | ||
136 | printk(KERN_CRIT "Could not allocate MMC input device\n"); | ||
137 | return -ENOMEM; | ||
138 | } | ||
139 | |||
140 | mmci_card->mmc_input->name = "MMC insert notification"; | ||
141 | mmci_card->mmc_input->id.bustype = BUS_HOST; | ||
142 | mmci_card->mmc_input->id.vendor = 0; | ||
143 | mmci_card->mmc_input->id.product = 0; | ||
144 | mmci_card->mmc_input->id.version = 0x0100; | ||
145 | mmci_card->mmc_input->dev.parent = mmcsd_device; | ||
146 | input_set_capability(mmci_card->mmc_input, EV_SW, KEY_INSERT); | ||
147 | |||
148 | /* | ||
149 | * Since this must always be compiled into the kernel, this input | ||
150 | * is never unregistered or free:ed. | ||
151 | */ | ||
152 | ret = input_register_device(mmci_card->mmc_input); | ||
153 | if (ret) { | ||
154 | input_free_device(mmci_card->mmc_input); | ||
155 | goto out; | ||
156 | } | ||
157 | |||
158 | input_set_drvdata(mmci_card->mmc_input, mmci_card); | ||
159 | 52 | ||
160 | /* | 53 | /* |
161 | * Setup padmuxing for MMC. Since this must always be | 54 | * Setup padmuxing for MMC. Since this must always be |
@@ -171,12 +64,5 @@ int __devinit mmc_init(struct amba_device *adev) | |||
171 | pr_warning("Could not activate padmuxing\n"); | 64 | pr_warning("Could not activate padmuxing\n"); |
172 | } | 65 | } |
173 | 66 | ||
174 | ret = gpio_register_callback(U300_GPIO_PIN_MMC_CD, mmci_callback, | ||
175 | mmci_card); | ||
176 | |||
177 | schedule_work(&mmci_card->workq); | ||
178 | |||
179 | printk(KERN_INFO "Registered MMC insert/remove notification\n"); | ||
180 | out: | ||
181 | return ret; | 67 | return ret; |
182 | } | 68 | } |
diff --git a/arch/arm/mach-u300/spi.c b/arch/arm/mach-u300/spi.c index 00869def5420..5767208f1c1d 100644 --- a/arch/arm/mach-u300/spi.c +++ b/arch/arm/mach-u300/spi.c | |||
@@ -11,6 +11,9 @@ | |||
11 | #include <linux/spi/spi.h> | 11 | #include <linux/spi/spi.h> |
12 | #include <linux/amba/pl022.h> | 12 | #include <linux/amba/pl022.h> |
13 | #include <linux/err.h> | 13 | #include <linux/err.h> |
14 | #include <mach/coh901318.h> | ||
15 | #include <mach/dma_channels.h> | ||
16 | |||
14 | #include "padmux.h" | 17 | #include "padmux.h" |
15 | 18 | ||
16 | /* | 19 | /* |
@@ -30,11 +33,8 @@ static void select_dummy_chip(u32 chipselect) | |||
30 | } | 33 | } |
31 | 34 | ||
32 | struct pl022_config_chip dummy_chip_info = { | 35 | struct pl022_config_chip dummy_chip_info = { |
33 | /* | 36 | /* available POLLING_TRANSFER, INTERRUPT_TRANSFER, DMA_TRANSFER */ |
34 | * available POLLING_TRANSFER and INTERRUPT_TRANSFER, | 37 | .com_mode = DMA_TRANSFER, |
35 | * DMA_TRANSFER does not work | ||
36 | */ | ||
37 | .com_mode = INTERRUPT_TRANSFER, | ||
38 | .iface = SSP_INTERFACE_MOTOROLA_SPI, | 38 | .iface = SSP_INTERFACE_MOTOROLA_SPI, |
39 | /* We can only act as master but SSP_SLAVE is possible in theory */ | 39 | /* We can only act as master but SSP_SLAVE is possible in theory */ |
40 | .hierarchy = SSP_MASTER, | 40 | .hierarchy = SSP_MASTER, |
@@ -75,8 +75,6 @@ static struct spi_board_info u300_spi_devices[] = { | |||
75 | static struct pl022_ssp_controller ssp_platform_data = { | 75 | static struct pl022_ssp_controller ssp_platform_data = { |
76 | /* If you have several SPI buses this varies, we have only bus 0 */ | 76 | /* If you have several SPI buses this varies, we have only bus 0 */ |
77 | .bus_id = 0, | 77 | .bus_id = 0, |
78 | /* Set this to 1 when we think we got DMA working */ | ||
79 | .enable_dma = 0, | ||
80 | /* | 78 | /* |
81 | * On the APP CPU GPIO 4, 5 and 6 are connected as generic | 79 | * On the APP CPU GPIO 4, 5 and 6 are connected as generic |
82 | * chip selects for SPI. (Same on U330, U335 and U365.) | 80 | * chip selects for SPI. (Same on U330, U335 and U365.) |
@@ -84,6 +82,14 @@ static struct pl022_ssp_controller ssp_platform_data = { | |||
84 | * and do padmuxing accordingly too. | 82 | * and do padmuxing accordingly too. |
85 | */ | 83 | */ |
86 | .num_chipselect = 3, | 84 | .num_chipselect = 3, |
85 | #ifdef CONFIG_COH901318 | ||
86 | .enable_dma = 1, | ||
87 | .dma_filter = coh901318_filter_id, | ||
88 | .dma_rx_param = (void *) U300_DMA_SPI_RX, | ||
89 | .dma_tx_param = (void *) U300_DMA_SPI_TX, | ||
90 | #else | ||
91 | .enable_dma = 0, | ||
92 | #endif | ||
87 | }; | 93 | }; |
88 | 94 | ||
89 | 95 | ||
@@ -109,6 +115,7 @@ void __init u300_spi_init(struct amba_device *adev) | |||
109 | } | 115 | } |
110 | 116 | ||
111 | } | 117 | } |
118 | |||
112 | void __init u300_spi_register_board_devices(void) | 119 | void __init u300_spi_register_board_devices(void) |
113 | { | 120 | { |
114 | /* Register any SPI devices */ | 121 | /* Register any SPI devices */ |