diff options
Diffstat (limited to 'arch')
498 files changed, 6864 insertions, 17255 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index e3a82775f9da..60219bf94198 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -41,10 +41,6 @@ config ARCH_HAS_ILOG2_U64 | |||
41 | bool | 41 | bool |
42 | default n | 42 | default n |
43 | 43 | ||
44 | config GENERIC_FIND_NEXT_BIT | ||
45 | bool | ||
46 | default y | ||
47 | |||
48 | config GENERIC_CALIBRATE_DELAY | 44 | config GENERIC_CALIBRATE_DELAY |
49 | bool | 45 | bool |
50 | default y | 46 | default y |
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index b1834166922d..4ac48a095f3a 100644 --- a/arch/alpha/include/asm/unistd.h +++ b/arch/alpha/include/asm/unistd.h | |||
@@ -456,10 +456,11 @@ | |||
456 | #define __NR_open_by_handle_at 498 | 456 | #define __NR_open_by_handle_at 498 |
457 | #define __NR_clock_adjtime 499 | 457 | #define __NR_clock_adjtime 499 |
458 | #define __NR_syncfs 500 | 458 | #define __NR_syncfs 500 |
459 | #define __NR_setns 501 | ||
459 | 460 | ||
460 | #ifdef __KERNEL__ | 461 | #ifdef __KERNEL__ |
461 | 462 | ||
462 | #define NR_SYSCALLS 501 | 463 | #define NR_SYSCALLS 502 |
463 | 464 | ||
464 | #define __ARCH_WANT_IPC_PARSE_VERSION | 465 | #define __ARCH_WANT_IPC_PARSE_VERSION |
465 | #define __ARCH_WANT_OLD_READDIR | 466 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index 15f999d41c75..b9c28f3f1956 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S | |||
@@ -519,6 +519,7 @@ sys_call_table: | |||
519 | .quad sys_open_by_handle_at | 519 | .quad sys_open_by_handle_at |
520 | .quad sys_clock_adjtime | 520 | .quad sys_clock_adjtime |
521 | .quad sys_syncfs /* 500 */ | 521 | .quad sys_syncfs /* 500 */ |
522 | .quad sys_setns | ||
522 | 523 | ||
523 | .size sys_call_table, . - sys_call_table | 524 | .size sys_call_table, . - sys_call_table |
524 | .type sys_call_table, @object | 525 | .type sys_call_table, @object |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 7275009686e6..9adc278a22ab 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -294,6 +294,8 @@ config ARCH_AT91 | |||
294 | bool "Atmel AT91" | 294 | bool "Atmel AT91" |
295 | select ARCH_REQUIRE_GPIOLIB | 295 | select ARCH_REQUIRE_GPIOLIB |
296 | select HAVE_CLK | 296 | select HAVE_CLK |
297 | select CLKDEV_LOOKUP | ||
298 | select ARM_PATCH_PHYS_VIRT if MMU | ||
297 | help | 299 | help |
298 | This enables support for systems based on the Atmel AT91RM9200, | 300 | This enables support for systems based on the Atmel AT91RM9200, |
299 | AT91SAM9 and AT91CAP9 processors. | 301 | AT91SAM9 and AT91CAP9 processors. |
@@ -730,16 +732,6 @@ config ARCH_S5P64X0 | |||
730 | Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440, | 732 | Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440, |
731 | SMDK6450. | 733 | SMDK6450. |
732 | 734 | ||
733 | config ARCH_S5P6442 | ||
734 | bool "Samsung S5P6442" | ||
735 | select CPU_V6 | ||
736 | select GENERIC_GPIO | ||
737 | select HAVE_CLK | ||
738 | select ARCH_USES_GETTIMEOFFSET | ||
739 | select HAVE_S3C2410_WATCHDOG if WATCHDOG | ||
740 | help | ||
741 | Samsung S5P6442 CPU based systems | ||
742 | |||
743 | config ARCH_S5PC100 | 735 | config ARCH_S5PC100 |
744 | bool "Samsung S5PC100" | 736 | bool "Samsung S5PC100" |
745 | select GENERIC_GPIO | 737 | select GENERIC_GPIO |
@@ -991,8 +983,6 @@ endif | |||
991 | 983 | ||
992 | source "arch/arm/mach-s5p64x0/Kconfig" | 984 | source "arch/arm/mach-s5p64x0/Kconfig" |
993 | 985 | ||
994 | source "arch/arm/mach-s5p6442/Kconfig" | ||
995 | |||
996 | source "arch/arm/mach-s5pc100/Kconfig" | 986 | source "arch/arm/mach-s5pc100/Kconfig" |
997 | 987 | ||
998 | source "arch/arm/mach-s5pv210/Kconfig" | 988 | source "arch/arm/mach-s5pv210/Kconfig" |
@@ -1399,7 +1389,6 @@ config NR_CPUS | |||
1399 | config HOTPLUG_CPU | 1389 | config HOTPLUG_CPU |
1400 | bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" | 1390 | bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" |
1401 | depends on SMP && HOTPLUG && EXPERIMENTAL | 1391 | depends on SMP && HOTPLUG && EXPERIMENTAL |
1402 | depends on !ARCH_MSM | ||
1403 | help | 1392 | help |
1404 | Say Y here to experiment with turning CPUs off and on. CPUs | 1393 | Say Y here to experiment with turning CPUs off and on. CPUs |
1405 | can be controlled through /sys/devices/system/cpu. | 1394 | can be controlled through /sys/devices/system/cpu. |
@@ -1420,7 +1409,7 @@ source kernel/Kconfig.preempt | |||
1420 | config HZ | 1409 | config HZ |
1421 | int | 1410 | int |
1422 | default 200 if ARCH_EBSA110 || ARCH_S3C2410 || ARCH_S5P64X0 || \ | 1411 | default 200 if ARCH_EBSA110 || ARCH_S3C2410 || ARCH_S5P64X0 || \ |
1423 | ARCH_S5P6442 || ARCH_S5PV210 || ARCH_EXYNOS4 | 1412 | ARCH_S5PV210 || ARCH_EXYNOS4 |
1424 | default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER | 1413 | default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER |
1425 | default AT91_TIMER_HZ if ARCH_AT91 | 1414 | default AT91_TIMER_HZ if ARCH_AT91 |
1426 | default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE | 1415 | default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE |
@@ -1516,6 +1505,9 @@ config ARCH_SPARSEMEM_DEFAULT | |||
1516 | config ARCH_SELECT_MEMORY_MODEL | 1505 | config ARCH_SELECT_MEMORY_MODEL |
1517 | def_bool ARCH_SPARSEMEM_ENABLE | 1506 | def_bool ARCH_SPARSEMEM_ENABLE |
1518 | 1507 | ||
1508 | config HAVE_ARCH_PFN_VALID | ||
1509 | def_bool ARCH_HAS_HOLES_MEMORYMODEL || !SPARSEMEM | ||
1510 | |||
1519 | config HIGHMEM | 1511 | config HIGHMEM |
1520 | bool "High Memory Support" | 1512 | bool "High Memory Support" |
1521 | depends on MMU | 1513 | depends on MMU |
@@ -1683,6 +1675,13 @@ endmenu | |||
1683 | 1675 | ||
1684 | menu "Boot options" | 1676 | menu "Boot options" |
1685 | 1677 | ||
1678 | config USE_OF | ||
1679 | bool "Flattened Device Tree support" | ||
1680 | select OF | ||
1681 | select OF_EARLY_FLATTREE | ||
1682 | help | ||
1683 | Include support for flattened device tree machine descriptions. | ||
1684 | |||
1686 | # Compressed boot loader in ROM. Yes, we really want to ask about | 1685 | # Compressed boot loader in ROM. Yes, we really want to ask about |
1687 | # TEXT and BSS so we preserve their values in the config files. | 1686 | # TEXT and BSS so we preserve their values in the config files. |
1688 | config ZBOOT_ROM_TEXT | 1687 | config ZBOOT_ROM_TEXT |
@@ -2021,7 +2020,7 @@ menu "Power management options" | |||
2021 | source "kernel/power/Kconfig" | 2020 | source "kernel/power/Kconfig" |
2022 | 2021 | ||
2023 | config ARCH_SUSPEND_POSSIBLE | 2022 | config ARCH_SUSPEND_POSSIBLE |
2024 | depends on !ARCH_S5P64X0 && !ARCH_S5P6442 && !ARCH_S5PC100 | 2023 | depends on !ARCH_S5P64X0 && !ARCH_S5PC100 |
2025 | depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \ | 2024 | depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \ |
2026 | CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE | 2025 | CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE |
2027 | def_bool y | 2026 | def_bool y |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 25750bcb3397..f5b2b390c8f2 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -176,7 +176,6 @@ machine-$(CONFIG_ARCH_S3C2410) := s3c2410 s3c2400 s3c2412 s3c2416 s3c2440 s3c24 | |||
176 | machine-$(CONFIG_ARCH_S3C24A0) := s3c24a0 | 176 | machine-$(CONFIG_ARCH_S3C24A0) := s3c24a0 |
177 | machine-$(CONFIG_ARCH_S3C64XX) := s3c64xx | 177 | machine-$(CONFIG_ARCH_S3C64XX) := s3c64xx |
178 | machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0 | 178 | machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0 |
179 | machine-$(CONFIG_ARCH_S5P6442) := s5p6442 | ||
180 | machine-$(CONFIG_ARCH_S5PC100) := s5pc100 | 179 | machine-$(CONFIG_ARCH_S5PC100) := s5pc100 |
181 | machine-$(CONFIG_ARCH_S5PV210) := s5pv210 | 180 | machine-$(CONFIG_ARCH_S5PV210) := s5pv210 |
182 | machine-$(CONFIG_ARCH_EXYNOS4) := exynos4 | 181 | machine-$(CONFIG_ARCH_EXYNOS4) := exynos4 |
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index ea5ee4d067f3..4b71766fb21d 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig | |||
@@ -7,7 +7,7 @@ config ARM_VIC | |||
7 | config ARM_VIC_NR | 7 | config ARM_VIC_NR |
8 | int | 8 | int |
9 | default 4 if ARCH_S5PV210 | 9 | default 4 if ARCH_S5PV210 |
10 | default 3 if ARCH_S5P6442 || ARCH_S5PC100 | 10 | default 3 if ARCH_S5PC100 |
11 | default 2 | 11 | default 2 |
12 | depends on ARM_VIC | 12 | depends on ARM_VIC |
13 | help | 13 | help |
diff --git a/arch/arm/configs/at572d940hfek_defconfig b/arch/arm/configs/at572d940hfek_defconfig deleted file mode 100644 index 1b1158ae8f82..000000000000 --- a/arch/arm/configs/at572d940hfek_defconfig +++ /dev/null | |||
@@ -1,358 +0,0 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_LOCALVERSION="-AT572D940HF" | ||
3 | # CONFIG_LOCALVERSION_AUTO is not set | ||
4 | CONFIG_SYSVIPC=y | ||
5 | CONFIG_POSIX_MQUEUE=y | ||
6 | CONFIG_BSD_PROCESS_ACCT=y | ||
7 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
8 | CONFIG_TASKSTATS=y | ||
9 | CONFIG_TASK_XACCT=y | ||
10 | CONFIG_TASK_IO_ACCOUNTING=y | ||
11 | CONFIG_AUDIT=y | ||
12 | CONFIG_CGROUPS=y | ||
13 | CONFIG_CGROUP_CPUACCT=y | ||
14 | CONFIG_CGROUP_SCHED=y | ||
15 | CONFIG_RT_GROUP_SCHED=y | ||
16 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
17 | CONFIG_RELAY=y | ||
18 | CONFIG_BLK_DEV_INITRD=y | ||
19 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
20 | CONFIG_EXPERT=y | ||
21 | CONFIG_SLAB=y | ||
22 | CONFIG_PROFILING=y | ||
23 | CONFIG_OPROFILE=m | ||
24 | CONFIG_KPROBES=y | ||
25 | CONFIG_MODULES=y | ||
26 | CONFIG_MODULE_UNLOAD=y | ||
27 | CONFIG_MODVERSIONS=y | ||
28 | CONFIG_MODULE_SRCVERSION_ALL=y | ||
29 | # CONFIG_BLK_DEV_BSG is not set | ||
30 | CONFIG_ARCH_AT91=y | ||
31 | CONFIG_ARCH_AT572D940HF=y | ||
32 | CONFIG_MACH_AT572D940HFEB=y | ||
33 | CONFIG_AT91_PROGRAMMABLE_CLOCKS=y | ||
34 | CONFIG_NO_HZ=y | ||
35 | CONFIG_HIGH_RES_TIMERS=y | ||
36 | CONFIG_PREEMPT=y | ||
37 | CONFIG_CMDLINE="mem=48M console=ttyS0 initrd=0x21100000,3145728 root=/dev/ram0 rw ip=172.16.1.181" | ||
38 | CONFIG_KEXEC=y | ||
39 | CONFIG_FPE_NWFPE=y | ||
40 | CONFIG_FPE_NWFPE_XP=y | ||
41 | CONFIG_NET=y | ||
42 | CONFIG_PACKET=m | ||
43 | CONFIG_UNIX=y | ||
44 | CONFIG_INET=y | ||
45 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
46 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
47 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
48 | # CONFIG_INET_LRO is not set | ||
49 | # CONFIG_INET_DIAG is not set | ||
50 | # CONFIG_IPV6 is not set | ||
51 | CONFIG_NET_PKTGEN=m | ||
52 | CONFIG_NET_TCPPROBE=m | ||
53 | CONFIG_CAN=m | ||
54 | CONFIG_CAN_RAW=m | ||
55 | CONFIG_CAN_BCM=m | ||
56 | CONFIG_CAN_VCAN=m | ||
57 | CONFIG_CAN_DEBUG_DEVICES=y | ||
58 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
59 | CONFIG_CONNECTOR=m | ||
60 | CONFIG_MTD=m | ||
61 | CONFIG_MTD_DEBUG=y | ||
62 | CONFIG_MTD_DEBUG_VERBOSE=1 | ||
63 | CONFIG_MTD_CONCAT=m | ||
64 | CONFIG_MTD_PARTITIONS=y | ||
65 | CONFIG_MTD_CHAR=m | ||
66 | CONFIG_MTD_BLOCK=m | ||
67 | CONFIG_MTD_BLOCK_RO=m | ||
68 | CONFIG_FTL=m | ||
69 | CONFIG_NFTL=m | ||
70 | CONFIG_NFTL_RW=y | ||
71 | CONFIG_INFTL=m | ||
72 | CONFIG_RFD_FTL=m | ||
73 | CONFIG_SSFDC=m | ||
74 | CONFIG_MTD_OOPS=m | ||
75 | CONFIG_MTD_CFI=m | ||
76 | CONFIG_MTD_JEDECPROBE=m | ||
77 | CONFIG_MTD_CFI_INTELEXT=m | ||
78 | CONFIG_MTD_CFI_AMDSTD=m | ||
79 | CONFIG_MTD_CFI_STAA=m | ||
80 | CONFIG_MTD_ROM=m | ||
81 | CONFIG_MTD_ABSENT=m | ||
82 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
83 | CONFIG_MTD_PHYSMAP=m | ||
84 | CONFIG_MTD_PLATRAM=m | ||
85 | CONFIG_MTD_DATAFLASH=m | ||
86 | CONFIG_MTD_M25P80=m | ||
87 | CONFIG_MTD_SLRAM=m | ||
88 | CONFIG_MTD_PHRAM=m | ||
89 | CONFIG_MTD_MTDRAM=m | ||
90 | CONFIG_MTD_BLOCK2MTD=m | ||
91 | CONFIG_MTD_NAND=m | ||
92 | CONFIG_MTD_NAND_VERIFY_WRITE=y | ||
93 | CONFIG_MTD_NAND_DISKONCHIP=m | ||
94 | CONFIG_MTD_NAND_NANDSIM=m | ||
95 | CONFIG_MTD_NAND_PLATFORM=m | ||
96 | CONFIG_MTD_ALAUDA=m | ||
97 | CONFIG_MTD_UBI=m | ||
98 | CONFIG_MTD_UBI_GLUEBI=m | ||
99 | CONFIG_BLK_DEV_LOOP=y | ||
100 | CONFIG_BLK_DEV_CRYPTOLOOP=m | ||
101 | CONFIG_BLK_DEV_NBD=m | ||
102 | CONFIG_BLK_DEV_RAM=y | ||
103 | CONFIG_BLK_DEV_RAM_SIZE=65536 | ||
104 | CONFIG_ATMEL_TCLIB=y | ||
105 | CONFIG_ATMEL_SSC=m | ||
106 | CONFIG_SENSORS_TSL2550=m | ||
107 | CONFIG_DS1682=m | ||
108 | CONFIG_RAID_ATTRS=m | ||
109 | CONFIG_SCSI=m | ||
110 | CONFIG_SCSI_TGT=m | ||
111 | # CONFIG_SCSI_PROC_FS is not set | ||
112 | CONFIG_BLK_DEV_SD=m | ||
113 | CONFIG_BLK_DEV_SR=m | ||
114 | CONFIG_CHR_DEV_SG=m | ||
115 | CONFIG_CHR_DEV_SCH=m | ||
116 | CONFIG_SCSI_MULTI_LUN=y | ||
117 | CONFIG_SCSI_CONSTANTS=y | ||
118 | CONFIG_SCSI_LOGGING=y | ||
119 | CONFIG_SCSI_SCAN_ASYNC=y | ||
120 | CONFIG_SCSI_ISCSI_ATTRS=m | ||
121 | CONFIG_NETDEVICES=y | ||
122 | CONFIG_DUMMY=m | ||
123 | CONFIG_BONDING=m | ||
124 | CONFIG_MACVLAN=m | ||
125 | CONFIG_EQUALIZER=m | ||
126 | CONFIG_TUN=m | ||
127 | CONFIG_VETH=m | ||
128 | CONFIG_PHYLIB=y | ||
129 | CONFIG_MARVELL_PHY=m | ||
130 | CONFIG_DAVICOM_PHY=m | ||
131 | CONFIG_QSEMI_PHY=m | ||
132 | CONFIG_LXT_PHY=m | ||
133 | CONFIG_CICADA_PHY=m | ||
134 | CONFIG_VITESSE_PHY=m | ||
135 | CONFIG_SMSC_PHY=m | ||
136 | CONFIG_BROADCOM_PHY=m | ||
137 | CONFIG_ICPLUS_PHY=m | ||
138 | CONFIG_MDIO_BITBANG=m | ||
139 | CONFIG_NET_ETHERNET=y | ||
140 | # CONFIG_NETDEV_1000 is not set | ||
141 | # CONFIG_NETDEV_10000 is not set | ||
142 | CONFIG_USB_ZD1201=m | ||
143 | CONFIG_HOSTAP=m | ||
144 | CONFIG_HOSTAP_FIRMWARE=y | ||
145 | CONFIG_HOSTAP_FIRMWARE_NVRAM=y | ||
146 | CONFIG_USB_CATC=m | ||
147 | CONFIG_USB_KAWETH=m | ||
148 | CONFIG_USB_PEGASUS=m | ||
149 | CONFIG_USB_RTL8150=m | ||
150 | CONFIG_USB_USBNET=m | ||
151 | CONFIG_USB_NET_DM9601=m | ||
152 | CONFIG_USB_NET_GL620A=m | ||
153 | CONFIG_USB_NET_PLUSB=m | ||
154 | CONFIG_USB_NET_MCS7830=m | ||
155 | CONFIG_USB_NET_RNDIS_HOST=m | ||
156 | CONFIG_USB_ALI_M5632=y | ||
157 | CONFIG_USB_AN2720=y | ||
158 | CONFIG_USB_EPSON2888=y | ||
159 | CONFIG_USB_KC2190=y | ||
160 | # CONFIG_USB_NET_ZAURUS is not set | ||
161 | CONFIG_INPUT_MOUSEDEV=m | ||
162 | CONFIG_INPUT_EVDEV=m | ||
163 | CONFIG_INPUT_EVBUG=m | ||
164 | CONFIG_KEYBOARD_LKKBD=m | ||
165 | CONFIG_KEYBOARD_GPIO=m | ||
166 | CONFIG_KEYBOARD_NEWTON=m | ||
167 | CONFIG_KEYBOARD_STOWAWAY=m | ||
168 | CONFIG_KEYBOARD_SUNKBD=m | ||
169 | CONFIG_KEYBOARD_XTKBD=m | ||
170 | CONFIG_MOUSE_PS2=m | ||
171 | CONFIG_MOUSE_SERIAL=m | ||
172 | CONFIG_MOUSE_APPLETOUCH=m | ||
173 | CONFIG_MOUSE_VSXXXAA=m | ||
174 | CONFIG_MOUSE_GPIO=m | ||
175 | CONFIG_INPUT_MISC=y | ||
176 | CONFIG_INPUT_UINPUT=m | ||
177 | CONFIG_SERIO_SERPORT=m | ||
178 | CONFIG_SERIO_RAW=m | ||
179 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
180 | CONFIG_SERIAL_NONSTANDARD=y | ||
181 | CONFIG_N_HDLC=m | ||
182 | CONFIG_SPECIALIX=m | ||
183 | CONFIG_STALDRV=y | ||
184 | CONFIG_SERIAL_ATMEL=y | ||
185 | CONFIG_SERIAL_ATMEL_CONSOLE=y | ||
186 | CONFIG_IPMI_HANDLER=m | ||
187 | CONFIG_IPMI_DEVICE_INTERFACE=m | ||
188 | CONFIG_IPMI_SI=m | ||
189 | CONFIG_IPMI_WATCHDOG=m | ||
190 | CONFIG_IPMI_POWEROFF=m | ||
191 | CONFIG_HW_RANDOM=y | ||
192 | CONFIG_R3964=m | ||
193 | CONFIG_RAW_DRIVER=m | ||
194 | CONFIG_TCG_TPM=m | ||
195 | CONFIG_TCG_NSC=m | ||
196 | CONFIG_TCG_ATMEL=m | ||
197 | CONFIG_I2C=m | ||
198 | CONFIG_I2C_CHARDEV=m | ||
199 | CONFIG_SPI=y | ||
200 | CONFIG_SPI_ATMEL=y | ||
201 | CONFIG_SPI_BITBANG=m | ||
202 | CONFIG_SPI_SPIDEV=m | ||
203 | # CONFIG_HWMON is not set | ||
204 | # CONFIG_VGA_CONSOLE is not set | ||
205 | CONFIG_SOUND=m | ||
206 | CONFIG_SND=m | ||
207 | CONFIG_SND_SEQUENCER=m | ||
208 | CONFIG_SND_SEQ_DUMMY=m | ||
209 | CONFIG_SND_MIXER_OSS=m | ||
210 | CONFIG_SND_PCM_OSS=m | ||
211 | # CONFIG_SND_PCM_OSS_PLUGINS is not set | ||
212 | CONFIG_SND_SEQUENCER_OSS=y | ||
213 | CONFIG_SND_DYNAMIC_MINORS=y | ||
214 | # CONFIG_SND_VERBOSE_PROCFS is not set | ||
215 | CONFIG_SND_DUMMY=m | ||
216 | CONFIG_SND_VIRMIDI=m | ||
217 | CONFIG_SND_USB_AUDIO=m | ||
218 | CONFIG_SND_USB_CAIAQ=m | ||
219 | CONFIG_SND_USB_CAIAQ_INPUT=y | ||
220 | CONFIG_HID=m | ||
221 | CONFIG_HIDRAW=y | ||
222 | CONFIG_USB_HID=m | ||
223 | CONFIG_USB_HIDDEV=y | ||
224 | CONFIG_USB_KBD=m | ||
225 | CONFIG_USB_MOUSE=m | ||
226 | CONFIG_HID_A4TECH=m | ||
227 | CONFIG_HID_APPLE=m | ||
228 | CONFIG_HID_BELKIN=m | ||
229 | CONFIG_HID_CHERRY=m | ||
230 | CONFIG_HID_CHICONY=m | ||
231 | CONFIG_HID_CYPRESS=m | ||
232 | CONFIG_HID_EZKEY=m | ||
233 | CONFIG_HID_GYRATION=m | ||
234 | CONFIG_HID_LOGITECH=m | ||
235 | CONFIG_HID_MICROSOFT=m | ||
236 | CONFIG_HID_MONTEREY=m | ||
237 | CONFIG_HID_PANTHERLORD=m | ||
238 | CONFIG_HID_PETALYNX=m | ||
239 | CONFIG_HID_SAMSUNG=m | ||
240 | CONFIG_HID_SONY=m | ||
241 | CONFIG_HID_SUNPLUS=m | ||
242 | CONFIG_USB=y | ||
243 | CONFIG_USB_DEVICEFS=y | ||
244 | # CONFIG_USB_DEVICE_CLASS is not set | ||
245 | CONFIG_USB_DYNAMIC_MINORS=y | ||
246 | CONFIG_USB_MON=y | ||
247 | CONFIG_USB_OHCI_HCD=y | ||
248 | CONFIG_USB_STORAGE=m | ||
249 | CONFIG_USB_STORAGE_DATAFAB=m | ||
250 | CONFIG_USB_STORAGE_FREECOM=m | ||
251 | CONFIG_USB_STORAGE_ISD200=m | ||
252 | CONFIG_USB_STORAGE_USBAT=m | ||
253 | CONFIG_USB_STORAGE_SDDR09=m | ||
254 | CONFIG_USB_STORAGE_SDDR55=m | ||
255 | CONFIG_USB_STORAGE_JUMPSHOT=m | ||
256 | CONFIG_USB_STORAGE_ALAUDA=m | ||
257 | CONFIG_USB_STORAGE_KARMA=m | ||
258 | CONFIG_USB_LIBUSUAL=y | ||
259 | CONFIG_USB_SERIAL=m | ||
260 | CONFIG_USB_EZUSB=y | ||
261 | CONFIG_USB_SERIAL_GENERIC=y | ||
262 | CONFIG_USB_SERIAL_PL2303=m | ||
263 | CONFIG_USB_SERIAL_SPCP8X5=m | ||
264 | CONFIG_USB_SERIAL_DEBUG=m | ||
265 | CONFIG_USB_EMI62=m | ||
266 | CONFIG_USB_EMI26=m | ||
267 | CONFIG_USB_ADUTUX=m | ||
268 | CONFIG_USB_TEST=m | ||
269 | CONFIG_USB_GADGET=m | ||
270 | CONFIG_USB_GADGET_DEBUG_FILES=y | ||
271 | CONFIG_USB_GADGET_DEBUG_FS=y | ||
272 | CONFIG_USB_ZERO=m | ||
273 | CONFIG_USB_ETH=m | ||
274 | CONFIG_USB_GADGETFS=m | ||
275 | CONFIG_USB_FILE_STORAGE=m | ||
276 | CONFIG_USB_G_SERIAL=m | ||
277 | CONFIG_USB_MIDI_GADGET=m | ||
278 | CONFIG_MMC=y | ||
279 | CONFIG_SDIO_UART=m | ||
280 | CONFIG_MMC_AT91=m | ||
281 | CONFIG_MMC_SPI=m | ||
282 | CONFIG_NEW_LEDS=y | ||
283 | CONFIG_LEDS_CLASS=m | ||
284 | CONFIG_LEDS_GPIO=m | ||
285 | CONFIG_LEDS_TRIGGERS=y | ||
286 | CONFIG_LEDS_TRIGGER_TIMER=m | ||
287 | CONFIG_LEDS_TRIGGER_HEARTBEAT=m | ||
288 | CONFIG_RTC_CLASS=y | ||
289 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y | ||
290 | CONFIG_RTC_DRV_DS1307=m | ||
291 | CONFIG_RTC_DRV_DS1305=y | ||
292 | CONFIG_EXT2_FS=y | ||
293 | CONFIG_EXT2_FS_XATTR=y | ||
294 | CONFIG_EXT2_FS_POSIX_ACL=y | ||
295 | CONFIG_EXT2_FS_SECURITY=y | ||
296 | CONFIG_EXT3_FS=y | ||
297 | CONFIG_EXT3_FS_POSIX_ACL=y | ||
298 | CONFIG_EXT3_FS_SECURITY=y | ||
299 | CONFIG_JBD_DEBUG=y | ||
300 | CONFIG_REISERFS_FS=m | ||
301 | CONFIG_REISERFS_CHECK=y | ||
302 | CONFIG_REISERFS_PROC_INFO=y | ||
303 | CONFIG_REISERFS_FS_XATTR=y | ||
304 | CONFIG_REISERFS_FS_POSIX_ACL=y | ||
305 | CONFIG_REISERFS_FS_SECURITY=y | ||
306 | CONFIG_INOTIFY=y | ||
307 | CONFIG_FUSE_FS=m | ||
308 | CONFIG_MSDOS_FS=m | ||
309 | CONFIG_VFAT_FS=y | ||
310 | CONFIG_NTFS_FS=m | ||
311 | CONFIG_NTFS_RW=y | ||
312 | CONFIG_TMPFS=y | ||
313 | CONFIG_TMPFS_POSIX_ACL=y | ||
314 | CONFIG_JFFS2_FS=m | ||
315 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
316 | CONFIG_JFFS2_LZO=y | ||
317 | CONFIG_JFFS2_CMODE_FAVOURLZO=y | ||
318 | CONFIG_CRAMFS=m | ||
319 | CONFIG_NFS_FS=m | ||
320 | CONFIG_NFS_V3=y | ||
321 | CONFIG_NFS_V3_ACL=y | ||
322 | CONFIG_NFS_V4=y | ||
323 | CONFIG_NFSD=m | ||
324 | CONFIG_NFSD_V3_ACL=y | ||
325 | CONFIG_NFSD_V4=y | ||
326 | CONFIG_CIFS=m | ||
327 | CONFIG_CIFS_WEAK_PW_HASH=y | ||
328 | CONFIG_PARTITION_ADVANCED=y | ||
329 | CONFIG_MAC_PARTITION=y | ||
330 | CONFIG_BSD_DISKLABEL=y | ||
331 | CONFIG_MINIX_SUBPARTITION=y | ||
332 | CONFIG_SOLARIS_X86_PARTITION=y | ||
333 | CONFIG_UNIXWARE_DISKLABEL=y | ||
334 | CONFIG_LDM_PARTITION=y | ||
335 | CONFIG_LDM_DEBUG=y | ||
336 | CONFIG_SGI_PARTITION=y | ||
337 | CONFIG_SUN_PARTITION=y | ||
338 | CONFIG_NLS_DEFAULT="cp437" | ||
339 | CONFIG_NLS_CODEPAGE_437=y | ||
340 | CONFIG_NLS_CODEPAGE_850=m | ||
341 | CONFIG_NLS_ASCII=y | ||
342 | CONFIG_NLS_ISO8859_1=y | ||
343 | CONFIG_NLS_UTF8=m | ||
344 | CONFIG_DLM=m | ||
345 | CONFIG_PRINTK_TIME=y | ||
346 | CONFIG_MAGIC_SYSRQ=y | ||
347 | CONFIG_UNUSED_SYMBOLS=y | ||
348 | CONFIG_DEBUG_FS=y | ||
349 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
350 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
351 | CONFIG_CRYPTO=y | ||
352 | CONFIG_CRYPTO_GF128MUL=m | ||
353 | CONFIG_CRYPTO_HMAC=y | ||
354 | CONFIG_CRYPTO_MD5=y | ||
355 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
356 | # CONFIG_CRYPTO_HW is not set | ||
357 | CONFIG_CRC_CCITT=m | ||
358 | CONFIG_CRC16=m | ||
diff --git a/arch/arm/configs/at91sam9261ek_defconfig b/arch/arm/configs/at91sam9261_defconfig index b46025b66b64..ade6b2f23116 100644 --- a/arch/arm/configs/at91sam9261ek_defconfig +++ b/arch/arm/configs/at91sam9261_defconfig | |||
@@ -1,9 +1,13 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | 1 | CONFIG_EXPERIMENTAL=y |
2 | # CONFIG_LOCALVERSION_AUTO is not set | 2 | # CONFIG_LOCALVERSION_AUTO is not set |
3 | CONFIG_KERNEL_LZMA=y | ||
3 | # CONFIG_SWAP is not set | 4 | # CONFIG_SWAP is not set |
4 | CONFIG_SYSVIPC=y | 5 | CONFIG_SYSVIPC=y |
6 | CONFIG_IKCONFIG=y | ||
7 | CONFIG_IKCONFIG_PROC=y | ||
5 | CONFIG_LOG_BUF_SHIFT=14 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
6 | CONFIG_BLK_DEV_INITRD=y | 9 | CONFIG_NAMESPACES=y |
10 | CONFIG_EMBEDDED=y | ||
7 | CONFIG_SLAB=y | 11 | CONFIG_SLAB=y |
8 | CONFIG_MODULES=y | 12 | CONFIG_MODULES=y |
9 | CONFIG_MODULE_UNLOAD=y | 13 | CONFIG_MODULE_UNLOAD=y |
@@ -15,18 +19,27 @@ CONFIG_ARCH_AT91SAM9261=y | |||
15 | CONFIG_MACH_AT91SAM9261EK=y | 19 | CONFIG_MACH_AT91SAM9261EK=y |
16 | CONFIG_AT91_PROGRAMMABLE_CLOCKS=y | 20 | CONFIG_AT91_PROGRAMMABLE_CLOCKS=y |
17 | # CONFIG_ARM_THUMB is not set | 21 | # CONFIG_ARM_THUMB is not set |
22 | CONFIG_AEABI=y | ||
23 | # CONFIG_OABI_COMPAT is not set | ||
18 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 24 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
19 | CONFIG_ZBOOT_ROM_BSS=0x0 | 25 | CONFIG_ZBOOT_ROM_BSS=0x0 |
20 | CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" | 26 | CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" |
21 | CONFIG_FPE_NWFPE=y | 27 | CONFIG_AUTO_ZRELADDR=y |
28 | CONFIG_VFP=y | ||
29 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
22 | CONFIG_NET=y | 30 | CONFIG_NET=y |
23 | CONFIG_PACKET=y | 31 | CONFIG_PACKET=y |
24 | CONFIG_UNIX=y | 32 | CONFIG_UNIX=y |
25 | CONFIG_INET=y | 33 | CONFIG_INET=y |
34 | CONFIG_IP_MULTICAST=y | ||
26 | CONFIG_IP_PNP=y | 35 | CONFIG_IP_PNP=y |
36 | CONFIG_IP_PNP_DHCP=y | ||
27 | CONFIG_IP_PNP_BOOTP=y | 37 | CONFIG_IP_PNP_BOOTP=y |
28 | # CONFIG_INET_LRO is not set | 38 | # CONFIG_INET_LRO is not set |
29 | # CONFIG_IPV6 is not set | 39 | # CONFIG_IPV6 is not set |
40 | CONFIG_CFG80211=y | ||
41 | CONFIG_LIB80211=y | ||
42 | CONFIG_MAC80211=y | ||
30 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 43 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
31 | CONFIG_MTD=y | 44 | CONFIG_MTD=y |
32 | CONFIG_MTD_PARTITIONS=y | 45 | CONFIG_MTD_PARTITIONS=y |
@@ -34,8 +47,12 @@ CONFIG_MTD_CMDLINE_PARTS=y | |||
34 | CONFIG_MTD_BLOCK=y | 47 | CONFIG_MTD_BLOCK=y |
35 | CONFIG_MTD_NAND=y | 48 | CONFIG_MTD_NAND=y |
36 | CONFIG_MTD_NAND_ATMEL=y | 49 | CONFIG_MTD_NAND_ATMEL=y |
50 | CONFIG_MTD_UBI=y | ||
51 | CONFIG_MTD_UBI_GLUEBI=y | ||
37 | CONFIG_BLK_DEV_RAM=y | 52 | CONFIG_BLK_DEV_RAM=y |
38 | CONFIG_BLK_DEV_RAM_SIZE=8192 | 53 | CONFIG_BLK_DEV_RAM_SIZE=8192 |
54 | CONFIG_MISC_DEVICES=y | ||
55 | CONFIG_ATMEL_TCLIB=y | ||
39 | CONFIG_ATMEL_SSC=y | 56 | CONFIG_ATMEL_SSC=y |
40 | CONFIG_SCSI=y | 57 | CONFIG_SCSI=y |
41 | CONFIG_BLK_DEV_SD=y | 58 | CONFIG_BLK_DEV_SD=y |
@@ -45,12 +62,27 @@ CONFIG_NET_ETHERNET=y | |||
45 | CONFIG_DM9000=y | 62 | CONFIG_DM9000=y |
46 | # CONFIG_NETDEV_1000 is not set | 63 | # CONFIG_NETDEV_1000 is not set |
47 | # CONFIG_NETDEV_10000 is not set | 64 | # CONFIG_NETDEV_10000 is not set |
65 | CONFIG_USB_ZD1201=m | ||
66 | CONFIG_RTL8187=m | ||
67 | CONFIG_LIBERTAS=m | ||
68 | CONFIG_LIBERTAS_USB=m | ||
69 | CONFIG_LIBERTAS_SDIO=m | ||
70 | CONFIG_LIBERTAS_SPI=m | ||
71 | CONFIG_RT2X00=m | ||
72 | CONFIG_RT2500USB=m | ||
73 | CONFIG_RT73USB=m | ||
74 | CONFIG_ZD1211RW=m | ||
75 | CONFIG_INPUT_POLLDEV=m | ||
48 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 76 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
77 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 | ||
78 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | ||
79 | CONFIG_INPUT_EVDEV=y | ||
49 | # CONFIG_KEYBOARD_ATKBD is not set | 80 | # CONFIG_KEYBOARD_ATKBD is not set |
50 | CONFIG_KEYBOARD_GPIO=y | 81 | CONFIG_KEYBOARD_GPIO=y |
51 | # CONFIG_INPUT_MOUSE is not set | 82 | # CONFIG_INPUT_MOUSE is not set |
52 | CONFIG_INPUT_TOUCHSCREEN=y | 83 | CONFIG_INPUT_TOUCHSCREEN=y |
53 | CONFIG_TOUCHSCREEN_ADS7846=y | 84 | CONFIG_TOUCHSCREEN_ADS7846=y |
85 | CONFIG_DEVPTS_MULTIPLE_INSTANCES=y | ||
54 | CONFIG_SERIAL_ATMEL=y | 86 | CONFIG_SERIAL_ATMEL=y |
55 | CONFIG_SERIAL_ATMEL_CONSOLE=y | 87 | CONFIG_SERIAL_ATMEL_CONSOLE=y |
56 | CONFIG_HW_RANDOM=y | 88 | CONFIG_HW_RANDOM=y |
@@ -65,31 +97,62 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
65 | CONFIG_AT91SAM9X_WATCHDOG=y | 97 | CONFIG_AT91SAM9X_WATCHDOG=y |
66 | CONFIG_FB=y | 98 | CONFIG_FB=y |
67 | CONFIG_FB_ATMEL=y | 99 | CONFIG_FB_ATMEL=y |
68 | # CONFIG_VGA_CONSOLE is not set | 100 | CONFIG_BACKLIGHT_LCD_SUPPORT=y |
101 | # CONFIG_LCD_CLASS_DEVICE is not set | ||
102 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
103 | CONFIG_BACKLIGHT_ATMEL_LCDC=y | ||
104 | # CONFIG_BACKLIGHT_GENERIC is not set | ||
105 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
106 | CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y | ||
107 | CONFIG_LOGO=y | ||
108 | CONFIG_SOUND=y | ||
109 | CONFIG_SND=y | ||
110 | CONFIG_SND_SEQUENCER=y | ||
111 | CONFIG_SND_MIXER_OSS=y | ||
112 | CONFIG_SND_PCM_OSS=y | ||
113 | # CONFIG_SND_SUPPORT_OLD_API is not set | ||
114 | # CONFIG_SND_VERBOSE_PROCFS is not set | ||
115 | # CONFIG_SND_DRIVERS is not set | ||
116 | # CONFIG_SND_ARM is not set | ||
117 | CONFIG_SND_AT73C213=y | ||
118 | CONFIG_SND_USB_AUDIO=m | ||
69 | # CONFIG_USB_HID is not set | 119 | # CONFIG_USB_HID is not set |
70 | CONFIG_USB=y | 120 | CONFIG_USB=y |
71 | CONFIG_USB_DEVICEFS=y | 121 | CONFIG_USB_DEVICEFS=y |
72 | CONFIG_USB_MON=y | ||
73 | CONFIG_USB_OHCI_HCD=y | 122 | CONFIG_USB_OHCI_HCD=y |
74 | CONFIG_USB_STORAGE=y | 123 | CONFIG_USB_STORAGE=y |
75 | CONFIG_USB_STORAGE_DEBUG=y | ||
76 | CONFIG_USB_GADGET=y | 124 | CONFIG_USB_GADGET=y |
77 | CONFIG_USB_ZERO=m | 125 | CONFIG_USB_ZERO=m |
126 | CONFIG_USB_ETH=m | ||
78 | CONFIG_USB_GADGETFS=m | 127 | CONFIG_USB_GADGETFS=m |
79 | CONFIG_USB_FILE_STORAGE=m | 128 | CONFIG_USB_FILE_STORAGE=m |
80 | CONFIG_USB_G_SERIAL=m | 129 | CONFIG_USB_G_SERIAL=m |
81 | CONFIG_MMC=y | 130 | CONFIG_MMC=y |
82 | CONFIG_MMC_AT91=m | 131 | CONFIG_MMC_AT91=m |
132 | CONFIG_NEW_LEDS=y | ||
133 | CONFIG_LEDS_CLASS=y | ||
134 | CONFIG_LEDS_GPIO=y | ||
135 | CONFIG_LEDS_TRIGGERS=y | ||
136 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
137 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
138 | CONFIG_LEDS_TRIGGER_GPIO=y | ||
83 | CONFIG_RTC_CLASS=y | 139 | CONFIG_RTC_CLASS=y |
84 | CONFIG_RTC_DRV_AT91SAM9=y | 140 | CONFIG_RTC_DRV_AT91SAM9=y |
85 | CONFIG_EXT2_FS=y | 141 | CONFIG_MSDOS_FS=y |
86 | CONFIG_INOTIFY=y | ||
87 | CONFIG_VFAT_FS=y | 142 | CONFIG_VFAT_FS=y |
88 | CONFIG_TMPFS=y | 143 | CONFIG_TMPFS=y |
89 | CONFIG_CRAMFS=y | 144 | CONFIG_UBIFS_FS=y |
145 | CONFIG_UBIFS_FS_ADVANCED_COMPR=y | ||
146 | CONFIG_SQUASHFS=y | ||
147 | CONFIG_SQUASHFS_LZO=y | ||
148 | CONFIG_SQUASHFS_XZ=y | ||
149 | CONFIG_NFS_FS=y | ||
150 | CONFIG_NFS_V3=y | ||
151 | CONFIG_ROOT_NFS=y | ||
90 | CONFIG_NLS_CODEPAGE_437=y | 152 | CONFIG_NLS_CODEPAGE_437=y |
91 | CONFIG_NLS_CODEPAGE_850=y | 153 | CONFIG_NLS_CODEPAGE_850=y |
92 | CONFIG_NLS_ISO8859_1=y | 154 | CONFIG_NLS_ISO8859_1=y |
93 | CONFIG_DEBUG_KERNEL=y | 155 | CONFIG_NLS_ISO8859_15=y |
94 | CONFIG_DEBUG_USER=y | 156 | CONFIG_NLS_UTF8=y |
95 | CONFIG_DEBUG_LL=y | 157 | CONFIG_FTRACE=y |
158 | CONFIG_CRC_CCITT=m | ||
diff --git a/arch/arm/configs/at91sam9263ek_defconfig b/arch/arm/configs/at91sam9263_defconfig index 8a04d6f4e065..1cf96264cba1 100644 --- a/arch/arm/configs/at91sam9263ek_defconfig +++ b/arch/arm/configs/at91sam9263_defconfig | |||
@@ -1,9 +1,13 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | 1 | CONFIG_EXPERIMENTAL=y |
2 | # CONFIG_LOCALVERSION_AUTO is not set | 2 | # CONFIG_LOCALVERSION_AUTO is not set |
3 | CONFIG_KERNEL_LZMA=y | ||
3 | # CONFIG_SWAP is not set | 4 | # CONFIG_SWAP is not set |
4 | CONFIG_SYSVIPC=y | 5 | CONFIG_SYSVIPC=y |
6 | CONFIG_IKCONFIG=y | ||
7 | CONFIG_IKCONFIG_PROC=y | ||
5 | CONFIG_LOG_BUF_SHIFT=14 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
6 | CONFIG_BLK_DEV_INITRD=y | 9 | CONFIG_NAMESPACES=y |
10 | CONFIG_EMBEDDED=y | ||
7 | CONFIG_SLAB=y | 11 | CONFIG_SLAB=y |
8 | CONFIG_MODULES=y | 12 | CONFIG_MODULES=y |
9 | CONFIG_MODULE_UNLOAD=y | 13 | CONFIG_MODULE_UNLOAD=y |
@@ -13,53 +17,81 @@ CONFIG_MODULE_UNLOAD=y | |||
13 | CONFIG_ARCH_AT91=y | 17 | CONFIG_ARCH_AT91=y |
14 | CONFIG_ARCH_AT91SAM9263=y | 18 | CONFIG_ARCH_AT91SAM9263=y |
15 | CONFIG_MACH_AT91SAM9263EK=y | 19 | CONFIG_MACH_AT91SAM9263EK=y |
20 | CONFIG_MACH_USB_A9263=y | ||
21 | CONFIG_MACH_NEOCORE926=y | ||
16 | CONFIG_MTD_AT91_DATAFLASH_CARD=y | 22 | CONFIG_MTD_AT91_DATAFLASH_CARD=y |
17 | # CONFIG_ARM_THUMB is not set | 23 | # CONFIG_ARM_THUMB is not set |
24 | CONFIG_AEABI=y | ||
25 | # CONFIG_OABI_COMPAT is not set | ||
18 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 26 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
19 | CONFIG_ZBOOT_ROM_BSS=0x0 | 27 | CONFIG_ZBOOT_ROM_BSS=0x0 |
20 | CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" | 28 | CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" |
21 | CONFIG_FPE_NWFPE=y | 29 | CONFIG_AUTO_ZRELADDR=y |
22 | CONFIG_NET=y | 30 | CONFIG_NET=y |
23 | CONFIG_PACKET=y | 31 | CONFIG_PACKET=y |
24 | CONFIG_UNIX=y | 32 | CONFIG_UNIX=y |
33 | CONFIG_NET_KEY=y | ||
25 | CONFIG_INET=y | 34 | CONFIG_INET=y |
35 | CONFIG_IP_MULTICAST=y | ||
36 | CONFIG_IP_ADVANCED_ROUTER=y | ||
37 | CONFIG_IP_ROUTE_VERBOSE=y | ||
26 | CONFIG_IP_PNP=y | 38 | CONFIG_IP_PNP=y |
39 | CONFIG_IP_PNP_DHCP=y | ||
27 | CONFIG_IP_PNP_BOOTP=y | 40 | CONFIG_IP_PNP_BOOTP=y |
28 | CONFIG_IP_PNP_RARP=y | 41 | CONFIG_IP_PNP_RARP=y |
42 | CONFIG_NET_IPIP=y | ||
43 | CONFIG_IP_MROUTE=y | ||
44 | CONFIG_IP_PIMSM_V1=y | ||
45 | CONFIG_IP_PIMSM_V2=y | ||
29 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | 46 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set |
30 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 47 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
31 | # CONFIG_INET_XFRM_MODE_BEET is not set | 48 | # CONFIG_INET_XFRM_MODE_BEET is not set |
32 | # CONFIG_INET_LRO is not set | 49 | # CONFIG_INET_LRO is not set |
33 | # CONFIG_INET_DIAG is not set | 50 | # CONFIG_INET_DIAG is not set |
34 | # CONFIG_IPV6 is not set | 51 | CONFIG_IPV6=y |
35 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 52 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
36 | CONFIG_MTD=y | 53 | CONFIG_MTD=y |
37 | CONFIG_MTD_PARTITIONS=y | 54 | CONFIG_MTD_PARTITIONS=y |
38 | CONFIG_MTD_CMDLINE_PARTS=y | 55 | CONFIG_MTD_CMDLINE_PARTS=y |
39 | CONFIG_MTD_CHAR=y | 56 | CONFIG_MTD_CHAR=y |
40 | CONFIG_MTD_BLOCK=y | 57 | CONFIG_MTD_BLOCK=y |
58 | CONFIG_NFTL=y | ||
59 | CONFIG_NFTL_RW=y | ||
41 | CONFIG_MTD_DATAFLASH=y | 60 | CONFIG_MTD_DATAFLASH=y |
61 | CONFIG_MTD_BLOCK2MTD=y | ||
42 | CONFIG_MTD_NAND=y | 62 | CONFIG_MTD_NAND=y |
43 | CONFIG_MTD_NAND_ATMEL=y | 63 | CONFIG_MTD_NAND_ATMEL=y |
64 | CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y | ||
65 | CONFIG_MTD_UBI=y | ||
66 | CONFIG_MTD_UBI_GLUEBI=y | ||
44 | CONFIG_BLK_DEV_LOOP=y | 67 | CONFIG_BLK_DEV_LOOP=y |
45 | CONFIG_BLK_DEV_RAM=y | 68 | CONFIG_BLK_DEV_RAM=y |
46 | CONFIG_BLK_DEV_RAM_SIZE=8192 | 69 | CONFIG_BLK_DEV_RAM_SIZE=8192 |
47 | CONFIG_ATMEL_SSC=y | 70 | CONFIG_MISC_DEVICES=y |
71 | CONFIG_ATMEL_PWM=y | ||
72 | CONFIG_ATMEL_TCLIB=y | ||
48 | CONFIG_SCSI=y | 73 | CONFIG_SCSI=y |
49 | CONFIG_BLK_DEV_SD=y | 74 | CONFIG_BLK_DEV_SD=y |
50 | CONFIG_SCSI_MULTI_LUN=y | 75 | CONFIG_SCSI_MULTI_LUN=y |
51 | CONFIG_NETDEVICES=y | 76 | CONFIG_NETDEVICES=y |
52 | CONFIG_NET_ETHERNET=y | ||
53 | CONFIG_MII=y | 77 | CONFIG_MII=y |
78 | CONFIG_SMSC_PHY=y | ||
79 | CONFIG_NET_ETHERNET=y | ||
54 | CONFIG_MACB=y | 80 | CONFIG_MACB=y |
81 | # CONFIG_NETDEV_1000 is not set | ||
82 | # CONFIG_NETDEV_10000 is not set | ||
83 | CONFIG_USB_ZD1201=m | ||
84 | CONFIG_INPUT_POLLDEV=m | ||
55 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 85 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
86 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 | ||
87 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | ||
56 | CONFIG_INPUT_EVDEV=y | 88 | CONFIG_INPUT_EVDEV=y |
57 | # CONFIG_KEYBOARD_ATKBD is not set | 89 | # CONFIG_KEYBOARD_ATKBD is not set |
58 | CONFIG_KEYBOARD_GPIO=y | 90 | CONFIG_KEYBOARD_GPIO=y |
59 | # CONFIG_INPUT_MOUSE is not set | 91 | # CONFIG_INPUT_MOUSE is not set |
60 | CONFIG_INPUT_TOUCHSCREEN=y | 92 | CONFIG_INPUT_TOUCHSCREEN=y |
61 | CONFIG_TOUCHSCREEN_ADS7846=y | 93 | CONFIG_TOUCHSCREEN_ADS7846=y |
62 | # CONFIG_SERIO is not set | 94 | CONFIG_LEGACY_PTY_COUNT=4 |
63 | CONFIG_SERIAL_ATMEL=y | 95 | CONFIG_SERIAL_ATMEL=y |
64 | CONFIG_SERIAL_ATMEL_CONSOLE=y | 96 | CONFIG_SERIAL_ATMEL_CONSOLE=y |
65 | CONFIG_HW_RANDOM=y | 97 | CONFIG_HW_RANDOM=y |
@@ -74,8 +106,25 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
74 | CONFIG_AT91SAM9X_WATCHDOG=y | 106 | CONFIG_AT91SAM9X_WATCHDOG=y |
75 | CONFIG_FB=y | 107 | CONFIG_FB=y |
76 | CONFIG_FB_ATMEL=y | 108 | CONFIG_FB_ATMEL=y |
77 | # CONFIG_VGA_CONSOLE is not set | 109 | CONFIG_BACKLIGHT_LCD_SUPPORT=y |
78 | # CONFIG_USB_HID is not set | 110 | CONFIG_LCD_CLASS_DEVICE=y |
111 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
112 | CONFIG_BACKLIGHT_ATMEL_LCDC=y | ||
113 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
114 | CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y | ||
115 | CONFIG_LOGO=y | ||
116 | CONFIG_SOUND=y | ||
117 | CONFIG_SND=y | ||
118 | CONFIG_SND_SEQUENCER=y | ||
119 | CONFIG_SND_MIXER_OSS=y | ||
120 | CONFIG_SND_PCM_OSS=y | ||
121 | # CONFIG_SND_SUPPORT_OLD_API is not set | ||
122 | # CONFIG_SND_VERBOSE_PROCFS is not set | ||
123 | # CONFIG_SND_DRIVERS is not set | ||
124 | # CONFIG_SND_ARM is not set | ||
125 | CONFIG_SND_ATMEL_AC97C=y | ||
126 | # CONFIG_SND_SPI is not set | ||
127 | CONFIG_SND_USB_AUDIO=m | ||
79 | CONFIG_USB=y | 128 | CONFIG_USB=y |
80 | CONFIG_USB_DEVICEFS=y | 129 | CONFIG_USB_DEVICEFS=y |
81 | CONFIG_USB_MON=y | 130 | CONFIG_USB_MON=y |
@@ -83,24 +132,37 @@ CONFIG_USB_OHCI_HCD=y | |||
83 | CONFIG_USB_STORAGE=y | 132 | CONFIG_USB_STORAGE=y |
84 | CONFIG_USB_GADGET=y | 133 | CONFIG_USB_GADGET=y |
85 | CONFIG_USB_ZERO=m | 134 | CONFIG_USB_ZERO=m |
135 | CONFIG_USB_ETH=m | ||
86 | CONFIG_USB_GADGETFS=m | 136 | CONFIG_USB_GADGETFS=m |
87 | CONFIG_USB_FILE_STORAGE=m | 137 | CONFIG_USB_FILE_STORAGE=m |
88 | CONFIG_USB_G_SERIAL=m | 138 | CONFIG_USB_G_SERIAL=m |
89 | CONFIG_MMC=y | 139 | CONFIG_MMC=y |
140 | CONFIG_SDIO_UART=m | ||
90 | CONFIG_MMC_AT91=m | 141 | CONFIG_MMC_AT91=m |
142 | CONFIG_NEW_LEDS=y | ||
143 | CONFIG_LEDS_CLASS=y | ||
144 | CONFIG_LEDS_ATMEL_PWM=y | ||
145 | CONFIG_LEDS_GPIO=y | ||
146 | CONFIG_LEDS_TRIGGERS=y | ||
147 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
91 | CONFIG_RTC_CLASS=y | 148 | CONFIG_RTC_CLASS=y |
92 | CONFIG_RTC_DRV_AT91SAM9=y | 149 | CONFIG_RTC_DRV_AT91SAM9=y |
93 | CONFIG_EXT2_FS=y | 150 | CONFIG_EXT2_FS=y |
94 | CONFIG_INOTIFY=y | 151 | CONFIG_FUSE_FS=m |
95 | CONFIG_VFAT_FS=y | 152 | CONFIG_VFAT_FS=y |
96 | CONFIG_TMPFS=y | 153 | CONFIG_TMPFS=y |
97 | CONFIG_JFFS2_FS=y | 154 | CONFIG_JFFS2_FS=y |
155 | CONFIG_UBIFS_FS=y | ||
156 | CONFIG_UBIFS_FS_ADVANCED_COMPR=y | ||
98 | CONFIG_CRAMFS=y | 157 | CONFIG_CRAMFS=y |
99 | CONFIG_NFS_FS=y | 158 | CONFIG_NFS_FS=y |
159 | CONFIG_NFS_V3=y | ||
160 | CONFIG_NFS_V3_ACL=y | ||
161 | CONFIG_NFS_V4=y | ||
100 | CONFIG_ROOT_NFS=y | 162 | CONFIG_ROOT_NFS=y |
101 | CONFIG_NLS_CODEPAGE_437=y | 163 | CONFIG_NLS_CODEPAGE_437=y |
102 | CONFIG_NLS_CODEPAGE_850=y | 164 | CONFIG_NLS_CODEPAGE_850=y |
103 | CONFIG_NLS_ISO8859_1=y | 165 | CONFIG_NLS_ISO8859_1=y |
104 | CONFIG_DEBUG_KERNEL=y | 166 | CONFIG_FTRACE=y |
105 | CONFIG_DEBUG_USER=y | 167 | CONFIG_DEBUG_USER=y |
106 | CONFIG_DEBUG_LL=y | 168 | CONFIG_XZ_DEC=y |
diff --git a/arch/arm/configs/exynos4_defconfig b/arch/arm/configs/exynos4_defconfig index 2ffba24d2e2a..da53ff3b4d70 100644 --- a/arch/arm/configs/exynos4_defconfig +++ b/arch/arm/configs/exynos4_defconfig | |||
@@ -8,7 +8,9 @@ CONFIG_ARCH_EXYNOS4=y | |||
8 | CONFIG_S3C_LOWLEVEL_UART_PORT=1 | 8 | CONFIG_S3C_LOWLEVEL_UART_PORT=1 |
9 | CONFIG_MACH_SMDKC210=y | 9 | CONFIG_MACH_SMDKC210=y |
10 | CONFIG_MACH_SMDKV310=y | 10 | CONFIG_MACH_SMDKV310=y |
11 | CONFIG_MACH_ARMLEX4210=y | ||
11 | CONFIG_MACH_UNIVERSAL_C210=y | 12 | CONFIG_MACH_UNIVERSAL_C210=y |
13 | CONFIG_MACH_NURI=y | ||
12 | CONFIG_NO_HZ=y | 14 | CONFIG_NO_HZ=y |
13 | CONFIG_HIGH_RES_TIMERS=y | 15 | CONFIG_HIGH_RES_TIMERS=y |
14 | CONFIG_SMP=y | 16 | CONFIG_SMP=y |
diff --git a/arch/arm/configs/neocore926_defconfig b/arch/arm/configs/neocore926_defconfig deleted file mode 100644 index 462dd1850d15..000000000000 --- a/arch/arm/configs/neocore926_defconfig +++ /dev/null | |||
@@ -1,104 +0,0 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | # CONFIG_LOCALVERSION_AUTO is not set | ||
3 | # CONFIG_SWAP is not set | ||
4 | CONFIG_SYSVIPC=y | ||
5 | CONFIG_BLK_DEV_INITRD=y | ||
6 | # CONFIG_COMPAT_BRK is not set | ||
7 | CONFIG_MODULES=y | ||
8 | CONFIG_MODULE_UNLOAD=y | ||
9 | # CONFIG_BLK_DEV_BSG is not set | ||
10 | # CONFIG_IOSCHED_DEADLINE is not set | ||
11 | # CONFIG_IOSCHED_CFQ is not set | ||
12 | CONFIG_ARCH_AT91=y | ||
13 | CONFIG_ARCH_AT91SAM9263=y | ||
14 | CONFIG_MACH_NEOCORE926=y | ||
15 | CONFIG_MTD_AT91_DATAFLASH_CARD=y | ||
16 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
17 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
18 | CONFIG_FPE_NWFPE=y | ||
19 | CONFIG_NET=y | ||
20 | CONFIG_PACKET=y | ||
21 | CONFIG_UNIX=y | ||
22 | CONFIG_NET_KEY=y | ||
23 | CONFIG_INET=y | ||
24 | CONFIG_IP_PNP=y | ||
25 | CONFIG_IP_PNP_DHCP=y | ||
26 | CONFIG_IP_PNP_BOOTP=y | ||
27 | CONFIG_IP_PNP_RARP=y | ||
28 | CONFIG_NET_IPIP=y | ||
29 | # CONFIG_INET_LRO is not set | ||
30 | CONFIG_IPV6=y | ||
31 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
32 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | ||
33 | CONFIG_MTD=y | ||
34 | CONFIG_MTD_PARTITIONS=y | ||
35 | CONFIG_MTD_CHAR=y | ||
36 | CONFIG_MTD_BLOCK=y | ||
37 | CONFIG_NFTL=y | ||
38 | CONFIG_NFTL_RW=y | ||
39 | CONFIG_MTD_BLOCK2MTD=y | ||
40 | CONFIG_MTD_NAND=y | ||
41 | CONFIG_MTD_NAND_ECC_SMC=y | ||
42 | CONFIG_MTD_NAND_VERIFY_WRITE=y | ||
43 | CONFIG_MTD_NAND_ATMEL=y | ||
44 | CONFIG_MTD_NAND_PLATFORM=y | ||
45 | CONFIG_BLK_DEV_LOOP=y | ||
46 | CONFIG_BLK_DEV_NBD=y | ||
47 | CONFIG_ATMEL_PWM=y | ||
48 | CONFIG_ATMEL_TCLIB=y | ||
49 | CONFIG_SCSI=y | ||
50 | CONFIG_CHR_DEV_SG=y | ||
51 | CONFIG_NETDEVICES=y | ||
52 | CONFIG_SMSC_PHY=y | ||
53 | CONFIG_NET_ETHERNET=y | ||
54 | CONFIG_MACB=y | ||
55 | # CONFIG_NETDEV_1000 is not set | ||
56 | # CONFIG_NETDEV_10000 is not set | ||
57 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
58 | CONFIG_INPUT_EVDEV=y | ||
59 | CONFIG_INPUT_TOUCHSCREEN=y | ||
60 | CONFIG_TOUCHSCREEN_ADS7846=y | ||
61 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
62 | # CONFIG_DEVKMEM is not set | ||
63 | CONFIG_SERIAL_NONSTANDARD=y | ||
64 | CONFIG_SERIAL_ATMEL=y | ||
65 | CONFIG_SERIAL_ATMEL_CONSOLE=y | ||
66 | # CONFIG_SERIAL_ATMEL_PDC is not set | ||
67 | # CONFIG_HW_RANDOM is not set | ||
68 | CONFIG_I2C=y | ||
69 | CONFIG_I2C_CHARDEV=y | ||
70 | CONFIG_SPI=y | ||
71 | CONFIG_SPI_ATMEL=y | ||
72 | # CONFIG_HWMON is not set | ||
73 | CONFIG_VIDEO_OUTPUT_CONTROL=y | ||
74 | CONFIG_FB=y | ||
75 | CONFIG_FB_ATMEL=y | ||
76 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
77 | CONFIG_LCD_CLASS_DEVICE=y | ||
78 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
79 | CONFIG_BACKLIGHT_ATMEL_LCDC=y | ||
80 | # CONFIG_VGA_CONSOLE is not set | ||
81 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
82 | CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y | ||
83 | CONFIG_LOGO=y | ||
84 | CONFIG_USB=y | ||
85 | CONFIG_USB_DEVICEFS=y | ||
86 | CONFIG_USB_MON=y | ||
87 | CONFIG_USB_OHCI_HCD=y | ||
88 | CONFIG_USB_STORAGE=y | ||
89 | CONFIG_MMC=y | ||
90 | CONFIG_SDIO_UART=y | ||
91 | CONFIG_MMC_AT91=m | ||
92 | CONFIG_EXT2_FS=y | ||
93 | # CONFIG_DNOTIFY is not set | ||
94 | CONFIG_AUTOFS_FS=y | ||
95 | CONFIG_VFAT_FS=y | ||
96 | CONFIG_TMPFS=y | ||
97 | CONFIG_JFFS2_FS=y | ||
98 | CONFIG_JFFS2_FS_WBUF_VERIFY=y | ||
99 | CONFIG_NFS_FS=y | ||
100 | CONFIG_ROOT_NFS=y | ||
101 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
102 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
103 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
104 | # CONFIG_CRYPTO_HW is not set | ||
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index 076db52ff672..d5f00d7eb075 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
@@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y | |||
21 | CONFIG_MODULE_SRCVERSION_ALL=y | 21 | CONFIG_MODULE_SRCVERSION_ALL=y |
22 | # CONFIG_BLK_DEV_BSG is not set | 22 | # CONFIG_BLK_DEV_BSG is not set |
23 | CONFIG_ARCH_OMAP=y | 23 | CONFIG_ARCH_OMAP=y |
24 | CONFIG_ARCH_OMAP2=y | ||
25 | CONFIG_ARCH_OMAP3=y | ||
26 | CONFIG_ARCH_OMAP4=y | ||
27 | CONFIG_OMAP_RESET_CLOCKS=y | 24 | CONFIG_OMAP_RESET_CLOCKS=y |
28 | CONFIG_OMAP_MUX_DEBUG=y | 25 | CONFIG_OMAP_MUX_DEBUG=y |
29 | CONFIG_OMAP_32K_TIMER=y | ||
30 | CONFIG_MACH_OMAP_GENERIC=y | ||
31 | CONFIG_ARCH_OMAP2420=y | ||
32 | CONFIG_ARCH_OMAP2430=y | ||
33 | CONFIG_ARCH_OMAP3430=y | ||
34 | CONFIG_MACH_OMAP_H4=y | ||
35 | CONFIG_MACH_OMAP_APOLLON=y | ||
36 | CONFIG_MACH_OMAP_2430SDP=y | ||
37 | CONFIG_MACH_OMAP3_BEAGLE=y | ||
38 | CONFIG_MACH_DEVKIT8000=y | ||
39 | CONFIG_MACH_OMAP_LDP=y | ||
40 | CONFIG_MACH_OVERO=y | ||
41 | CONFIG_MACH_OMAP3EVM=y | ||
42 | CONFIG_MACH_OMAP3517EVM=y | ||
43 | CONFIG_MACH_OMAP3_PANDORA=y | ||
44 | CONFIG_MACH_OMAP3_TOUCHBOOK=y | ||
45 | CONFIG_MACH_OMAP_3430SDP=y | ||
46 | CONFIG_MACH_NOKIA_N8X0=y | ||
47 | CONFIG_MACH_NOKIA_RX51=y | ||
48 | CONFIG_MACH_OMAP_ZOOM2=y | ||
49 | CONFIG_MACH_OMAP_ZOOM3=y | ||
50 | CONFIG_MACH_CM_T35=y | ||
51 | CONFIG_MACH_IGEP0020=y | ||
52 | CONFIG_MACH_SBC3530=y | ||
53 | CONFIG_MACH_OMAP_3630SDP=y | ||
54 | CONFIG_MACH_OMAP_4430SDP=y | ||
55 | CONFIG_ARM_THUMBEE=y | 26 | CONFIG_ARM_THUMBEE=y |
56 | CONFIG_ARM_L1_CACHE_SHIFT=5 | ||
57 | CONFIG_ARM_ERRATA_411920=y | 27 | CONFIG_ARM_ERRATA_411920=y |
58 | CONFIG_NO_HZ=y | 28 | CONFIG_NO_HZ=y |
59 | CONFIG_HIGH_RES_TIMERS=y | 29 | CONFIG_HIGH_RES_TIMERS=y |
60 | CONFIG_SMP=y | 30 | CONFIG_SMP=y |
61 | CONFIG_NR_CPUS=2 | 31 | CONFIG_NR_CPUS=2 |
62 | # CONFIG_LOCAL_TIMERS is not set | ||
63 | CONFIG_AEABI=y | ||
64 | CONFIG_LEDS=y | 32 | CONFIG_LEDS=y |
65 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 33 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
66 | CONFIG_ZBOOT_ROM_BSS=0x0 | 34 | CONFIG_ZBOOT_ROM_BSS=0x0 |
67 | CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200" | 35 | CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200" |
68 | CONFIG_KEXEC=y | 36 | CONFIG_KEXEC=y |
69 | CONFIG_FPE_NWFPE=y | 37 | CONFIG_FPE_NWFPE=y |
70 | CONFIG_VFP=y | ||
71 | CONFIG_NEON=y | ||
72 | CONFIG_BINFMT_MISC=y | 38 | CONFIG_BINFMT_MISC=y |
73 | CONFIG_PM=y | ||
74 | CONFIG_PM_DEBUG=y | 39 | CONFIG_PM_DEBUG=y |
75 | CONFIG_PM_RUNTIME=y | ||
76 | CONFIG_NET=y | 40 | CONFIG_NET=y |
77 | CONFIG_PACKET=y | 41 | CONFIG_PACKET=y |
78 | CONFIG_UNIX=y | 42 | CONFIG_UNIX=y |
@@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y | |||
89 | # CONFIG_IPV6 is not set | 53 | # CONFIG_IPV6 is not set |
90 | CONFIG_NETFILTER=y | 54 | CONFIG_NETFILTER=y |
91 | CONFIG_BT=m | 55 | CONFIG_BT=m |
92 | CONFIG_BT_L2CAP=m | ||
93 | CONFIG_BT_SCO=m | ||
94 | CONFIG_BT_RFCOMM=y | ||
95 | CONFIG_BT_RFCOMM_TTY=y | ||
96 | CONFIG_BT_BNEP=m | ||
97 | CONFIG_BT_BNEP_MC_FILTER=y | ||
98 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
99 | CONFIG_BT_HIDP=m | ||
100 | CONFIG_BT_HCIUART=m | 56 | CONFIG_BT_HCIUART=m |
101 | CONFIG_BT_HCIUART_H4=y | 57 | CONFIG_BT_HCIUART_H4=y |
102 | CONFIG_BT_HCIUART_BCSP=y | 58 | CONFIG_BT_HCIUART_BCSP=y |
@@ -107,11 +63,9 @@ CONFIG_CFG80211=m | |||
107 | CONFIG_MAC80211=m | 63 | CONFIG_MAC80211=m |
108 | CONFIG_MAC80211_RC_PID=y | 64 | CONFIG_MAC80211_RC_PID=y |
109 | CONFIG_MAC80211_RC_DEFAULT_PID=y | 65 | CONFIG_MAC80211_RC_DEFAULT_PID=y |
110 | CONFIG_MAC80211_LEDS=y | ||
111 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 66 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
112 | CONFIG_CONNECTOR=y | 67 | CONFIG_CONNECTOR=y |
113 | CONFIG_MTD=y | 68 | CONFIG_MTD=y |
114 | CONFIG_MTD_CONCAT=y | ||
115 | CONFIG_MTD_CMDLINE_PARTS=y | 69 | CONFIG_MTD_CMDLINE_PARTS=y |
116 | CONFIG_MTD_CHAR=y | 70 | CONFIG_MTD_CHAR=y |
117 | CONFIG_MTD_BLOCK=y | 71 | CONFIG_MTD_BLOCK=y |
@@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y | |||
127 | CONFIG_BLK_DEV_LOOP=y | 81 | CONFIG_BLK_DEV_LOOP=y |
128 | CONFIG_BLK_DEV_RAM=y | 82 | CONFIG_BLK_DEV_RAM=y |
129 | CONFIG_BLK_DEV_RAM_SIZE=16384 | 83 | CONFIG_BLK_DEV_RAM_SIZE=16384 |
130 | CONFIG_EEPROM_LEGACY=y | ||
131 | CONFIG_SCSI=y | 84 | CONFIG_SCSI=y |
132 | CONFIG_BLK_DEV_SD=y | 85 | CONFIG_BLK_DEV_SD=y |
133 | CONFIG_SCSI_MULTI_LUN=y | 86 | CONFIG_SCSI_MULTI_LUN=y |
@@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y | |||
158 | CONFIG_INPUT_MISC=y | 111 | CONFIG_INPUT_MISC=y |
159 | CONFIG_INPUT_TWL4030_PWRBUTTON=y | 112 | CONFIG_INPUT_TWL4030_PWRBUTTON=y |
160 | CONFIG_VT_HW_CONSOLE_BINDING=y | 113 | CONFIG_VT_HW_CONSOLE_BINDING=y |
161 | CONFIG_SERIAL_8250=y | 114 | # CONFIG_LEGACY_PTYS is not set |
162 | CONFIG_SERIAL_8250_CONSOLE=y | ||
163 | CONFIG_SERIAL_8250_NR_UARTS=32 | 115 | CONFIG_SERIAL_8250_NR_UARTS=32 |
164 | CONFIG_SERIAL_8250_EXTENDED=y | 116 | CONFIG_SERIAL_8250_EXTENDED=y |
165 | CONFIG_SERIAL_8250_MANY_PORTS=y | 117 | CONFIG_SERIAL_8250_MANY_PORTS=y |
166 | CONFIG_SERIAL_8250_SHARE_IRQ=y | 118 | CONFIG_SERIAL_8250_SHARE_IRQ=y |
167 | CONFIG_SERIAL_8250_DETECT_IRQ=y | 119 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
168 | CONFIG_SERIAL_8250_RSA=y | 120 | CONFIG_SERIAL_8250_RSA=y |
169 | # CONFIG_LEGACY_PTYS is not set | ||
170 | CONFIG_HW_RANDOM=y | 121 | CONFIG_HW_RANDOM=y |
171 | CONFIG_I2C=y | ||
172 | CONFIG_I2C_CHARDEV=y | 122 | CONFIG_I2C_CHARDEV=y |
173 | CONFIG_I2C_OMAP=y | ||
174 | CONFIG_SPI=y | 123 | CONFIG_SPI=y |
175 | CONFIG_SPI_OMAP24XX=y | 124 | CONFIG_SPI_OMAP24XX=y |
176 | CONFIG_DEBUG_GPIO=y | 125 | CONFIG_DEBUG_GPIO=y |
@@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y | |||
181 | CONFIG_WATCHDOG=y | 130 | CONFIG_WATCHDOG=y |
182 | CONFIG_OMAP_WATCHDOG=y | 131 | CONFIG_OMAP_WATCHDOG=y |
183 | CONFIG_TWL4030_WATCHDOG=y | 132 | CONFIG_TWL4030_WATCHDOG=y |
184 | CONFIG_MENELAUS=y | ||
185 | CONFIG_TWL4030_CORE=y | ||
186 | CONFIG_TWL4030_POWER=y | ||
187 | CONFIG_REGULATOR=y | ||
188 | CONFIG_REGULATOR_TWL4030=y | 133 | CONFIG_REGULATOR_TWL4030=y |
189 | CONFIG_REGULATOR_TPS65023=y | 134 | CONFIG_REGULATOR_TPS65023=y |
190 | CONFIG_REGULATOR_TPS6507X=y | 135 | CONFIG_REGULATOR_TPS6507X=y |
@@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y | |||
208 | CONFIG_LCD_CLASS_DEVICE=y | 153 | CONFIG_LCD_CLASS_DEVICE=y |
209 | CONFIG_LCD_PLATFORM=y | 154 | CONFIG_LCD_PLATFORM=y |
210 | CONFIG_DISPLAY_SUPPORT=y | 155 | CONFIG_DISPLAY_SUPPORT=y |
211 | # CONFIG_VGA_CONSOLE is not set | ||
212 | CONFIG_FRAMEBUFFER_CONSOLE=y | 156 | CONFIG_FRAMEBUFFER_CONSOLE=y |
213 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | 157 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y |
214 | CONFIG_FONTS=y | 158 | CONFIG_FONTS=y |
@@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y | |||
217 | CONFIG_LOGO=y | 161 | CONFIG_LOGO=y |
218 | CONFIG_SOUND=m | 162 | CONFIG_SOUND=m |
219 | CONFIG_SND=m | 163 | CONFIG_SND=m |
220 | CONFIG_SND_MIXER_OSS=y | 164 | CONFIG_SND_MIXER_OSS=m |
221 | CONFIG_SND_PCM_OSS=y | 165 | CONFIG_SND_PCM_OSS=m |
222 | CONFIG_SND_VERBOSE_PRINTK=y | 166 | CONFIG_SND_VERBOSE_PRINTK=y |
223 | CONFIG_SND_DEBUG=y | 167 | CONFIG_SND_DEBUG=y |
224 | CONFIG_SND_USB_AUDIO=y | 168 | CONFIG_SND_USB_AUDIO=m |
225 | CONFIG_SND_SOC=y | 169 | CONFIG_SND_SOC=m |
226 | CONFIG_SND_OMAP_SOC=y | 170 | CONFIG_SND_OMAP_SOC=m |
227 | CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=y | 171 | CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m |
228 | CONFIG_USB=y | 172 | CONFIG_USB=y |
229 | CONFIG_USB_DEBUG=y | 173 | CONFIG_USB_DEBUG=y |
230 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | 174 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y |
231 | CONFIG_USB_DEVICEFS=y | 175 | CONFIG_USB_DEVICEFS=y |
232 | CONFIG_USB_SUSPEND=y | 176 | CONFIG_USB_SUSPEND=y |
233 | # CONFIG_USB_OTG_WHITELIST is not set | ||
234 | CONFIG_USB_MON=y | 177 | CONFIG_USB_MON=y |
235 | # CONFIG_USB_MUSB_HDRC is not set | ||
236 | # CONFIG_USB_MUSB_OTG is not set | ||
237 | # CONFIG_USB_GADGET_MUSB_HDRC is not set | ||
238 | CONFIG_USB_MUSB_DEBUG=y | ||
239 | CONFIG_USB_WDM=y | 178 | CONFIG_USB_WDM=y |
240 | CONFIG_USB_STORAGE=y | 179 | CONFIG_USB_STORAGE=y |
241 | CONFIG_USB_LIBUSUAL=y | 180 | CONFIG_USB_LIBUSUAL=y |
@@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y | |||
250 | CONFIG_SDIO_UART=y | 189 | CONFIG_SDIO_UART=y |
251 | CONFIG_MMC_OMAP=y | 190 | CONFIG_MMC_OMAP=y |
252 | CONFIG_MMC_OMAP_HS=y | 191 | CONFIG_MMC_OMAP_HS=y |
253 | CONFIG_LEDS_CLASS=y | ||
254 | CONFIG_LEDS_GPIO=y | ||
255 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
256 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
257 | CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | ||
258 | CONFIG_RTC_CLASS=y | 192 | CONFIG_RTC_CLASS=y |
259 | CONFIG_RTC_DRV_TWL92330=y | 193 | CONFIG_RTC_DRV_TWL92330=y |
260 | CONFIG_RTC_DRV_TWL4030=y | 194 | CONFIG_RTC_DRV_TWL4030=y |
261 | CONFIG_EXT2_FS=y | 195 | CONFIG_EXT2_FS=y |
262 | CONFIG_EXT3_FS=y | 196 | CONFIG_EXT3_FS=y |
263 | # CONFIG_EXT3_FS_XATTR is not set | 197 | # CONFIG_EXT3_FS_XATTR is not set |
264 | CONFIG_INOTIFY=y | ||
265 | CONFIG_QUOTA=y | 198 | CONFIG_QUOTA=y |
266 | CONFIG_QFMT_V2=y | 199 | CONFIG_QFMT_V2=y |
267 | CONFIG_MSDOS_FS=y | 200 | CONFIG_MSDOS_FS=y |
@@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y | |||
285 | CONFIG_NLS_ISO8859_1=y | 218 | CONFIG_NLS_ISO8859_1=y |
286 | CONFIG_PRINTK_TIME=y | 219 | CONFIG_PRINTK_TIME=y |
287 | CONFIG_MAGIC_SYSRQ=y | 220 | CONFIG_MAGIC_SYSRQ=y |
288 | CONFIG_DEBUG_FS=y | ||
289 | CONFIG_DEBUG_KERNEL=y | 221 | CONFIG_DEBUG_KERNEL=y |
290 | CONFIG_SCHEDSTATS=y | 222 | CONFIG_SCHEDSTATS=y |
291 | CONFIG_TIMER_STATS=y | 223 | CONFIG_TIMER_STATS=y |
292 | CONFIG_PROVE_LOCKING=y | 224 | CONFIG_PROVE_LOCKING=y |
293 | # CONFIG_LOCK_STAT is not set | ||
294 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | 225 | CONFIG_DEBUG_SPINLOCK_SLEEP=y |
295 | # CONFIG_DEBUG_BUGVERBOSE is not set | 226 | # CONFIG_DEBUG_BUGVERBOSE is not set |
296 | CONFIG_DEBUG_INFO=y | 227 | CONFIG_DEBUG_INFO=y |
diff --git a/arch/arm/configs/s5p6442_defconfig b/arch/arm/configs/s5p6442_defconfig deleted file mode 100644 index 0e92a784af66..000000000000 --- a/arch/arm/configs/s5p6442_defconfig +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
3 | CONFIG_BLK_DEV_INITRD=y | ||
4 | CONFIG_KALLSYMS_ALL=y | ||
5 | CONFIG_MODULES=y | ||
6 | CONFIG_MODULE_UNLOAD=y | ||
7 | # CONFIG_BLK_DEV_BSG is not set | ||
8 | CONFIG_ARCH_S5P6442=y | ||
9 | CONFIG_S3C_LOWLEVEL_UART_PORT=1 | ||
10 | CONFIG_MACH_SMDK6442=y | ||
11 | CONFIG_CPU_32v6K=y | ||
12 | CONFIG_AEABI=y | ||
13 | CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x20800000,8M console=ttySAC1,115200 init=/linuxrc" | ||
14 | CONFIG_FPE_NWFPE=y | ||
15 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
16 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | ||
17 | CONFIG_BLK_DEV_LOOP=y | ||
18 | CONFIG_BLK_DEV_RAM=y | ||
19 | CONFIG_BLK_DEV_RAM_SIZE=8192 | ||
20 | # CONFIG_MISC_DEVICES is not set | ||
21 | CONFIG_SCSI=y | ||
22 | CONFIG_BLK_DEV_SD=y | ||
23 | CONFIG_CHR_DEV_SG=y | ||
24 | CONFIG_INPUT_EVDEV=y | ||
25 | # CONFIG_INPUT_KEYBOARD is not set | ||
26 | # CONFIG_INPUT_MOUSE is not set | ||
27 | CONFIG_INPUT_TOUCHSCREEN=y | ||
28 | CONFIG_SERIAL_8250=y | ||
29 | CONFIG_SERIAL_8250_NR_UARTS=3 | ||
30 | CONFIG_SERIAL_SAMSUNG=y | ||
31 | CONFIG_SERIAL_SAMSUNG_CONSOLE=y | ||
32 | CONFIG_HW_RANDOM=y | ||
33 | # CONFIG_HWMON is not set | ||
34 | # CONFIG_VGA_CONSOLE is not set | ||
35 | # CONFIG_HID_SUPPORT is not set | ||
36 | # CONFIG_USB_SUPPORT is not set | ||
37 | CONFIG_EXT2_FS=y | ||
38 | CONFIG_INOTIFY=y | ||
39 | CONFIG_MSDOS_FS=y | ||
40 | CONFIG_VFAT_FS=y | ||
41 | CONFIG_TMPFS=y | ||
42 | CONFIG_TMPFS_POSIX_ACL=y | ||
43 | CONFIG_CRAMFS=y | ||
44 | CONFIG_ROMFS_FS=y | ||
45 | CONFIG_PARTITION_ADVANCED=y | ||
46 | CONFIG_BSD_DISKLABEL=y | ||
47 | CONFIG_SOLARIS_X86_PARTITION=y | ||
48 | CONFIG_NLS_CODEPAGE_437=y | ||
49 | CONFIG_NLS_ASCII=y | ||
50 | CONFIG_NLS_ISO8859_1=y | ||
51 | CONFIG_MAGIC_SYSRQ=y | ||
52 | CONFIG_DEBUG_KERNEL=y | ||
53 | CONFIG_DEBUG_RT_MUTEXES=y | ||
54 | CONFIG_DEBUG_SPINLOCK=y | ||
55 | CONFIG_DEBUG_MUTEXES=y | ||
56 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | ||
57 | CONFIG_DEBUG_INFO=y | ||
58 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
59 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
60 | # CONFIG_ARM_UNWIND is not set | ||
61 | CONFIG_DEBUG_USER=y | ||
62 | CONFIG_DEBUG_ERRORS=y | ||
63 | CONFIG_DEBUG_LL=y | ||
64 | CONFIG_DEBUG_S3C_UART=1 | ||
65 | CONFIG_CRC_CCITT=y | ||
diff --git a/arch/arm/configs/usb-a9263_defconfig b/arch/arm/configs/usb-a9263_defconfig deleted file mode 100644 index ee82d09249c6..000000000000 --- a/arch/arm/configs/usb-a9263_defconfig +++ /dev/null | |||
@@ -1,106 +0,0 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | # CONFIG_LOCALVERSION_AUTO is not set | ||
3 | # CONFIG_SWAP is not set | ||
4 | CONFIG_SYSVIPC=y | ||
5 | CONFIG_LOG_BUF_SHIFT=14 | ||
6 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
7 | CONFIG_SLAB=y | ||
8 | CONFIG_MODULES=y | ||
9 | CONFIG_MODULE_UNLOAD=y | ||
10 | # CONFIG_BLK_DEV_BSG is not set | ||
11 | # CONFIG_IOSCHED_DEADLINE is not set | ||
12 | # CONFIG_IOSCHED_CFQ is not set | ||
13 | CONFIG_ARCH_AT91=y | ||
14 | CONFIG_ARCH_AT91SAM9263=y | ||
15 | CONFIG_MACH_USB_A9263=y | ||
16 | CONFIG_AT91_SLOW_CLOCK=y | ||
17 | # CONFIG_ARM_THUMB is not set | ||
18 | CONFIG_AEABI=y | ||
19 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
20 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
21 | CONFIG_CMDLINE="mem=64M console=ttyS0,115200" | ||
22 | CONFIG_FPE_NWFPE=y | ||
23 | CONFIG_PM=y | ||
24 | CONFIG_NET=y | ||
25 | CONFIG_PACKET=y | ||
26 | CONFIG_UNIX=y | ||
27 | CONFIG_INET=y | ||
28 | CONFIG_IP_MULTICAST=y | ||
29 | CONFIG_IP_ADVANCED_ROUTER=y | ||
30 | CONFIG_IP_ROUTE_VERBOSE=y | ||
31 | CONFIG_IP_PNP=y | ||
32 | CONFIG_IP_PNP_BOOTP=y | ||
33 | CONFIG_IP_PNP_RARP=y | ||
34 | CONFIG_IP_MROUTE=y | ||
35 | CONFIG_IP_PIMSM_V1=y | ||
36 | CONFIG_IP_PIMSM_V2=y | ||
37 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
38 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
39 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
40 | # CONFIG_INET_LRO is not set | ||
41 | # CONFIG_INET_DIAG is not set | ||
42 | # CONFIG_IPV6 is not set | ||
43 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
44 | CONFIG_MTD=y | ||
45 | CONFIG_MTD_PARTITIONS=y | ||
46 | CONFIG_MTD_CMDLINE_PARTS=y | ||
47 | CONFIG_MTD_CHAR=y | ||
48 | CONFIG_MTD_BLOCK=y | ||
49 | CONFIG_MTD_DATAFLASH=y | ||
50 | CONFIG_MTD_NAND=y | ||
51 | CONFIG_MTD_NAND_ATMEL=y | ||
52 | CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y | ||
53 | CONFIG_BLK_DEV_LOOP=y | ||
54 | # CONFIG_MISC_DEVICES is not set | ||
55 | CONFIG_SCSI=y | ||
56 | CONFIG_BLK_DEV_SD=y | ||
57 | CONFIG_SCSI_MULTI_LUN=y | ||
58 | CONFIG_NETDEVICES=y | ||
59 | CONFIG_NET_ETHERNET=y | ||
60 | CONFIG_MII=y | ||
61 | CONFIG_MACB=y | ||
62 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
63 | CONFIG_INPUT_EVDEV=y | ||
64 | CONFIG_INPUT_EVBUG=y | ||
65 | # CONFIG_KEYBOARD_ATKBD is not set | ||
66 | CONFIG_KEYBOARD_GPIO=y | ||
67 | # CONFIG_INPUT_MOUSE is not set | ||
68 | # CONFIG_SERIO is not set | ||
69 | CONFIG_SERIAL_ATMEL=y | ||
70 | CONFIG_SERIAL_ATMEL_CONSOLE=y | ||
71 | CONFIG_HW_RANDOM=y | ||
72 | CONFIG_SPI=y | ||
73 | CONFIG_SPI_ATMEL=y | ||
74 | # CONFIG_HWMON is not set | ||
75 | # CONFIG_VGA_CONSOLE is not set | ||
76 | # CONFIG_USB_HID is not set | ||
77 | CONFIG_USB=y | ||
78 | CONFIG_USB_DEVICEFS=y | ||
79 | CONFIG_USB_MON=y | ||
80 | CONFIG_USB_OHCI_HCD=y | ||
81 | CONFIG_USB_STORAGE=y | ||
82 | CONFIG_USB_GADGET=y | ||
83 | CONFIG_USB_ETH=m | ||
84 | CONFIG_NEW_LEDS=y | ||
85 | CONFIG_LEDS_CLASS=y | ||
86 | CONFIG_LEDS_GPIO=y | ||
87 | CONFIG_LEDS_TRIGGERS=y | ||
88 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
89 | CONFIG_EXT2_FS=y | ||
90 | CONFIG_INOTIFY=y | ||
91 | CONFIG_FUSE_FS=m | ||
92 | CONFIG_VFAT_FS=y | ||
93 | CONFIG_TMPFS=y | ||
94 | CONFIG_JFFS2_FS=y | ||
95 | CONFIG_NFS_FS=y | ||
96 | CONFIG_NFS_V3=y | ||
97 | CONFIG_NFS_V3_ACL=y | ||
98 | CONFIG_NFS_V4=y | ||
99 | CONFIG_ROOT_NFS=y | ||
100 | CONFIG_NLS_CODEPAGE_437=y | ||
101 | CONFIG_NLS_CODEPAGE_850=y | ||
102 | CONFIG_NLS_ISO8859_1=y | ||
103 | CONFIG_DEBUG_KERNEL=y | ||
104 | CONFIG_DEBUG_USER=y | ||
105 | CONFIG_DEBUG_LL=y | ||
106 | # CONFIG_CRYPTO_HW is not set | ||
diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h index 6b7403fd8f54..b4892a06442c 100644 --- a/arch/arm/include/asm/bitops.h +++ b/arch/arm/include/asm/bitops.h | |||
@@ -203,8 +203,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
203 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) | 203 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) |
204 | #define find_next_bit(p,sz,off) _find_next_bit_le(p,sz,off) | 204 | #define find_next_bit(p,sz,off) _find_next_bit_le(p,sz,off) |
205 | 205 | ||
206 | #define WORD_BITOFF_TO_LE(x) ((x)) | ||
207 | |||
208 | #else | 206 | #else |
209 | /* | 207 | /* |
210 | * These are the big endian, atomic definitions. | 208 | * These are the big endian, atomic definitions. |
@@ -214,8 +212,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
214 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) | 212 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) |
215 | #define find_next_bit(p,sz,off) _find_next_bit_be(p,sz,off) | 213 | #define find_next_bit(p,sz,off) _find_next_bit_be(p,sz,off) |
216 | 214 | ||
217 | #define WORD_BITOFF_TO_LE(x) ((x) ^ 0x18) | ||
218 | |||
219 | #endif | 215 | #endif |
220 | 216 | ||
221 | #if __LINUX_ARM_ARCH__ < 5 | 217 | #if __LINUX_ARM_ARCH__ < 5 |
@@ -287,55 +283,29 @@ static inline int fls(int x) | |||
287 | #include <asm-generic/bitops/hweight.h> | 283 | #include <asm-generic/bitops/hweight.h> |
288 | #include <asm-generic/bitops/lock.h> | 284 | #include <asm-generic/bitops/lock.h> |
289 | 285 | ||
290 | static inline void __set_bit_le(int nr, void *addr) | 286 | #ifdef __ARMEB__ |
291 | { | ||
292 | __set_bit(WORD_BITOFF_TO_LE(nr), addr); | ||
293 | } | ||
294 | |||
295 | static inline void __clear_bit_le(int nr, void *addr) | ||
296 | { | ||
297 | __clear_bit(WORD_BITOFF_TO_LE(nr), addr); | ||
298 | } | ||
299 | |||
300 | static inline int __test_and_set_bit_le(int nr, void *addr) | ||
301 | { | ||
302 | return __test_and_set_bit(WORD_BITOFF_TO_LE(nr), addr); | ||
303 | } | ||
304 | |||
305 | static inline int test_and_set_bit_le(int nr, void *addr) | ||
306 | { | ||
307 | return test_and_set_bit(WORD_BITOFF_TO_LE(nr), addr); | ||
308 | } | ||
309 | |||
310 | static inline int __test_and_clear_bit_le(int nr, void *addr) | ||
311 | { | ||
312 | return __test_and_clear_bit(WORD_BITOFF_TO_LE(nr), addr); | ||
313 | } | ||
314 | |||
315 | static inline int test_and_clear_bit_le(int nr, void *addr) | ||
316 | { | ||
317 | return test_and_clear_bit(WORD_BITOFF_TO_LE(nr), addr); | ||
318 | } | ||
319 | |||
320 | static inline int test_bit_le(int nr, const void *addr) | ||
321 | { | ||
322 | return test_bit(WORD_BITOFF_TO_LE(nr), addr); | ||
323 | } | ||
324 | 287 | ||
325 | static inline int find_first_zero_bit_le(const void *p, unsigned size) | 288 | static inline int find_first_zero_bit_le(const void *p, unsigned size) |
326 | { | 289 | { |
327 | return _find_first_zero_bit_le(p, size); | 290 | return _find_first_zero_bit_le(p, size); |
328 | } | 291 | } |
292 | #define find_first_zero_bit_le find_first_zero_bit_le | ||
329 | 293 | ||
330 | static inline int find_next_zero_bit_le(const void *p, int size, int offset) | 294 | static inline int find_next_zero_bit_le(const void *p, int size, int offset) |
331 | { | 295 | { |
332 | return _find_next_zero_bit_le(p, size, offset); | 296 | return _find_next_zero_bit_le(p, size, offset); |
333 | } | 297 | } |
298 | #define find_next_zero_bit_le find_next_zero_bit_le | ||
334 | 299 | ||
335 | static inline int find_next_bit_le(const void *p, int size, int offset) | 300 | static inline int find_next_bit_le(const void *p, int size, int offset) |
336 | { | 301 | { |
337 | return _find_next_bit_le(p, size, offset); | 302 | return _find_next_bit_le(p, size, offset); |
338 | } | 303 | } |
304 | #define find_next_bit_le find_next_bit_le | ||
305 | |||
306 | #endif | ||
307 | |||
308 | #include <asm-generic/bitops/le.h> | ||
339 | 309 | ||
340 | /* | 310 | /* |
341 | * Ext2 is defined to use little-endian byte ordering. | 311 | * Ext2 is defined to use little-endian byte ordering. |
diff --git a/arch/arm/include/asm/fiq.h b/arch/arm/include/asm/fiq.h index 2242ce22ec6c..d493d0b742a1 100644 --- a/arch/arm/include/asm/fiq.h +++ b/arch/arm/include/asm/fiq.h | |||
@@ -4,6 +4,13 @@ | |||
4 | * Support for FIQ on ARM architectures. | 4 | * Support for FIQ on ARM architectures. |
5 | * Written by Philip Blundell <philb@gnu.org>, 1998 | 5 | * Written by Philip Blundell <philb@gnu.org>, 1998 |
6 | * Re-written by Russell King | 6 | * Re-written by Russell King |
7 | * | ||
8 | * NOTE: The FIQ mode registers are not magically preserved across | ||
9 | * suspend/resume. | ||
10 | * | ||
11 | * Drivers which require these registers to be preserved across power | ||
12 | * management operations must implement appropriate suspend/resume handlers to | ||
13 | * save and restore them. | ||
7 | */ | 14 | */ |
8 | 15 | ||
9 | #ifndef __ASM_FIQ_H | 16 | #ifndef __ASM_FIQ_H |
@@ -29,9 +36,21 @@ struct fiq_handler { | |||
29 | extern int claim_fiq(struct fiq_handler *f); | 36 | extern int claim_fiq(struct fiq_handler *f); |
30 | extern void release_fiq(struct fiq_handler *f); | 37 | extern void release_fiq(struct fiq_handler *f); |
31 | extern void set_fiq_handler(void *start, unsigned int length); | 38 | extern void set_fiq_handler(void *start, unsigned int length); |
32 | extern void set_fiq_regs(struct pt_regs *regs); | ||
33 | extern void get_fiq_regs(struct pt_regs *regs); | ||
34 | extern void enable_fiq(int fiq); | 39 | extern void enable_fiq(int fiq); |
35 | extern void disable_fiq(int fiq); | 40 | extern void disable_fiq(int fiq); |
36 | 41 | ||
42 | /* helpers defined in fiqasm.S: */ | ||
43 | extern void __set_fiq_regs(unsigned long const *regs); | ||
44 | extern void __get_fiq_regs(unsigned long *regs); | ||
45 | |||
46 | static inline void set_fiq_regs(struct pt_regs const *regs) | ||
47 | { | ||
48 | __set_fiq_regs(®s->ARM_r8); | ||
49 | } | ||
50 | |||
51 | static inline void get_fiq_regs(struct pt_regs *regs) | ||
52 | { | ||
53 | __get_fiq_regs(®s->ARM_r8); | ||
54 | } | ||
55 | |||
37 | #endif | 56 | #endif |
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index bf13b814c1b8..946f4d778f71 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
@@ -18,6 +18,8 @@ struct machine_desc { | |||
18 | unsigned int nr; /* architecture number */ | 18 | unsigned int nr; /* architecture number */ |
19 | const char *name; /* architecture name */ | 19 | const char *name; /* architecture name */ |
20 | unsigned long boot_params; /* tagged list */ | 20 | unsigned long boot_params; /* tagged list */ |
21 | const char **dt_compat; /* array of device tree | ||
22 | * 'compatible' strings */ | ||
21 | 23 | ||
22 | unsigned int nr_irqs; /* number of IRQs */ | 24 | unsigned int nr_irqs; /* number of IRQs */ |
23 | 25 | ||
@@ -48,6 +50,13 @@ struct machine_desc { | |||
48 | extern struct machine_desc *machine_desc; | 50 | extern struct machine_desc *machine_desc; |
49 | 51 | ||
50 | /* | 52 | /* |
53 | * Machine type table - also only accessible during boot | ||
54 | */ | ||
55 | extern struct machine_desc __arch_info_begin[], __arch_info_end[]; | ||
56 | #define for_each_machine_desc(p) \ | ||
57 | for (p = __arch_info_begin; p < __arch_info_end; p++) | ||
58 | |||
59 | /* | ||
51 | * Set of macros to define architecture features. This is built into | 60 | * Set of macros to define architecture features. This is built into |
52 | * a table by the linker. | 61 | * a table by the linker. |
53 | */ | 62 | */ |
diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h index f51a69595f6e..ac75d0848889 100644 --- a/arch/arm/include/asm/page.h +++ b/arch/arm/include/asm/page.h | |||
@@ -197,7 +197,7 @@ typedef unsigned long pgprot_t; | |||
197 | 197 | ||
198 | typedef struct page *pgtable_t; | 198 | typedef struct page *pgtable_t; |
199 | 199 | ||
200 | #ifndef CONFIG_SPARSEMEM | 200 | #ifdef CONFIG_HAVE_ARCH_PFN_VALID |
201 | extern int pfn_valid(unsigned long); | 201 | extern int pfn_valid(unsigned long); |
202 | #endif | 202 | #endif |
203 | 203 | ||
diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h new file mode 100644 index 000000000000..11b8708fc4db --- /dev/null +++ b/arch/arm/include/asm/prom.h | |||
@@ -0,0 +1,37 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/prom.h | ||
3 | * | ||
4 | * Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | #ifndef __ASMARM_PROM_H | ||
12 | #define __ASMARM_PROM_H | ||
13 | |||
14 | #ifdef CONFIG_OF | ||
15 | |||
16 | #include <asm/setup.h> | ||
17 | #include <asm/irq.h> | ||
18 | |||
19 | static inline void irq_dispose_mapping(unsigned int virq) | ||
20 | { | ||
21 | return; | ||
22 | } | ||
23 | |||
24 | extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys); | ||
25 | extern void arm_dt_memblock_reserve(void); | ||
26 | |||
27 | #else /* CONFIG_OF */ | ||
28 | |||
29 | static inline struct machine_desc *setup_machine_fdt(unsigned int dt_phys) | ||
30 | { | ||
31 | return NULL; | ||
32 | } | ||
33 | |||
34 | static inline void arm_dt_memblock_reserve(void) { } | ||
35 | |||
36 | #endif /* CONFIG_OF */ | ||
37 | #endif /* ASMARM_PROM_H */ | ||
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h index 95176af3df8c..ee2ad8ae07af 100644 --- a/arch/arm/include/asm/setup.h +++ b/arch/arm/include/asm/setup.h | |||
@@ -217,6 +217,10 @@ extern struct meminfo meminfo; | |||
217 | #define bank_phys_end(bank) ((bank)->start + (bank)->size) | 217 | #define bank_phys_end(bank) ((bank)->start + (bank)->size) |
218 | #define bank_phys_size(bank) (bank)->size | 218 | #define bank_phys_size(bank) (bank)->size |
219 | 219 | ||
220 | extern int arm_add_memory(phys_addr_t start, unsigned long size); | ||
221 | extern void early_print(const char *str, ...); | ||
222 | extern void dump_machine_table(void); | ||
223 | |||
220 | #endif /* __KERNEL__ */ | 224 | #endif /* __KERNEL__ */ |
221 | 225 | ||
222 | #endif | 226 | #endif |
diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index d2b514fd76f4..e42d96a45d3e 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h | |||
@@ -70,6 +70,7 @@ extern void platform_smp_prepare_cpus(unsigned int); | |||
70 | */ | 70 | */ |
71 | struct secondary_data { | 71 | struct secondary_data { |
72 | unsigned long pgdir; | 72 | unsigned long pgdir; |
73 | unsigned long swapper_pg_dir; | ||
73 | void *stack; | 74 | void *stack; |
74 | }; | 75 | }; |
75 | extern struct secondary_data secondary_data; | 76 | extern struct secondary_data secondary_data; |
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 87dbe3e21970..2c04ed5efeb5 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
@@ -400,6 +400,8 @@ | |||
400 | #define __NR_open_by_handle_at (__NR_SYSCALL_BASE+371) | 400 | #define __NR_open_by_handle_at (__NR_SYSCALL_BASE+371) |
401 | #define __NR_clock_adjtime (__NR_SYSCALL_BASE+372) | 401 | #define __NR_clock_adjtime (__NR_SYSCALL_BASE+372) |
402 | #define __NR_syncfs (__NR_SYSCALL_BASE+373) | 402 | #define __NR_syncfs (__NR_SYSCALL_BASE+373) |
403 | #define __NR_sendmmsg (__NR_SYSCALL_BASE+374) | ||
404 | #define __NR_setns (__NR_SYSCALL_BASE+375) | ||
403 | 405 | ||
404 | /* | 406 | /* |
405 | * The following SWIs are ARM private. | 407 | * The following SWIs are ARM private. |
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 8d95446150a3..a5b31af5c2b8 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -24,7 +24,7 @@ obj-$(CONFIG_OC_ETM) += etm.o | |||
24 | 24 | ||
25 | obj-$(CONFIG_ISA_DMA_API) += dma.o | 25 | obj-$(CONFIG_ISA_DMA_API) += dma.o |
26 | obj-$(CONFIG_ARCH_ACORN) += ecard.o | 26 | obj-$(CONFIG_ARCH_ACORN) += ecard.o |
27 | obj-$(CONFIG_FIQ) += fiq.o | 27 | obj-$(CONFIG_FIQ) += fiq.o fiqasm.o |
28 | obj-$(CONFIG_MODULES) += armksyms.o module.o | 28 | obj-$(CONFIG_MODULES) += armksyms.o module.o |
29 | obj-$(CONFIG_ARTHUR) += arthur.o | 29 | obj-$(CONFIG_ARTHUR) += arthur.o |
30 | obj-$(CONFIG_ISA_DMA) += dma-isa.o | 30 | obj-$(CONFIG_ISA_DMA) += dma-isa.o |
@@ -44,6 +44,7 @@ obj-$(CONFIG_ARM_THUMBEE) += thumbee.o | |||
44 | obj-$(CONFIG_KGDB) += kgdb.o | 44 | obj-$(CONFIG_KGDB) += kgdb.o |
45 | obj-$(CONFIG_ARM_UNWIND) += unwind.o | 45 | obj-$(CONFIG_ARM_UNWIND) += unwind.o |
46 | obj-$(CONFIG_HAVE_TCM) += tcm.o | 46 | obj-$(CONFIG_HAVE_TCM) += tcm.o |
47 | obj-$(CONFIG_OF) += devtree.o | ||
47 | obj-$(CONFIG_CRASH_DUMP) += crash_dump.o | 48 | obj-$(CONFIG_CRASH_DUMP) += crash_dump.o |
48 | obj-$(CONFIG_SWP_EMULATE) += swp_emulate.o | 49 | obj-$(CONFIG_SWP_EMULATE) += swp_emulate.o |
49 | CFLAGS_swp_emulate.o := -Wa,-march=armv7-a | 50 | CFLAGS_swp_emulate.o := -Wa,-march=armv7-a |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 7fbf28c35bb2..80f7896cc016 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -383,6 +383,8 @@ | |||
383 | CALL(sys_open_by_handle_at) | 383 | CALL(sys_open_by_handle_at) |
384 | CALL(sys_clock_adjtime) | 384 | CALL(sys_clock_adjtime) |
385 | CALL(sys_syncfs) | 385 | CALL(sys_syncfs) |
386 | CALL(sys_sendmmsg) | ||
387 | /* 375 */ CALL(sys_setns) | ||
386 | #ifndef syscalls_counted | 388 | #ifndef syscalls_counted |
387 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 389 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
388 | #define syscalls_counted | 390 | #define syscalls_counted |
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c new file mode 100644 index 000000000000..a701e4226a6c --- /dev/null +++ b/arch/arm/kernel/devtree.c | |||
@@ -0,0 +1,145 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/kernel/devtree.c | ||
3 | * | ||
4 | * Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/errno.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/bootmem.h> | ||
16 | #include <linux/memblock.h> | ||
17 | #include <linux/of.h> | ||
18 | #include <linux/of_fdt.h> | ||
19 | #include <linux/of_irq.h> | ||
20 | #include <linux/of_platform.h> | ||
21 | |||
22 | #include <asm/setup.h> | ||
23 | #include <asm/page.h> | ||
24 | #include <asm/mach/arch.h> | ||
25 | #include <asm/mach-types.h> | ||
26 | |||
27 | void __init early_init_dt_add_memory_arch(u64 base, u64 size) | ||
28 | { | ||
29 | arm_add_memory(base, size); | ||
30 | } | ||
31 | |||
32 | void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | ||
33 | { | ||
34 | return alloc_bootmem_align(size, align); | ||
35 | } | ||
36 | |||
37 | void __init arm_dt_memblock_reserve(void) | ||
38 | { | ||
39 | u64 *reserve_map, base, size; | ||
40 | |||
41 | if (!initial_boot_params) | ||
42 | return; | ||
43 | |||
44 | /* Reserve the dtb region */ | ||
45 | memblock_reserve(virt_to_phys(initial_boot_params), | ||
46 | be32_to_cpu(initial_boot_params->totalsize)); | ||
47 | |||
48 | /* | ||
49 | * Process the reserve map. This will probably overlap the initrd | ||
50 | * and dtb locations which are already reserved, but overlaping | ||
51 | * doesn't hurt anything | ||
52 | */ | ||
53 | reserve_map = ((void*)initial_boot_params) + | ||
54 | be32_to_cpu(initial_boot_params->off_mem_rsvmap); | ||
55 | while (1) { | ||
56 | base = be64_to_cpup(reserve_map++); | ||
57 | size = be64_to_cpup(reserve_map++); | ||
58 | if (!size) | ||
59 | break; | ||
60 | memblock_reserve(base, size); | ||
61 | } | ||
62 | } | ||
63 | |||
64 | /** | ||
65 | * setup_machine_fdt - Machine setup when an dtb was passed to the kernel | ||
66 | * @dt_phys: physical address of dt blob | ||
67 | * | ||
68 | * If a dtb was passed to the kernel in r2, then use it to choose the | ||
69 | * correct machine_desc and to setup the system. | ||
70 | */ | ||
71 | struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) | ||
72 | { | ||
73 | struct boot_param_header *devtree; | ||
74 | struct machine_desc *mdesc, *mdesc_best = NULL; | ||
75 | unsigned int score, mdesc_score = ~1; | ||
76 | unsigned long dt_root; | ||
77 | const char *model; | ||
78 | |||
79 | devtree = phys_to_virt(dt_phys); | ||
80 | |||
81 | /* check device tree validity */ | ||
82 | if (be32_to_cpu(devtree->magic) != OF_DT_HEADER) | ||
83 | return NULL; | ||
84 | |||
85 | /* Search the mdescs for the 'best' compatible value match */ | ||
86 | initial_boot_params = devtree; | ||
87 | dt_root = of_get_flat_dt_root(); | ||
88 | for_each_machine_desc(mdesc) { | ||
89 | score = of_flat_dt_match(dt_root, mdesc->dt_compat); | ||
90 | if (score > 0 && score < mdesc_score) { | ||
91 | mdesc_best = mdesc; | ||
92 | mdesc_score = score; | ||
93 | } | ||
94 | } | ||
95 | if (!mdesc_best) { | ||
96 | const char *prop; | ||
97 | long size; | ||
98 | |||
99 | early_print("\nError: unrecognized/unsupported " | ||
100 | "device tree compatible list:\n[ "); | ||
101 | |||
102 | prop = of_get_flat_dt_prop(dt_root, "compatible", &size); | ||
103 | while (size > 0) { | ||
104 | early_print("'%s' ", prop); | ||
105 | size -= strlen(prop) + 1; | ||
106 | prop += strlen(prop) + 1; | ||
107 | } | ||
108 | early_print("]\n\n"); | ||
109 | |||
110 | dump_machine_table(); /* does not return */ | ||
111 | } | ||
112 | |||
113 | model = of_get_flat_dt_prop(dt_root, "model", NULL); | ||
114 | if (!model) | ||
115 | model = of_get_flat_dt_prop(dt_root, "compatible", NULL); | ||
116 | if (!model) | ||
117 | model = "<unknown>"; | ||
118 | pr_info("Machine: %s, model: %s\n", mdesc_best->name, model); | ||
119 | |||
120 | /* Retrieve various information from the /chosen node */ | ||
121 | of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); | ||
122 | /* Initialize {size,address}-cells info */ | ||
123 | of_scan_flat_dt(early_init_dt_scan_root, NULL); | ||
124 | /* Setup memory, calling early_init_dt_add_memory_arch */ | ||
125 | of_scan_flat_dt(early_init_dt_scan_memory, NULL); | ||
126 | |||
127 | /* Change machine number to match the mdesc we're using */ | ||
128 | __machine_arch_type = mdesc_best->nr; | ||
129 | |||
130 | return mdesc_best; | ||
131 | } | ||
132 | |||
133 | /** | ||
134 | * irq_create_of_mapping - Hook to resolve OF irq specifier into a Linux irq# | ||
135 | * | ||
136 | * Currently the mapping mechanism is trivial; simple flat hwirq numbers are | ||
137 | * mapped 1:1 onto Linux irq numbers. Cascaded irq controllers are not | ||
138 | * supported. | ||
139 | */ | ||
140 | unsigned int irq_create_of_mapping(struct device_node *controller, | ||
141 | const u32 *intspec, unsigned int intsize) | ||
142 | { | ||
143 | return intspec[0]; | ||
144 | } | ||
145 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); | ||
diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index e72dc34eea1c..4c164ece5891 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c | |||
@@ -89,47 +89,6 @@ void set_fiq_handler(void *start, unsigned int length) | |||
89 | flush_icache_range(0x1c, 0x1c + length); | 89 | flush_icache_range(0x1c, 0x1c + length); |
90 | } | 90 | } |
91 | 91 | ||
92 | /* | ||
93 | * Taking an interrupt in FIQ mode is death, so both these functions | ||
94 | * disable irqs for the duration. Note - these functions are almost | ||
95 | * entirely coded in assembly. | ||
96 | */ | ||
97 | void __naked set_fiq_regs(struct pt_regs *regs) | ||
98 | { | ||
99 | register unsigned long tmp; | ||
100 | asm volatile ( | ||
101 | "mov ip, sp\n\ | ||
102 | stmfd sp!, {fp, ip, lr, pc}\n\ | ||
103 | sub fp, ip, #4\n\ | ||
104 | mrs %0, cpsr\n\ | ||
105 | msr cpsr_c, %2 @ select FIQ mode\n\ | ||
106 | mov r0, r0\n\ | ||
107 | ldmia %1, {r8 - r14}\n\ | ||
108 | msr cpsr_c, %0 @ return to SVC mode\n\ | ||
109 | mov r0, r0\n\ | ||
110 | ldmfd sp, {fp, sp, pc}" | ||
111 | : "=&r" (tmp) | ||
112 | : "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)); | ||
113 | } | ||
114 | |||
115 | void __naked get_fiq_regs(struct pt_regs *regs) | ||
116 | { | ||
117 | register unsigned long tmp; | ||
118 | asm volatile ( | ||
119 | "mov ip, sp\n\ | ||
120 | stmfd sp!, {fp, ip, lr, pc}\n\ | ||
121 | sub fp, ip, #4\n\ | ||
122 | mrs %0, cpsr\n\ | ||
123 | msr cpsr_c, %2 @ select FIQ mode\n\ | ||
124 | mov r0, r0\n\ | ||
125 | stmia %1, {r8 - r14}\n\ | ||
126 | msr cpsr_c, %0 @ return to SVC mode\n\ | ||
127 | mov r0, r0\n\ | ||
128 | ldmfd sp, {fp, sp, pc}" | ||
129 | : "=&r" (tmp) | ||
130 | : "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)); | ||
131 | } | ||
132 | |||
133 | int claim_fiq(struct fiq_handler *f) | 92 | int claim_fiq(struct fiq_handler *f) |
134 | { | 93 | { |
135 | int ret = 0; | 94 | int ret = 0; |
@@ -174,8 +133,8 @@ void disable_fiq(int fiq) | |||
174 | } | 133 | } |
175 | 134 | ||
176 | EXPORT_SYMBOL(set_fiq_handler); | 135 | EXPORT_SYMBOL(set_fiq_handler); |
177 | EXPORT_SYMBOL(set_fiq_regs); | 136 | EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */ |
178 | EXPORT_SYMBOL(get_fiq_regs); | 137 | EXPORT_SYMBOL(__get_fiq_regs); /* defined in fiqasm.S */ |
179 | EXPORT_SYMBOL(claim_fiq); | 138 | EXPORT_SYMBOL(claim_fiq); |
180 | EXPORT_SYMBOL(release_fiq); | 139 | EXPORT_SYMBOL(release_fiq); |
181 | EXPORT_SYMBOL(enable_fiq); | 140 | EXPORT_SYMBOL(enable_fiq); |
diff --git a/arch/arm/kernel/fiqasm.S b/arch/arm/kernel/fiqasm.S new file mode 100644 index 000000000000..207f9d652010 --- /dev/null +++ b/arch/arm/kernel/fiqasm.S | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/kernel/fiqasm.S | ||
3 | * | ||
4 | * Derived from code originally in linux/arch/arm/kernel/fiq.c: | ||
5 | * | ||
6 | * Copyright (C) 1998 Russell King | ||
7 | * Copyright (C) 1998, 1999 Phil Blundell | ||
8 | * Copyright (C) 2011, Linaro Limited | ||
9 | * | ||
10 | * FIQ support written by Philip Blundell <philb@gnu.org>, 1998. | ||
11 | * | ||
12 | * FIQ support re-written by Russell King to be more generic | ||
13 | * | ||
14 | * v7/Thumb-2 compatibility modifications by Linaro Limited, 2011. | ||
15 | */ | ||
16 | |||
17 | #include <linux/linkage.h> | ||
18 | #include <asm/assembler.h> | ||
19 | |||
20 | /* | ||
21 | * Taking an interrupt in FIQ mode is death, so both these functions | ||
22 | * disable irqs for the duration. | ||
23 | */ | ||
24 | |||
25 | ENTRY(__set_fiq_regs) | ||
26 | mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE | ||
27 | mrs r1, cpsr | ||
28 | msr cpsr_c, r2 @ select FIQ mode | ||
29 | mov r0, r0 @ avoid hazard prior to ARMv4 | ||
30 | ldmia r0!, {r8 - r12} | ||
31 | ldr sp, [r0], #4 | ||
32 | ldr lr, [r0] | ||
33 | msr cpsr_c, r1 @ return to SVC mode | ||
34 | mov r0, r0 @ avoid hazard prior to ARMv4 | ||
35 | mov pc, lr | ||
36 | ENDPROC(__set_fiq_regs) | ||
37 | |||
38 | ENTRY(__get_fiq_regs) | ||
39 | mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE | ||
40 | mrs r1, cpsr | ||
41 | msr cpsr_c, r2 @ select FIQ mode | ||
42 | mov r0, r0 @ avoid hazard prior to ARMv4 | ||
43 | stmia r0!, {r8 - r12} | ||
44 | str sp, [r0], #4 | ||
45 | str lr, [r0] | ||
46 | msr cpsr_c, r1 @ return to SVC mode | ||
47 | mov r0, r0 @ avoid hazard prior to ARMv4 | ||
48 | mov pc, lr | ||
49 | ENDPROC(__get_fiq_regs) | ||
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index c84b57d27d07..854bd22380d3 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S | |||
@@ -15,6 +15,12 @@ | |||
15 | #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) | 15 | #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) |
16 | #define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2) | 16 | #define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2) |
17 | 17 | ||
18 | #ifdef CONFIG_CPU_BIG_ENDIAN | ||
19 | #define OF_DT_MAGIC 0xd00dfeed | ||
20 | #else | ||
21 | #define OF_DT_MAGIC 0xedfe0dd0 /* 0xd00dfeed in big-endian */ | ||
22 | #endif | ||
23 | |||
18 | /* | 24 | /* |
19 | * Exception handling. Something went wrong and we can't proceed. We | 25 | * Exception handling. Something went wrong and we can't proceed. We |
20 | * ought to tell the user, but since we don't have any guarantee that | 26 | * ought to tell the user, but since we don't have any guarantee that |
@@ -28,20 +34,26 @@ | |||
28 | 34 | ||
29 | /* Determine validity of the r2 atags pointer. The heuristic requires | 35 | /* Determine validity of the r2 atags pointer. The heuristic requires |
30 | * that the pointer be aligned, in the first 16k of physical RAM and | 36 | * that the pointer be aligned, in the first 16k of physical RAM and |
31 | * that the ATAG_CORE marker is first and present. Future revisions | 37 | * that the ATAG_CORE marker is first and present. If CONFIG_OF_FLATTREE |
38 | * is selected, then it will also accept a dtb pointer. Future revisions | ||
32 | * of this function may be more lenient with the physical address and | 39 | * of this function may be more lenient with the physical address and |
33 | * may also be able to move the ATAGS block if necessary. | 40 | * may also be able to move the ATAGS block if necessary. |
34 | * | 41 | * |
35 | * Returns: | 42 | * Returns: |
36 | * r2 either valid atags pointer, or zero | 43 | * r2 either valid atags pointer, valid dtb pointer, or zero |
37 | * r5, r6 corrupted | 44 | * r5, r6 corrupted |
38 | */ | 45 | */ |
39 | __vet_atags: | 46 | __vet_atags: |
40 | tst r2, #0x3 @ aligned? | 47 | tst r2, #0x3 @ aligned? |
41 | bne 1f | 48 | bne 1f |
42 | 49 | ||
43 | ldr r5, [r2, #0] @ is first tag ATAG_CORE? | 50 | ldr r5, [r2, #0] |
44 | cmp r5, #ATAG_CORE_SIZE | 51 | #ifdef CONFIG_OF_FLATTREE |
52 | ldr r6, =OF_DT_MAGIC @ is it a DTB? | ||
53 | cmp r5, r6 | ||
54 | beq 2f | ||
55 | #endif | ||
56 | cmp r5, #ATAG_CORE_SIZE @ is first tag ATAG_CORE? | ||
45 | cmpne r5, #ATAG_CORE_SIZE_EMPTY | 57 | cmpne r5, #ATAG_CORE_SIZE_EMPTY |
46 | bne 1f | 58 | bne 1f |
47 | ldr r5, [r2, #4] | 59 | ldr r5, [r2, #4] |
@@ -49,7 +61,7 @@ __vet_atags: | |||
49 | cmp r5, r6 | 61 | cmp r5, r6 |
50 | bne 1f | 62 | bne 1f |
51 | 63 | ||
52 | mov pc, lr @ atag pointer is ok | 64 | 2: mov pc, lr @ atag/dtb pointer is ok |
53 | 65 | ||
54 | 1: mov r2, #0 | 66 | 1: mov r2, #0 |
55 | mov pc, lr | 67 | mov pc, lr |
@@ -61,7 +73,7 @@ ENDPROC(__vet_atags) | |||
61 | * | 73 | * |
62 | * r0 = cp#15 control register | 74 | * r0 = cp#15 control register |
63 | * r1 = machine ID | 75 | * r1 = machine ID |
64 | * r2 = atags pointer | 76 | * r2 = atags/dtb pointer |
65 | * r9 = processor ID | 77 | * r9 = processor ID |
66 | */ | 78 | */ |
67 | __INIT | 79 | __INIT |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index c9173cfbbc74..278c1b0ebb2e 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -59,7 +59,7 @@ | |||
59 | * | 59 | * |
60 | * This is normally called from the decompressor code. The requirements | 60 | * This is normally called from the decompressor code. The requirements |
61 | * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0, | 61 | * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0, |
62 | * r1 = machine nr, r2 = atags pointer. | 62 | * r1 = machine nr, r2 = atags or dtb pointer. |
63 | * | 63 | * |
64 | * This code is mostly position independent, so if you link the kernel at | 64 | * This code is mostly position independent, so if you link the kernel at |
65 | * 0xc0008000, you call this at __pa(0xc0008000). | 65 | * 0xc0008000, you call this at __pa(0xc0008000). |
@@ -91,7 +91,7 @@ ENTRY(stext) | |||
91 | #endif | 91 | #endif |
92 | 92 | ||
93 | /* | 93 | /* |
94 | * r1 = machine no, r2 = atags, | 94 | * r1 = machine no, r2 = atags or dtb, |
95 | * r8 = phys_offset, r9 = cpuid, r10 = procinfo | 95 | * r8 = phys_offset, r9 = cpuid, r10 = procinfo |
96 | */ | 96 | */ |
97 | bl __vet_atags | 97 | bl __vet_atags |
@@ -113,6 +113,7 @@ ENTRY(stext) | |||
113 | ldr r13, =__mmap_switched @ address to jump to after | 113 | ldr r13, =__mmap_switched @ address to jump to after |
114 | @ mmu has been enabled | 114 | @ mmu has been enabled |
115 | adr lr, BSYM(1f) @ return (PIC) address | 115 | adr lr, BSYM(1f) @ return (PIC) address |
116 | mov r8, r4 @ set TTBR1 to swapper_pg_dir | ||
116 | ARM( add pc, r10, #PROCINFO_INITFUNC ) | 117 | ARM( add pc, r10, #PROCINFO_INITFUNC ) |
117 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | 118 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) |
118 | THUMB( mov pc, r12 ) | 119 | THUMB( mov pc, r12 ) |
@@ -302,8 +303,10 @@ ENTRY(secondary_startup) | |||
302 | */ | 303 | */ |
303 | adr r4, __secondary_data | 304 | adr r4, __secondary_data |
304 | ldmia r4, {r5, r7, r12} @ address to jump to after | 305 | ldmia r4, {r5, r7, r12} @ address to jump to after |
305 | sub r4, r4, r5 @ mmu has been enabled | 306 | sub lr, r4, r5 @ mmu has been enabled |
306 | ldr r4, [r7, r4] @ get secondary_data.pgdir | 307 | ldr r4, [r7, lr] @ get secondary_data.pgdir |
308 | add r7, r7, #4 | ||
309 | ldr r8, [r7, lr] @ get secondary_data.swapper_pg_dir | ||
307 | adr lr, BSYM(__enable_mmu) @ return address | 310 | adr lr, BSYM(__enable_mmu) @ return address |
308 | mov r13, r12 @ __secondary_switched address | 311 | mov r13, r12 @ __secondary_switched address |
309 | ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor | 312 | ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor |
@@ -339,7 +342,7 @@ __secondary_data: | |||
339 | * | 342 | * |
340 | * r0 = cp#15 control register | 343 | * r0 = cp#15 control register |
341 | * r1 = machine ID | 344 | * r1 = machine ID |
342 | * r2 = atags pointer | 345 | * r2 = atags or dtb pointer |
343 | * r4 = page table pointer | 346 | * r4 = page table pointer |
344 | * r9 = processor ID | 347 | * r9 = processor ID |
345 | * r13 = *virtual* address to jump to upon completion | 348 | * r13 = *virtual* address to jump to upon completion |
@@ -376,7 +379,7 @@ ENDPROC(__enable_mmu) | |||
376 | * | 379 | * |
377 | * r0 = cp#15 control register | 380 | * r0 = cp#15 control register |
378 | * r1 = machine ID | 381 | * r1 = machine ID |
379 | * r2 = atags pointer | 382 | * r2 = atags or dtb pointer |
380 | * r9 = processor ID | 383 | * r9 = processor ID |
381 | * r13 = *virtual* address to jump to upon completion | 384 | * r13 = *virtual* address to jump to upon completion |
382 | * | 385 | * |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 6dce209a623b..ed11fb08b05a 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/screen_info.h> | 20 | #include <linux/screen_info.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/kexec.h> | 22 | #include <linux/kexec.h> |
23 | #include <linux/of_fdt.h> | ||
23 | #include <linux/crash_dump.h> | 24 | #include <linux/crash_dump.h> |
24 | #include <linux/root_dev.h> | 25 | #include <linux/root_dev.h> |
25 | #include <linux/cpu.h> | 26 | #include <linux/cpu.h> |
@@ -42,6 +43,7 @@ | |||
42 | #include <asm/cachetype.h> | 43 | #include <asm/cachetype.h> |
43 | #include <asm/tlbflush.h> | 44 | #include <asm/tlbflush.h> |
44 | 45 | ||
46 | #include <asm/prom.h> | ||
45 | #include <asm/mach/arch.h> | 47 | #include <asm/mach/arch.h> |
46 | #include <asm/mach/irq.h> | 48 | #include <asm/mach/irq.h> |
47 | #include <asm/mach/time.h> | 49 | #include <asm/mach/time.h> |
@@ -309,7 +311,7 @@ static void __init cacheid_init(void) | |||
309 | */ | 311 | */ |
310 | extern struct proc_info_list *lookup_processor_type(unsigned int); | 312 | extern struct proc_info_list *lookup_processor_type(unsigned int); |
311 | 313 | ||
312 | static void __init early_print(const char *str, ...) | 314 | void __init early_print(const char *str, ...) |
313 | { | 315 | { |
314 | extern void printascii(const char *); | 316 | extern void printascii(const char *); |
315 | char buf[256]; | 317 | char buf[256]; |
@@ -439,25 +441,12 @@ void cpu_init(void) | |||
439 | : "r14"); | 441 | : "r14"); |
440 | } | 442 | } |
441 | 443 | ||
442 | static struct machine_desc * __init setup_machine(unsigned int nr) | 444 | void __init dump_machine_table(void) |
443 | { | 445 | { |
444 | extern struct machine_desc __arch_info_begin[], __arch_info_end[]; | ||
445 | struct machine_desc *p; | 446 | struct machine_desc *p; |
446 | 447 | ||
447 | /* | 448 | early_print("Available machine support:\n\nID (hex)\tNAME\n"); |
448 | * locate machine in the list of supported machines. | 449 | for_each_machine_desc(p) |
449 | */ | ||
450 | for (p = __arch_info_begin; p < __arch_info_end; p++) | ||
451 | if (nr == p->nr) { | ||
452 | printk("Machine: %s\n", p->name); | ||
453 | return p; | ||
454 | } | ||
455 | |||
456 | early_print("\n" | ||
457 | "Error: unrecognized/unsupported machine ID (r1 = 0x%08x).\n\n" | ||
458 | "Available machine support:\n\nID (hex)\tNAME\n", nr); | ||
459 | |||
460 | for (p = __arch_info_begin; p < __arch_info_end; p++) | ||
461 | early_print("%08x\t%s\n", p->nr, p->name); | 450 | early_print("%08x\t%s\n", p->nr, p->name); |
462 | 451 | ||
463 | early_print("\nPlease check your kernel config and/or bootloader.\n"); | 452 | early_print("\nPlease check your kernel config and/or bootloader.\n"); |
@@ -466,7 +455,7 @@ static struct machine_desc * __init setup_machine(unsigned int nr) | |||
466 | /* can't use cpu_relax() here as it may require MMU setup */; | 455 | /* can't use cpu_relax() here as it may require MMU setup */; |
467 | } | 456 | } |
468 | 457 | ||
469 | static int __init arm_add_memory(phys_addr_t start, unsigned long size) | 458 | int __init arm_add_memory(phys_addr_t start, unsigned long size) |
470 | { | 459 | { |
471 | struct membank *bank = &meminfo.bank[meminfo.nr_banks]; | 460 | struct membank *bank = &meminfo.bank[meminfo.nr_banks]; |
472 | 461 | ||
@@ -801,23 +790,29 @@ static void __init squash_mem_tags(struct tag *tag) | |||
801 | tag->hdr.tag = ATAG_NONE; | 790 | tag->hdr.tag = ATAG_NONE; |
802 | } | 791 | } |
803 | 792 | ||
804 | void __init setup_arch(char **cmdline_p) | 793 | static struct machine_desc * __init setup_machine_tags(unsigned int nr) |
805 | { | 794 | { |
806 | struct tag *tags = (struct tag *)&init_tags; | 795 | struct tag *tags = (struct tag *)&init_tags; |
807 | struct machine_desc *mdesc; | 796 | struct machine_desc *mdesc = NULL, *p; |
808 | char *from = default_command_line; | 797 | char *from = default_command_line; |
809 | 798 | ||
810 | init_tags.mem.start = PHYS_OFFSET; | 799 | init_tags.mem.start = PHYS_OFFSET; |
811 | 800 | ||
812 | unwind_init(); | 801 | /* |
813 | 802 | * locate machine in the list of supported machines. | |
814 | setup_processor(); | 803 | */ |
815 | mdesc = setup_machine(machine_arch_type); | 804 | for_each_machine_desc(p) |
816 | machine_desc = mdesc; | 805 | if (nr == p->nr) { |
817 | machine_name = mdesc->name; | 806 | printk("Machine: %s\n", p->name); |
807 | mdesc = p; | ||
808 | break; | ||
809 | } | ||
818 | 810 | ||
819 | if (mdesc->soft_reboot) | 811 | if (!mdesc) { |
820 | reboot_setup("s"); | 812 | early_print("\nError: unrecognized/unsupported machine ID" |
813 | " (r1 = 0x%08x).\n\n", nr); | ||
814 | dump_machine_table(); /* does not return */ | ||
815 | } | ||
821 | 816 | ||
822 | if (__atags_pointer) | 817 | if (__atags_pointer) |
823 | tags = phys_to_virt(__atags_pointer); | 818 | tags = phys_to_virt(__atags_pointer); |
@@ -849,8 +844,17 @@ void __init setup_arch(char **cmdline_p) | |||
849 | if (tags->hdr.tag != ATAG_CORE) | 844 | if (tags->hdr.tag != ATAG_CORE) |
850 | convert_to_tag_list(tags); | 845 | convert_to_tag_list(tags); |
851 | #endif | 846 | #endif |
852 | if (tags->hdr.tag != ATAG_CORE) | 847 | |
848 | if (tags->hdr.tag != ATAG_CORE) { | ||
849 | #if defined(CONFIG_OF) | ||
850 | /* | ||
851 | * If CONFIG_OF is set, then assume this is a reasonably | ||
852 | * modern system that should pass boot parameters | ||
853 | */ | ||
854 | early_print("Warning: Neither atags nor dtb found\n"); | ||
855 | #endif | ||
853 | tags = (struct tag *)&init_tags; | 856 | tags = (struct tag *)&init_tags; |
857 | } | ||
854 | 858 | ||
855 | if (mdesc->fixup) | 859 | if (mdesc->fixup) |
856 | mdesc->fixup(mdesc, tags, &from, &meminfo); | 860 | mdesc->fixup(mdesc, tags, &from, &meminfo); |
@@ -862,14 +866,34 @@ void __init setup_arch(char **cmdline_p) | |||
862 | parse_tags(tags); | 866 | parse_tags(tags); |
863 | } | 867 | } |
864 | 868 | ||
869 | /* parse_early_param needs a boot_command_line */ | ||
870 | strlcpy(boot_command_line, from, COMMAND_LINE_SIZE); | ||
871 | |||
872 | return mdesc; | ||
873 | } | ||
874 | |||
875 | |||
876 | void __init setup_arch(char **cmdline_p) | ||
877 | { | ||
878 | struct machine_desc *mdesc; | ||
879 | |||
880 | unwind_init(); | ||
881 | |||
882 | setup_processor(); | ||
883 | mdesc = setup_machine_fdt(__atags_pointer); | ||
884 | if (!mdesc) | ||
885 | mdesc = setup_machine_tags(machine_arch_type); | ||
886 | machine_desc = mdesc; | ||
887 | machine_name = mdesc->name; | ||
888 | |||
889 | if (mdesc->soft_reboot) | ||
890 | reboot_setup("s"); | ||
891 | |||
865 | init_mm.start_code = (unsigned long) _text; | 892 | init_mm.start_code = (unsigned long) _text; |
866 | init_mm.end_code = (unsigned long) _etext; | 893 | init_mm.end_code = (unsigned long) _etext; |
867 | init_mm.end_data = (unsigned long) _edata; | 894 | init_mm.end_data = (unsigned long) _edata; |
868 | init_mm.brk = (unsigned long) _end; | 895 | init_mm.brk = (unsigned long) _end; |
869 | 896 | ||
870 | /* parse_early_param needs a boot_command_line */ | ||
871 | strlcpy(boot_command_line, from, COMMAND_LINE_SIZE); | ||
872 | |||
873 | /* populate cmd_line too for later use, preserving boot_command_line */ | 897 | /* populate cmd_line too for later use, preserving boot_command_line */ |
874 | strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); | 898 | strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); |
875 | *cmdline_p = cmd_line; | 899 | *cmdline_p = cmd_line; |
@@ -881,6 +905,8 @@ void __init setup_arch(char **cmdline_p) | |||
881 | paging_init(mdesc); | 905 | paging_init(mdesc); |
882 | request_standard_resources(mdesc); | 906 | request_standard_resources(mdesc); |
883 | 907 | ||
908 | unflatten_device_tree(); | ||
909 | |||
884 | #ifdef CONFIG_SMP | 910 | #ifdef CONFIG_SMP |
885 | if (is_smp()) | 911 | if (is_smp()) |
886 | smp_init_cpus(); | 912 | smp_init_cpus(); |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index d439a8f4c078..344e52b16c8c 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -105,6 +105,7 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
105 | */ | 105 | */ |
106 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; | 106 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; |
107 | secondary_data.pgdir = virt_to_phys(pgd); | 107 | secondary_data.pgdir = virt_to_phys(pgd); |
108 | secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir); | ||
108 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); | 109 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); |
109 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); | 110 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); |
110 | 111 | ||
diff --git a/arch/arm/lib/lib1funcs.S b/arch/arm/lib/lib1funcs.S index 6dc06487f3c3..c562f649734c 100644 --- a/arch/arm/lib/lib1funcs.S +++ b/arch/arm/lib/lib1funcs.S | |||
@@ -35,7 +35,7 @@ Boston, MA 02111-1307, USA. */ | |||
35 | 35 | ||
36 | #include <linux/linkage.h> | 36 | #include <linux/linkage.h> |
37 | #include <asm/assembler.h> | 37 | #include <asm/assembler.h> |
38 | 38 | #include <asm/unwind.h> | |
39 | 39 | ||
40 | .macro ARM_DIV_BODY dividend, divisor, result, curbit | 40 | .macro ARM_DIV_BODY dividend, divisor, result, curbit |
41 | 41 | ||
@@ -207,6 +207,7 @@ Boston, MA 02111-1307, USA. */ | |||
207 | 207 | ||
208 | ENTRY(__udivsi3) | 208 | ENTRY(__udivsi3) |
209 | ENTRY(__aeabi_uidiv) | 209 | ENTRY(__aeabi_uidiv) |
210 | UNWIND(.fnstart) | ||
210 | 211 | ||
211 | subs r2, r1, #1 | 212 | subs r2, r1, #1 |
212 | moveq pc, lr | 213 | moveq pc, lr |
@@ -230,10 +231,12 @@ ENTRY(__aeabi_uidiv) | |||
230 | mov r0, r0, lsr r2 | 231 | mov r0, r0, lsr r2 |
231 | mov pc, lr | 232 | mov pc, lr |
232 | 233 | ||
234 | UNWIND(.fnend) | ||
233 | ENDPROC(__udivsi3) | 235 | ENDPROC(__udivsi3) |
234 | ENDPROC(__aeabi_uidiv) | 236 | ENDPROC(__aeabi_uidiv) |
235 | 237 | ||
236 | ENTRY(__umodsi3) | 238 | ENTRY(__umodsi3) |
239 | UNWIND(.fnstart) | ||
237 | 240 | ||
238 | subs r2, r1, #1 @ compare divisor with 1 | 241 | subs r2, r1, #1 @ compare divisor with 1 |
239 | bcc Ldiv0 | 242 | bcc Ldiv0 |
@@ -247,10 +250,12 @@ ENTRY(__umodsi3) | |||
247 | 250 | ||
248 | mov pc, lr | 251 | mov pc, lr |
249 | 252 | ||
253 | UNWIND(.fnend) | ||
250 | ENDPROC(__umodsi3) | 254 | ENDPROC(__umodsi3) |
251 | 255 | ||
252 | ENTRY(__divsi3) | 256 | ENTRY(__divsi3) |
253 | ENTRY(__aeabi_idiv) | 257 | ENTRY(__aeabi_idiv) |
258 | UNWIND(.fnstart) | ||
254 | 259 | ||
255 | cmp r1, #0 | 260 | cmp r1, #0 |
256 | eor ip, r0, r1 @ save the sign of the result. | 261 | eor ip, r0, r1 @ save the sign of the result. |
@@ -287,10 +292,12 @@ ENTRY(__aeabi_idiv) | |||
287 | rsbmi r0, r0, #0 | 292 | rsbmi r0, r0, #0 |
288 | mov pc, lr | 293 | mov pc, lr |
289 | 294 | ||
295 | UNWIND(.fnend) | ||
290 | ENDPROC(__divsi3) | 296 | ENDPROC(__divsi3) |
291 | ENDPROC(__aeabi_idiv) | 297 | ENDPROC(__aeabi_idiv) |
292 | 298 | ||
293 | ENTRY(__modsi3) | 299 | ENTRY(__modsi3) |
300 | UNWIND(.fnstart) | ||
294 | 301 | ||
295 | cmp r1, #0 | 302 | cmp r1, #0 |
296 | beq Ldiv0 | 303 | beq Ldiv0 |
@@ -310,11 +317,14 @@ ENTRY(__modsi3) | |||
310 | rsbmi r0, r0, #0 | 317 | rsbmi r0, r0, #0 |
311 | mov pc, lr | 318 | mov pc, lr |
312 | 319 | ||
320 | UNWIND(.fnend) | ||
313 | ENDPROC(__modsi3) | 321 | ENDPROC(__modsi3) |
314 | 322 | ||
315 | #ifdef CONFIG_AEABI | 323 | #ifdef CONFIG_AEABI |
316 | 324 | ||
317 | ENTRY(__aeabi_uidivmod) | 325 | ENTRY(__aeabi_uidivmod) |
326 | UNWIND(.fnstart) | ||
327 | UNWIND(.save {r0, r1, ip, lr} ) | ||
318 | 328 | ||
319 | stmfd sp!, {r0, r1, ip, lr} | 329 | stmfd sp!, {r0, r1, ip, lr} |
320 | bl __aeabi_uidiv | 330 | bl __aeabi_uidiv |
@@ -323,10 +333,12 @@ ENTRY(__aeabi_uidivmod) | |||
323 | sub r1, r1, r3 | 333 | sub r1, r1, r3 |
324 | mov pc, lr | 334 | mov pc, lr |
325 | 335 | ||
336 | UNWIND(.fnend) | ||
326 | ENDPROC(__aeabi_uidivmod) | 337 | ENDPROC(__aeabi_uidivmod) |
327 | 338 | ||
328 | ENTRY(__aeabi_idivmod) | 339 | ENTRY(__aeabi_idivmod) |
329 | 340 | UNWIND(.fnstart) | |
341 | UNWIND(.save {r0, r1, ip, lr} ) | ||
330 | stmfd sp!, {r0, r1, ip, lr} | 342 | stmfd sp!, {r0, r1, ip, lr} |
331 | bl __aeabi_idiv | 343 | bl __aeabi_idiv |
332 | ldmfd sp!, {r1, r2, ip, lr} | 344 | ldmfd sp!, {r1, r2, ip, lr} |
@@ -334,15 +346,18 @@ ENTRY(__aeabi_idivmod) | |||
334 | sub r1, r1, r3 | 346 | sub r1, r1, r3 |
335 | mov pc, lr | 347 | mov pc, lr |
336 | 348 | ||
349 | UNWIND(.fnend) | ||
337 | ENDPROC(__aeabi_idivmod) | 350 | ENDPROC(__aeabi_idivmod) |
338 | 351 | ||
339 | #endif | 352 | #endif |
340 | 353 | ||
341 | Ldiv0: | 354 | Ldiv0: |
342 | 355 | UNWIND(.fnstart) | |
356 | UNWIND(.pad #4) | ||
357 | UNWIND(.save {lr}) | ||
343 | str lr, [sp, #-8]! | 358 | str lr, [sp, #-8]! |
344 | bl __div0 | 359 | bl __div0 |
345 | mov r0, #0 @ About as wrong as it could be. | 360 | mov r0, #0 @ About as wrong as it could be. |
346 | ldr pc, [sp], #8 | 361 | ldr pc, [sp], #8 |
347 | 362 | UNWIND(.fnend) | |
348 | 363 | ENDPROC(Ldiv0) | |
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 2d299bf5d72f..22484670e7ba 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig | |||
@@ -3,9 +3,6 @@ if ARCH_AT91 | |||
3 | config HAVE_AT91_DATAFLASH_CARD | 3 | config HAVE_AT91_DATAFLASH_CARD |
4 | bool | 4 | bool |
5 | 5 | ||
6 | config HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
7 | bool | ||
8 | |||
9 | config HAVE_AT91_USART3 | 6 | config HAVE_AT91_USART3 |
10 | bool | 7 | bool |
11 | 8 | ||
@@ -85,11 +82,6 @@ config ARCH_AT91CAP9 | |||
85 | select HAVE_FB_ATMEL | 82 | select HAVE_FB_ATMEL |
86 | select HAVE_NET_MACB | 83 | select HAVE_NET_MACB |
87 | 84 | ||
88 | config ARCH_AT572D940HF | ||
89 | bool "AT572D940HF" | ||
90 | select CPU_ARM926T | ||
91 | select GENERIC_CLOCKEVENTS | ||
92 | |||
93 | config ARCH_AT91X40 | 85 | config ARCH_AT91X40 |
94 | bool "AT91x40" | 86 | bool "AT91x40" |
95 | select ARCH_USES_GETTIMEOFFSET | 87 | select ARCH_USES_GETTIMEOFFSET |
@@ -209,7 +201,6 @@ comment "AT91SAM9260 / AT91SAM9XE Board Type" | |||
209 | config MACH_AT91SAM9260EK | 201 | config MACH_AT91SAM9260EK |
210 | bool "Atmel AT91SAM9260-EK / AT91SAM9XE Evaluation Kit" | 202 | bool "Atmel AT91SAM9260-EK / AT91SAM9XE Evaluation Kit" |
211 | select HAVE_AT91_DATAFLASH_CARD | 203 | select HAVE_AT91_DATAFLASH_CARD |
212 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
213 | help | 204 | help |
214 | Select this if you are using Atmel's AT91SAM9260-EK or AT91SAM9XE Evaluation Kit | 205 | Select this if you are using Atmel's AT91SAM9260-EK or AT91SAM9XE Evaluation Kit |
215 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3933> | 206 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3933> |
@@ -270,7 +261,6 @@ comment "AT91SAM9261 Board Type" | |||
270 | config MACH_AT91SAM9261EK | 261 | config MACH_AT91SAM9261EK |
271 | bool "Atmel AT91SAM9261-EK Evaluation Kit" | 262 | bool "Atmel AT91SAM9261-EK Evaluation Kit" |
272 | select HAVE_AT91_DATAFLASH_CARD | 263 | select HAVE_AT91_DATAFLASH_CARD |
273 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
274 | help | 264 | help |
275 | Select this if you are using Atmel's AT91SAM9261-EK Evaluation Kit. | 265 | Select this if you are using Atmel's AT91SAM9261-EK Evaluation Kit. |
276 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820> | 266 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820> |
@@ -286,7 +276,6 @@ comment "AT91SAM9G10 Board Type" | |||
286 | config MACH_AT91SAM9G10EK | 276 | config MACH_AT91SAM9G10EK |
287 | bool "Atmel AT91SAM9G10-EK Evaluation Kit" | 277 | bool "Atmel AT91SAM9G10-EK Evaluation Kit" |
288 | select HAVE_AT91_DATAFLASH_CARD | 278 | select HAVE_AT91_DATAFLASH_CARD |
289 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
290 | help | 279 | help |
291 | Select this if you are using Atmel's AT91SAM9G10-EK Evaluation Kit. | 280 | Select this if you are using Atmel's AT91SAM9G10-EK Evaluation Kit. |
292 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4588> | 281 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4588> |
@@ -302,7 +291,6 @@ comment "AT91SAM9263 Board Type" | |||
302 | config MACH_AT91SAM9263EK | 291 | config MACH_AT91SAM9263EK |
303 | bool "Atmel AT91SAM9263-EK Evaluation Kit" | 292 | bool "Atmel AT91SAM9263-EK Evaluation Kit" |
304 | select HAVE_AT91_DATAFLASH_CARD | 293 | select HAVE_AT91_DATAFLASH_CARD |
305 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
306 | help | 294 | help |
307 | Select this if you are using Atmel's AT91SAM9263-EK Evaluation Kit. | 295 | Select this if you are using Atmel's AT91SAM9263-EK Evaluation Kit. |
308 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4057> | 296 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4057> |
@@ -343,7 +331,6 @@ comment "AT91SAM9G20 Board Type" | |||
343 | config MACH_AT91SAM9G20EK | 331 | config MACH_AT91SAM9G20EK |
344 | bool "Atmel AT91SAM9G20-EK Evaluation Kit" | 332 | bool "Atmel AT91SAM9G20-EK Evaluation Kit" |
345 | select HAVE_AT91_DATAFLASH_CARD | 333 | select HAVE_AT91_DATAFLASH_CARD |
346 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
347 | help | 334 | help |
348 | Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit | 335 | Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit |
349 | that embeds only one SD/MMC slot. | 336 | that embeds only one SD/MMC slot. |
@@ -351,7 +338,6 @@ config MACH_AT91SAM9G20EK | |||
351 | config MACH_AT91SAM9G20EK_2MMC | 338 | config MACH_AT91SAM9G20EK_2MMC |
352 | depends on MACH_AT91SAM9G20EK | 339 | depends on MACH_AT91SAM9G20EK |
353 | bool "Atmel AT91SAM9G20-EK Evaluation Kit with 2 SD/MMC Slots" | 340 | bool "Atmel AT91SAM9G20-EK Evaluation Kit with 2 SD/MMC Slots" |
354 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
355 | help | 341 | help |
356 | Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit | 342 | Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit |
357 | with 2 SD/MMC Slots. This is the case for AT91SAM9G20-EK rev. C and | 343 | with 2 SD/MMC Slots. This is the case for AT91SAM9G20-EK rev. C and |
@@ -416,7 +402,6 @@ comment "AT91SAM9G45 Board Type" | |||
416 | 402 | ||
417 | config MACH_AT91SAM9M10G45EK | 403 | config MACH_AT91SAM9M10G45EK |
418 | bool "Atmel AT91SAM9M10G45-EK Evaluation Kits" | 404 | bool "Atmel AT91SAM9M10G45-EK Evaluation Kits" |
419 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
420 | help | 405 | help |
421 | Select this if you are using Atmel's AT91SAM9G45-EKES Evaluation Kit. | 406 | Select this if you are using Atmel's AT91SAM9G45-EKES Evaluation Kit. |
422 | "ES" at the end of the name means that this board is an | 407 | "ES" at the end of the name means that this board is an |
@@ -433,7 +418,6 @@ comment "AT91CAP9 Board Type" | |||
433 | config MACH_AT91CAP9ADK | 418 | config MACH_AT91CAP9ADK |
434 | bool "Atmel AT91CAP9A-DK Evaluation Kit" | 419 | bool "Atmel AT91CAP9A-DK Evaluation Kit" |
435 | select HAVE_AT91_DATAFLASH_CARD | 420 | select HAVE_AT91_DATAFLASH_CARD |
436 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
437 | help | 421 | help |
438 | Select this if you are using Atmel's AT91CAP9A-DK Evaluation Kit. | 422 | Select this if you are using Atmel's AT91CAP9A-DK Evaluation Kit. |
439 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4138> | 423 | <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4138> |
@@ -442,23 +426,6 @@ endif | |||
442 | 426 | ||
443 | # ---------------------------------------------------------- | 427 | # ---------------------------------------------------------- |
444 | 428 | ||
445 | if ARCH_AT572D940HF | ||
446 | |||
447 | comment "AT572D940HF Board Type" | ||
448 | |||
449 | config MACH_AT572D940HFEB | ||
450 | bool "AT572D940HF-EK" | ||
451 | depends on ARCH_AT572D940HF | ||
452 | select HAVE_AT91_DATAFLASH_CARD | ||
453 | select HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
454 | help | ||
455 | Select this if you are using Atmel's AT572D940HF-EK evaluation kit. | ||
456 | <http://www.atmel.com/products/diopsis/default.asp> | ||
457 | |||
458 | endif | ||
459 | |||
460 | # ---------------------------------------------------------- | ||
461 | |||
462 | if ARCH_AT91X40 | 429 | if ARCH_AT91X40 |
463 | 430 | ||
464 | comment "AT91X40 Board Type" | 431 | comment "AT91X40 Board Type" |
@@ -483,13 +450,6 @@ config MTD_AT91_DATAFLASH_CARD | |||
483 | help | 450 | help |
484 | Enable support for the DataFlash card. | 451 | Enable support for the DataFlash card. |
485 | 452 | ||
486 | config MTD_NAND_ATMEL_BUSWIDTH_16 | ||
487 | bool "Enable 16-bit data bus interface to NAND flash" | ||
488 | depends on HAVE_NAND_ATMEL_BUSWIDTH_16 | ||
489 | help | ||
490 | On AT91SAM926x boards both types of NAND flash can be present | ||
491 | (8 and 16 bit data bus width). | ||
492 | |||
493 | # ---------------------------------------------------------- | 453 | # ---------------------------------------------------------- |
494 | 454 | ||
495 | comment "AT91 Feature Selections" | 455 | comment "AT91 Feature Selections" |
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index a83835e0c185..96966231920c 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile | |||
@@ -19,7 +19,6 @@ obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devi | |||
19 | obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o | 19 | obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o |
20 | obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o | 20 | obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o |
21 | obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o | 21 | obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o |
22 | obj-$(CONFIG_ARCH_AT572D940HF) += at572d940hf.o at91sam926x_time.o at572d940hf_devices.o sam9_smc.o | ||
23 | obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o | 22 | obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o |
24 | 23 | ||
25 | # AT91RM9200 board-specific support | 24 | # AT91RM9200 board-specific support |
@@ -78,9 +77,6 @@ obj-$(CONFIG_MACH_AT91SAM9M10G45EK) += board-sam9m10g45ek.o | |||
78 | # AT91CAP9 board-specific support | 77 | # AT91CAP9 board-specific support |
79 | obj-$(CONFIG_MACH_AT91CAP9ADK) += board-cap9adk.o | 78 | obj-$(CONFIG_MACH_AT91CAP9ADK) += board-cap9adk.o |
80 | 79 | ||
81 | # AT572D940HF board-specific support | ||
82 | obj-$(CONFIG_MACH_AT572D940HFEB) += board-at572d940hf_ek.o | ||
83 | |||
84 | # AT91X40 board-specific support | 80 | # AT91X40 board-specific support |
85 | obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o | 81 | obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o |
86 | 82 | ||
diff --git a/arch/arm/mach-at91/at572d940hf.c b/arch/arm/mach-at91/at572d940hf.c deleted file mode 100644 index a6b9c68c003a..000000000000 --- a/arch/arm/mach-at91/at572d940hf.c +++ /dev/null | |||
@@ -1,377 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/at572d940hf.c | ||
3 | * | ||
4 | * Antonio R. Costa <costa.antonior@gmail.com> | ||
5 | * Copyright (C) 2008 Atmel | ||
6 | * | ||
7 | * Copyright (C) 2005 SAN People | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #include <linux/module.h> | ||
26 | |||
27 | #include <asm/mach/irq.h> | ||
28 | #include <asm/mach/arch.h> | ||
29 | #include <asm/mach/map.h> | ||
30 | #include <mach/at572d940hf.h> | ||
31 | #include <mach/at91_pmc.h> | ||
32 | #include <mach/at91_rstc.h> | ||
33 | |||
34 | #include "generic.h" | ||
35 | #include "clock.h" | ||
36 | |||
37 | static struct map_desc at572d940hf_io_desc[] __initdata = { | ||
38 | { | ||
39 | .virtual = AT91_VA_BASE_SYS, | ||
40 | .pfn = __phys_to_pfn(AT91_BASE_SYS), | ||
41 | .length = SZ_16K, | ||
42 | .type = MT_DEVICE, | ||
43 | }, { | ||
44 | .virtual = AT91_IO_VIRT_BASE - AT572D940HF_SRAM_SIZE, | ||
45 | .pfn = __phys_to_pfn(AT572D940HF_SRAM_BASE), | ||
46 | .length = AT572D940HF_SRAM_SIZE, | ||
47 | .type = MT_DEVICE, | ||
48 | }, | ||
49 | }; | ||
50 | |||
51 | /* -------------------------------------------------------------------- | ||
52 | * Clocks | ||
53 | * -------------------------------------------------------------------- */ | ||
54 | |||
55 | /* | ||
56 | * The peripheral clocks. | ||
57 | */ | ||
58 | static struct clk pioA_clk = { | ||
59 | .name = "pioA_clk", | ||
60 | .pmc_mask = 1 << AT572D940HF_ID_PIOA, | ||
61 | .type = CLK_TYPE_PERIPHERAL, | ||
62 | }; | ||
63 | static struct clk pioB_clk = { | ||
64 | .name = "pioB_clk", | ||
65 | .pmc_mask = 1 << AT572D940HF_ID_PIOB, | ||
66 | .type = CLK_TYPE_PERIPHERAL, | ||
67 | }; | ||
68 | static struct clk pioC_clk = { | ||
69 | .name = "pioC_clk", | ||
70 | .pmc_mask = 1 << AT572D940HF_ID_PIOC, | ||
71 | .type = CLK_TYPE_PERIPHERAL, | ||
72 | }; | ||
73 | static struct clk macb_clk = { | ||
74 | .name = "macb_clk", | ||
75 | .pmc_mask = 1 << AT572D940HF_ID_EMAC, | ||
76 | .type = CLK_TYPE_PERIPHERAL, | ||
77 | }; | ||
78 | static struct clk usart0_clk = { | ||
79 | .name = "usart0_clk", | ||
80 | .pmc_mask = 1 << AT572D940HF_ID_US0, | ||
81 | .type = CLK_TYPE_PERIPHERAL, | ||
82 | }; | ||
83 | static struct clk usart1_clk = { | ||
84 | .name = "usart1_clk", | ||
85 | .pmc_mask = 1 << AT572D940HF_ID_US1, | ||
86 | .type = CLK_TYPE_PERIPHERAL, | ||
87 | }; | ||
88 | static struct clk usart2_clk = { | ||
89 | .name = "usart2_clk", | ||
90 | .pmc_mask = 1 << AT572D940HF_ID_US2, | ||
91 | .type = CLK_TYPE_PERIPHERAL, | ||
92 | }; | ||
93 | static struct clk mmc_clk = { | ||
94 | .name = "mci_clk", | ||
95 | .pmc_mask = 1 << AT572D940HF_ID_MCI, | ||
96 | .type = CLK_TYPE_PERIPHERAL, | ||
97 | }; | ||
98 | static struct clk udc_clk = { | ||
99 | .name = "udc_clk", | ||
100 | .pmc_mask = 1 << AT572D940HF_ID_UDP, | ||
101 | .type = CLK_TYPE_PERIPHERAL, | ||
102 | }; | ||
103 | static struct clk twi0_clk = { | ||
104 | .name = "twi0_clk", | ||
105 | .pmc_mask = 1 << AT572D940HF_ID_TWI0, | ||
106 | .type = CLK_TYPE_PERIPHERAL, | ||
107 | }; | ||
108 | static struct clk spi0_clk = { | ||
109 | .name = "spi0_clk", | ||
110 | .pmc_mask = 1 << AT572D940HF_ID_SPI0, | ||
111 | .type = CLK_TYPE_PERIPHERAL, | ||
112 | }; | ||
113 | static struct clk spi1_clk = { | ||
114 | .name = "spi1_clk", | ||
115 | .pmc_mask = 1 << AT572D940HF_ID_SPI1, | ||
116 | .type = CLK_TYPE_PERIPHERAL, | ||
117 | }; | ||
118 | static struct clk ssc0_clk = { | ||
119 | .name = "ssc0_clk", | ||
120 | .pmc_mask = 1 << AT572D940HF_ID_SSC0, | ||
121 | .type = CLK_TYPE_PERIPHERAL, | ||
122 | }; | ||
123 | static struct clk ssc1_clk = { | ||
124 | .name = "ssc1_clk", | ||
125 | .pmc_mask = 1 << AT572D940HF_ID_SSC1, | ||
126 | .type = CLK_TYPE_PERIPHERAL, | ||
127 | }; | ||
128 | static struct clk ssc2_clk = { | ||
129 | .name = "ssc2_clk", | ||
130 | .pmc_mask = 1 << AT572D940HF_ID_SSC2, | ||
131 | .type = CLK_TYPE_PERIPHERAL, | ||
132 | }; | ||
133 | static struct clk tc0_clk = { | ||
134 | .name = "tc0_clk", | ||
135 | .pmc_mask = 1 << AT572D940HF_ID_TC0, | ||
136 | .type = CLK_TYPE_PERIPHERAL, | ||
137 | }; | ||
138 | static struct clk tc1_clk = { | ||
139 | .name = "tc1_clk", | ||
140 | .pmc_mask = 1 << AT572D940HF_ID_TC1, | ||
141 | .type = CLK_TYPE_PERIPHERAL, | ||
142 | }; | ||
143 | static struct clk tc2_clk = { | ||
144 | .name = "tc2_clk", | ||
145 | .pmc_mask = 1 << AT572D940HF_ID_TC2, | ||
146 | .type = CLK_TYPE_PERIPHERAL, | ||
147 | }; | ||
148 | static struct clk ohci_clk = { | ||
149 | .name = "ohci_clk", | ||
150 | .pmc_mask = 1 << AT572D940HF_ID_UHP, | ||
151 | .type = CLK_TYPE_PERIPHERAL, | ||
152 | }; | ||
153 | static struct clk ssc3_clk = { | ||
154 | .name = "ssc3_clk", | ||
155 | .pmc_mask = 1 << AT572D940HF_ID_SSC3, | ||
156 | .type = CLK_TYPE_PERIPHERAL, | ||
157 | }; | ||
158 | static struct clk twi1_clk = { | ||
159 | .name = "twi1_clk", | ||
160 | .pmc_mask = 1 << AT572D940HF_ID_TWI1, | ||
161 | .type = CLK_TYPE_PERIPHERAL, | ||
162 | }; | ||
163 | static struct clk can0_clk = { | ||
164 | .name = "can0_clk", | ||
165 | .pmc_mask = 1 << AT572D940HF_ID_CAN0, | ||
166 | .type = CLK_TYPE_PERIPHERAL, | ||
167 | }; | ||
168 | static struct clk can1_clk = { | ||
169 | .name = "can1_clk", | ||
170 | .pmc_mask = 1 << AT572D940HF_ID_CAN1, | ||
171 | .type = CLK_TYPE_PERIPHERAL, | ||
172 | }; | ||
173 | static struct clk mAgicV_clk = { | ||
174 | .name = "mAgicV_clk", | ||
175 | .pmc_mask = 1 << AT572D940HF_ID_MSIRQ0, | ||
176 | .type = CLK_TYPE_PERIPHERAL, | ||
177 | }; | ||
178 | |||
179 | |||
180 | static struct clk *periph_clocks[] __initdata = { | ||
181 | &pioA_clk, | ||
182 | &pioB_clk, | ||
183 | &pioC_clk, | ||
184 | &macb_clk, | ||
185 | &usart0_clk, | ||
186 | &usart1_clk, | ||
187 | &usart2_clk, | ||
188 | &mmc_clk, | ||
189 | &udc_clk, | ||
190 | &twi0_clk, | ||
191 | &spi0_clk, | ||
192 | &spi1_clk, | ||
193 | &ssc0_clk, | ||
194 | &ssc1_clk, | ||
195 | &ssc2_clk, | ||
196 | &tc0_clk, | ||
197 | &tc1_clk, | ||
198 | &tc2_clk, | ||
199 | &ohci_clk, | ||
200 | &ssc3_clk, | ||
201 | &twi1_clk, | ||
202 | &can0_clk, | ||
203 | &can1_clk, | ||
204 | &mAgicV_clk, | ||
205 | /* irq0 .. irq2 */ | ||
206 | }; | ||
207 | |||
208 | /* | ||
209 | * The five programmable clocks. | ||
210 | * You must configure pin multiplexing to bring these signals out. | ||
211 | */ | ||
212 | static struct clk pck0 = { | ||
213 | .name = "pck0", | ||
214 | .pmc_mask = AT91_PMC_PCK0, | ||
215 | .type = CLK_TYPE_PROGRAMMABLE, | ||
216 | .id = 0, | ||
217 | }; | ||
218 | static struct clk pck1 = { | ||
219 | .name = "pck1", | ||
220 | .pmc_mask = AT91_PMC_PCK1, | ||
221 | .type = CLK_TYPE_PROGRAMMABLE, | ||
222 | .id = 1, | ||
223 | }; | ||
224 | static struct clk pck2 = { | ||
225 | .name = "pck2", | ||
226 | .pmc_mask = AT91_PMC_PCK2, | ||
227 | .type = CLK_TYPE_PROGRAMMABLE, | ||
228 | .id = 2, | ||
229 | }; | ||
230 | static struct clk pck3 = { | ||
231 | .name = "pck3", | ||
232 | .pmc_mask = AT91_PMC_PCK3, | ||
233 | .type = CLK_TYPE_PROGRAMMABLE, | ||
234 | .id = 3, | ||
235 | }; | ||
236 | |||
237 | static struct clk mAgicV_mem_clk = { | ||
238 | .name = "mAgicV_mem_clk", | ||
239 | .pmc_mask = AT91_PMC_PCK4, | ||
240 | .type = CLK_TYPE_PROGRAMMABLE, | ||
241 | .id = 4, | ||
242 | }; | ||
243 | |||
244 | /* HClocks */ | ||
245 | static struct clk hck0 = { | ||
246 | .name = "hck0", | ||
247 | .pmc_mask = AT91_PMC_HCK0, | ||
248 | .type = CLK_TYPE_SYSTEM, | ||
249 | .id = 0, | ||
250 | }; | ||
251 | static struct clk hck1 = { | ||
252 | .name = "hck1", | ||
253 | .pmc_mask = AT91_PMC_HCK1, | ||
254 | .type = CLK_TYPE_SYSTEM, | ||
255 | .id = 1, | ||
256 | }; | ||
257 | |||
258 | static void __init at572d940hf_register_clocks(void) | ||
259 | { | ||
260 | int i; | ||
261 | |||
262 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | ||
263 | clk_register(periph_clocks[i]); | ||
264 | |||
265 | clk_register(&pck0); | ||
266 | clk_register(&pck1); | ||
267 | clk_register(&pck2); | ||
268 | clk_register(&pck3); | ||
269 | clk_register(&mAgicV_mem_clk); | ||
270 | |||
271 | clk_register(&hck0); | ||
272 | clk_register(&hck1); | ||
273 | } | ||
274 | |||
275 | /* -------------------------------------------------------------------- | ||
276 | * GPIO | ||
277 | * -------------------------------------------------------------------- */ | ||
278 | |||
279 | static struct at91_gpio_bank at572d940hf_gpio[] = { | ||
280 | { | ||
281 | .id = AT572D940HF_ID_PIOA, | ||
282 | .offset = AT91_PIOA, | ||
283 | .clock = &pioA_clk, | ||
284 | }, { | ||
285 | .id = AT572D940HF_ID_PIOB, | ||
286 | .offset = AT91_PIOB, | ||
287 | .clock = &pioB_clk, | ||
288 | }, { | ||
289 | .id = AT572D940HF_ID_PIOC, | ||
290 | .offset = AT91_PIOC, | ||
291 | .clock = &pioC_clk, | ||
292 | } | ||
293 | }; | ||
294 | |||
295 | static void at572d940hf_reset(void) | ||
296 | { | ||
297 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); | ||
298 | } | ||
299 | |||
300 | |||
301 | /* -------------------------------------------------------------------- | ||
302 | * AT572D940HF processor initialization | ||
303 | * -------------------------------------------------------------------- */ | ||
304 | |||
305 | void __init at572d940hf_initialize(unsigned long main_clock) | ||
306 | { | ||
307 | /* Map peripherals */ | ||
308 | iotable_init(at572d940hf_io_desc, ARRAY_SIZE(at572d940hf_io_desc)); | ||
309 | |||
310 | at91_arch_reset = at572d940hf_reset; | ||
311 | at91_extern_irq = (1 << AT572D940HF_ID_IRQ0) | (1 << AT572D940HF_ID_IRQ1) | ||
312 | | (1 << AT572D940HF_ID_IRQ2); | ||
313 | |||
314 | /* Init clock subsystem */ | ||
315 | at91_clock_init(main_clock); | ||
316 | |||
317 | /* Register the processor-specific clocks */ | ||
318 | at572d940hf_register_clocks(); | ||
319 | |||
320 | /* Register GPIO subsystem */ | ||
321 | at91_gpio_init(at572d940hf_gpio, 3); | ||
322 | } | ||
323 | |||
324 | /* -------------------------------------------------------------------- | ||
325 | * Interrupt initialization | ||
326 | * -------------------------------------------------------------------- */ | ||
327 | |||
328 | /* | ||
329 | * The default interrupt priority levels (0 = lowest, 7 = highest). | ||
330 | */ | ||
331 | static unsigned int at572d940hf_default_irq_priority[NR_AIC_IRQS] __initdata = { | ||
332 | 7, /* Advanced Interrupt Controller */ | ||
333 | 7, /* System Peripherals */ | ||
334 | 0, /* Parallel IO Controller A */ | ||
335 | 0, /* Parallel IO Controller B */ | ||
336 | 0, /* Parallel IO Controller C */ | ||
337 | 3, /* Ethernet */ | ||
338 | 6, /* USART 0 */ | ||
339 | 6, /* USART 1 */ | ||
340 | 6, /* USART 2 */ | ||
341 | 0, /* Multimedia Card Interface */ | ||
342 | 4, /* USB Device Port */ | ||
343 | 0, /* Two-Wire Interface 0 */ | ||
344 | 6, /* Serial Peripheral Interface 0 */ | ||
345 | 6, /* Serial Peripheral Interface 1 */ | ||
346 | 5, /* Serial Synchronous Controller 0 */ | ||
347 | 5, /* Serial Synchronous Controller 1 */ | ||
348 | 5, /* Serial Synchronous Controller 2 */ | ||
349 | 0, /* Timer Counter 0 */ | ||
350 | 0, /* Timer Counter 1 */ | ||
351 | 0, /* Timer Counter 2 */ | ||
352 | 3, /* USB Host port */ | ||
353 | 3, /* Serial Synchronous Controller 3 */ | ||
354 | 0, /* Two-Wire Interface 1 */ | ||
355 | 0, /* CAN Controller 0 */ | ||
356 | 0, /* CAN Controller 1 */ | ||
357 | 0, /* mAgicV HALT line */ | ||
358 | 0, /* mAgicV SIRQ0 line */ | ||
359 | 0, /* mAgicV exception line */ | ||
360 | 0, /* mAgicV end of DMA line */ | ||
361 | 0, /* Advanced Interrupt Controller */ | ||
362 | 0, /* Advanced Interrupt Controller */ | ||
363 | 0, /* Advanced Interrupt Controller */ | ||
364 | }; | ||
365 | |||
366 | void __init at572d940hf_init_interrupts(unsigned int priority[NR_AIC_IRQS]) | ||
367 | { | ||
368 | if (!priority) | ||
369 | priority = at572d940hf_default_irq_priority; | ||
370 | |||
371 | /* Initialize the AIC interrupt controller */ | ||
372 | at91_aic_init(priority); | ||
373 | |||
374 | /* Enable GPIO interrupts */ | ||
375 | at91_gpio_irq_setup(); | ||
376 | } | ||
377 | |||
diff --git a/arch/arm/mach-at91/at572d940hf_devices.c b/arch/arm/mach-at91/at572d940hf_devices.c deleted file mode 100644 index 0fc20a240782..000000000000 --- a/arch/arm/mach-at91/at572d940hf_devices.c +++ /dev/null | |||
@@ -1,970 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/at572d940hf_devices.c | ||
3 | * | ||
4 | * Copyright (C) 2008 Atmel Antonio R. Costa <costa.antonior@gmail.com> | ||
5 | * Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org> | ||
6 | * Copyright (C) 2005 David Brownell | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | * | ||
22 | */ | ||
23 | |||
24 | #include <asm/mach/arch.h> | ||
25 | #include <asm/mach/map.h> | ||
26 | |||
27 | #include <linux/dma-mapping.h> | ||
28 | #include <linux/platform_device.h> | ||
29 | |||
30 | #include <mach/board.h> | ||
31 | #include <mach/gpio.h> | ||
32 | #include <mach/at572d940hf.h> | ||
33 | #include <mach/at572d940hf_matrix.h> | ||
34 | #include <mach/at91sam9_smc.h> | ||
35 | |||
36 | #include "generic.h" | ||
37 | #include "sam9_smc.h" | ||
38 | |||
39 | |||
40 | /* -------------------------------------------------------------------- | ||
41 | * USB Host | ||
42 | * -------------------------------------------------------------------- */ | ||
43 | |||
44 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) | ||
45 | static u64 ohci_dmamask = DMA_BIT_MASK(32); | ||
46 | static struct at91_usbh_data usbh_data; | ||
47 | |||
48 | static struct resource usbh_resources[] = { | ||
49 | [0] = { | ||
50 | .start = AT572D940HF_UHP_BASE, | ||
51 | .end = AT572D940HF_UHP_BASE + SZ_1M - 1, | ||
52 | .flags = IORESOURCE_MEM, | ||
53 | }, | ||
54 | [1] = { | ||
55 | .start = AT572D940HF_ID_UHP, | ||
56 | .end = AT572D940HF_ID_UHP, | ||
57 | .flags = IORESOURCE_IRQ, | ||
58 | }, | ||
59 | }; | ||
60 | |||
61 | static struct platform_device at572d940hf_usbh_device = { | ||
62 | .name = "at91_ohci", | ||
63 | .id = -1, | ||
64 | .dev = { | ||
65 | .dma_mask = &ohci_dmamask, | ||
66 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
67 | .platform_data = &usbh_data, | ||
68 | }, | ||
69 | .resource = usbh_resources, | ||
70 | .num_resources = ARRAY_SIZE(usbh_resources), | ||
71 | }; | ||
72 | |||
73 | void __init at91_add_device_usbh(struct at91_usbh_data *data) | ||
74 | { | ||
75 | if (!data) | ||
76 | return; | ||
77 | |||
78 | usbh_data = *data; | ||
79 | platform_device_register(&at572d940hf_usbh_device); | ||
80 | |||
81 | } | ||
82 | #else | ||
83 | void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | ||
84 | #endif | ||
85 | |||
86 | |||
87 | /* -------------------------------------------------------------------- | ||
88 | * USB Device (Gadget) | ||
89 | * -------------------------------------------------------------------- */ | ||
90 | |||
91 | #ifdef CONFIG_USB_GADGET_AT91 | ||
92 | static struct at91_udc_data udc_data; | ||
93 | |||
94 | static struct resource udc_resources[] = { | ||
95 | [0] = { | ||
96 | .start = AT572D940HF_BASE_UDP, | ||
97 | .end = AT572D940HF_BASE_UDP + SZ_16K - 1, | ||
98 | .flags = IORESOURCE_MEM, | ||
99 | }, | ||
100 | [1] = { | ||
101 | .start = AT572D940HF_ID_UDP, | ||
102 | .end = AT572D940HF_ID_UDP, | ||
103 | .flags = IORESOURCE_IRQ, | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | static struct platform_device at572d940hf_udc_device = { | ||
108 | .name = "at91_udc", | ||
109 | .id = -1, | ||
110 | .dev = { | ||
111 | .platform_data = &udc_data, | ||
112 | }, | ||
113 | .resource = udc_resources, | ||
114 | .num_resources = ARRAY_SIZE(udc_resources), | ||
115 | }; | ||
116 | |||
117 | void __init at91_add_device_udc(struct at91_udc_data *data) | ||
118 | { | ||
119 | if (!data) | ||
120 | return; | ||
121 | |||
122 | if (data->vbus_pin) { | ||
123 | at91_set_gpio_input(data->vbus_pin, 0); | ||
124 | at91_set_deglitch(data->vbus_pin, 1); | ||
125 | } | ||
126 | |||
127 | /* Pullup pin is handled internally */ | ||
128 | |||
129 | udc_data = *data; | ||
130 | platform_device_register(&at572d940hf_udc_device); | ||
131 | } | ||
132 | #else | ||
133 | void __init at91_add_device_udc(struct at91_udc_data *data) {} | ||
134 | #endif | ||
135 | |||
136 | |||
137 | /* -------------------------------------------------------------------- | ||
138 | * Ethernet | ||
139 | * -------------------------------------------------------------------- */ | ||
140 | |||
141 | #if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE) | ||
142 | static u64 eth_dmamask = DMA_BIT_MASK(32); | ||
143 | static struct at91_eth_data eth_data; | ||
144 | |||
145 | static struct resource eth_resources[] = { | ||
146 | [0] = { | ||
147 | .start = AT572D940HF_BASE_EMAC, | ||
148 | .end = AT572D940HF_BASE_EMAC + SZ_16K - 1, | ||
149 | .flags = IORESOURCE_MEM, | ||
150 | }, | ||
151 | [1] = { | ||
152 | .start = AT572D940HF_ID_EMAC, | ||
153 | .end = AT572D940HF_ID_EMAC, | ||
154 | .flags = IORESOURCE_IRQ, | ||
155 | }, | ||
156 | }; | ||
157 | |||
158 | static struct platform_device at572d940hf_eth_device = { | ||
159 | .name = "macb", | ||
160 | .id = -1, | ||
161 | .dev = { | ||
162 | .dma_mask = ð_dmamask, | ||
163 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
164 | .platform_data = ð_data, | ||
165 | }, | ||
166 | .resource = eth_resources, | ||
167 | .num_resources = ARRAY_SIZE(eth_resources), | ||
168 | }; | ||
169 | |||
170 | void __init at91_add_device_eth(struct at91_eth_data *data) | ||
171 | { | ||
172 | if (!data) | ||
173 | return; | ||
174 | |||
175 | if (data->phy_irq_pin) { | ||
176 | at91_set_gpio_input(data->phy_irq_pin, 0); | ||
177 | at91_set_deglitch(data->phy_irq_pin, 1); | ||
178 | } | ||
179 | |||
180 | /* Only RMII is supported */ | ||
181 | data->is_rmii = 1; | ||
182 | |||
183 | /* Pins used for RMII */ | ||
184 | at91_set_A_periph(AT91_PIN_PA16, 0); /* ETXCK_EREFCK */ | ||
185 | at91_set_A_periph(AT91_PIN_PA17, 0); /* ERXDV */ | ||
186 | at91_set_A_periph(AT91_PIN_PA18, 0); /* ERX0 */ | ||
187 | at91_set_A_periph(AT91_PIN_PA19, 0); /* ERX1 */ | ||
188 | at91_set_A_periph(AT91_PIN_PA20, 0); /* ERXER */ | ||
189 | at91_set_A_periph(AT91_PIN_PA23, 0); /* ETXEN */ | ||
190 | at91_set_A_periph(AT91_PIN_PA21, 0); /* ETX0 */ | ||
191 | at91_set_A_periph(AT91_PIN_PA22, 0); /* ETX1 */ | ||
192 | at91_set_A_periph(AT91_PIN_PA13, 0); /* EMDIO */ | ||
193 | at91_set_A_periph(AT91_PIN_PA14, 0); /* EMDC */ | ||
194 | |||
195 | eth_data = *data; | ||
196 | platform_device_register(&at572d940hf_eth_device); | ||
197 | } | ||
198 | #else | ||
199 | void __init at91_add_device_eth(struct at91_eth_data *data) {} | ||
200 | #endif | ||
201 | |||
202 | |||
203 | /* -------------------------------------------------------------------- | ||
204 | * MMC / SD | ||
205 | * -------------------------------------------------------------------- */ | ||
206 | |||
207 | #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) | ||
208 | static u64 mmc_dmamask = DMA_BIT_MASK(32); | ||
209 | static struct at91_mmc_data mmc_data; | ||
210 | |||
211 | static struct resource mmc_resources[] = { | ||
212 | [0] = { | ||
213 | .start = AT572D940HF_BASE_MCI, | ||
214 | .end = AT572D940HF_BASE_MCI + SZ_16K - 1, | ||
215 | .flags = IORESOURCE_MEM, | ||
216 | }, | ||
217 | [1] = { | ||
218 | .start = AT572D940HF_ID_MCI, | ||
219 | .end = AT572D940HF_ID_MCI, | ||
220 | .flags = IORESOURCE_IRQ, | ||
221 | }, | ||
222 | }; | ||
223 | |||
224 | static struct platform_device at572d940hf_mmc_device = { | ||
225 | .name = "at91_mci", | ||
226 | .id = -1, | ||
227 | .dev = { | ||
228 | .dma_mask = &mmc_dmamask, | ||
229 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
230 | .platform_data = &mmc_data, | ||
231 | }, | ||
232 | .resource = mmc_resources, | ||
233 | .num_resources = ARRAY_SIZE(mmc_resources), | ||
234 | }; | ||
235 | |||
236 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | ||
237 | { | ||
238 | if (!data) | ||
239 | return; | ||
240 | |||
241 | /* input/irq */ | ||
242 | if (data->det_pin) { | ||
243 | at91_set_gpio_input(data->det_pin, 1); | ||
244 | at91_set_deglitch(data->det_pin, 1); | ||
245 | } | ||
246 | if (data->wp_pin) | ||
247 | at91_set_gpio_input(data->wp_pin, 1); | ||
248 | if (data->vcc_pin) | ||
249 | at91_set_gpio_output(data->vcc_pin, 0); | ||
250 | |||
251 | /* CLK */ | ||
252 | at91_set_A_periph(AT91_PIN_PC22, 0); | ||
253 | |||
254 | /* CMD */ | ||
255 | at91_set_A_periph(AT91_PIN_PC23, 1); | ||
256 | |||
257 | /* DAT0, maybe DAT1..DAT3 */ | ||
258 | at91_set_A_periph(AT91_PIN_PC24, 1); | ||
259 | if (data->wire4) { | ||
260 | at91_set_A_periph(AT91_PIN_PC25, 1); | ||
261 | at91_set_A_periph(AT91_PIN_PC26, 1); | ||
262 | at91_set_A_periph(AT91_PIN_PC27, 1); | ||
263 | } | ||
264 | |||
265 | mmc_data = *data; | ||
266 | platform_device_register(&at572d940hf_mmc_device); | ||
267 | } | ||
268 | #else | ||
269 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} | ||
270 | #endif | ||
271 | |||
272 | |||
273 | /* -------------------------------------------------------------------- | ||
274 | * NAND / SmartMedia | ||
275 | * -------------------------------------------------------------------- */ | ||
276 | |||
277 | #if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE) | ||
278 | static struct atmel_nand_data nand_data; | ||
279 | |||
280 | #define NAND_BASE AT91_CHIPSELECT_3 | ||
281 | |||
282 | static struct resource nand_resources[] = { | ||
283 | { | ||
284 | .start = NAND_BASE, | ||
285 | .end = NAND_BASE + SZ_256M - 1, | ||
286 | .flags = IORESOURCE_MEM, | ||
287 | } | ||
288 | }; | ||
289 | |||
290 | static struct platform_device at572d940hf_nand_device = { | ||
291 | .name = "atmel_nand", | ||
292 | .id = -1, | ||
293 | .dev = { | ||
294 | .platform_data = &nand_data, | ||
295 | }, | ||
296 | .resource = nand_resources, | ||
297 | .num_resources = ARRAY_SIZE(nand_resources), | ||
298 | }; | ||
299 | |||
300 | void __init at91_add_device_nand(struct atmel_nand_data *data) | ||
301 | { | ||
302 | unsigned long csa; | ||
303 | |||
304 | if (!data) | ||
305 | return; | ||
306 | |||
307 | csa = at91_sys_read(AT91_MATRIX_EBICSA); | ||
308 | at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); | ||
309 | |||
310 | /* enable pin */ | ||
311 | if (data->enable_pin) | ||
312 | at91_set_gpio_output(data->enable_pin, 1); | ||
313 | |||
314 | /* ready/busy pin */ | ||
315 | if (data->rdy_pin) | ||
316 | at91_set_gpio_input(data->rdy_pin, 1); | ||
317 | |||
318 | /* card detect pin */ | ||
319 | if (data->det_pin) | ||
320 | at91_set_gpio_input(data->det_pin, 1); | ||
321 | |||
322 | at91_set_A_periph(AT91_PIN_PB28, 0); /* A[22] */ | ||
323 | at91_set_B_periph(AT91_PIN_PA28, 0); /* NANDOE */ | ||
324 | at91_set_B_periph(AT91_PIN_PA29, 0); /* NANDWE */ | ||
325 | |||
326 | nand_data = *data; | ||
327 | platform_device_register(&at572d940hf_nand_device); | ||
328 | } | ||
329 | |||
330 | #else | ||
331 | void __init at91_add_device_nand(struct atmel_nand_data *data) {} | ||
332 | #endif | ||
333 | |||
334 | |||
335 | /* -------------------------------------------------------------------- | ||
336 | * TWI (i2c) | ||
337 | * -------------------------------------------------------------------- */ | ||
338 | |||
339 | /* | ||
340 | * Prefer the GPIO code since the TWI controller isn't robust | ||
341 | * (gets overruns and underruns under load) and can only issue | ||
342 | * repeated STARTs in one scenario (the driver doesn't yet handle them). | ||
343 | */ | ||
344 | |||
345 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | ||
346 | |||
347 | static struct i2c_gpio_platform_data pdata = { | ||
348 | .sda_pin = AT91_PIN_PC7, | ||
349 | .sda_is_open_drain = 1, | ||
350 | .scl_pin = AT91_PIN_PC8, | ||
351 | .scl_is_open_drain = 1, | ||
352 | .udelay = 2, /* ~100 kHz */ | ||
353 | }; | ||
354 | |||
355 | static struct platform_device at572d940hf_twi_device { | ||
356 | .name = "i2c-gpio", | ||
357 | .id = -1, | ||
358 | .dev.platform_data = &pdata, | ||
359 | }; | ||
360 | |||
361 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) | ||
362 | { | ||
363 | at91_set_GPIO_periph(AT91_PIN_PC7, 1); /* TWD (SDA) */ | ||
364 | at91_set_multi_drive(AT91_PIN_PC7, 1); | ||
365 | |||
366 | at91_set_GPIO_periph(AT91_PIN_PA8, 1); /* TWCK (SCL) */ | ||
367 | at91_set_multi_drive(AT91_PIN_PC8, 1); | ||
368 | |||
369 | i2c_register_board_info(0, devices, nr_devices); | ||
370 | platform_device_register(&at572d940hf_twi_device); | ||
371 | } | ||
372 | |||
373 | #elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) | ||
374 | |||
375 | static struct resource twi0_resources[] = { | ||
376 | [0] = { | ||
377 | .start = AT572D940HF_BASE_TWI0, | ||
378 | .end = AT572D940HF_BASE_TWI0 + SZ_16K - 1, | ||
379 | .flags = IORESOURCE_MEM, | ||
380 | }, | ||
381 | [1] = { | ||
382 | .start = AT572D940HF_ID_TWI0, | ||
383 | .end = AT572D940HF_ID_TWI0, | ||
384 | .flags = IORESOURCE_IRQ, | ||
385 | }, | ||
386 | }; | ||
387 | |||
388 | static struct platform_device at572d940hf_twi0_device = { | ||
389 | .name = "at91_i2c", | ||
390 | .id = 0, | ||
391 | .resource = twi0_resources, | ||
392 | .num_resources = ARRAY_SIZE(twi0_resources), | ||
393 | }; | ||
394 | |||
395 | static struct resource twi1_resources[] = { | ||
396 | [0] = { | ||
397 | .start = AT572D940HF_BASE_TWI1, | ||
398 | .end = AT572D940HF_BASE_TWI1 + SZ_16K - 1, | ||
399 | .flags = IORESOURCE_MEM, | ||
400 | }, | ||
401 | [1] = { | ||
402 | .start = AT572D940HF_ID_TWI1, | ||
403 | .end = AT572D940HF_ID_TWI1, | ||
404 | .flags = IORESOURCE_IRQ, | ||
405 | }, | ||
406 | }; | ||
407 | |||
408 | static struct platform_device at572d940hf_twi1_device = { | ||
409 | .name = "at91_i2c", | ||
410 | .id = 1, | ||
411 | .resource = twi1_resources, | ||
412 | .num_resources = ARRAY_SIZE(twi1_resources), | ||
413 | }; | ||
414 | |||
415 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) | ||
416 | { | ||
417 | /* pins used for TWI0 interface */ | ||
418 | at91_set_A_periph(AT91_PIN_PC7, 0); /* TWD */ | ||
419 | at91_set_multi_drive(AT91_PIN_PC7, 1); | ||
420 | |||
421 | at91_set_A_periph(AT91_PIN_PC8, 0); /* TWCK */ | ||
422 | at91_set_multi_drive(AT91_PIN_PC8, 1); | ||
423 | |||
424 | /* pins used for TWI1 interface */ | ||
425 | at91_set_A_periph(AT91_PIN_PC20, 0); /* TWD */ | ||
426 | at91_set_multi_drive(AT91_PIN_PC20, 1); | ||
427 | |||
428 | at91_set_A_periph(AT91_PIN_PC21, 0); /* TWCK */ | ||
429 | at91_set_multi_drive(AT91_PIN_PC21, 1); | ||
430 | |||
431 | i2c_register_board_info(0, devices, nr_devices); | ||
432 | platform_device_register(&at572d940hf_twi0_device); | ||
433 | platform_device_register(&at572d940hf_twi1_device); | ||
434 | } | ||
435 | #else | ||
436 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {} | ||
437 | #endif | ||
438 | |||
439 | |||
440 | /* -------------------------------------------------------------------- | ||
441 | * SPI | ||
442 | * -------------------------------------------------------------------- */ | ||
443 | |||
444 | #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) | ||
445 | static u64 spi_dmamask = DMA_BIT_MASK(32); | ||
446 | |||
447 | static struct resource spi0_resources[] = { | ||
448 | [0] = { | ||
449 | .start = AT572D940HF_BASE_SPI0, | ||
450 | .end = AT572D940HF_BASE_SPI0 + SZ_16K - 1, | ||
451 | .flags = IORESOURCE_MEM, | ||
452 | }, | ||
453 | [1] = { | ||
454 | .start = AT572D940HF_ID_SPI0, | ||
455 | .end = AT572D940HF_ID_SPI0, | ||
456 | .flags = IORESOURCE_IRQ, | ||
457 | }, | ||
458 | }; | ||
459 | |||
460 | static struct platform_device at572d940hf_spi0_device = { | ||
461 | .name = "atmel_spi", | ||
462 | .id = 0, | ||
463 | .dev = { | ||
464 | .dma_mask = &spi_dmamask, | ||
465 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
466 | }, | ||
467 | .resource = spi0_resources, | ||
468 | .num_resources = ARRAY_SIZE(spi0_resources), | ||
469 | }; | ||
470 | |||
471 | static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PA5, AT91_PIN_PA6 }; | ||
472 | |||
473 | static struct resource spi1_resources[] = { | ||
474 | [0] = { | ||
475 | .start = AT572D940HF_BASE_SPI1, | ||
476 | .end = AT572D940HF_BASE_SPI1 + SZ_16K - 1, | ||
477 | .flags = IORESOURCE_MEM, | ||
478 | }, | ||
479 | [1] = { | ||
480 | .start = AT572D940HF_ID_SPI1, | ||
481 | .end = AT572D940HF_ID_SPI1, | ||
482 | .flags = IORESOURCE_IRQ, | ||
483 | }, | ||
484 | }; | ||
485 | |||
486 | static struct platform_device at572d940hf_spi1_device = { | ||
487 | .name = "atmel_spi", | ||
488 | .id = 1, | ||
489 | .dev = { | ||
490 | .dma_mask = &spi_dmamask, | ||
491 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
492 | }, | ||
493 | .resource = spi1_resources, | ||
494 | .num_resources = ARRAY_SIZE(spi1_resources), | ||
495 | }; | ||
496 | |||
497 | static const unsigned spi1_standard_cs[4] = { AT91_PIN_PC3, AT91_PIN_PC4, AT91_PIN_PC5, AT91_PIN_PC6 }; | ||
498 | |||
499 | void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | ||
500 | { | ||
501 | int i; | ||
502 | unsigned long cs_pin; | ||
503 | short enable_spi0 = 0; | ||
504 | short enable_spi1 = 0; | ||
505 | |||
506 | /* Choose SPI chip-selects */ | ||
507 | for (i = 0; i < nr_devices; i++) { | ||
508 | if (devices[i].controller_data) | ||
509 | cs_pin = (unsigned long) devices[i].controller_data; | ||
510 | else if (devices[i].bus_num == 0) | ||
511 | cs_pin = spi0_standard_cs[devices[i].chip_select]; | ||
512 | else | ||
513 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | ||
514 | |||
515 | if (devices[i].bus_num == 0) | ||
516 | enable_spi0 = 1; | ||
517 | else | ||
518 | enable_spi1 = 1; | ||
519 | |||
520 | /* enable chip-select pin */ | ||
521 | at91_set_gpio_output(cs_pin, 1); | ||
522 | |||
523 | /* pass chip-select pin to driver */ | ||
524 | devices[i].controller_data = (void *) cs_pin; | ||
525 | } | ||
526 | |||
527 | spi_register_board_info(devices, nr_devices); | ||
528 | |||
529 | /* Configure SPI bus(es) */ | ||
530 | if (enable_spi0) { | ||
531 | at91_set_A_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */ | ||
532 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | ||
533 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | ||
534 | |||
535 | at91_clock_associate("spi0_clk", &at572d940hf_spi0_device.dev, "spi_clk"); | ||
536 | platform_device_register(&at572d940hf_spi0_device); | ||
537 | } | ||
538 | if (enable_spi1) { | ||
539 | at91_set_A_periph(AT91_PIN_PC0, 0); /* SPI1_MISO */ | ||
540 | at91_set_A_periph(AT91_PIN_PC1, 0); /* SPI1_MOSI */ | ||
541 | at91_set_A_periph(AT91_PIN_PC2, 0); /* SPI1_SPCK */ | ||
542 | |||
543 | at91_clock_associate("spi1_clk", &at572d940hf_spi1_device.dev, "spi_clk"); | ||
544 | platform_device_register(&at572d940hf_spi1_device); | ||
545 | } | ||
546 | } | ||
547 | #else | ||
548 | void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {} | ||
549 | #endif | ||
550 | |||
551 | |||
552 | /* -------------------------------------------------------------------- | ||
553 | * Timer/Counter blocks | ||
554 | * -------------------------------------------------------------------- */ | ||
555 | |||
556 | #ifdef CONFIG_ATMEL_TCLIB | ||
557 | |||
558 | static struct resource tcb_resources[] = { | ||
559 | [0] = { | ||
560 | .start = AT572D940HF_BASE_TCB, | ||
561 | .end = AT572D940HF_BASE_TCB + SZ_16K - 1, | ||
562 | .flags = IORESOURCE_MEM, | ||
563 | }, | ||
564 | [1] = { | ||
565 | .start = AT572D940HF_ID_TC0, | ||
566 | .end = AT572D940HF_ID_TC0, | ||
567 | .flags = IORESOURCE_IRQ, | ||
568 | }, | ||
569 | [2] = { | ||
570 | .start = AT572D940HF_ID_TC1, | ||
571 | .end = AT572D940HF_ID_TC1, | ||
572 | .flags = IORESOURCE_IRQ, | ||
573 | }, | ||
574 | [3] = { | ||
575 | .start = AT572D940HF_ID_TC2, | ||
576 | .end = AT572D940HF_ID_TC2, | ||
577 | .flags = IORESOURCE_IRQ, | ||
578 | }, | ||
579 | }; | ||
580 | |||
581 | static struct platform_device at572d940hf_tcb_device = { | ||
582 | .name = "atmel_tcb", | ||
583 | .id = 0, | ||
584 | .resource = tcb_resources, | ||
585 | .num_resources = ARRAY_SIZE(tcb_resources), | ||
586 | }; | ||
587 | |||
588 | static void __init at91_add_device_tc(void) | ||
589 | { | ||
590 | /* this chip has a separate clock and irq for each TC channel */ | ||
591 | at91_clock_associate("tc0_clk", &at572d940hf_tcb_device.dev, "t0_clk"); | ||
592 | at91_clock_associate("tc1_clk", &at572d940hf_tcb_device.dev, "t1_clk"); | ||
593 | at91_clock_associate("tc2_clk", &at572d940hf_tcb_device.dev, "t2_clk"); | ||
594 | platform_device_register(&at572d940hf_tcb_device); | ||
595 | } | ||
596 | #else | ||
597 | static void __init at91_add_device_tc(void) { } | ||
598 | #endif | ||
599 | |||
600 | |||
601 | /* -------------------------------------------------------------------- | ||
602 | * RTT | ||
603 | * -------------------------------------------------------------------- */ | ||
604 | |||
605 | static struct resource rtt_resources[] = { | ||
606 | { | ||
607 | .start = AT91_BASE_SYS + AT91_RTT, | ||
608 | .end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1, | ||
609 | .flags = IORESOURCE_MEM, | ||
610 | } | ||
611 | }; | ||
612 | |||
613 | static struct platform_device at572d940hf_rtt_device = { | ||
614 | .name = "at91_rtt", | ||
615 | .id = 0, | ||
616 | .resource = rtt_resources, | ||
617 | .num_resources = ARRAY_SIZE(rtt_resources), | ||
618 | }; | ||
619 | |||
620 | static void __init at91_add_device_rtt(void) | ||
621 | { | ||
622 | platform_device_register(&at572d940hf_rtt_device); | ||
623 | } | ||
624 | |||
625 | |||
626 | /* -------------------------------------------------------------------- | ||
627 | * Watchdog | ||
628 | * -------------------------------------------------------------------- */ | ||
629 | |||
630 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) | ||
631 | static struct platform_device at572d940hf_wdt_device = { | ||
632 | .name = "at91_wdt", | ||
633 | .id = -1, | ||
634 | .num_resources = 0, | ||
635 | }; | ||
636 | |||
637 | static void __init at91_add_device_watchdog(void) | ||
638 | { | ||
639 | platform_device_register(&at572d940hf_wdt_device); | ||
640 | } | ||
641 | #else | ||
642 | static void __init at91_add_device_watchdog(void) {} | ||
643 | #endif | ||
644 | |||
645 | |||
646 | /* -------------------------------------------------------------------- | ||
647 | * UART | ||
648 | * -------------------------------------------------------------------- */ | ||
649 | |||
650 | #if defined(CONFIG_SERIAL_ATMEL) | ||
651 | static struct resource dbgu_resources[] = { | ||
652 | [0] = { | ||
653 | .start = AT91_VA_BASE_SYS + AT91_DBGU, | ||
654 | .end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1, | ||
655 | .flags = IORESOURCE_MEM, | ||
656 | }, | ||
657 | [1] = { | ||
658 | .start = AT91_ID_SYS, | ||
659 | .end = AT91_ID_SYS, | ||
660 | .flags = IORESOURCE_IRQ, | ||
661 | }, | ||
662 | }; | ||
663 | |||
664 | static struct atmel_uart_data dbgu_data = { | ||
665 | .use_dma_tx = 0, | ||
666 | .use_dma_rx = 0, /* DBGU not capable of receive DMA */ | ||
667 | .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), | ||
668 | }; | ||
669 | |||
670 | static u64 dbgu_dmamask = DMA_BIT_MASK(32); | ||
671 | |||
672 | static struct platform_device at572d940hf_dbgu_device = { | ||
673 | .name = "atmel_usart", | ||
674 | .id = 0, | ||
675 | .dev = { | ||
676 | .dma_mask = &dbgu_dmamask, | ||
677 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
678 | .platform_data = &dbgu_data, | ||
679 | }, | ||
680 | .resource = dbgu_resources, | ||
681 | .num_resources = ARRAY_SIZE(dbgu_resources), | ||
682 | }; | ||
683 | |||
684 | static inline void configure_dbgu_pins(void) | ||
685 | { | ||
686 | at91_set_A_periph(AT91_PIN_PC31, 1); /* DTXD */ | ||
687 | at91_set_A_periph(AT91_PIN_PC30, 0); /* DRXD */ | ||
688 | } | ||
689 | |||
690 | static struct resource uart0_resources[] = { | ||
691 | [0] = { | ||
692 | .start = AT572D940HF_BASE_US0, | ||
693 | .end = AT572D940HF_BASE_US0 + SZ_16K - 1, | ||
694 | .flags = IORESOURCE_MEM, | ||
695 | }, | ||
696 | [1] = { | ||
697 | .start = AT572D940HF_ID_US0, | ||
698 | .end = AT572D940HF_ID_US0, | ||
699 | .flags = IORESOURCE_IRQ, | ||
700 | }, | ||
701 | }; | ||
702 | |||
703 | static struct atmel_uart_data uart0_data = { | ||
704 | .use_dma_tx = 1, | ||
705 | .use_dma_rx = 1, | ||
706 | }; | ||
707 | |||
708 | static u64 uart0_dmamask = DMA_BIT_MASK(32); | ||
709 | |||
710 | static struct platform_device at572d940hf_uart0_device = { | ||
711 | .name = "atmel_usart", | ||
712 | .id = 1, | ||
713 | .dev = { | ||
714 | .dma_mask = &uart0_dmamask, | ||
715 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
716 | .platform_data = &uart0_data, | ||
717 | }, | ||
718 | .resource = uart0_resources, | ||
719 | .num_resources = ARRAY_SIZE(uart0_resources), | ||
720 | }; | ||
721 | |||
722 | static inline void configure_usart0_pins(unsigned pins) | ||
723 | { | ||
724 | at91_set_A_periph(AT91_PIN_PA8, 1); /* TXD0 */ | ||
725 | at91_set_A_periph(AT91_PIN_PA7, 0); /* RXD0 */ | ||
726 | |||
727 | if (pins & ATMEL_UART_RTS) | ||
728 | at91_set_A_periph(AT91_PIN_PA10, 0); /* RTS0 */ | ||
729 | if (pins & ATMEL_UART_CTS) | ||
730 | at91_set_A_periph(AT91_PIN_PA9, 0); /* CTS0 */ | ||
731 | } | ||
732 | |||
733 | static struct resource uart1_resources[] = { | ||
734 | [0] = { | ||
735 | .start = AT572D940HF_BASE_US1, | ||
736 | .end = AT572D940HF_BASE_US1 + SZ_16K - 1, | ||
737 | .flags = IORESOURCE_MEM, | ||
738 | }, | ||
739 | [1] = { | ||
740 | .start = AT572D940HF_ID_US1, | ||
741 | .end = AT572D940HF_ID_US1, | ||
742 | .flags = IORESOURCE_IRQ, | ||
743 | }, | ||
744 | }; | ||
745 | |||
746 | static struct atmel_uart_data uart1_data = { | ||
747 | .use_dma_tx = 1, | ||
748 | .use_dma_rx = 1, | ||
749 | }; | ||
750 | |||
751 | static u64 uart1_dmamask = DMA_BIT_MASK(32); | ||
752 | |||
753 | static struct platform_device at572d940hf_uart1_device = { | ||
754 | .name = "atmel_usart", | ||
755 | .id = 2, | ||
756 | .dev = { | ||
757 | .dma_mask = &uart1_dmamask, | ||
758 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
759 | .platform_data = &uart1_data, | ||
760 | }, | ||
761 | .resource = uart1_resources, | ||
762 | .num_resources = ARRAY_SIZE(uart1_resources), | ||
763 | }; | ||
764 | |||
765 | static inline void configure_usart1_pins(unsigned pins) | ||
766 | { | ||
767 | at91_set_A_periph(AT91_PIN_PC10, 1); /* TXD1 */ | ||
768 | at91_set_A_periph(AT91_PIN_PC9 , 0); /* RXD1 */ | ||
769 | |||
770 | if (pins & ATMEL_UART_RTS) | ||
771 | at91_set_A_periph(AT91_PIN_PC12, 0); /* RTS1 */ | ||
772 | if (pins & ATMEL_UART_CTS) | ||
773 | at91_set_A_periph(AT91_PIN_PC11, 0); /* CTS1 */ | ||
774 | } | ||
775 | |||
776 | static struct resource uart2_resources[] = { | ||
777 | [0] = { | ||
778 | .start = AT572D940HF_BASE_US2, | ||
779 | .end = AT572D940HF_BASE_US2 + SZ_16K - 1, | ||
780 | .flags = IORESOURCE_MEM, | ||
781 | }, | ||
782 | [1] = { | ||
783 | .start = AT572D940HF_ID_US2, | ||
784 | .end = AT572D940HF_ID_US2, | ||
785 | .flags = IORESOURCE_IRQ, | ||
786 | }, | ||
787 | }; | ||
788 | |||
789 | static struct atmel_uart_data uart2_data = { | ||
790 | .use_dma_tx = 1, | ||
791 | .use_dma_rx = 1, | ||
792 | }; | ||
793 | |||
794 | static u64 uart2_dmamask = DMA_BIT_MASK(32); | ||
795 | |||
796 | static struct platform_device at572d940hf_uart2_device = { | ||
797 | .name = "atmel_usart", | ||
798 | .id = 3, | ||
799 | .dev = { | ||
800 | .dma_mask = &uart2_dmamask, | ||
801 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
802 | .platform_data = &uart2_data, | ||
803 | }, | ||
804 | .resource = uart2_resources, | ||
805 | .num_resources = ARRAY_SIZE(uart2_resources), | ||
806 | }; | ||
807 | |||
808 | static inline void configure_usart2_pins(unsigned pins) | ||
809 | { | ||
810 | at91_set_A_periph(AT91_PIN_PC15, 1); /* TXD2 */ | ||
811 | at91_set_A_periph(AT91_PIN_PC14, 0); /* RXD2 */ | ||
812 | |||
813 | if (pins & ATMEL_UART_RTS) | ||
814 | at91_set_A_periph(AT91_PIN_PC17, 0); /* RTS2 */ | ||
815 | if (pins & ATMEL_UART_CTS) | ||
816 | at91_set_A_periph(AT91_PIN_PC16, 0); /* CTS2 */ | ||
817 | } | ||
818 | |||
819 | static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ | ||
820 | struct platform_device *atmel_default_console_device; /* the serial console device */ | ||
821 | |||
822 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | ||
823 | { | ||
824 | struct platform_device *pdev; | ||
825 | |||
826 | switch (id) { | ||
827 | case 0: /* DBGU */ | ||
828 | pdev = &at572d940hf_dbgu_device; | ||
829 | configure_dbgu_pins(); | ||
830 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
831 | break; | ||
832 | case AT572D940HF_ID_US0: | ||
833 | pdev = &at572d940hf_uart0_device; | ||
834 | configure_usart0_pins(pins); | ||
835 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
836 | break; | ||
837 | case AT572D940HF_ID_US1: | ||
838 | pdev = &at572d940hf_uart1_device; | ||
839 | configure_usart1_pins(pins); | ||
840 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
841 | break; | ||
842 | case AT572D940HF_ID_US2: | ||
843 | pdev = &at572d940hf_uart2_device; | ||
844 | configure_usart2_pins(pins); | ||
845 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
846 | break; | ||
847 | default: | ||
848 | return; | ||
849 | } | ||
850 | pdev->id = portnr; /* update to mapped ID */ | ||
851 | |||
852 | if (portnr < ATMEL_MAX_UART) | ||
853 | at91_uarts[portnr] = pdev; | ||
854 | } | ||
855 | |||
856 | void __init at91_set_serial_console(unsigned portnr) | ||
857 | { | ||
858 | if (portnr < ATMEL_MAX_UART) | ||
859 | atmel_default_console_device = at91_uarts[portnr]; | ||
860 | } | ||
861 | |||
862 | void __init at91_add_device_serial(void) | ||
863 | { | ||
864 | int i; | ||
865 | |||
866 | for (i = 0; i < ATMEL_MAX_UART; i++) { | ||
867 | if (at91_uarts[i]) | ||
868 | platform_device_register(at91_uarts[i]); | ||
869 | } | ||
870 | |||
871 | if (!atmel_default_console_device) | ||
872 | printk(KERN_INFO "AT91: No default serial console defined.\n"); | ||
873 | } | ||
874 | |||
875 | #else | ||
876 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} | ||
877 | void __init at91_set_serial_console(unsigned portnr) {} | ||
878 | void __init at91_add_device_serial(void) {} | ||
879 | #endif | ||
880 | |||
881 | |||
882 | /* -------------------------------------------------------------------- | ||
883 | * mAgic | ||
884 | * -------------------------------------------------------------------- */ | ||
885 | |||
886 | #ifdef CONFIG_MAGICV | ||
887 | static struct resource mAgic_resources[] = { | ||
888 | { | ||
889 | .start = AT91_MAGIC_PM_BASE, | ||
890 | .end = AT91_MAGIC_PM_BASE + AT91_MAGIC_PM_SIZE - 1, | ||
891 | .flags = IORESOURCE_MEM, | ||
892 | }, | ||
893 | { | ||
894 | .start = AT91_MAGIC_DM_I_BASE, | ||
895 | .end = AT91_MAGIC_DM_I_BASE + AT91_MAGIC_DM_I_SIZE - 1, | ||
896 | .flags = IORESOURCE_MEM, | ||
897 | }, | ||
898 | { | ||
899 | .start = AT91_MAGIC_DM_F_BASE, | ||
900 | .end = AT91_MAGIC_DM_F_BASE + AT91_MAGIC_DM_F_SIZE - 1, | ||
901 | .flags = IORESOURCE_MEM, | ||
902 | }, | ||
903 | { | ||
904 | .start = AT91_MAGIC_DM_DB_BASE, | ||
905 | .end = AT91_MAGIC_DM_DB_BASE + AT91_MAGIC_DM_DB_SIZE - 1, | ||
906 | .flags = IORESOURCE_MEM, | ||
907 | }, | ||
908 | { | ||
909 | .start = AT91_MAGIC_REGS_BASE, | ||
910 | .end = AT91_MAGIC_REGS_BASE + AT91_MAGIC_REGS_SIZE - 1, | ||
911 | .flags = IORESOURCE_MEM, | ||
912 | }, | ||
913 | { | ||
914 | .start = AT91_MAGIC_EXTPAGE_BASE, | ||
915 | .end = AT91_MAGIC_EXTPAGE_BASE + AT91_MAGIC_EXTPAGE_SIZE - 1, | ||
916 | .flags = IORESOURCE_MEM, | ||
917 | }, | ||
918 | { | ||
919 | .start = AT572D940HF_ID_MSIRQ0, | ||
920 | .end = AT572D940HF_ID_MSIRQ0, | ||
921 | .flags = IORESOURCE_IRQ, | ||
922 | }, | ||
923 | { | ||
924 | .start = AT572D940HF_ID_MHALT, | ||
925 | .end = AT572D940HF_ID_MHALT, | ||
926 | .flags = IORESOURCE_IRQ, | ||
927 | }, | ||
928 | { | ||
929 | .start = AT572D940HF_ID_MEXC, | ||
930 | .end = AT572D940HF_ID_MEXC, | ||
931 | .flags = IORESOURCE_IRQ, | ||
932 | }, | ||
933 | { | ||
934 | .start = AT572D940HF_ID_MEDMA, | ||
935 | .end = AT572D940HF_ID_MEDMA, | ||
936 | .flags = IORESOURCE_IRQ, | ||
937 | }, | ||
938 | }; | ||
939 | |||
940 | static struct platform_device mAgic_device = { | ||
941 | .name = "mAgic", | ||
942 | .id = -1, | ||
943 | .num_resources = ARRAY_SIZE(mAgic_resources), | ||
944 | .resource = mAgic_resources, | ||
945 | }; | ||
946 | |||
947 | void __init at91_add_device_mAgic(void) | ||
948 | { | ||
949 | platform_device_register(&mAgic_device); | ||
950 | } | ||
951 | #else | ||
952 | void __init at91_add_device_mAgic(void) {} | ||
953 | #endif | ||
954 | |||
955 | |||
956 | /* -------------------------------------------------------------------- */ | ||
957 | |||
958 | /* | ||
959 | * These devices are always present and don't need any board-specific | ||
960 | * setup. | ||
961 | */ | ||
962 | static int __init at91_add_standard_devices(void) | ||
963 | { | ||
964 | at91_add_device_rtt(); | ||
965 | at91_add_device_watchdog(); | ||
966 | at91_add_device_tc(); | ||
967 | return 0; | ||
968 | } | ||
969 | |||
970 | arch_initcall(at91_add_standard_devices); | ||
diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index 73376170fb91..17fae4a42ab5 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c | |||
@@ -222,6 +222,25 @@ static struct clk *periph_clocks[] __initdata = { | |||
222 | // irq0 .. irq1 | 222 | // irq0 .. irq1 |
223 | }; | 223 | }; |
224 | 224 | ||
225 | static struct clk_lookup periph_clocks_lookups[] = { | ||
226 | CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), | ||
227 | CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), | ||
228 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), | ||
229 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), | ||
230 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
231 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
232 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), | ||
233 | CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), | ||
234 | CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), | ||
235 | }; | ||
236 | |||
237 | static struct clk_lookup usart_clocks_lookups[] = { | ||
238 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
239 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
240 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
241 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
242 | }; | ||
243 | |||
225 | /* | 244 | /* |
226 | * The four programmable clocks. | 245 | * The four programmable clocks. |
227 | * You must configure pin multiplexing to bring these signals out. | 246 | * You must configure pin multiplexing to bring these signals out. |
@@ -258,12 +277,29 @@ static void __init at91cap9_register_clocks(void) | |||
258 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 277 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
259 | clk_register(periph_clocks[i]); | 278 | clk_register(periph_clocks[i]); |
260 | 279 | ||
280 | clkdev_add_table(periph_clocks_lookups, | ||
281 | ARRAY_SIZE(periph_clocks_lookups)); | ||
282 | clkdev_add_table(usart_clocks_lookups, | ||
283 | ARRAY_SIZE(usart_clocks_lookups)); | ||
284 | |||
261 | clk_register(&pck0); | 285 | clk_register(&pck0); |
262 | clk_register(&pck1); | 286 | clk_register(&pck1); |
263 | clk_register(&pck2); | 287 | clk_register(&pck2); |
264 | clk_register(&pck3); | 288 | clk_register(&pck3); |
265 | } | 289 | } |
266 | 290 | ||
291 | static struct clk_lookup console_clock_lookup; | ||
292 | |||
293 | void __init at91cap9_set_console_clock(int id) | ||
294 | { | ||
295 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
296 | return; | ||
297 | |||
298 | console_clock_lookup.con_id = "usart"; | ||
299 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
300 | clkdev_add(&console_clock_lookup); | ||
301 | } | ||
302 | |||
267 | /* -------------------------------------------------------------------- | 303 | /* -------------------------------------------------------------------- |
268 | * GPIO | 304 | * GPIO |
269 | * -------------------------------------------------------------------- */ | 305 | * -------------------------------------------------------------------- */ |
@@ -303,11 +339,14 @@ static void at91cap9_poweroff(void) | |||
303 | * AT91CAP9 processor initialization | 339 | * AT91CAP9 processor initialization |
304 | * -------------------------------------------------------------------- */ | 340 | * -------------------------------------------------------------------- */ |
305 | 341 | ||
306 | void __init at91cap9_initialize(unsigned long main_clock) | 342 | void __init at91cap9_map_io(void) |
307 | { | 343 | { |
308 | /* Map peripherals */ | 344 | /* Map peripherals */ |
309 | iotable_init(at91cap9_io_desc, ARRAY_SIZE(at91cap9_io_desc)); | 345 | iotable_init(at91cap9_io_desc, ARRAY_SIZE(at91cap9_io_desc)); |
346 | } | ||
310 | 347 | ||
348 | void __init at91cap9_initialize(unsigned long main_clock) | ||
349 | { | ||
311 | at91_arch_reset = at91cap9_reset; | 350 | at91_arch_reset = at91cap9_reset; |
312 | pm_power_off = at91cap9_poweroff; | 351 | pm_power_off = at91cap9_poweroff; |
313 | at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); | 352 | at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); |
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index 21020ceb2f3a..cd850ed6f335 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
@@ -181,10 +181,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data) | |||
181 | 181 | ||
182 | /* Pullup pin is handled internally by USB device peripheral */ | 182 | /* Pullup pin is handled internally by USB device peripheral */ |
183 | 183 | ||
184 | /* Clocks */ | ||
185 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
186 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
187 | |||
188 | platform_device_register(&at91_usba_udc_device); | 184 | platform_device_register(&at91_usba_udc_device); |
189 | } | 185 | } |
190 | #else | 186 | #else |
@@ -355,7 +351,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
355 | } | 351 | } |
356 | 352 | ||
357 | mmc0_data = *data; | 353 | mmc0_data = *data; |
358 | at91_clock_associate("mci0_clk", &at91cap9_mmc0_device.dev, "mci_clk"); | ||
359 | platform_device_register(&at91cap9_mmc0_device); | 354 | platform_device_register(&at91cap9_mmc0_device); |
360 | } else { /* MCI1 */ | 355 | } else { /* MCI1 */ |
361 | /* CLK */ | 356 | /* CLK */ |
@@ -373,7 +368,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
373 | } | 368 | } |
374 | 369 | ||
375 | mmc1_data = *data; | 370 | mmc1_data = *data; |
376 | at91_clock_associate("mci1_clk", &at91cap9_mmc1_device.dev, "mci_clk"); | ||
377 | platform_device_register(&at91cap9_mmc1_device); | 371 | platform_device_register(&at91cap9_mmc1_device); |
378 | } | 372 | } |
379 | } | 373 | } |
@@ -614,7 +608,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
614 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 608 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
615 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | 609 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ |
616 | 610 | ||
617 | at91_clock_associate("spi0_clk", &at91cap9_spi0_device.dev, "spi_clk"); | ||
618 | platform_device_register(&at91cap9_spi0_device); | 611 | platform_device_register(&at91cap9_spi0_device); |
619 | } | 612 | } |
620 | if (enable_spi1) { | 613 | if (enable_spi1) { |
@@ -622,7 +615,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
622 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ | 615 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ |
623 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ | 616 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ |
624 | 617 | ||
625 | at91_clock_associate("spi1_clk", &at91cap9_spi1_device.dev, "spi_clk"); | ||
626 | platform_device_register(&at91cap9_spi1_device); | 618 | platform_device_register(&at91cap9_spi1_device); |
627 | } | 619 | } |
628 | } | 620 | } |
@@ -659,8 +651,6 @@ static struct platform_device at91cap9_tcb_device = { | |||
659 | 651 | ||
660 | static void __init at91_add_device_tc(void) | 652 | static void __init at91_add_device_tc(void) |
661 | { | 653 | { |
662 | /* this chip has one clock and irq for all three TC channels */ | ||
663 | at91_clock_associate("tcb_clk", &at91cap9_tcb_device.dev, "t0_clk"); | ||
664 | platform_device_register(&at91cap9_tcb_device); | 654 | platform_device_register(&at91cap9_tcb_device); |
665 | } | 655 | } |
666 | #else | 656 | #else |
@@ -1001,12 +991,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
1001 | case AT91CAP9_ID_SSC0: | 991 | case AT91CAP9_ID_SSC0: |
1002 | pdev = &at91cap9_ssc0_device; | 992 | pdev = &at91cap9_ssc0_device; |
1003 | configure_ssc0_pins(pins); | 993 | configure_ssc0_pins(pins); |
1004 | at91_clock_associate("ssc0_clk", &pdev->dev, "ssc"); | ||
1005 | break; | 994 | break; |
1006 | case AT91CAP9_ID_SSC1: | 995 | case AT91CAP9_ID_SSC1: |
1007 | pdev = &at91cap9_ssc1_device; | 996 | pdev = &at91cap9_ssc1_device; |
1008 | configure_ssc1_pins(pins); | 997 | configure_ssc1_pins(pins); |
1009 | at91_clock_associate("ssc1_clk", &pdev->dev, "ssc"); | ||
1010 | break; | 998 | break; |
1011 | default: | 999 | default: |
1012 | return; | 1000 | return; |
@@ -1199,32 +1187,30 @@ struct platform_device *atmel_default_console_device; /* the serial console devi | |||
1199 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | 1187 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) |
1200 | { | 1188 | { |
1201 | struct platform_device *pdev; | 1189 | struct platform_device *pdev; |
1190 | struct atmel_uart_data *pdata; | ||
1202 | 1191 | ||
1203 | switch (id) { | 1192 | switch (id) { |
1204 | case 0: /* DBGU */ | 1193 | case 0: /* DBGU */ |
1205 | pdev = &at91cap9_dbgu_device; | 1194 | pdev = &at91cap9_dbgu_device; |
1206 | configure_dbgu_pins(); | 1195 | configure_dbgu_pins(); |
1207 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1208 | break; | 1196 | break; |
1209 | case AT91CAP9_ID_US0: | 1197 | case AT91CAP9_ID_US0: |
1210 | pdev = &at91cap9_uart0_device; | 1198 | pdev = &at91cap9_uart0_device; |
1211 | configure_usart0_pins(pins); | 1199 | configure_usart0_pins(pins); |
1212 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1213 | break; | 1200 | break; |
1214 | case AT91CAP9_ID_US1: | 1201 | case AT91CAP9_ID_US1: |
1215 | pdev = &at91cap9_uart1_device; | 1202 | pdev = &at91cap9_uart1_device; |
1216 | configure_usart1_pins(pins); | 1203 | configure_usart1_pins(pins); |
1217 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1218 | break; | 1204 | break; |
1219 | case AT91CAP9_ID_US2: | 1205 | case AT91CAP9_ID_US2: |
1220 | pdev = &at91cap9_uart2_device; | 1206 | pdev = &at91cap9_uart2_device; |
1221 | configure_usart2_pins(pins); | 1207 | configure_usart2_pins(pins); |
1222 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1223 | break; | 1208 | break; |
1224 | default: | 1209 | default: |
1225 | return; | 1210 | return; |
1226 | } | 1211 | } |
1227 | pdev->id = portnr; /* update to mapped ID */ | 1212 | pdata = pdev->dev.platform_data; |
1213 | pdata->num = portnr; /* update to mapped ID */ | ||
1228 | 1214 | ||
1229 | if (portnr < ATMEL_MAX_UART) | 1215 | if (portnr < ATMEL_MAX_UART) |
1230 | at91_uarts[portnr] = pdev; | 1216 | at91_uarts[portnr] = pdev; |
@@ -1232,8 +1218,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1232 | 1218 | ||
1233 | void __init at91_set_serial_console(unsigned portnr) | 1219 | void __init at91_set_serial_console(unsigned portnr) |
1234 | { | 1220 | { |
1235 | if (portnr < ATMEL_MAX_UART) | 1221 | if (portnr < ATMEL_MAX_UART) { |
1236 | atmel_default_console_device = at91_uarts[portnr]; | 1222 | atmel_default_console_device = at91_uarts[portnr]; |
1223 | at91cap9_set_console_clock(portnr); | ||
1224 | } | ||
1237 | } | 1225 | } |
1238 | 1226 | ||
1239 | void __init at91_add_device_serial(void) | 1227 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 2e9ecad97f3d..b228ce9e21a1 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <mach/at91rm9200.h> | 18 | #include <mach/at91rm9200.h> |
19 | #include <mach/at91_pmc.h> | 19 | #include <mach/at91_pmc.h> |
20 | #include <mach/at91_st.h> | 20 | #include <mach/at91_st.h> |
21 | #include <mach/cpu.h> | ||
21 | 22 | ||
22 | #include "generic.h" | 23 | #include "generic.h" |
23 | #include "clock.h" | 24 | #include "clock.h" |
@@ -191,6 +192,26 @@ static struct clk *periph_clocks[] __initdata = { | |||
191 | // irq0 .. irq6 | 192 | // irq0 .. irq6 |
192 | }; | 193 | }; |
193 | 194 | ||
195 | static struct clk_lookup periph_clocks_lookups[] = { | ||
196 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
197 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
198 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | ||
199 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk), | ||
200 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk), | ||
201 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk), | ||
202 | CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), | ||
203 | CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), | ||
204 | CLKDEV_CON_DEV_ID("ssc", "ssc.2", &ssc2_clk), | ||
205 | }; | ||
206 | |||
207 | static struct clk_lookup usart_clocks_lookups[] = { | ||
208 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
209 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
210 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
211 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
212 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
213 | }; | ||
214 | |||
194 | /* | 215 | /* |
195 | * The four programmable clocks. | 216 | * The four programmable clocks. |
196 | * You must configure pin multiplexing to bring these signals out. | 217 | * You must configure pin multiplexing to bring these signals out. |
@@ -227,12 +248,29 @@ static void __init at91rm9200_register_clocks(void) | |||
227 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 248 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
228 | clk_register(periph_clocks[i]); | 249 | clk_register(periph_clocks[i]); |
229 | 250 | ||
251 | clkdev_add_table(periph_clocks_lookups, | ||
252 | ARRAY_SIZE(periph_clocks_lookups)); | ||
253 | clkdev_add_table(usart_clocks_lookups, | ||
254 | ARRAY_SIZE(usart_clocks_lookups)); | ||
255 | |||
230 | clk_register(&pck0); | 256 | clk_register(&pck0); |
231 | clk_register(&pck1); | 257 | clk_register(&pck1); |
232 | clk_register(&pck2); | 258 | clk_register(&pck2); |
233 | clk_register(&pck3); | 259 | clk_register(&pck3); |
234 | } | 260 | } |
235 | 261 | ||
262 | static struct clk_lookup console_clock_lookup; | ||
263 | |||
264 | void __init at91rm9200_set_console_clock(int id) | ||
265 | { | ||
266 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
267 | return; | ||
268 | |||
269 | console_clock_lookup.con_id = "usart"; | ||
270 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
271 | clkdev_add(&console_clock_lookup); | ||
272 | } | ||
273 | |||
236 | /* -------------------------------------------------------------------- | 274 | /* -------------------------------------------------------------------- |
237 | * GPIO | 275 | * GPIO |
238 | * -------------------------------------------------------------------- */ | 276 | * -------------------------------------------------------------------- */ |
@@ -266,15 +304,25 @@ static void at91rm9200_reset(void) | |||
266 | at91_sys_write(AT91_ST_CR, AT91_ST_WDRST); | 304 | at91_sys_write(AT91_ST_CR, AT91_ST_WDRST); |
267 | } | 305 | } |
268 | 306 | ||
307 | int rm9200_type; | ||
308 | EXPORT_SYMBOL(rm9200_type); | ||
309 | |||
310 | void __init at91rm9200_set_type(int type) | ||
311 | { | ||
312 | rm9200_type = type; | ||
313 | } | ||
269 | 314 | ||
270 | /* -------------------------------------------------------------------- | 315 | /* -------------------------------------------------------------------- |
271 | * AT91RM9200 processor initialization | 316 | * AT91RM9200 processor initialization |
272 | * -------------------------------------------------------------------- */ | 317 | * -------------------------------------------------------------------- */ |
273 | void __init at91rm9200_initialize(unsigned long main_clock, unsigned short banks) | 318 | void __init at91rm9200_map_io(void) |
274 | { | 319 | { |
275 | /* Map peripherals */ | 320 | /* Map peripherals */ |
276 | iotable_init(at91rm9200_io_desc, ARRAY_SIZE(at91rm9200_io_desc)); | 321 | iotable_init(at91rm9200_io_desc, ARRAY_SIZE(at91rm9200_io_desc)); |
322 | } | ||
277 | 323 | ||
324 | void __init at91rm9200_initialize(unsigned long main_clock) | ||
325 | { | ||
278 | at91_arch_reset = at91rm9200_reset; | 326 | at91_arch_reset = at91rm9200_reset; |
279 | at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1) | 327 | at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1) |
280 | | (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3) | 328 | | (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3) |
@@ -288,7 +336,8 @@ void __init at91rm9200_initialize(unsigned long main_clock, unsigned short banks | |||
288 | at91rm9200_register_clocks(); | 336 | at91rm9200_register_clocks(); |
289 | 337 | ||
290 | /* Initialize GPIO subsystem */ | 338 | /* Initialize GPIO subsystem */ |
291 | at91_gpio_init(at91rm9200_gpio, banks); | 339 | at91_gpio_init(at91rm9200_gpio, |
340 | cpu_is_at91rm9200_bga() ? AT91RM9200_BGA : AT91RM9200_PQFP); | ||
292 | } | 341 | } |
293 | 342 | ||
294 | 343 | ||
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 7b539228e0ef..a0ba475be04c 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c | |||
@@ -644,15 +644,7 @@ static struct platform_device at91rm9200_tcb1_device = { | |||
644 | 644 | ||
645 | static void __init at91_add_device_tc(void) | 645 | static void __init at91_add_device_tc(void) |
646 | { | 646 | { |
647 | /* this chip has a separate clock and irq for each TC channel */ | ||
648 | at91_clock_associate("tc0_clk", &at91rm9200_tcb0_device.dev, "t0_clk"); | ||
649 | at91_clock_associate("tc1_clk", &at91rm9200_tcb0_device.dev, "t1_clk"); | ||
650 | at91_clock_associate("tc2_clk", &at91rm9200_tcb0_device.dev, "t2_clk"); | ||
651 | platform_device_register(&at91rm9200_tcb0_device); | 647 | platform_device_register(&at91rm9200_tcb0_device); |
652 | |||
653 | at91_clock_associate("tc3_clk", &at91rm9200_tcb1_device.dev, "t0_clk"); | ||
654 | at91_clock_associate("tc4_clk", &at91rm9200_tcb1_device.dev, "t1_clk"); | ||
655 | at91_clock_associate("tc5_clk", &at91rm9200_tcb1_device.dev, "t2_clk"); | ||
656 | platform_device_register(&at91rm9200_tcb1_device); | 648 | platform_device_register(&at91rm9200_tcb1_device); |
657 | } | 649 | } |
658 | #else | 650 | #else |
@@ -849,17 +841,14 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
849 | case AT91RM9200_ID_SSC0: | 841 | case AT91RM9200_ID_SSC0: |
850 | pdev = &at91rm9200_ssc0_device; | 842 | pdev = &at91rm9200_ssc0_device; |
851 | configure_ssc0_pins(pins); | 843 | configure_ssc0_pins(pins); |
852 | at91_clock_associate("ssc0_clk", &pdev->dev, "ssc"); | ||
853 | break; | 844 | break; |
854 | case AT91RM9200_ID_SSC1: | 845 | case AT91RM9200_ID_SSC1: |
855 | pdev = &at91rm9200_ssc1_device; | 846 | pdev = &at91rm9200_ssc1_device; |
856 | configure_ssc1_pins(pins); | 847 | configure_ssc1_pins(pins); |
857 | at91_clock_associate("ssc1_clk", &pdev->dev, "ssc"); | ||
858 | break; | 848 | break; |
859 | case AT91RM9200_ID_SSC2: | 849 | case AT91RM9200_ID_SSC2: |
860 | pdev = &at91rm9200_ssc2_device; | 850 | pdev = &at91rm9200_ssc2_device; |
861 | configure_ssc2_pins(pins); | 851 | configure_ssc2_pins(pins); |
862 | at91_clock_associate("ssc2_clk", &pdev->dev, "ssc"); | ||
863 | break; | 852 | break; |
864 | default: | 853 | default: |
865 | return; | 854 | return; |
@@ -1109,37 +1098,34 @@ struct platform_device *atmel_default_console_device; /* the serial console devi | |||
1109 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | 1098 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) |
1110 | { | 1099 | { |
1111 | struct platform_device *pdev; | 1100 | struct platform_device *pdev; |
1101 | struct atmel_uart_data *pdata; | ||
1112 | 1102 | ||
1113 | switch (id) { | 1103 | switch (id) { |
1114 | case 0: /* DBGU */ | 1104 | case 0: /* DBGU */ |
1115 | pdev = &at91rm9200_dbgu_device; | 1105 | pdev = &at91rm9200_dbgu_device; |
1116 | configure_dbgu_pins(); | 1106 | configure_dbgu_pins(); |
1117 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1118 | break; | 1107 | break; |
1119 | case AT91RM9200_ID_US0: | 1108 | case AT91RM9200_ID_US0: |
1120 | pdev = &at91rm9200_uart0_device; | 1109 | pdev = &at91rm9200_uart0_device; |
1121 | configure_usart0_pins(pins); | 1110 | configure_usart0_pins(pins); |
1122 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1123 | break; | 1111 | break; |
1124 | case AT91RM9200_ID_US1: | 1112 | case AT91RM9200_ID_US1: |
1125 | pdev = &at91rm9200_uart1_device; | 1113 | pdev = &at91rm9200_uart1_device; |
1126 | configure_usart1_pins(pins); | 1114 | configure_usart1_pins(pins); |
1127 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1128 | break; | 1115 | break; |
1129 | case AT91RM9200_ID_US2: | 1116 | case AT91RM9200_ID_US2: |
1130 | pdev = &at91rm9200_uart2_device; | 1117 | pdev = &at91rm9200_uart2_device; |
1131 | configure_usart2_pins(pins); | 1118 | configure_usart2_pins(pins); |
1132 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1133 | break; | 1119 | break; |
1134 | case AT91RM9200_ID_US3: | 1120 | case AT91RM9200_ID_US3: |
1135 | pdev = &at91rm9200_uart3_device; | 1121 | pdev = &at91rm9200_uart3_device; |
1136 | configure_usart3_pins(pins); | 1122 | configure_usart3_pins(pins); |
1137 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1138 | break; | 1123 | break; |
1139 | default: | 1124 | default: |
1140 | return; | 1125 | return; |
1141 | } | 1126 | } |
1142 | pdev->id = portnr; /* update to mapped ID */ | 1127 | pdata = pdev->dev.platform_data; |
1128 | pdata->num = portnr; /* update to mapped ID */ | ||
1143 | 1129 | ||
1144 | if (portnr < ATMEL_MAX_UART) | 1130 | if (portnr < ATMEL_MAX_UART) |
1145 | at91_uarts[portnr] = pdev; | 1131 | at91_uarts[portnr] = pdev; |
@@ -1147,8 +1133,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1147 | 1133 | ||
1148 | void __init at91_set_serial_console(unsigned portnr) | 1134 | void __init at91_set_serial_console(unsigned portnr) |
1149 | { | 1135 | { |
1150 | if (portnr < ATMEL_MAX_UART) | 1136 | if (portnr < ATMEL_MAX_UART) { |
1151 | atmel_default_console_device = at91_uarts[portnr]; | 1137 | atmel_default_console_device = at91_uarts[portnr]; |
1138 | at91rm9200_set_console_clock(portnr); | ||
1139 | } | ||
1152 | } | 1140 | } |
1153 | 1141 | ||
1154 | void __init at91_add_device_serial(void) | 1142 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 195208b30024..7d606b04d313 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
@@ -231,6 +231,28 @@ static struct clk *periph_clocks[] __initdata = { | |||
231 | // irq0 .. irq2 | 231 | // irq0 .. irq2 |
232 | }; | 232 | }; |
233 | 233 | ||
234 | static struct clk_lookup periph_clocks_lookups[] = { | ||
235 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
236 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
237 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
238 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
239 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | ||
240 | CLKDEV_CON_DEV_ID("t3_clk", "atmel_tcb.1", &tc3_clk), | ||
241 | CLKDEV_CON_DEV_ID("t4_clk", "atmel_tcb.1", &tc4_clk), | ||
242 | CLKDEV_CON_DEV_ID("t5_clk", "atmel_tcb.1", &tc5_clk), | ||
243 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk), | ||
244 | }; | ||
245 | |||
246 | static struct clk_lookup usart_clocks_lookups[] = { | ||
247 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
248 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
249 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
250 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
251 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
252 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.5", &usart4_clk), | ||
253 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.6", &usart5_clk), | ||
254 | }; | ||
255 | |||
234 | /* | 256 | /* |
235 | * The two programmable clocks. | 257 | * The two programmable clocks. |
236 | * You must configure pin multiplexing to bring these signals out. | 258 | * You must configure pin multiplexing to bring these signals out. |
@@ -255,10 +277,27 @@ static void __init at91sam9260_register_clocks(void) | |||
255 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 277 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
256 | clk_register(periph_clocks[i]); | 278 | clk_register(periph_clocks[i]); |
257 | 279 | ||
280 | clkdev_add_table(periph_clocks_lookups, | ||
281 | ARRAY_SIZE(periph_clocks_lookups)); | ||
282 | clkdev_add_table(usart_clocks_lookups, | ||
283 | ARRAY_SIZE(usart_clocks_lookups)); | ||
284 | |||
258 | clk_register(&pck0); | 285 | clk_register(&pck0); |
259 | clk_register(&pck1); | 286 | clk_register(&pck1); |
260 | } | 287 | } |
261 | 288 | ||
289 | static struct clk_lookup console_clock_lookup; | ||
290 | |||
291 | void __init at91sam9260_set_console_clock(int id) | ||
292 | { | ||
293 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
294 | return; | ||
295 | |||
296 | console_clock_lookup.con_id = "usart"; | ||
297 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
298 | clkdev_add(&console_clock_lookup); | ||
299 | } | ||
300 | |||
262 | /* -------------------------------------------------------------------- | 301 | /* -------------------------------------------------------------------- |
263 | * GPIO | 302 | * GPIO |
264 | * -------------------------------------------------------------------- */ | 303 | * -------------------------------------------------------------------- */ |
@@ -289,7 +328,7 @@ static void at91sam9260_poweroff(void) | |||
289 | * AT91SAM9260 processor initialization | 328 | * AT91SAM9260 processor initialization |
290 | * -------------------------------------------------------------------- */ | 329 | * -------------------------------------------------------------------- */ |
291 | 330 | ||
292 | static void __init at91sam9xe_initialize(void) | 331 | static void __init at91sam9xe_map_io(void) |
293 | { | 332 | { |
294 | unsigned long cidr, sram_size; | 333 | unsigned long cidr, sram_size; |
295 | 334 | ||
@@ -310,18 +349,21 @@ static void __init at91sam9xe_initialize(void) | |||
310 | iotable_init(at91sam9xe_sram_desc, ARRAY_SIZE(at91sam9xe_sram_desc)); | 349 | iotable_init(at91sam9xe_sram_desc, ARRAY_SIZE(at91sam9xe_sram_desc)); |
311 | } | 350 | } |
312 | 351 | ||
313 | void __init at91sam9260_initialize(unsigned long main_clock) | 352 | void __init at91sam9260_map_io(void) |
314 | { | 353 | { |
315 | /* Map peripherals */ | 354 | /* Map peripherals */ |
316 | iotable_init(at91sam9260_io_desc, ARRAY_SIZE(at91sam9260_io_desc)); | 355 | iotable_init(at91sam9260_io_desc, ARRAY_SIZE(at91sam9260_io_desc)); |
317 | 356 | ||
318 | if (cpu_is_at91sam9xe()) | 357 | if (cpu_is_at91sam9xe()) |
319 | at91sam9xe_initialize(); | 358 | at91sam9xe_map_io(); |
320 | else if (cpu_is_at91sam9g20()) | 359 | else if (cpu_is_at91sam9g20()) |
321 | iotable_init(at91sam9g20_sram_desc, ARRAY_SIZE(at91sam9g20_sram_desc)); | 360 | iotable_init(at91sam9g20_sram_desc, ARRAY_SIZE(at91sam9g20_sram_desc)); |
322 | else | 361 | else |
323 | iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc)); | 362 | iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc)); |
363 | } | ||
324 | 364 | ||
365 | void __init at91sam9260_initialize(unsigned long main_clock) | ||
366 | { | ||
325 | at91_arch_reset = at91sam9_alt_reset; | 367 | at91_arch_reset = at91sam9_alt_reset; |
326 | pm_power_off = at91sam9260_poweroff; | 368 | pm_power_off = at91sam9260_poweroff; |
327 | at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) | 369 | at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 07eb7b07e442..1fdeb9058a76 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -609,7 +609,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
609 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 609 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
610 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI1_SPCK */ | 610 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI1_SPCK */ |
611 | 611 | ||
612 | at91_clock_associate("spi0_clk", &at91sam9260_spi0_device.dev, "spi_clk"); | ||
613 | platform_device_register(&at91sam9260_spi0_device); | 612 | platform_device_register(&at91sam9260_spi0_device); |
614 | } | 613 | } |
615 | if (enable_spi1) { | 614 | if (enable_spi1) { |
@@ -617,7 +616,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
617 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI1_MOSI */ | 616 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI1_MOSI */ |
618 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI1_SPCK */ | 617 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI1_SPCK */ |
619 | 618 | ||
620 | at91_clock_associate("spi1_clk", &at91sam9260_spi1_device.dev, "spi_clk"); | ||
621 | platform_device_register(&at91sam9260_spi1_device); | 619 | platform_device_register(&at91sam9260_spi1_device); |
622 | } | 620 | } |
623 | } | 621 | } |
@@ -694,15 +692,7 @@ static struct platform_device at91sam9260_tcb1_device = { | |||
694 | 692 | ||
695 | static void __init at91_add_device_tc(void) | 693 | static void __init at91_add_device_tc(void) |
696 | { | 694 | { |
697 | /* this chip has a separate clock and irq for each TC channel */ | ||
698 | at91_clock_associate("tc0_clk", &at91sam9260_tcb0_device.dev, "t0_clk"); | ||
699 | at91_clock_associate("tc1_clk", &at91sam9260_tcb0_device.dev, "t1_clk"); | ||
700 | at91_clock_associate("tc2_clk", &at91sam9260_tcb0_device.dev, "t2_clk"); | ||
701 | platform_device_register(&at91sam9260_tcb0_device); | 695 | platform_device_register(&at91sam9260_tcb0_device); |
702 | |||
703 | at91_clock_associate("tc3_clk", &at91sam9260_tcb1_device.dev, "t0_clk"); | ||
704 | at91_clock_associate("tc4_clk", &at91sam9260_tcb1_device.dev, "t1_clk"); | ||
705 | at91_clock_associate("tc5_clk", &at91sam9260_tcb1_device.dev, "t2_clk"); | ||
706 | platform_device_register(&at91sam9260_tcb1_device); | 696 | platform_device_register(&at91sam9260_tcb1_device); |
707 | } | 697 | } |
708 | #else | 698 | #else |
@@ -820,7 +810,6 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
820 | case AT91SAM9260_ID_SSC: | 810 | case AT91SAM9260_ID_SSC: |
821 | pdev = &at91sam9260_ssc_device; | 811 | pdev = &at91sam9260_ssc_device; |
822 | configure_ssc_pins(pins); | 812 | configure_ssc_pins(pins); |
823 | at91_clock_associate("ssc_clk", &pdev->dev, "pclk"); | ||
824 | break; | 813 | break; |
825 | default: | 814 | default: |
826 | return; | 815 | return; |
@@ -1139,47 +1128,42 @@ struct platform_device *atmel_default_console_device; /* the serial console devi | |||
1139 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | 1128 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) |
1140 | { | 1129 | { |
1141 | struct platform_device *pdev; | 1130 | struct platform_device *pdev; |
1131 | struct atmel_uart_data *pdata; | ||
1142 | 1132 | ||
1143 | switch (id) { | 1133 | switch (id) { |
1144 | case 0: /* DBGU */ | 1134 | case 0: /* DBGU */ |
1145 | pdev = &at91sam9260_dbgu_device; | 1135 | pdev = &at91sam9260_dbgu_device; |
1146 | configure_dbgu_pins(); | 1136 | configure_dbgu_pins(); |
1147 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1148 | break; | 1137 | break; |
1149 | case AT91SAM9260_ID_US0: | 1138 | case AT91SAM9260_ID_US0: |
1150 | pdev = &at91sam9260_uart0_device; | 1139 | pdev = &at91sam9260_uart0_device; |
1151 | configure_usart0_pins(pins); | 1140 | configure_usart0_pins(pins); |
1152 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1153 | break; | 1141 | break; |
1154 | case AT91SAM9260_ID_US1: | 1142 | case AT91SAM9260_ID_US1: |
1155 | pdev = &at91sam9260_uart1_device; | 1143 | pdev = &at91sam9260_uart1_device; |
1156 | configure_usart1_pins(pins); | 1144 | configure_usart1_pins(pins); |
1157 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1158 | break; | 1145 | break; |
1159 | case AT91SAM9260_ID_US2: | 1146 | case AT91SAM9260_ID_US2: |
1160 | pdev = &at91sam9260_uart2_device; | 1147 | pdev = &at91sam9260_uart2_device; |
1161 | configure_usart2_pins(pins); | 1148 | configure_usart2_pins(pins); |
1162 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1163 | break; | 1149 | break; |
1164 | case AT91SAM9260_ID_US3: | 1150 | case AT91SAM9260_ID_US3: |
1165 | pdev = &at91sam9260_uart3_device; | 1151 | pdev = &at91sam9260_uart3_device; |
1166 | configure_usart3_pins(pins); | 1152 | configure_usart3_pins(pins); |
1167 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1168 | break; | 1153 | break; |
1169 | case AT91SAM9260_ID_US4: | 1154 | case AT91SAM9260_ID_US4: |
1170 | pdev = &at91sam9260_uart4_device; | 1155 | pdev = &at91sam9260_uart4_device; |
1171 | configure_usart4_pins(); | 1156 | configure_usart4_pins(); |
1172 | at91_clock_associate("usart4_clk", &pdev->dev, "usart"); | ||
1173 | break; | 1157 | break; |
1174 | case AT91SAM9260_ID_US5: | 1158 | case AT91SAM9260_ID_US5: |
1175 | pdev = &at91sam9260_uart5_device; | 1159 | pdev = &at91sam9260_uart5_device; |
1176 | configure_usart5_pins(); | 1160 | configure_usart5_pins(); |
1177 | at91_clock_associate("usart5_clk", &pdev->dev, "usart"); | ||
1178 | break; | 1161 | break; |
1179 | default: | 1162 | default: |
1180 | return; | 1163 | return; |
1181 | } | 1164 | } |
1182 | pdev->id = portnr; /* update to mapped ID */ | 1165 | pdata = pdev->dev.platform_data; |
1166 | pdata->num = portnr; /* update to mapped ID */ | ||
1183 | 1167 | ||
1184 | if (portnr < ATMEL_MAX_UART) | 1168 | if (portnr < ATMEL_MAX_UART) |
1185 | at91_uarts[portnr] = pdev; | 1169 | at91_uarts[portnr] = pdev; |
@@ -1187,8 +1171,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1187 | 1171 | ||
1188 | void __init at91_set_serial_console(unsigned portnr) | 1172 | void __init at91_set_serial_console(unsigned portnr) |
1189 | { | 1173 | { |
1190 | if (portnr < ATMEL_MAX_UART) | 1174 | if (portnr < ATMEL_MAX_UART) { |
1191 | atmel_default_console_device = at91_uarts[portnr]; | 1175 | atmel_default_console_device = at91_uarts[portnr]; |
1176 | at91sam9260_set_console_clock(portnr); | ||
1177 | } | ||
1192 | } | 1178 | } |
1193 | 1179 | ||
1194 | void __init at91_add_device_serial(void) | 1180 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index fcad88668504..c1483168c97a 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
@@ -178,6 +178,24 @@ static struct clk *periph_clocks[] __initdata = { | |||
178 | // irq0 .. irq2 | 178 | // irq0 .. irq2 |
179 | }; | 179 | }; |
180 | 180 | ||
181 | static struct clk_lookup periph_clocks_lookups[] = { | ||
182 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
183 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
184 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
185 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
186 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc1_clk), | ||
187 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
188 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
189 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), | ||
190 | }; | ||
191 | |||
192 | static struct clk_lookup usart_clocks_lookups[] = { | ||
193 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
194 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
195 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
196 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
197 | }; | ||
198 | |||
181 | /* | 199 | /* |
182 | * The four programmable clocks. | 200 | * The four programmable clocks. |
183 | * You must configure pin multiplexing to bring these signals out. | 201 | * You must configure pin multiplexing to bring these signals out. |
@@ -228,6 +246,11 @@ static void __init at91sam9261_register_clocks(void) | |||
228 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 246 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
229 | clk_register(periph_clocks[i]); | 247 | clk_register(periph_clocks[i]); |
230 | 248 | ||
249 | clkdev_add_table(periph_clocks_lookups, | ||
250 | ARRAY_SIZE(periph_clocks_lookups)); | ||
251 | clkdev_add_table(usart_clocks_lookups, | ||
252 | ARRAY_SIZE(usart_clocks_lookups)); | ||
253 | |||
231 | clk_register(&pck0); | 254 | clk_register(&pck0); |
232 | clk_register(&pck1); | 255 | clk_register(&pck1); |
233 | clk_register(&pck2); | 256 | clk_register(&pck2); |
@@ -237,6 +260,18 @@ static void __init at91sam9261_register_clocks(void) | |||
237 | clk_register(&hck1); | 260 | clk_register(&hck1); |
238 | } | 261 | } |
239 | 262 | ||
263 | static struct clk_lookup console_clock_lookup; | ||
264 | |||
265 | void __init at91sam9261_set_console_clock(int id) | ||
266 | { | ||
267 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
268 | return; | ||
269 | |||
270 | console_clock_lookup.con_id = "usart"; | ||
271 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
272 | clkdev_add(&console_clock_lookup); | ||
273 | } | ||
274 | |||
240 | /* -------------------------------------------------------------------- | 275 | /* -------------------------------------------------------------------- |
241 | * GPIO | 276 | * GPIO |
242 | * -------------------------------------------------------------------- */ | 277 | * -------------------------------------------------------------------- */ |
@@ -267,7 +302,7 @@ static void at91sam9261_poweroff(void) | |||
267 | * AT91SAM9261 processor initialization | 302 | * AT91SAM9261 processor initialization |
268 | * -------------------------------------------------------------------- */ | 303 | * -------------------------------------------------------------------- */ |
269 | 304 | ||
270 | void __init at91sam9261_initialize(unsigned long main_clock) | 305 | void __init at91sam9261_map_io(void) |
271 | { | 306 | { |
272 | /* Map peripherals */ | 307 | /* Map peripherals */ |
273 | iotable_init(at91sam9261_io_desc, ARRAY_SIZE(at91sam9261_io_desc)); | 308 | iotable_init(at91sam9261_io_desc, ARRAY_SIZE(at91sam9261_io_desc)); |
@@ -276,8 +311,10 @@ void __init at91sam9261_initialize(unsigned long main_clock) | |||
276 | iotable_init(at91sam9g10_sram_desc, ARRAY_SIZE(at91sam9g10_sram_desc)); | 311 | iotable_init(at91sam9g10_sram_desc, ARRAY_SIZE(at91sam9g10_sram_desc)); |
277 | else | 312 | else |
278 | iotable_init(at91sam9261_sram_desc, ARRAY_SIZE(at91sam9261_sram_desc)); | 313 | iotable_init(at91sam9261_sram_desc, ARRAY_SIZE(at91sam9261_sram_desc)); |
314 | } | ||
279 | 315 | ||
280 | 316 | void __init at91sam9261_initialize(unsigned long main_clock) | |
317 | { | ||
281 | at91_arch_reset = at91sam9_alt_reset; | 318 | at91_arch_reset = at91sam9_alt_reset; |
282 | pm_power_off = at91sam9261_poweroff; | 319 | pm_power_off = at91sam9261_poweroff; |
283 | at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1) | 320 | at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1) |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 59fc48311fb0..3eb4538fceeb 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
@@ -426,7 +426,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
426 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 426 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
427 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | 427 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ |
428 | 428 | ||
429 | at91_clock_associate("spi0_clk", &at91sam9261_spi0_device.dev, "spi_clk"); | ||
430 | platform_device_register(&at91sam9261_spi0_device); | 429 | platform_device_register(&at91sam9261_spi0_device); |
431 | } | 430 | } |
432 | if (enable_spi1) { | 431 | if (enable_spi1) { |
@@ -434,7 +433,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
434 | at91_set_A_periph(AT91_PIN_PB31, 0); /* SPI1_MOSI */ | 433 | at91_set_A_periph(AT91_PIN_PB31, 0); /* SPI1_MOSI */ |
435 | at91_set_A_periph(AT91_PIN_PB29, 0); /* SPI1_SPCK */ | 434 | at91_set_A_periph(AT91_PIN_PB29, 0); /* SPI1_SPCK */ |
436 | 435 | ||
437 | at91_clock_associate("spi1_clk", &at91sam9261_spi1_device.dev, "spi_clk"); | ||
438 | platform_device_register(&at91sam9261_spi1_device); | 436 | platform_device_register(&at91sam9261_spi1_device); |
439 | } | 437 | } |
440 | } | 438 | } |
@@ -581,10 +579,6 @@ static struct platform_device at91sam9261_tcb_device = { | |||
581 | 579 | ||
582 | static void __init at91_add_device_tc(void) | 580 | static void __init at91_add_device_tc(void) |
583 | { | 581 | { |
584 | /* this chip has a separate clock and irq for each TC channel */ | ||
585 | at91_clock_associate("tc0_clk", &at91sam9261_tcb_device.dev, "t0_clk"); | ||
586 | at91_clock_associate("tc1_clk", &at91sam9261_tcb_device.dev, "t1_clk"); | ||
587 | at91_clock_associate("tc2_clk", &at91sam9261_tcb_device.dev, "t2_clk"); | ||
588 | platform_device_register(&at91sam9261_tcb_device); | 582 | platform_device_register(&at91sam9261_tcb_device); |
589 | } | 583 | } |
590 | #else | 584 | #else |
@@ -786,17 +780,14 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
786 | case AT91SAM9261_ID_SSC0: | 780 | case AT91SAM9261_ID_SSC0: |
787 | pdev = &at91sam9261_ssc0_device; | 781 | pdev = &at91sam9261_ssc0_device; |
788 | configure_ssc0_pins(pins); | 782 | configure_ssc0_pins(pins); |
789 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
790 | break; | 783 | break; |
791 | case AT91SAM9261_ID_SSC1: | 784 | case AT91SAM9261_ID_SSC1: |
792 | pdev = &at91sam9261_ssc1_device; | 785 | pdev = &at91sam9261_ssc1_device; |
793 | configure_ssc1_pins(pins); | 786 | configure_ssc1_pins(pins); |
794 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
795 | break; | 787 | break; |
796 | case AT91SAM9261_ID_SSC2: | 788 | case AT91SAM9261_ID_SSC2: |
797 | pdev = &at91sam9261_ssc2_device; | 789 | pdev = &at91sam9261_ssc2_device; |
798 | configure_ssc2_pins(pins); | 790 | configure_ssc2_pins(pins); |
799 | at91_clock_associate("ssc2_clk", &pdev->dev, "pclk"); | ||
800 | break; | 791 | break; |
801 | default: | 792 | default: |
802 | return; | 793 | return; |
@@ -989,32 +980,30 @@ struct platform_device *atmel_default_console_device; /* the serial console devi | |||
989 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | 980 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) |
990 | { | 981 | { |
991 | struct platform_device *pdev; | 982 | struct platform_device *pdev; |
983 | struct atmel_uart_data *pdata; | ||
992 | 984 | ||
993 | switch (id) { | 985 | switch (id) { |
994 | case 0: /* DBGU */ | 986 | case 0: /* DBGU */ |
995 | pdev = &at91sam9261_dbgu_device; | 987 | pdev = &at91sam9261_dbgu_device; |
996 | configure_dbgu_pins(); | 988 | configure_dbgu_pins(); |
997 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
998 | break; | 989 | break; |
999 | case AT91SAM9261_ID_US0: | 990 | case AT91SAM9261_ID_US0: |
1000 | pdev = &at91sam9261_uart0_device; | 991 | pdev = &at91sam9261_uart0_device; |
1001 | configure_usart0_pins(pins); | 992 | configure_usart0_pins(pins); |
1002 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1003 | break; | 993 | break; |
1004 | case AT91SAM9261_ID_US1: | 994 | case AT91SAM9261_ID_US1: |
1005 | pdev = &at91sam9261_uart1_device; | 995 | pdev = &at91sam9261_uart1_device; |
1006 | configure_usart1_pins(pins); | 996 | configure_usart1_pins(pins); |
1007 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1008 | break; | 997 | break; |
1009 | case AT91SAM9261_ID_US2: | 998 | case AT91SAM9261_ID_US2: |
1010 | pdev = &at91sam9261_uart2_device; | 999 | pdev = &at91sam9261_uart2_device; |
1011 | configure_usart2_pins(pins); | 1000 | configure_usart2_pins(pins); |
1012 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1013 | break; | 1001 | break; |
1014 | default: | 1002 | default: |
1015 | return; | 1003 | return; |
1016 | } | 1004 | } |
1017 | pdev->id = portnr; /* update to mapped ID */ | 1005 | pdata = pdev->dev.platform_data; |
1006 | pdata->num = portnr; /* update to mapped ID */ | ||
1018 | 1007 | ||
1019 | if (portnr < ATMEL_MAX_UART) | 1008 | if (portnr < ATMEL_MAX_UART) |
1020 | at91_uarts[portnr] = pdev; | 1009 | at91_uarts[portnr] = pdev; |
@@ -1022,8 +1011,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1022 | 1011 | ||
1023 | void __init at91_set_serial_console(unsigned portnr) | 1012 | void __init at91_set_serial_console(unsigned portnr) |
1024 | { | 1013 | { |
1025 | if (portnr < ATMEL_MAX_UART) | 1014 | if (portnr < ATMEL_MAX_UART) { |
1026 | atmel_default_console_device = at91_uarts[portnr]; | 1015 | atmel_default_console_device = at91_uarts[portnr]; |
1016 | at91sam9261_set_console_clock(portnr); | ||
1017 | } | ||
1027 | } | 1018 | } |
1028 | 1019 | ||
1029 | void __init at91_add_device_serial(void) | 1020 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 249f900954d8..dc28477d14ff 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
@@ -199,6 +199,23 @@ static struct clk *periph_clocks[] __initdata = { | |||
199 | // irq0 .. irq1 | 199 | // irq0 .. irq1 |
200 | }; | 200 | }; |
201 | 201 | ||
202 | static struct clk_lookup periph_clocks_lookups[] = { | ||
203 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
204 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
205 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), | ||
206 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), | ||
207 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
208 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
209 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), | ||
210 | }; | ||
211 | |||
212 | static struct clk_lookup usart_clocks_lookups[] = { | ||
213 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
214 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
215 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
216 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
217 | }; | ||
218 | |||
202 | /* | 219 | /* |
203 | * The four programmable clocks. | 220 | * The four programmable clocks. |
204 | * You must configure pin multiplexing to bring these signals out. | 221 | * You must configure pin multiplexing to bring these signals out. |
@@ -235,12 +252,29 @@ static void __init at91sam9263_register_clocks(void) | |||
235 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 252 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
236 | clk_register(periph_clocks[i]); | 253 | clk_register(periph_clocks[i]); |
237 | 254 | ||
255 | clkdev_add_table(periph_clocks_lookups, | ||
256 | ARRAY_SIZE(periph_clocks_lookups)); | ||
257 | clkdev_add_table(usart_clocks_lookups, | ||
258 | ARRAY_SIZE(usart_clocks_lookups)); | ||
259 | |||
238 | clk_register(&pck0); | 260 | clk_register(&pck0); |
239 | clk_register(&pck1); | 261 | clk_register(&pck1); |
240 | clk_register(&pck2); | 262 | clk_register(&pck2); |
241 | clk_register(&pck3); | 263 | clk_register(&pck3); |
242 | } | 264 | } |
243 | 265 | ||
266 | static struct clk_lookup console_clock_lookup; | ||
267 | |||
268 | void __init at91sam9263_set_console_clock(int id) | ||
269 | { | ||
270 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
271 | return; | ||
272 | |||
273 | console_clock_lookup.con_id = "usart"; | ||
274 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
275 | clkdev_add(&console_clock_lookup); | ||
276 | } | ||
277 | |||
244 | /* -------------------------------------------------------------------- | 278 | /* -------------------------------------------------------------------- |
245 | * GPIO | 279 | * GPIO |
246 | * -------------------------------------------------------------------- */ | 280 | * -------------------------------------------------------------------- */ |
@@ -279,11 +313,14 @@ static void at91sam9263_poweroff(void) | |||
279 | * AT91SAM9263 processor initialization | 313 | * AT91SAM9263 processor initialization |
280 | * -------------------------------------------------------------------- */ | 314 | * -------------------------------------------------------------------- */ |
281 | 315 | ||
282 | void __init at91sam9263_initialize(unsigned long main_clock) | 316 | void __init at91sam9263_map_io(void) |
283 | { | 317 | { |
284 | /* Map peripherals */ | 318 | /* Map peripherals */ |
285 | iotable_init(at91sam9263_io_desc, ARRAY_SIZE(at91sam9263_io_desc)); | 319 | iotable_init(at91sam9263_io_desc, ARRAY_SIZE(at91sam9263_io_desc)); |
320 | } | ||
286 | 321 | ||
322 | void __init at91sam9263_initialize(unsigned long main_clock) | ||
323 | { | ||
287 | at91_arch_reset = at91sam9_alt_reset; | 324 | at91_arch_reset = at91sam9_alt_reset; |
288 | pm_power_off = at91sam9263_poweroff; | 325 | pm_power_off = at91sam9263_poweroff; |
289 | at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); | 326 | at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index fb5c23af1017..ffe081b77ed0 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
@@ -308,7 +308,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
308 | } | 308 | } |
309 | 309 | ||
310 | mmc0_data = *data; | 310 | mmc0_data = *data; |
311 | at91_clock_associate("mci0_clk", &at91sam9263_mmc0_device.dev, "mci_clk"); | ||
312 | platform_device_register(&at91sam9263_mmc0_device); | 311 | platform_device_register(&at91sam9263_mmc0_device); |
313 | } else { /* MCI1 */ | 312 | } else { /* MCI1 */ |
314 | /* CLK */ | 313 | /* CLK */ |
@@ -339,7 +338,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
339 | } | 338 | } |
340 | 339 | ||
341 | mmc1_data = *data; | 340 | mmc1_data = *data; |
342 | at91_clock_associate("mci1_clk", &at91sam9263_mmc1_device.dev, "mci_clk"); | ||
343 | platform_device_register(&at91sam9263_mmc1_device); | 341 | platform_device_register(&at91sam9263_mmc1_device); |
344 | } | 342 | } |
345 | } | 343 | } |
@@ -686,7 +684,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
686 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 684 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
687 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | 685 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ |
688 | 686 | ||
689 | at91_clock_associate("spi0_clk", &at91sam9263_spi0_device.dev, "spi_clk"); | ||
690 | platform_device_register(&at91sam9263_spi0_device); | 687 | platform_device_register(&at91sam9263_spi0_device); |
691 | } | 688 | } |
692 | if (enable_spi1) { | 689 | if (enable_spi1) { |
@@ -694,7 +691,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
694 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ | 691 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ |
695 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ | 692 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ |
696 | 693 | ||
697 | at91_clock_associate("spi1_clk", &at91sam9263_spi1_device.dev, "spi_clk"); | ||
698 | platform_device_register(&at91sam9263_spi1_device); | 694 | platform_device_register(&at91sam9263_spi1_device); |
699 | } | 695 | } |
700 | } | 696 | } |
@@ -941,8 +937,6 @@ static struct platform_device at91sam9263_tcb_device = { | |||
941 | 937 | ||
942 | static void __init at91_add_device_tc(void) | 938 | static void __init at91_add_device_tc(void) |
943 | { | 939 | { |
944 | /* this chip has one clock and irq for all three TC channels */ | ||
945 | at91_clock_associate("tcb_clk", &at91sam9263_tcb_device.dev, "t0_clk"); | ||
946 | platform_device_register(&at91sam9263_tcb_device); | 940 | platform_device_register(&at91sam9263_tcb_device); |
947 | } | 941 | } |
948 | #else | 942 | #else |
@@ -1171,12 +1165,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
1171 | case AT91SAM9263_ID_SSC0: | 1165 | case AT91SAM9263_ID_SSC0: |
1172 | pdev = &at91sam9263_ssc0_device; | 1166 | pdev = &at91sam9263_ssc0_device; |
1173 | configure_ssc0_pins(pins); | 1167 | configure_ssc0_pins(pins); |
1174 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
1175 | break; | 1168 | break; |
1176 | case AT91SAM9263_ID_SSC1: | 1169 | case AT91SAM9263_ID_SSC1: |
1177 | pdev = &at91sam9263_ssc1_device; | 1170 | pdev = &at91sam9263_ssc1_device; |
1178 | configure_ssc1_pins(pins); | 1171 | configure_ssc1_pins(pins); |
1179 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
1180 | break; | 1172 | break; |
1181 | default: | 1173 | default: |
1182 | return; | 1174 | return; |
@@ -1370,32 +1362,30 @@ struct platform_device *atmel_default_console_device; /* the serial console devi | |||
1370 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | 1362 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) |
1371 | { | 1363 | { |
1372 | struct platform_device *pdev; | 1364 | struct platform_device *pdev; |
1365 | struct atmel_uart_data *pdata; | ||
1373 | 1366 | ||
1374 | switch (id) { | 1367 | switch (id) { |
1375 | case 0: /* DBGU */ | 1368 | case 0: /* DBGU */ |
1376 | pdev = &at91sam9263_dbgu_device; | 1369 | pdev = &at91sam9263_dbgu_device; |
1377 | configure_dbgu_pins(); | 1370 | configure_dbgu_pins(); |
1378 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1379 | break; | 1371 | break; |
1380 | case AT91SAM9263_ID_US0: | 1372 | case AT91SAM9263_ID_US0: |
1381 | pdev = &at91sam9263_uart0_device; | 1373 | pdev = &at91sam9263_uart0_device; |
1382 | configure_usart0_pins(pins); | 1374 | configure_usart0_pins(pins); |
1383 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1384 | break; | 1375 | break; |
1385 | case AT91SAM9263_ID_US1: | 1376 | case AT91SAM9263_ID_US1: |
1386 | pdev = &at91sam9263_uart1_device; | 1377 | pdev = &at91sam9263_uart1_device; |
1387 | configure_usart1_pins(pins); | 1378 | configure_usart1_pins(pins); |
1388 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1389 | break; | 1379 | break; |
1390 | case AT91SAM9263_ID_US2: | 1380 | case AT91SAM9263_ID_US2: |
1391 | pdev = &at91sam9263_uart2_device; | 1381 | pdev = &at91sam9263_uart2_device; |
1392 | configure_usart2_pins(pins); | 1382 | configure_usart2_pins(pins); |
1393 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1394 | break; | 1383 | break; |
1395 | default: | 1384 | default: |
1396 | return; | 1385 | return; |
1397 | } | 1386 | } |
1398 | pdev->id = portnr; /* update to mapped ID */ | 1387 | pdata = pdev->dev.platform_data; |
1388 | pdata->num = portnr; /* update to mapped ID */ | ||
1399 | 1389 | ||
1400 | if (portnr < ATMEL_MAX_UART) | 1390 | if (portnr < ATMEL_MAX_UART) |
1401 | at91_uarts[portnr] = pdev; | 1391 | at91_uarts[portnr] = pdev; |
@@ -1403,8 +1393,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1403 | 1393 | ||
1404 | void __init at91_set_serial_console(unsigned portnr) | 1394 | void __init at91_set_serial_console(unsigned portnr) |
1405 | { | 1395 | { |
1406 | if (portnr < ATMEL_MAX_UART) | 1396 | if (portnr < ATMEL_MAX_UART) { |
1407 | atmel_default_console_device = at91_uarts[portnr]; | 1397 | atmel_default_console_device = at91_uarts[portnr]; |
1398 | at91sam9263_set_console_clock(portnr); | ||
1399 | } | ||
1408 | } | 1400 | } |
1409 | 1401 | ||
1410 | void __init at91_add_device_serial(void) | 1402 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index c67b47f1c0fd..2bb6ff9af1c7 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
@@ -184,22 +184,6 @@ static struct clk vdec_clk = { | |||
184 | .type = CLK_TYPE_PERIPHERAL, | 184 | .type = CLK_TYPE_PERIPHERAL, |
185 | }; | 185 | }; |
186 | 186 | ||
187 | /* One additional fake clock for ohci */ | ||
188 | static struct clk ohci_clk = { | ||
189 | .name = "ohci_clk", | ||
190 | .pmc_mask = 0, | ||
191 | .type = CLK_TYPE_PERIPHERAL, | ||
192 | .parent = &uhphs_clk, | ||
193 | }; | ||
194 | |||
195 | /* One additional fake clock for second TC block */ | ||
196 | static struct clk tcb1_clk = { | ||
197 | .name = "tcb1_clk", | ||
198 | .pmc_mask = 0, | ||
199 | .type = CLK_TYPE_PERIPHERAL, | ||
200 | .parent = &tcb0_clk, | ||
201 | }; | ||
202 | |||
203 | static struct clk *periph_clocks[] __initdata = { | 187 | static struct clk *periph_clocks[] __initdata = { |
204 | &pioA_clk, | 188 | &pioA_clk, |
205 | &pioB_clk, | 189 | &pioB_clk, |
@@ -228,8 +212,30 @@ static struct clk *periph_clocks[] __initdata = { | |||
228 | &udphs_clk, | 212 | &udphs_clk, |
229 | &mmc1_clk, | 213 | &mmc1_clk, |
230 | // irq0 | 214 | // irq0 |
231 | &ohci_clk, | 215 | }; |
232 | &tcb1_clk, | 216 | |
217 | static struct clk_lookup periph_clocks_lookups[] = { | ||
218 | /* One additional fake clock for ohci */ | ||
219 | CLKDEV_CON_ID("ohci_clk", &uhphs_clk), | ||
220 | CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci.0", &uhphs_clk), | ||
221 | CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), | ||
222 | CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), | ||
223 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), | ||
224 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), | ||
225 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
226 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
227 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk), | ||
228 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tcb0_clk), | ||
229 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
230 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
231 | }; | ||
232 | |||
233 | static struct clk_lookup usart_clocks_lookups[] = { | ||
234 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
235 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
236 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
237 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
238 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
233 | }; | 239 | }; |
234 | 240 | ||
235 | /* | 241 | /* |
@@ -256,6 +262,11 @@ static void __init at91sam9g45_register_clocks(void) | |||
256 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 262 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
257 | clk_register(periph_clocks[i]); | 263 | clk_register(periph_clocks[i]); |
258 | 264 | ||
265 | clkdev_add_table(periph_clocks_lookups, | ||
266 | ARRAY_SIZE(periph_clocks_lookups)); | ||
267 | clkdev_add_table(usart_clocks_lookups, | ||
268 | ARRAY_SIZE(usart_clocks_lookups)); | ||
269 | |||
259 | if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11()) | 270 | if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11()) |
260 | clk_register(&vdec_clk); | 271 | clk_register(&vdec_clk); |
261 | 272 | ||
@@ -263,6 +274,18 @@ static void __init at91sam9g45_register_clocks(void) | |||
263 | clk_register(&pck1); | 274 | clk_register(&pck1); |
264 | } | 275 | } |
265 | 276 | ||
277 | static struct clk_lookup console_clock_lookup; | ||
278 | |||
279 | void __init at91sam9g45_set_console_clock(int id) | ||
280 | { | ||
281 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
282 | return; | ||
283 | |||
284 | console_clock_lookup.con_id = "usart"; | ||
285 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
286 | clkdev_add(&console_clock_lookup); | ||
287 | } | ||
288 | |||
266 | /* -------------------------------------------------------------------- | 289 | /* -------------------------------------------------------------------- |
267 | * GPIO | 290 | * GPIO |
268 | * -------------------------------------------------------------------- */ | 291 | * -------------------------------------------------------------------- */ |
@@ -306,11 +329,14 @@ static void at91sam9g45_poweroff(void) | |||
306 | * AT91SAM9G45 processor initialization | 329 | * AT91SAM9G45 processor initialization |
307 | * -------------------------------------------------------------------- */ | 330 | * -------------------------------------------------------------------- */ |
308 | 331 | ||
309 | void __init at91sam9g45_initialize(unsigned long main_clock) | 332 | void __init at91sam9g45_map_io(void) |
310 | { | 333 | { |
311 | /* Map peripherals */ | 334 | /* Map peripherals */ |
312 | iotable_init(at91sam9g45_io_desc, ARRAY_SIZE(at91sam9g45_io_desc)); | 335 | iotable_init(at91sam9g45_io_desc, ARRAY_SIZE(at91sam9g45_io_desc)); |
336 | } | ||
313 | 337 | ||
338 | void __init at91sam9g45_initialize(unsigned long main_clock) | ||
339 | { | ||
314 | at91_arch_reset = at91sam9g45_reset; | 340 | at91_arch_reset = at91sam9g45_reset; |
315 | pm_power_off = at91sam9g45_poweroff; | 341 | pm_power_off = at91sam9g45_poweroff; |
316 | at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); | 342 | at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 5e9f8a4c38df..05674865bc21 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
@@ -180,7 +180,6 @@ void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data) | |||
180 | } | 180 | } |
181 | 181 | ||
182 | usbh_ehci_data = *data; | 182 | usbh_ehci_data = *data; |
183 | at91_clock_associate("uhphs_clk", &at91_usbh_ehci_device.dev, "ehci_clk"); | ||
184 | platform_device_register(&at91_usbh_ehci_device); | 183 | platform_device_register(&at91_usbh_ehci_device); |
185 | } | 184 | } |
186 | #else | 185 | #else |
@@ -266,10 +265,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data) | |||
266 | 265 | ||
267 | /* Pullup pin is handled internally by USB device peripheral */ | 266 | /* Pullup pin is handled internally by USB device peripheral */ |
268 | 267 | ||
269 | /* Clocks */ | ||
270 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
271 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
272 | |||
273 | platform_device_register(&at91_usba_udc_device); | 268 | platform_device_register(&at91_usba_udc_device); |
274 | } | 269 | } |
275 | #else | 270 | #else |
@@ -478,7 +473,6 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) | |||
478 | } | 473 | } |
479 | 474 | ||
480 | mmc0_data = *data; | 475 | mmc0_data = *data; |
481 | at91_clock_associate("mci0_clk", &at91sam9g45_mmc0_device.dev, "mci_clk"); | ||
482 | platform_device_register(&at91sam9g45_mmc0_device); | 476 | platform_device_register(&at91sam9g45_mmc0_device); |
483 | 477 | ||
484 | } else { /* MCI1 */ | 478 | } else { /* MCI1 */ |
@@ -504,7 +498,6 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) | |||
504 | } | 498 | } |
505 | 499 | ||
506 | mmc1_data = *data; | 500 | mmc1_data = *data; |
507 | at91_clock_associate("mci1_clk", &at91sam9g45_mmc1_device.dev, "mci_clk"); | ||
508 | platform_device_register(&at91sam9g45_mmc1_device); | 501 | platform_device_register(&at91sam9g45_mmc1_device); |
509 | 502 | ||
510 | } | 503 | } |
@@ -801,7 +794,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
801 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */ | 794 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */ |
802 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */ | 795 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */ |
803 | 796 | ||
804 | at91_clock_associate("spi0_clk", &at91sam9g45_spi0_device.dev, "spi_clk"); | ||
805 | platform_device_register(&at91sam9g45_spi0_device); | 797 | platform_device_register(&at91sam9g45_spi0_device); |
806 | } | 798 | } |
807 | if (enable_spi1) { | 799 | if (enable_spi1) { |
@@ -809,7 +801,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
809 | at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */ | 801 | at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */ |
810 | at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */ | 802 | at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */ |
811 | 803 | ||
812 | at91_clock_associate("spi1_clk", &at91sam9g45_spi1_device.dev, "spi_clk"); | ||
813 | platform_device_register(&at91sam9g45_spi1_device); | 804 | platform_device_register(&at91sam9g45_spi1_device); |
814 | } | 805 | } |
815 | } | 806 | } |
@@ -999,10 +990,7 @@ static struct platform_device at91sam9g45_tcb1_device = { | |||
999 | 990 | ||
1000 | static void __init at91_add_device_tc(void) | 991 | static void __init at91_add_device_tc(void) |
1001 | { | 992 | { |
1002 | /* this chip has one clock and irq for all six TC channels */ | ||
1003 | at91_clock_associate("tcb0_clk", &at91sam9g45_tcb0_device.dev, "t0_clk"); | ||
1004 | platform_device_register(&at91sam9g45_tcb0_device); | 993 | platform_device_register(&at91sam9g45_tcb0_device); |
1005 | at91_clock_associate("tcb1_clk", &at91sam9g45_tcb1_device.dev, "t0_clk"); | ||
1006 | platform_device_register(&at91sam9g45_tcb1_device); | 994 | platform_device_register(&at91sam9g45_tcb1_device); |
1007 | } | 995 | } |
1008 | #else | 996 | #else |
@@ -1286,12 +1274,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
1286 | case AT91SAM9G45_ID_SSC0: | 1274 | case AT91SAM9G45_ID_SSC0: |
1287 | pdev = &at91sam9g45_ssc0_device; | 1275 | pdev = &at91sam9g45_ssc0_device; |
1288 | configure_ssc0_pins(pins); | 1276 | configure_ssc0_pins(pins); |
1289 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
1290 | break; | 1277 | break; |
1291 | case AT91SAM9G45_ID_SSC1: | 1278 | case AT91SAM9G45_ID_SSC1: |
1292 | pdev = &at91sam9g45_ssc1_device; | 1279 | pdev = &at91sam9g45_ssc1_device; |
1293 | configure_ssc1_pins(pins); | 1280 | configure_ssc1_pins(pins); |
1294 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
1295 | break; | 1281 | break; |
1296 | default: | 1282 | default: |
1297 | return; | 1283 | return; |
@@ -1527,37 +1513,34 @@ struct platform_device *atmel_default_console_device; /* the serial console devi | |||
1527 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | 1513 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) |
1528 | { | 1514 | { |
1529 | struct platform_device *pdev; | 1515 | struct platform_device *pdev; |
1516 | struct atmel_uart_data *pdata; | ||
1530 | 1517 | ||
1531 | switch (id) { | 1518 | switch (id) { |
1532 | case 0: /* DBGU */ | 1519 | case 0: /* DBGU */ |
1533 | pdev = &at91sam9g45_dbgu_device; | 1520 | pdev = &at91sam9g45_dbgu_device; |
1534 | configure_dbgu_pins(); | 1521 | configure_dbgu_pins(); |
1535 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1536 | break; | 1522 | break; |
1537 | case AT91SAM9G45_ID_US0: | 1523 | case AT91SAM9G45_ID_US0: |
1538 | pdev = &at91sam9g45_uart0_device; | 1524 | pdev = &at91sam9g45_uart0_device; |
1539 | configure_usart0_pins(pins); | 1525 | configure_usart0_pins(pins); |
1540 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1541 | break; | 1526 | break; |
1542 | case AT91SAM9G45_ID_US1: | 1527 | case AT91SAM9G45_ID_US1: |
1543 | pdev = &at91sam9g45_uart1_device; | 1528 | pdev = &at91sam9g45_uart1_device; |
1544 | configure_usart1_pins(pins); | 1529 | configure_usart1_pins(pins); |
1545 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1546 | break; | 1530 | break; |
1547 | case AT91SAM9G45_ID_US2: | 1531 | case AT91SAM9G45_ID_US2: |
1548 | pdev = &at91sam9g45_uart2_device; | 1532 | pdev = &at91sam9g45_uart2_device; |
1549 | configure_usart2_pins(pins); | 1533 | configure_usart2_pins(pins); |
1550 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1551 | break; | 1534 | break; |
1552 | case AT91SAM9G45_ID_US3: | 1535 | case AT91SAM9G45_ID_US3: |
1553 | pdev = &at91sam9g45_uart3_device; | 1536 | pdev = &at91sam9g45_uart3_device; |
1554 | configure_usart3_pins(pins); | 1537 | configure_usart3_pins(pins); |
1555 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1556 | break; | 1538 | break; |
1557 | default: | 1539 | default: |
1558 | return; | 1540 | return; |
1559 | } | 1541 | } |
1560 | pdev->id = portnr; /* update to mapped ID */ | 1542 | pdata = pdev->dev.platform_data; |
1543 | pdata->num = portnr; /* update to mapped ID */ | ||
1561 | 1544 | ||
1562 | if (portnr < ATMEL_MAX_UART) | 1545 | if (portnr < ATMEL_MAX_UART) |
1563 | at91_uarts[portnr] = pdev; | 1546 | at91_uarts[portnr] = pdev; |
@@ -1565,8 +1548,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1565 | 1548 | ||
1566 | void __init at91_set_serial_console(unsigned portnr) | 1549 | void __init at91_set_serial_console(unsigned portnr) |
1567 | { | 1550 | { |
1568 | if (portnr < ATMEL_MAX_UART) | 1551 | if (portnr < ATMEL_MAX_UART) { |
1569 | atmel_default_console_device = at91_uarts[portnr]; | 1552 | atmel_default_console_device = at91_uarts[portnr]; |
1553 | at91sam9g45_set_console_clock(portnr); | ||
1554 | } | ||
1570 | } | 1555 | } |
1571 | 1556 | ||
1572 | void __init at91_add_device_serial(void) | 1557 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 6a9d24e5ed8e..1a40f16b66c8 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
@@ -190,6 +190,24 @@ static struct clk *periph_clocks[] __initdata = { | |||
190 | // irq0 | 190 | // irq0 |
191 | }; | 191 | }; |
192 | 192 | ||
193 | static struct clk_lookup periph_clocks_lookups[] = { | ||
194 | CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), | ||
195 | CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), | ||
196 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
197 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
198 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | ||
199 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
200 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
201 | }; | ||
202 | |||
203 | static struct clk_lookup usart_clocks_lookups[] = { | ||
204 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
205 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
206 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
207 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
208 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
209 | }; | ||
210 | |||
193 | /* | 211 | /* |
194 | * The two programmable clocks. | 212 | * The two programmable clocks. |
195 | * You must configure pin multiplexing to bring these signals out. | 213 | * You must configure pin multiplexing to bring these signals out. |
@@ -214,10 +232,27 @@ static void __init at91sam9rl_register_clocks(void) | |||
214 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 232 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
215 | clk_register(periph_clocks[i]); | 233 | clk_register(periph_clocks[i]); |
216 | 234 | ||
235 | clkdev_add_table(periph_clocks_lookups, | ||
236 | ARRAY_SIZE(periph_clocks_lookups)); | ||
237 | clkdev_add_table(usart_clocks_lookups, | ||
238 | ARRAY_SIZE(usart_clocks_lookups)); | ||
239 | |||
217 | clk_register(&pck0); | 240 | clk_register(&pck0); |
218 | clk_register(&pck1); | 241 | clk_register(&pck1); |
219 | } | 242 | } |
220 | 243 | ||
244 | static struct clk_lookup console_clock_lookup; | ||
245 | |||
246 | void __init at91sam9rl_set_console_clock(int id) | ||
247 | { | ||
248 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
249 | return; | ||
250 | |||
251 | console_clock_lookup.con_id = "usart"; | ||
252 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
253 | clkdev_add(&console_clock_lookup); | ||
254 | } | ||
255 | |||
221 | /* -------------------------------------------------------------------- | 256 | /* -------------------------------------------------------------------- |
222 | * GPIO | 257 | * GPIO |
223 | * -------------------------------------------------------------------- */ | 258 | * -------------------------------------------------------------------- */ |
@@ -252,7 +287,7 @@ static void at91sam9rl_poweroff(void) | |||
252 | * AT91SAM9RL processor initialization | 287 | * AT91SAM9RL processor initialization |
253 | * -------------------------------------------------------------------- */ | 288 | * -------------------------------------------------------------------- */ |
254 | 289 | ||
255 | void __init at91sam9rl_initialize(unsigned long main_clock) | 290 | void __init at91sam9rl_map_io(void) |
256 | { | 291 | { |
257 | unsigned long cidr, sram_size; | 292 | unsigned long cidr, sram_size; |
258 | 293 | ||
@@ -275,7 +310,10 @@ void __init at91sam9rl_initialize(unsigned long main_clock) | |||
275 | 310 | ||
276 | /* Map SRAM */ | 311 | /* Map SRAM */ |
277 | iotable_init(at91sam9rl_sram_desc, ARRAY_SIZE(at91sam9rl_sram_desc)); | 312 | iotable_init(at91sam9rl_sram_desc, ARRAY_SIZE(at91sam9rl_sram_desc)); |
313 | } | ||
278 | 314 | ||
315 | void __init at91sam9rl_initialize(unsigned long main_clock) | ||
316 | { | ||
279 | at91_arch_reset = at91sam9_alt_reset; | 317 | at91_arch_reset = at91sam9_alt_reset; |
280 | pm_power_off = at91sam9rl_poweroff; | 318 | pm_power_off = at91sam9rl_poweroff; |
281 | at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); | 319 | at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index c49262bddd85..c296045f2b6a 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
@@ -155,10 +155,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data) | |||
155 | 155 | ||
156 | /* Pullup pin is handled internally by USB device peripheral */ | 156 | /* Pullup pin is handled internally by USB device peripheral */ |
157 | 157 | ||
158 | /* Clocks */ | ||
159 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
160 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
161 | |||
162 | platform_device_register(&at91_usba_udc_device); | 158 | platform_device_register(&at91_usba_udc_device); |
163 | } | 159 | } |
164 | #else | 160 | #else |
@@ -605,10 +601,6 @@ static struct platform_device at91sam9rl_tcb_device = { | |||
605 | 601 | ||
606 | static void __init at91_add_device_tc(void) | 602 | static void __init at91_add_device_tc(void) |
607 | { | 603 | { |
608 | /* this chip has a separate clock and irq for each TC channel */ | ||
609 | at91_clock_associate("tc0_clk", &at91sam9rl_tcb_device.dev, "t0_clk"); | ||
610 | at91_clock_associate("tc1_clk", &at91sam9rl_tcb_device.dev, "t1_clk"); | ||
611 | at91_clock_associate("tc2_clk", &at91sam9rl_tcb_device.dev, "t2_clk"); | ||
612 | platform_device_register(&at91sam9rl_tcb_device); | 604 | platform_device_register(&at91sam9rl_tcb_device); |
613 | } | 605 | } |
614 | #else | 606 | #else |
@@ -892,12 +884,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
892 | case AT91SAM9RL_ID_SSC0: | 884 | case AT91SAM9RL_ID_SSC0: |
893 | pdev = &at91sam9rl_ssc0_device; | 885 | pdev = &at91sam9rl_ssc0_device; |
894 | configure_ssc0_pins(pins); | 886 | configure_ssc0_pins(pins); |
895 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
896 | break; | 887 | break; |
897 | case AT91SAM9RL_ID_SSC1: | 888 | case AT91SAM9RL_ID_SSC1: |
898 | pdev = &at91sam9rl_ssc1_device; | 889 | pdev = &at91sam9rl_ssc1_device; |
899 | configure_ssc1_pins(pins); | 890 | configure_ssc1_pins(pins); |
900 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
901 | break; | 891 | break; |
902 | default: | 892 | default: |
903 | return; | 893 | return; |
@@ -1141,37 +1131,34 @@ struct platform_device *atmel_default_console_device; /* the serial console devi | |||
1141 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | 1131 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) |
1142 | { | 1132 | { |
1143 | struct platform_device *pdev; | 1133 | struct platform_device *pdev; |
1134 | struct atmel_uart_data *pdata; | ||
1144 | 1135 | ||
1145 | switch (id) { | 1136 | switch (id) { |
1146 | case 0: /* DBGU */ | 1137 | case 0: /* DBGU */ |
1147 | pdev = &at91sam9rl_dbgu_device; | 1138 | pdev = &at91sam9rl_dbgu_device; |
1148 | configure_dbgu_pins(); | 1139 | configure_dbgu_pins(); |
1149 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1150 | break; | 1140 | break; |
1151 | case AT91SAM9RL_ID_US0: | 1141 | case AT91SAM9RL_ID_US0: |
1152 | pdev = &at91sam9rl_uart0_device; | 1142 | pdev = &at91sam9rl_uart0_device; |
1153 | configure_usart0_pins(pins); | 1143 | configure_usart0_pins(pins); |
1154 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1155 | break; | 1144 | break; |
1156 | case AT91SAM9RL_ID_US1: | 1145 | case AT91SAM9RL_ID_US1: |
1157 | pdev = &at91sam9rl_uart1_device; | 1146 | pdev = &at91sam9rl_uart1_device; |
1158 | configure_usart1_pins(pins); | 1147 | configure_usart1_pins(pins); |
1159 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1160 | break; | 1148 | break; |
1161 | case AT91SAM9RL_ID_US2: | 1149 | case AT91SAM9RL_ID_US2: |
1162 | pdev = &at91sam9rl_uart2_device; | 1150 | pdev = &at91sam9rl_uart2_device; |
1163 | configure_usart2_pins(pins); | 1151 | configure_usart2_pins(pins); |
1164 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1165 | break; | 1152 | break; |
1166 | case AT91SAM9RL_ID_US3: | 1153 | case AT91SAM9RL_ID_US3: |
1167 | pdev = &at91sam9rl_uart3_device; | 1154 | pdev = &at91sam9rl_uart3_device; |
1168 | configure_usart3_pins(pins); | 1155 | configure_usart3_pins(pins); |
1169 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1170 | break; | 1156 | break; |
1171 | default: | 1157 | default: |
1172 | return; | 1158 | return; |
1173 | } | 1159 | } |
1174 | pdev->id = portnr; /* update to mapped ID */ | 1160 | pdata = pdev->dev.platform_data; |
1161 | pdata->num = portnr; /* update to mapped ID */ | ||
1175 | 1162 | ||
1176 | if (portnr < ATMEL_MAX_UART) | 1163 | if (portnr < ATMEL_MAX_UART) |
1177 | at91_uarts[portnr] = pdev; | 1164 | at91_uarts[portnr] = pdev; |
@@ -1179,8 +1166,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1179 | 1166 | ||
1180 | void __init at91_set_serial_console(unsigned portnr) | 1167 | void __init at91_set_serial_console(unsigned portnr) |
1181 | { | 1168 | { |
1182 | if (portnr < ATMEL_MAX_UART) | 1169 | if (portnr < ATMEL_MAX_UART) { |
1183 | atmel_default_console_device = at91_uarts[portnr]; | 1170 | atmel_default_console_device = at91_uarts[portnr]; |
1171 | at91sam9rl_set_console_clock(portnr); | ||
1172 | } | ||
1184 | } | 1173 | } |
1185 | 1174 | ||
1186 | void __init at91_add_device_serial(void) | 1175 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c index ad3ec85b2790..56ba3bd035ae 100644 --- a/arch/arm/mach-at91/at91x40.c +++ b/arch/arm/mach-at91/at91x40.c | |||
@@ -37,11 +37,6 @@ unsigned long clk_get_rate(struct clk *clk) | |||
37 | return AT91X40_MASTER_CLOCK; | 37 | return AT91X40_MASTER_CLOCK; |
38 | } | 38 | } |
39 | 39 | ||
40 | struct clk *clk_get(struct device *dev, const char *id) | ||
41 | { | ||
42 | return NULL; | ||
43 | } | ||
44 | |||
45 | void __init at91x40_initialize(unsigned long main_clock) | 40 | void __init at91x40_initialize(unsigned long main_clock) |
46 | { | 41 | { |
47 | at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1) | 42 | at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1) |
diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c index 8a3fc84847c1..ab1d463aa47d 100644 --- a/arch/arm/mach-at91/board-1arm.c +++ b/arch/arm/mach-at91/board-1arm.c | |||
@@ -35,14 +35,18 @@ | |||
35 | 35 | ||
36 | #include <mach/board.h> | 36 | #include <mach/board.h> |
37 | #include <mach/gpio.h> | 37 | #include <mach/gpio.h> |
38 | #include <mach/cpu.h> | ||
38 | 39 | ||
39 | #include "generic.h" | 40 | #include "generic.h" |
40 | 41 | ||
41 | 42 | ||
42 | static void __init onearm_map_io(void) | 43 | static void __init onearm_init_early(void) |
43 | { | 44 | { |
45 | /* Set cpu type: PQFP */ | ||
46 | at91rm9200_set_type(ARCH_REVISON_9200_PQFP); | ||
47 | |||
44 | /* Initialize processor: 18.432 MHz crystal */ | 48 | /* Initialize processor: 18.432 MHz crystal */ |
45 | at91rm9200_initialize(18432000, AT91RM9200_PQFP); | 49 | at91rm9200_initialize(18432000); |
46 | 50 | ||
47 | /* DBGU on ttyS0. (Rx & Tx only) */ | 51 | /* DBGU on ttyS0. (Rx & Tx only) */ |
48 | at91_register_uart(0, 0, 0); | 52 | at91_register_uart(0, 0, 0); |
@@ -92,9 +96,9 @@ static void __init onearm_board_init(void) | |||
92 | 96 | ||
93 | MACHINE_START(ONEARM, "Ajeco 1ARM single board computer") | 97 | MACHINE_START(ONEARM, "Ajeco 1ARM single board computer") |
94 | /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */ | 98 | /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */ |
95 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
96 | .timer = &at91rm9200_timer, | 99 | .timer = &at91rm9200_timer, |
97 | .map_io = onearm_map_io, | 100 | .map_io = at91rm9200_map_io, |
101 | .init_early = onearm_init_early, | ||
98 | .init_irq = onearm_init_irq, | 102 | .init_irq = onearm_init_irq, |
99 | .init_machine = onearm_board_init, | 103 | .init_machine = onearm_board_init, |
100 | MACHINE_END | 104 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c index cba7f7771fee..a4924de48c36 100644 --- a/arch/arm/mach-at91/board-afeb-9260v1.c +++ b/arch/arm/mach-at91/board-afeb-9260v1.c | |||
@@ -48,7 +48,7 @@ | |||
48 | #include "generic.h" | 48 | #include "generic.h" |
49 | 49 | ||
50 | 50 | ||
51 | static void __init afeb9260_map_io(void) | 51 | static void __init afeb9260_init_early(void) |
52 | { | 52 | { |
53 | /* Initialize processor: 18.432 MHz crystal */ | 53 | /* Initialize processor: 18.432 MHz crystal */ |
54 | at91sam9260_initialize(18432000); | 54 | at91sam9260_initialize(18432000); |
@@ -218,9 +218,9 @@ static void __init afeb9260_board_init(void) | |||
218 | 218 | ||
219 | MACHINE_START(AFEB9260, "Custom afeb9260 board") | 219 | MACHINE_START(AFEB9260, "Custom afeb9260 board") |
220 | /* Maintainer: Sergey Lapin <slapin@ossfans.org> */ | 220 | /* Maintainer: Sergey Lapin <slapin@ossfans.org> */ |
221 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
222 | .timer = &at91sam926x_timer, | 221 | .timer = &at91sam926x_timer, |
223 | .map_io = afeb9260_map_io, | 222 | .map_io = at91sam9260_map_io, |
223 | .init_early = afeb9260_init_early, | ||
224 | .init_irq = afeb9260_init_irq, | 224 | .init_irq = afeb9260_init_irq, |
225 | .init_machine = afeb9260_board_init, | 225 | .init_machine = afeb9260_board_init, |
226 | MACHINE_END | 226 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-at572d940hf_ek.c b/arch/arm/mach-at91/board-at572d940hf_ek.c deleted file mode 100644 index 3929f1c9e4e5..000000000000 --- a/arch/arm/mach-at91/board-at572d940hf_ek.c +++ /dev/null | |||
@@ -1,326 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-at91/board-at572d940hf_ek.c | ||
3 | * | ||
4 | * Copyright (C) 2008 Atmel Antonio R. Costa <costa.antonior@gmail.com> | ||
5 | * Copyright (C) 2005 SAN People | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | #include <linux/types.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/mm.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/platform_device.h> | ||
27 | #include <linux/spi/spi.h> | ||
28 | #include <linux/spi/ds1305.h> | ||
29 | #include <linux/irq.h> | ||
30 | #include <linux/mtd/physmap.h> | ||
31 | |||
32 | #include <mach/hardware.h> | ||
33 | #include <asm/setup.h> | ||
34 | #include <asm/mach-types.h> | ||
35 | #include <asm/irq.h> | ||
36 | |||
37 | #include <asm/mach/arch.h> | ||
38 | #include <asm/mach/map.h> | ||
39 | #include <asm/mach/irq.h> | ||
40 | |||
41 | #include <mach/board.h> | ||
42 | #include <mach/gpio.h> | ||
43 | #include <mach/at91sam9_smc.h> | ||
44 | |||
45 | #include "sam9_smc.h" | ||
46 | #include "generic.h" | ||
47 | |||
48 | |||
49 | static void __init eb_map_io(void) | ||
50 | { | ||
51 | /* Initialize processor: 12.500 MHz crystal */ | ||
52 | at572d940hf_initialize(12000000); | ||
53 | |||
54 | /* DBGU on ttyS0. (Rx & Tx only) */ | ||
55 | at91_register_uart(0, 0, 0); | ||
56 | |||
57 | /* USART0 on ttyS1. (Rx & Tx only) */ | ||
58 | at91_register_uart(AT572D940HF_ID_US0, 1, 0); | ||
59 | |||
60 | /* USART1 on ttyS2. (Rx & Tx only) */ | ||
61 | at91_register_uart(AT572D940HF_ID_US1, 2, 0); | ||
62 | |||
63 | /* USART2 on ttyS3. (Tx & Rx only */ | ||
64 | at91_register_uart(AT572D940HF_ID_US2, 3, 0); | ||
65 | |||
66 | /* set serial console to ttyS0 (ie, DBGU) */ | ||
67 | at91_set_serial_console(0); | ||
68 | } | ||
69 | |||
70 | static void __init eb_init_irq(void) | ||
71 | { | ||
72 | at572d940hf_init_interrupts(NULL); | ||
73 | } | ||
74 | |||
75 | |||
76 | /* | ||
77 | * USB Host Port | ||
78 | */ | ||
79 | static struct at91_usbh_data __initdata eb_usbh_data = { | ||
80 | .ports = 2, | ||
81 | }; | ||
82 | |||
83 | |||
84 | /* | ||
85 | * USB Device Port | ||
86 | */ | ||
87 | static struct at91_udc_data __initdata eb_udc_data = { | ||
88 | .vbus_pin = 0, /* no VBUS detection,UDC always on */ | ||
89 | .pullup_pin = 0, /* pull-up driven by UDC */ | ||
90 | }; | ||
91 | |||
92 | |||
93 | /* | ||
94 | * MCI (SD/MMC) | ||
95 | */ | ||
96 | static struct at91_mmc_data __initdata eb_mmc_data = { | ||
97 | .wire4 = 1, | ||
98 | /* .det_pin = ... not connected */ | ||
99 | /* .wp_pin = ... not connected */ | ||
100 | /* .vcc_pin = ... not connected */ | ||
101 | }; | ||
102 | |||
103 | |||
104 | /* | ||
105 | * MACB Ethernet device | ||
106 | */ | ||
107 | static struct at91_eth_data __initdata eb_eth_data = { | ||
108 | .phy_irq_pin = AT91_PIN_PB25, | ||
109 | .is_rmii = 1, | ||
110 | }; | ||
111 | |||
112 | /* | ||
113 | * NOR flash | ||
114 | */ | ||
115 | |||
116 | static struct mtd_partition eb_nor_partitions[] = { | ||
117 | { | ||
118 | .name = "Raw Environment", | ||
119 | .offset = 0, | ||
120 | .size = SZ_4M, | ||
121 | .mask_flags = 0, | ||
122 | }, | ||
123 | { | ||
124 | .name = "OS FS", | ||
125 | .offset = MTDPART_OFS_APPEND, | ||
126 | .size = 3 * SZ_1M, | ||
127 | .mask_flags = 0, | ||
128 | }, | ||
129 | { | ||
130 | .name = "APP FS", | ||
131 | .offset = MTDPART_OFS_APPEND, | ||
132 | .size = MTDPART_SIZ_FULL, | ||
133 | .mask_flags = 0, | ||
134 | }, | ||
135 | }; | ||
136 | |||
137 | static void nor_flash_set_vpp(struct map_info* mi, int i) { | ||
138 | }; | ||
139 | |||
140 | static struct physmap_flash_data nor_flash_data = { | ||
141 | .width = 4, | ||
142 | .parts = eb_nor_partitions, | ||
143 | .nr_parts = ARRAY_SIZE(eb_nor_partitions), | ||
144 | .set_vpp = nor_flash_set_vpp, | ||
145 | }; | ||
146 | |||
147 | static struct resource nor_flash_resources[] = { | ||
148 | { | ||
149 | .start = AT91_CHIPSELECT_0, | ||
150 | .end = AT91_CHIPSELECT_0 + SZ_16M - 1, | ||
151 | .flags = IORESOURCE_MEM, | ||
152 | }, | ||
153 | }; | ||
154 | |||
155 | static struct platform_device nor_flash = { | ||
156 | .name = "physmap-flash", | ||
157 | .id = 0, | ||
158 | .dev = { | ||
159 | .platform_data = &nor_flash_data, | ||
160 | }, | ||
161 | .resource = nor_flash_resources, | ||
162 | .num_resources = ARRAY_SIZE(nor_flash_resources), | ||
163 | }; | ||
164 | |||
165 | static struct sam9_smc_config __initdata eb_nor_smc_config = { | ||
166 | .ncs_read_setup = 1, | ||
167 | .nrd_setup = 1, | ||
168 | .ncs_write_setup = 1, | ||
169 | .nwe_setup = 1, | ||
170 | |||
171 | .ncs_read_pulse = 7, | ||
172 | .nrd_pulse = 7, | ||
173 | .ncs_write_pulse = 7, | ||
174 | .nwe_pulse = 7, | ||
175 | |||
176 | .read_cycle = 9, | ||
177 | .write_cycle = 9, | ||
178 | |||
179 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_32, | ||
180 | .tdf_cycles = 1, | ||
181 | }; | ||
182 | |||
183 | static void __init eb_add_device_nor(void) | ||
184 | { | ||
185 | /* configure chip-select 0 (NOR) */ | ||
186 | sam9_smc_configure(0, &eb_nor_smc_config); | ||
187 | platform_device_register(&nor_flash); | ||
188 | } | ||
189 | |||
190 | /* | ||
191 | * NAND flash | ||
192 | */ | ||
193 | static struct mtd_partition __initdata eb_nand_partition[] = { | ||
194 | { | ||
195 | .name = "Partition 1", | ||
196 | .offset = 0, | ||
197 | .size = SZ_16M, | ||
198 | }, | ||
199 | { | ||
200 | .name = "Partition 2", | ||
201 | .offset = MTDPART_OFS_NXTBLK, | ||
202 | .size = MTDPART_SIZ_FULL, | ||
203 | } | ||
204 | }; | ||
205 | |||
206 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) | ||
207 | { | ||
208 | *num_partitions = ARRAY_SIZE(eb_nand_partition); | ||
209 | return eb_nand_partition; | ||
210 | } | ||
211 | |||
212 | static struct atmel_nand_data __initdata eb_nand_data = { | ||
213 | .ale = 22, | ||
214 | .cle = 21, | ||
215 | /* .det_pin = ... not connected */ | ||
216 | /* .rdy_pin = AT91_PIN_PC16, */ | ||
217 | .enable_pin = AT91_PIN_PA15, | ||
218 | .partition_info = nand_partitions, | ||
219 | #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) | ||
220 | .bus_width_16 = 1, | ||
221 | #else | ||
222 | .bus_width_16 = 0, | ||
223 | #endif | ||
224 | }; | ||
225 | |||
226 | static struct sam9_smc_config __initdata eb_nand_smc_config = { | ||
227 | .ncs_read_setup = 0, | ||
228 | .nrd_setup = 0, | ||
229 | .ncs_write_setup = 1, | ||
230 | .nwe_setup = 1, | ||
231 | |||
232 | .ncs_read_pulse = 3, | ||
233 | .nrd_pulse = 3, | ||
234 | .ncs_write_pulse = 3, | ||
235 | .nwe_pulse = 3, | ||
236 | |||
237 | .read_cycle = 5, | ||
238 | .write_cycle = 5, | ||
239 | |||
240 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE, | ||
241 | .tdf_cycles = 12, | ||
242 | }; | ||
243 | |||
244 | static void __init eb_add_device_nand(void) | ||
245 | { | ||
246 | /* setup bus-width (8 or 16) */ | ||
247 | if (eb_nand_data.bus_width_16) | ||
248 | eb_nand_smc_config.mode |= AT91_SMC_DBW_16; | ||
249 | else | ||
250 | eb_nand_smc_config.mode |= AT91_SMC_DBW_8; | ||
251 | |||
252 | /* configure chip-select 3 (NAND) */ | ||
253 | sam9_smc_configure(3, &eb_nand_smc_config); | ||
254 | |||
255 | at91_add_device_nand(&eb_nand_data); | ||
256 | } | ||
257 | |||
258 | |||
259 | /* | ||
260 | * SPI devices | ||
261 | */ | ||
262 | static struct resource rtc_resources[] = { | ||
263 | [0] = { | ||
264 | .start = AT572D940HF_ID_IRQ1, | ||
265 | .end = AT572D940HF_ID_IRQ1, | ||
266 | .flags = IORESOURCE_IRQ, | ||
267 | }, | ||
268 | }; | ||
269 | |||
270 | static struct ds1305_platform_data ds1306_data = { | ||
271 | .is_ds1306 = true, | ||
272 | .en_1hz = false, | ||
273 | }; | ||
274 | |||
275 | static struct spi_board_info eb_spi_devices[] = { | ||
276 | { /* RTC Dallas DS1306 */ | ||
277 | .modalias = "rtc-ds1305", | ||
278 | .chip_select = 3, | ||
279 | .mode = SPI_CS_HIGH | SPI_CPOL | SPI_CPHA, | ||
280 | .max_speed_hz = 500000, | ||
281 | .bus_num = 0, | ||
282 | .irq = AT572D940HF_ID_IRQ1, | ||
283 | .platform_data = (void *) &ds1306_data, | ||
284 | }, | ||
285 | #if defined(CONFIG_MTD_AT91_DATAFLASH_CARD) | ||
286 | { /* Dataflash card */ | ||
287 | .modalias = "mtd_dataflash", | ||
288 | .chip_select = 0, | ||
289 | .max_speed_hz = 15 * 1000 * 1000, | ||
290 | .bus_num = 0, | ||
291 | }, | ||
292 | #endif | ||
293 | }; | ||
294 | |||
295 | static void __init eb_board_init(void) | ||
296 | { | ||
297 | /* Serial */ | ||
298 | at91_add_device_serial(); | ||
299 | /* USB Host */ | ||
300 | at91_add_device_usbh(&eb_usbh_data); | ||
301 | /* USB Device */ | ||
302 | at91_add_device_udc(&eb_udc_data); | ||
303 | /* I2C */ | ||
304 | at91_add_device_i2c(NULL, 0); | ||
305 | /* NOR */ | ||
306 | eb_add_device_nor(); | ||
307 | /* NAND */ | ||
308 | eb_add_device_nand(); | ||
309 | /* SPI */ | ||
310 | at91_add_device_spi(eb_spi_devices, ARRAY_SIZE(eb_spi_devices)); | ||
311 | /* MMC */ | ||
312 | at91_add_device_mmc(0, &eb_mmc_data); | ||
313 | /* Ethernet */ | ||
314 | at91_add_device_eth(&eb_eth_data); | ||
315 | /* mAgic */ | ||
316 | at91_add_device_mAgic(); | ||
317 | } | ||
318 | |||
319 | MACHINE_START(AT572D940HFEB, "Atmel AT91D940HF-EB") | ||
320 | /* Maintainer: Atmel <costa.antonior@gmail.com> */ | ||
321 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
322 | .timer = &at91sam926x_timer, | ||
323 | .map_io = eb_map_io, | ||
324 | .init_irq = eb_init_irq, | ||
325 | .init_machine = eb_board_init, | ||
326 | MACHINE_END | ||
diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c index b54e3e6fceb6..148fccb9a25a 100644 --- a/arch/arm/mach-at91/board-cam60.c +++ b/arch/arm/mach-at91/board-cam60.c | |||
@@ -45,7 +45,7 @@ | |||
45 | #include "generic.h" | 45 | #include "generic.h" |
46 | 46 | ||
47 | 47 | ||
48 | static void __init cam60_map_io(void) | 48 | static void __init cam60_init_early(void) |
49 | { | 49 | { |
50 | /* Initialize processor: 10 MHz crystal */ | 50 | /* Initialize processor: 10 MHz crystal */ |
51 | at91sam9260_initialize(10000000); | 51 | at91sam9260_initialize(10000000); |
@@ -198,9 +198,9 @@ static void __init cam60_board_init(void) | |||
198 | 198 | ||
199 | MACHINE_START(CAM60, "KwikByte CAM60") | 199 | MACHINE_START(CAM60, "KwikByte CAM60") |
200 | /* Maintainer: KwikByte */ | 200 | /* Maintainer: KwikByte */ |
201 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
202 | .timer = &at91sam926x_timer, | 201 | .timer = &at91sam926x_timer, |
203 | .map_io = cam60_map_io, | 202 | .map_io = at91sam9260_map_io, |
203 | .init_early = cam60_init_early, | ||
204 | .init_irq = cam60_init_irq, | 204 | .init_irq = cam60_init_irq, |
205 | .init_machine = cam60_board_init, | 205 | .init_machine = cam60_board_init, |
206 | MACHINE_END | 206 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-cap9adk.c b/arch/arm/mach-at91/board-cap9adk.c index e7274440ead9..1904fdf87613 100644 --- a/arch/arm/mach-at91/board-cap9adk.c +++ b/arch/arm/mach-at91/board-cap9adk.c | |||
@@ -44,12 +44,13 @@ | |||
44 | #include <mach/gpio.h> | 44 | #include <mach/gpio.h> |
45 | #include <mach/at91cap9_matrix.h> | 45 | #include <mach/at91cap9_matrix.h> |
46 | #include <mach/at91sam9_smc.h> | 46 | #include <mach/at91sam9_smc.h> |
47 | #include <mach/system_rev.h> | ||
47 | 48 | ||
48 | #include "sam9_smc.h" | 49 | #include "sam9_smc.h" |
49 | #include "generic.h" | 50 | #include "generic.h" |
50 | 51 | ||
51 | 52 | ||
52 | static void __init cap9adk_map_io(void) | 53 | static void __init cap9adk_init_early(void) |
53 | { | 54 | { |
54 | /* Initialize processor: 12 MHz crystal */ | 55 | /* Initialize processor: 12 MHz crystal */ |
55 | at91cap9_initialize(12000000); | 56 | at91cap9_initialize(12000000); |
@@ -187,11 +188,6 @@ static struct atmel_nand_data __initdata cap9adk_nand_data = { | |||
187 | // .rdy_pin = ... not connected | 188 | // .rdy_pin = ... not connected |
188 | .enable_pin = AT91_PIN_PD15, | 189 | .enable_pin = AT91_PIN_PD15, |
189 | .partition_info = nand_partitions, | 190 | .partition_info = nand_partitions, |
190 | #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) | ||
191 | .bus_width_16 = 1, | ||
192 | #else | ||
193 | .bus_width_16 = 0, | ||
194 | #endif | ||
195 | }; | 191 | }; |
196 | 192 | ||
197 | static struct sam9_smc_config __initdata cap9adk_nand_smc_config = { | 193 | static struct sam9_smc_config __initdata cap9adk_nand_smc_config = { |
@@ -219,6 +215,7 @@ static void __init cap9adk_add_device_nand(void) | |||
219 | csa = at91_sys_read(AT91_MATRIX_EBICSA); | 215 | csa = at91_sys_read(AT91_MATRIX_EBICSA); |
220 | at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); | 216 | at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); |
221 | 217 | ||
218 | cap9adk_nand_data.bus_width_16 = !board_have_nand_8bit(); | ||
222 | /* setup bus-width (8 or 16) */ | 219 | /* setup bus-width (8 or 16) */ |
223 | if (cap9adk_nand_data.bus_width_16) | 220 | if (cap9adk_nand_data.bus_width_16) |
224 | cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16; | 221 | cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16; |
@@ -399,9 +396,9 @@ static void __init cap9adk_board_init(void) | |||
399 | 396 | ||
400 | MACHINE_START(AT91CAP9ADK, "Atmel AT91CAP9A-DK") | 397 | MACHINE_START(AT91CAP9ADK, "Atmel AT91CAP9A-DK") |
401 | /* Maintainer: Stelian Pop <stelian.pop@leadtechdesign.com> */ | 398 | /* Maintainer: Stelian Pop <stelian.pop@leadtechdesign.com> */ |
402 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
403 | .timer = &at91sam926x_timer, | 399 | .timer = &at91sam926x_timer, |
404 | .map_io = cap9adk_map_io, | 400 | .map_io = at91cap9_map_io, |
401 | .init_early = cap9adk_init_early, | ||
405 | .init_irq = cap9adk_init_irq, | 402 | .init_irq = cap9adk_init_irq, |
406 | .init_machine = cap9adk_board_init, | 403 | .init_machine = cap9adk_board_init, |
407 | MACHINE_END | 404 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c index 295e1e77fa60..f36b18687494 100644 --- a/arch/arm/mach-at91/board-carmeva.c +++ b/arch/arm/mach-at91/board-carmeva.c | |||
@@ -40,10 +40,10 @@ | |||
40 | #include "generic.h" | 40 | #include "generic.h" |
41 | 41 | ||
42 | 42 | ||
43 | static void __init carmeva_map_io(void) | 43 | static void __init carmeva_init_early(void) |
44 | { | 44 | { |
45 | /* Initialize processor: 20.000 MHz crystal */ | 45 | /* Initialize processor: 20.000 MHz crystal */ |
46 | at91rm9200_initialize(20000000, AT91RM9200_BGA); | 46 | at91rm9200_initialize(20000000); |
47 | 47 | ||
48 | /* DBGU on ttyS0. (Rx & Tx only) */ | 48 | /* DBGU on ttyS0. (Rx & Tx only) */ |
49 | at91_register_uart(0, 0, 0); | 49 | at91_register_uart(0, 0, 0); |
@@ -162,9 +162,9 @@ static void __init carmeva_board_init(void) | |||
162 | 162 | ||
163 | MACHINE_START(CARMEVA, "Carmeva") | 163 | MACHINE_START(CARMEVA, "Carmeva") |
164 | /* Maintainer: Conitec Datasystems */ | 164 | /* Maintainer: Conitec Datasystems */ |
165 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
166 | .timer = &at91rm9200_timer, | 165 | .timer = &at91rm9200_timer, |
167 | .map_io = carmeva_map_io, | 166 | .map_io = at91rm9200_map_io, |
167 | .init_early = carmeva_init_early, | ||
168 | .init_irq = carmeva_init_irq, | 168 | .init_irq = carmeva_init_irq, |
169 | .init_machine = carmeva_board_init, | 169 | .init_machine = carmeva_board_init, |
170 | MACHINE_END | 170 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c index 3838594578f3..980511084fe4 100644 --- a/arch/arm/mach-at91/board-cpu9krea.c +++ b/arch/arm/mach-at91/board-cpu9krea.c | |||
@@ -47,7 +47,7 @@ | |||
47 | #include "sam9_smc.h" | 47 | #include "sam9_smc.h" |
48 | #include "generic.h" | 48 | #include "generic.h" |
49 | 49 | ||
50 | static void __init cpu9krea_map_io(void) | 50 | static void __init cpu9krea_init_early(void) |
51 | { | 51 | { |
52 | /* Initialize processor: 18.432 MHz crystal */ | 52 | /* Initialize processor: 18.432 MHz crystal */ |
53 | at91sam9260_initialize(18432000); | 53 | at91sam9260_initialize(18432000); |
@@ -375,9 +375,9 @@ MACHINE_START(CPUAT9260, "Eukrea CPU9260") | |||
375 | MACHINE_START(CPUAT9G20, "Eukrea CPU9G20") | 375 | MACHINE_START(CPUAT9G20, "Eukrea CPU9G20") |
376 | #endif | 376 | #endif |
377 | /* Maintainer: Eric Benard - EUKREA Electromatique */ | 377 | /* Maintainer: Eric Benard - EUKREA Electromatique */ |
378 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
379 | .timer = &at91sam926x_timer, | 378 | .timer = &at91sam926x_timer, |
380 | .map_io = cpu9krea_map_io, | 379 | .map_io = at91sam9260_map_io, |
380 | .init_early = cpu9krea_init_early, | ||
381 | .init_irq = cpu9krea_init_irq, | 381 | .init_irq = cpu9krea_init_irq, |
382 | .init_machine = cpu9krea_board_init, | 382 | .init_machine = cpu9krea_board_init, |
383 | MACHINE_END | 383 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c index 2f4dd8cdd484..6daabe3907a1 100644 --- a/arch/arm/mach-at91/board-cpuat91.c +++ b/arch/arm/mach-at91/board-cpuat91.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <mach/board.h> | 38 | #include <mach/board.h> |
39 | #include <mach/gpio.h> | 39 | #include <mach/gpio.h> |
40 | #include <mach/at91rm9200_mc.h> | 40 | #include <mach/at91rm9200_mc.h> |
41 | #include <mach/cpu.h> | ||
41 | 42 | ||
42 | #include "generic.h" | 43 | #include "generic.h" |
43 | 44 | ||
@@ -50,10 +51,13 @@ static struct gpio_led cpuat91_leds[] = { | |||
50 | }, | 51 | }, |
51 | }; | 52 | }; |
52 | 53 | ||
53 | static void __init cpuat91_map_io(void) | 54 | static void __init cpuat91_init_early(void) |
54 | { | 55 | { |
56 | /* Set cpu type: PQFP */ | ||
57 | at91rm9200_set_type(ARCH_REVISON_9200_PQFP); | ||
58 | |||
55 | /* Initialize processor: 18.432 MHz crystal */ | 59 | /* Initialize processor: 18.432 MHz crystal */ |
56 | at91rm9200_initialize(18432000, AT91RM9200_PQFP); | 60 | at91rm9200_initialize(18432000); |
57 | 61 | ||
58 | /* DBGU on ttyS0. (Rx & Tx only) */ | 62 | /* DBGU on ttyS0. (Rx & Tx only) */ |
59 | at91_register_uart(0, 0, 0); | 63 | at91_register_uart(0, 0, 0); |
@@ -175,9 +179,9 @@ static void __init cpuat91_board_init(void) | |||
175 | 179 | ||
176 | MACHINE_START(CPUAT91, "Eukrea") | 180 | MACHINE_START(CPUAT91, "Eukrea") |
177 | /* Maintainer: Eric Benard - EUKREA Electromatique */ | 181 | /* Maintainer: Eric Benard - EUKREA Electromatique */ |
178 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
179 | .timer = &at91rm9200_timer, | 182 | .timer = &at91rm9200_timer, |
180 | .map_io = cpuat91_map_io, | 183 | .map_io = at91rm9200_map_io, |
184 | .init_early = cpuat91_init_early, | ||
181 | .init_irq = cpuat91_init_irq, | 185 | .init_irq = cpuat91_init_irq, |
182 | .init_machine = cpuat91_board_init, | 186 | .init_machine = cpuat91_board_init, |
183 | MACHINE_END | 187 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c index 464839dc39bd..d98bcec1dfe0 100644 --- a/arch/arm/mach-at91/board-csb337.c +++ b/arch/arm/mach-at91/board-csb337.c | |||
@@ -43,10 +43,10 @@ | |||
43 | #include "generic.h" | 43 | #include "generic.h" |
44 | 44 | ||
45 | 45 | ||
46 | static void __init csb337_map_io(void) | 46 | static void __init csb337_init_early(void) |
47 | { | 47 | { |
48 | /* Initialize processor: 3.6864 MHz crystal */ | 48 | /* Initialize processor: 3.6864 MHz crystal */ |
49 | at91rm9200_initialize(3686400, AT91RM9200_BGA); | 49 | at91rm9200_initialize(3686400); |
50 | 50 | ||
51 | /* Setup the LEDs */ | 51 | /* Setup the LEDs */ |
52 | at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1); | 52 | at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1); |
@@ -257,9 +257,9 @@ static void __init csb337_board_init(void) | |||
257 | 257 | ||
258 | MACHINE_START(CSB337, "Cogent CSB337") | 258 | MACHINE_START(CSB337, "Cogent CSB337") |
259 | /* Maintainer: Bill Gatliff */ | 259 | /* Maintainer: Bill Gatliff */ |
260 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
261 | .timer = &at91rm9200_timer, | 260 | .timer = &at91rm9200_timer, |
262 | .map_io = csb337_map_io, | 261 | .map_io = at91rm9200_map_io, |
262 | .init_early = csb337_init_early, | ||
263 | .init_irq = csb337_init_irq, | 263 | .init_irq = csb337_init_irq, |
264 | .init_machine = csb337_board_init, | 264 | .init_machine = csb337_board_init, |
265 | MACHINE_END | 265 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c index 431688c61412..019aab4e20b0 100644 --- a/arch/arm/mach-at91/board-csb637.c +++ b/arch/arm/mach-at91/board-csb637.c | |||
@@ -40,10 +40,10 @@ | |||
40 | #include "generic.h" | 40 | #include "generic.h" |
41 | 41 | ||
42 | 42 | ||
43 | static void __init csb637_map_io(void) | 43 | static void __init csb637_init_early(void) |
44 | { | 44 | { |
45 | /* Initialize processor: 3.6864 MHz crystal */ | 45 | /* Initialize processor: 3.6864 MHz crystal */ |
46 | at91rm9200_initialize(3686400, AT91RM9200_BGA); | 46 | at91rm9200_initialize(3686400); |
47 | 47 | ||
48 | /* DBGU on ttyS0. (Rx & Tx only) */ | 48 | /* DBGU on ttyS0. (Rx & Tx only) */ |
49 | at91_register_uart(0, 0, 0); | 49 | at91_register_uart(0, 0, 0); |
@@ -138,9 +138,9 @@ static void __init csb637_board_init(void) | |||
138 | 138 | ||
139 | MACHINE_START(CSB637, "Cogent CSB637") | 139 | MACHINE_START(CSB637, "Cogent CSB637") |
140 | /* Maintainer: Bill Gatliff */ | 140 | /* Maintainer: Bill Gatliff */ |
141 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
142 | .timer = &at91rm9200_timer, | 141 | .timer = &at91rm9200_timer, |
143 | .map_io = csb637_map_io, | 142 | .map_io = at91rm9200_map_io, |
143 | .init_early = csb637_init_early, | ||
144 | .init_irq = csb637_init_irq, | 144 | .init_irq = csb637_init_irq, |
145 | .init_machine = csb637_board_init, | 145 | .init_machine = csb637_board_init, |
146 | MACHINE_END | 146 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-eb01.c b/arch/arm/mach-at91/board-eb01.c index d8df59a3426d..d2023f27c652 100644 --- a/arch/arm/mach-at91/board-eb01.c +++ b/arch/arm/mach-at91/board-eb01.c | |||
@@ -35,7 +35,7 @@ static void __init at91eb01_init_irq(void) | |||
35 | at91x40_init_interrupts(NULL); | 35 | at91x40_init_interrupts(NULL); |
36 | } | 36 | } |
37 | 37 | ||
38 | static void __init at91eb01_map_io(void) | 38 | static void __init at91eb01_init_early(void) |
39 | { | 39 | { |
40 | at91x40_initialize(40000000); | 40 | at91x40_initialize(40000000); |
41 | } | 41 | } |
@@ -43,7 +43,7 @@ static void __init at91eb01_map_io(void) | |||
43 | MACHINE_START(AT91EB01, "Atmel AT91 EB01") | 43 | MACHINE_START(AT91EB01, "Atmel AT91 EB01") |
44 | /* Maintainer: Greg Ungerer <gerg@snapgear.com> */ | 44 | /* Maintainer: Greg Ungerer <gerg@snapgear.com> */ |
45 | .timer = &at91x40_timer, | 45 | .timer = &at91x40_timer, |
46 | .init_early = at91eb01_init_early, | ||
46 | .init_irq = at91eb01_init_irq, | 47 | .init_irq = at91eb01_init_irq, |
47 | .map_io = at91eb01_map_io, | ||
48 | MACHINE_END | 48 | MACHINE_END |
49 | 49 | ||
diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c index 6cf6566ae346..e9484535cbc8 100644 --- a/arch/arm/mach-at91/board-eb9200.c +++ b/arch/arm/mach-at91/board-eb9200.c | |||
@@ -40,10 +40,10 @@ | |||
40 | #include "generic.h" | 40 | #include "generic.h" |
41 | 41 | ||
42 | 42 | ||
43 | static void __init eb9200_map_io(void) | 43 | static void __init eb9200_init_early(void) |
44 | { | 44 | { |
45 | /* Initialize processor: 18.432 MHz crystal */ | 45 | /* Initialize processor: 18.432 MHz crystal */ |
46 | at91rm9200_initialize(18432000, AT91RM9200_BGA); | 46 | at91rm9200_initialize(18432000); |
47 | 47 | ||
48 | /* DBGU on ttyS0. (Rx & Tx only) */ | 48 | /* DBGU on ttyS0. (Rx & Tx only) */ |
49 | at91_register_uart(0, 0, 0); | 49 | at91_register_uart(0, 0, 0); |
@@ -120,9 +120,9 @@ static void __init eb9200_board_init(void) | |||
120 | } | 120 | } |
121 | 121 | ||
122 | MACHINE_START(ATEB9200, "Embest ATEB9200") | 122 | MACHINE_START(ATEB9200, "Embest ATEB9200") |
123 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
124 | .timer = &at91rm9200_timer, | 123 | .timer = &at91rm9200_timer, |
125 | .map_io = eb9200_map_io, | 124 | .map_io = at91rm9200_map_io, |
125 | .init_early = eb9200_init_early, | ||
126 | .init_irq = eb9200_init_irq, | 126 | .init_irq = eb9200_init_irq, |
127 | .init_machine = eb9200_board_init, | 127 | .init_machine = eb9200_board_init, |
128 | MACHINE_END | 128 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c index de2fd04e7c8a..a6f57faa10a7 100644 --- a/arch/arm/mach-at91/board-ecbat91.c +++ b/arch/arm/mach-at91/board-ecbat91.c | |||
@@ -38,14 +38,18 @@ | |||
38 | 38 | ||
39 | #include <mach/board.h> | 39 | #include <mach/board.h> |
40 | #include <mach/gpio.h> | 40 | #include <mach/gpio.h> |
41 | #include <mach/cpu.h> | ||
41 | 42 | ||
42 | #include "generic.h" | 43 | #include "generic.h" |
43 | 44 | ||
44 | 45 | ||
45 | static void __init ecb_at91map_io(void) | 46 | static void __init ecb_at91init_early(void) |
46 | { | 47 | { |
48 | /* Set cpu type: PQFP */ | ||
49 | at91rm9200_set_type(ARCH_REVISON_9200_PQFP); | ||
50 | |||
47 | /* Initialize processor: 18.432 MHz crystal */ | 51 | /* Initialize processor: 18.432 MHz crystal */ |
48 | at91rm9200_initialize(18432000, AT91RM9200_PQFP); | 52 | at91rm9200_initialize(18432000); |
49 | 53 | ||
50 | /* Setup the LEDs */ | 54 | /* Setup the LEDs */ |
51 | at91_init_leds(AT91_PIN_PC7, AT91_PIN_PC7); | 55 | at91_init_leds(AT91_PIN_PC7, AT91_PIN_PC7); |
@@ -168,9 +172,9 @@ static void __init ecb_at91board_init(void) | |||
168 | 172 | ||
169 | MACHINE_START(ECBAT91, "emQbit's ECB_AT91") | 173 | MACHINE_START(ECBAT91, "emQbit's ECB_AT91") |
170 | /* Maintainer: emQbit.com */ | 174 | /* Maintainer: emQbit.com */ |
171 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
172 | .timer = &at91rm9200_timer, | 175 | .timer = &at91rm9200_timer, |
173 | .map_io = ecb_at91map_io, | 176 | .map_io = at91rm9200_map_io, |
177 | .init_early = ecb_at91init_early, | ||
174 | .init_irq = ecb_at91init_irq, | 178 | .init_irq = ecb_at91init_irq, |
175 | .init_machine = ecb_at91board_init, | 179 | .init_machine = ecb_at91board_init, |
176 | MACHINE_END | 180 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c index a158a0ce458f..bfc0062d1483 100644 --- a/arch/arm/mach-at91/board-eco920.c +++ b/arch/arm/mach-at91/board-eco920.c | |||
@@ -26,11 +26,16 @@ | |||
26 | 26 | ||
27 | #include <mach/board.h> | 27 | #include <mach/board.h> |
28 | #include <mach/at91rm9200_mc.h> | 28 | #include <mach/at91rm9200_mc.h> |
29 | #include <mach/cpu.h> | ||
30 | |||
29 | #include "generic.h" | 31 | #include "generic.h" |
30 | 32 | ||
31 | static void __init eco920_map_io(void) | 33 | static void __init eco920_init_early(void) |
32 | { | 34 | { |
33 | at91rm9200_initialize(18432000, AT91RM9200_PQFP); | 35 | /* Set cpu type: PQFP */ |
36 | at91rm9200_set_type(ARCH_REVISON_9200_PQFP); | ||
37 | |||
38 | at91rm9200_initialize(18432000); | ||
34 | 39 | ||
35 | /* Setup the LEDs */ | 40 | /* Setup the LEDs */ |
36 | at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1); | 41 | at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1); |
@@ -86,21 +91,6 @@ static struct platform_device eco920_flash = { | |||
86 | .num_resources = 1, | 91 | .num_resources = 1, |
87 | }; | 92 | }; |
88 | 93 | ||
89 | static struct resource at91_beeper_resources[] = { | ||
90 | [0] = { | ||
91 | .start = AT91RM9200_BASE_TC3, | ||
92 | .end = AT91RM9200_BASE_TC3 + 0x39, | ||
93 | .flags = IORESOURCE_MEM, | ||
94 | }, | ||
95 | }; | ||
96 | |||
97 | static struct platform_device at91_beeper = { | ||
98 | .name = "at91_beeper", | ||
99 | .id = 0, | ||
100 | .resource = at91_beeper_resources, | ||
101 | .num_resources = ARRAY_SIZE(at91_beeper_resources), | ||
102 | }; | ||
103 | |||
104 | static struct spi_board_info eco920_spi_devices[] = { | 94 | static struct spi_board_info eco920_spi_devices[] = { |
105 | { /* CAN controller */ | 95 | { /* CAN controller */ |
106 | .modalias = "tlv5638", | 96 | .modalias = "tlv5638", |
@@ -139,18 +129,14 @@ static void __init eco920_board_init(void) | |||
139 | AT91_SMC_TDF_(1) /* float time */ | 129 | AT91_SMC_TDF_(1) /* float time */ |
140 | ); | 130 | ); |
141 | 131 | ||
142 | at91_clock_associate("tc3_clk", &at91_beeper.dev, "at91_beeper"); | ||
143 | at91_set_B_periph(AT91_PIN_PB6, 0); | ||
144 | platform_device_register(&at91_beeper); | ||
145 | |||
146 | at91_add_device_spi(eco920_spi_devices, ARRAY_SIZE(eco920_spi_devices)); | 132 | at91_add_device_spi(eco920_spi_devices, ARRAY_SIZE(eco920_spi_devices)); |
147 | } | 133 | } |
148 | 134 | ||
149 | MACHINE_START(ECO920, "eco920") | 135 | MACHINE_START(ECO920, "eco920") |
150 | /* Maintainer: Sascha Hauer */ | 136 | /* Maintainer: Sascha Hauer */ |
151 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
152 | .timer = &at91rm9200_timer, | 137 | .timer = &at91rm9200_timer, |
153 | .map_io = eco920_map_io, | 138 | .map_io = at91rm9200_map_io, |
139 | .init_early = eco920_init_early, | ||
154 | .init_irq = eco920_init_irq, | 140 | .init_irq = eco920_init_irq, |
155 | .init_machine = eco920_board_init, | 141 | .init_machine = eco920_board_init, |
156 | MACHINE_END | 142 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-flexibity.c b/arch/arm/mach-at91/board-flexibity.c index c8a62dc8fa65..466c063b8d21 100644 --- a/arch/arm/mach-at91/board-flexibity.c +++ b/arch/arm/mach-at91/board-flexibity.c | |||
@@ -37,7 +37,7 @@ | |||
37 | 37 | ||
38 | #include "generic.h" | 38 | #include "generic.h" |
39 | 39 | ||
40 | static void __init flexibity_map_io(void) | 40 | static void __init flexibity_init_early(void) |
41 | { | 41 | { |
42 | /* Initialize processor: 18.432 MHz crystal */ | 42 | /* Initialize processor: 18.432 MHz crystal */ |
43 | at91sam9260_initialize(18432000); | 43 | at91sam9260_initialize(18432000); |
@@ -154,9 +154,9 @@ static void __init flexibity_board_init(void) | |||
154 | 154 | ||
155 | MACHINE_START(FLEXIBITY, "Flexibity Connect") | 155 | MACHINE_START(FLEXIBITY, "Flexibity Connect") |
156 | /* Maintainer: Maxim Osipov */ | 156 | /* Maintainer: Maxim Osipov */ |
157 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
158 | .timer = &at91sam926x_timer, | 157 | .timer = &at91sam926x_timer, |
159 | .map_io = flexibity_map_io, | 158 | .map_io = at91sam9260_map_io, |
159 | .init_early = flexibity_init_early, | ||
160 | .init_irq = flexibity_init_irq, | 160 | .init_irq = flexibity_init_irq, |
161 | .init_machine = flexibity_board_init, | 161 | .init_machine = flexibity_board_init, |
162 | MACHINE_END | 162 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-foxg20.c b/arch/arm/mach-at91/board-foxg20.c index dfc7dfe738e4..e2d1dc9eff45 100644 --- a/arch/arm/mach-at91/board-foxg20.c +++ b/arch/arm/mach-at91/board-foxg20.c | |||
@@ -57,7 +57,7 @@ | |||
57 | */ | 57 | */ |
58 | 58 | ||
59 | 59 | ||
60 | static void __init foxg20_map_io(void) | 60 | static void __init foxg20_init_early(void) |
61 | { | 61 | { |
62 | /* Initialize processor: 18.432 MHz crystal */ | 62 | /* Initialize processor: 18.432 MHz crystal */ |
63 | at91sam9260_initialize(18432000); | 63 | at91sam9260_initialize(18432000); |
@@ -266,9 +266,9 @@ static void __init foxg20_board_init(void) | |||
266 | 266 | ||
267 | MACHINE_START(ACMENETUSFOXG20, "Acme Systems srl FOX Board G20") | 267 | MACHINE_START(ACMENETUSFOXG20, "Acme Systems srl FOX Board G20") |
268 | /* Maintainer: Sergio Tanzilli */ | 268 | /* Maintainer: Sergio Tanzilli */ |
269 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
270 | .timer = &at91sam926x_timer, | 269 | .timer = &at91sam926x_timer, |
271 | .map_io = foxg20_map_io, | 270 | .map_io = at91sam9260_map_io, |
271 | .init_early = foxg20_init_early, | ||
272 | .init_irq = foxg20_init_irq, | 272 | .init_irq = foxg20_init_irq, |
273 | .init_machine = foxg20_board_init, | 273 | .init_machine = foxg20_board_init, |
274 | MACHINE_END | 274 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c index bc28136ee249..1d4f36b3cb27 100644 --- a/arch/arm/mach-at91/board-gsia18s.c +++ b/arch/arm/mach-at91/board-gsia18s.c | |||
@@ -38,9 +38,9 @@ | |||
38 | #include "sam9_smc.h" | 38 | #include "sam9_smc.h" |
39 | #include "generic.h" | 39 | #include "generic.h" |
40 | 40 | ||
41 | static void __init gsia18s_map_io(void) | 41 | static void __init gsia18s_init_early(void) |
42 | { | 42 | { |
43 | stamp9g20_map_io(); | 43 | stamp9g20_init_early(); |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * USART0 on ttyS1 (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI). | 46 | * USART0 on ttyS1 (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI). |
@@ -576,9 +576,9 @@ static void __init gsia18s_board_init(void) | |||
576 | } | 576 | } |
577 | 577 | ||
578 | MACHINE_START(GSIA18S, "GS_IA18_S") | 578 | MACHINE_START(GSIA18S, "GS_IA18_S") |
579 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
580 | .timer = &at91sam926x_timer, | 579 | .timer = &at91sam926x_timer, |
581 | .map_io = gsia18s_map_io, | 580 | .map_io = at91sam9260_map_io, |
581 | .init_early = gsia18s_init_early, | ||
582 | .init_irq = init_irq, | 582 | .init_irq = init_irq, |
583 | .init_machine = gsia18s_board_init, | 583 | .init_machine = gsia18s_board_init, |
584 | MACHINE_END | 584 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c index d2e1f4ec1fcc..9b003ff744ba 100644 --- a/arch/arm/mach-at91/board-kafa.c +++ b/arch/arm/mach-at91/board-kafa.c | |||
@@ -35,14 +35,18 @@ | |||
35 | 35 | ||
36 | #include <mach/board.h> | 36 | #include <mach/board.h> |
37 | #include <mach/gpio.h> | 37 | #include <mach/gpio.h> |
38 | #include <mach/cpu.h> | ||
38 | 39 | ||
39 | #include "generic.h" | 40 | #include "generic.h" |
40 | 41 | ||
41 | 42 | ||
42 | static void __init kafa_map_io(void) | 43 | static void __init kafa_init_early(void) |
43 | { | 44 | { |
45 | /* Set cpu type: PQFP */ | ||
46 | at91rm9200_set_type(ARCH_REVISON_9200_PQFP); | ||
47 | |||
44 | /* Initialize processor: 18.432 MHz crystal */ | 48 | /* Initialize processor: 18.432 MHz crystal */ |
45 | at91rm9200_initialize(18432000, AT91RM9200_PQFP); | 49 | at91rm9200_initialize(18432000); |
46 | 50 | ||
47 | /* Set up the LEDs */ | 51 | /* Set up the LEDs */ |
48 | at91_init_leds(AT91_PIN_PB4, AT91_PIN_PB4); | 52 | at91_init_leds(AT91_PIN_PB4, AT91_PIN_PB4); |
@@ -94,9 +98,9 @@ static void __init kafa_board_init(void) | |||
94 | 98 | ||
95 | MACHINE_START(KAFA, "Sperry-Sun KAFA") | 99 | MACHINE_START(KAFA, "Sperry-Sun KAFA") |
96 | /* Maintainer: Sergei Sharonov */ | 100 | /* Maintainer: Sergei Sharonov */ |
97 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
98 | .timer = &at91rm9200_timer, | 101 | .timer = &at91rm9200_timer, |
99 | .map_io = kafa_map_io, | 102 | .map_io = at91rm9200_map_io, |
103 | .init_early = kafa_init_early, | ||
100 | .init_irq = kafa_init_irq, | 104 | .init_irq = kafa_init_irq, |
101 | .init_machine = kafa_board_init, | 105 | .init_machine = kafa_board_init, |
102 | MACHINE_END | 106 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index a13d2063faff..a813a74b65f9 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c | |||
@@ -36,16 +36,19 @@ | |||
36 | 36 | ||
37 | #include <mach/board.h> | 37 | #include <mach/board.h> |
38 | #include <mach/gpio.h> | 38 | #include <mach/gpio.h> |
39 | 39 | #include <mach/cpu.h> | |
40 | #include <mach/at91rm9200_mc.h> | 40 | #include <mach/at91rm9200_mc.h> |
41 | 41 | ||
42 | #include "generic.h" | 42 | #include "generic.h" |
43 | 43 | ||
44 | 44 | ||
45 | static void __init kb9202_map_io(void) | 45 | static void __init kb9202_init_early(void) |
46 | { | 46 | { |
47 | /* Set cpu type: PQFP */ | ||
48 | at91rm9200_set_type(ARCH_REVISON_9200_PQFP); | ||
49 | |||
47 | /* Initialize processor: 10 MHz crystal */ | 50 | /* Initialize processor: 10 MHz crystal */ |
48 | at91rm9200_initialize(10000000, AT91RM9200_PQFP); | 51 | at91rm9200_initialize(10000000); |
49 | 52 | ||
50 | /* Set up the LEDs */ | 53 | /* Set up the LEDs */ |
51 | at91_init_leds(AT91_PIN_PC19, AT91_PIN_PC18); | 54 | at91_init_leds(AT91_PIN_PC19, AT91_PIN_PC18); |
@@ -136,9 +139,9 @@ static void __init kb9202_board_init(void) | |||
136 | 139 | ||
137 | MACHINE_START(KB9200, "KB920x") | 140 | MACHINE_START(KB9200, "KB920x") |
138 | /* Maintainer: KwikByte, Inc. */ | 141 | /* Maintainer: KwikByte, Inc. */ |
139 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
140 | .timer = &at91rm9200_timer, | 142 | .timer = &at91rm9200_timer, |
141 | .map_io = kb9202_map_io, | 143 | .map_io = at91rm9200_map_io, |
144 | .init_early = kb9202_init_early, | ||
142 | .init_irq = kb9202_init_irq, | 145 | .init_irq = kb9202_init_irq, |
143 | .init_machine = kb9202_board_init, | 146 | .init_machine = kb9202_board_init, |
144 | MACHINE_END | 147 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c index fe5f1d47e6e2..961e805db68c 100644 --- a/arch/arm/mach-at91/board-neocore926.c +++ b/arch/arm/mach-at91/board-neocore926.c | |||
@@ -51,7 +51,7 @@ | |||
51 | #include "generic.h" | 51 | #include "generic.h" |
52 | 52 | ||
53 | 53 | ||
54 | static void __init neocore926_map_io(void) | 54 | static void __init neocore926_init_early(void) |
55 | { | 55 | { |
56 | /* Initialize processor: 20 MHz crystal */ | 56 | /* Initialize processor: 20 MHz crystal */ |
57 | at91sam9263_initialize(20000000); | 57 | at91sam9263_initialize(20000000); |
@@ -387,9 +387,9 @@ static void __init neocore926_board_init(void) | |||
387 | 387 | ||
388 | MACHINE_START(NEOCORE926, "ADENEO NEOCORE 926") | 388 | MACHINE_START(NEOCORE926, "ADENEO NEOCORE 926") |
389 | /* Maintainer: ADENEO */ | 389 | /* Maintainer: ADENEO */ |
390 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
391 | .timer = &at91sam926x_timer, | 390 | .timer = &at91sam926x_timer, |
392 | .map_io = neocore926_map_io, | 391 | .map_io = at91sam9263_map_io, |
392 | .init_early = neocore926_init_early, | ||
393 | .init_irq = neocore926_init_irq, | 393 | .init_irq = neocore926_init_irq, |
394 | .init_machine = neocore926_board_init, | 394 | .init_machine = neocore926_board_init, |
395 | MACHINE_END | 395 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c index feb65787c30b..21a21af25878 100644 --- a/arch/arm/mach-at91/board-pcontrol-g20.c +++ b/arch/arm/mach-at91/board-pcontrol-g20.c | |||
@@ -37,9 +37,9 @@ | |||
37 | #include "generic.h" | 37 | #include "generic.h" |
38 | 38 | ||
39 | 39 | ||
40 | static void __init pcontrol_g20_map_io(void) | 40 | static void __init pcontrol_g20_init_early(void) |
41 | { | 41 | { |
42 | stamp9g20_map_io(); | 42 | stamp9g20_init_early(); |
43 | 43 | ||
44 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback A2 */ | 44 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback A2 */ |
45 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | 45 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS |
@@ -222,9 +222,9 @@ static void __init pcontrol_g20_board_init(void) | |||
222 | 222 | ||
223 | MACHINE_START(PCONTROL_G20, "PControl G20") | 223 | MACHINE_START(PCONTROL_G20, "PControl G20") |
224 | /* Maintainer: pgsellmann@portner-elektronik.at */ | 224 | /* Maintainer: pgsellmann@portner-elektronik.at */ |
225 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
226 | .timer = &at91sam926x_timer, | 225 | .timer = &at91sam926x_timer, |
227 | .map_io = pcontrol_g20_map_io, | 226 | .map_io = at91sam9260_map_io, |
227 | .init_early = pcontrol_g20_init_early, | ||
228 | .init_irq = init_irq, | 228 | .init_irq = init_irq, |
229 | .init_machine = pcontrol_g20_board_init, | 229 | .init_machine = pcontrol_g20_board_init, |
230 | MACHINE_END | 230 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c index 55dad3a46547..756cc2a745dd 100644 --- a/arch/arm/mach-at91/board-picotux200.c +++ b/arch/arm/mach-at91/board-picotux200.c | |||
@@ -43,10 +43,10 @@ | |||
43 | #include "generic.h" | 43 | #include "generic.h" |
44 | 44 | ||
45 | 45 | ||
46 | static void __init picotux200_map_io(void) | 46 | static void __init picotux200_init_early(void) |
47 | { | 47 | { |
48 | /* Initialize processor: 18.432 MHz crystal */ | 48 | /* Initialize processor: 18.432 MHz crystal */ |
49 | at91rm9200_initialize(18432000, AT91RM9200_BGA); | 49 | at91rm9200_initialize(18432000); |
50 | 50 | ||
51 | /* DBGU on ttyS0. (Rx & Tx only) */ | 51 | /* DBGU on ttyS0. (Rx & Tx only) */ |
52 | at91_register_uart(0, 0, 0); | 52 | at91_register_uart(0, 0, 0); |
@@ -123,9 +123,9 @@ static void __init picotux200_board_init(void) | |||
123 | 123 | ||
124 | MACHINE_START(PICOTUX2XX, "picotux 200") | 124 | MACHINE_START(PICOTUX2XX, "picotux 200") |
125 | /* Maintainer: Kleinhenz Elektronik GmbH */ | 125 | /* Maintainer: Kleinhenz Elektronik GmbH */ |
126 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
127 | .timer = &at91rm9200_timer, | 126 | .timer = &at91rm9200_timer, |
128 | .map_io = picotux200_map_io, | 127 | .map_io = at91rm9200_map_io, |
128 | .init_early = picotux200_init_early, | ||
129 | .init_irq = picotux200_init_irq, | 129 | .init_irq = picotux200_init_irq, |
130 | .init_machine = picotux200_board_init, | 130 | .init_machine = picotux200_board_init, |
131 | MACHINE_END | 131 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c index 69d15a875b66..d1a6001b0bd8 100644 --- a/arch/arm/mach-at91/board-qil-a9260.c +++ b/arch/arm/mach-at91/board-qil-a9260.c | |||
@@ -48,7 +48,7 @@ | |||
48 | #include "generic.h" | 48 | #include "generic.h" |
49 | 49 | ||
50 | 50 | ||
51 | static void __init ek_map_io(void) | 51 | static void __init ek_init_early(void) |
52 | { | 52 | { |
53 | /* Initialize processor: 12.000 MHz crystal */ | 53 | /* Initialize processor: 12.000 MHz crystal */ |
54 | at91sam9260_initialize(12000000); | 54 | at91sam9260_initialize(12000000); |
@@ -268,9 +268,9 @@ static void __init ek_board_init(void) | |||
268 | 268 | ||
269 | MACHINE_START(QIL_A9260, "CALAO QIL_A9260") | 269 | MACHINE_START(QIL_A9260, "CALAO QIL_A9260") |
270 | /* Maintainer: calao-systems */ | 270 | /* Maintainer: calao-systems */ |
271 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
272 | .timer = &at91sam926x_timer, | 271 | .timer = &at91sam926x_timer, |
273 | .map_io = ek_map_io, | 272 | .map_io = at91sam9260_map_io, |
273 | .init_early = ek_init_early, | ||
274 | .init_irq = ek_init_irq, | 274 | .init_irq = ek_init_irq, |
275 | .init_machine = ek_board_init, | 275 | .init_machine = ek_board_init, |
276 | MACHINE_END | 276 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c index 4c1047c8200d..aef9627710b0 100644 --- a/arch/arm/mach-at91/board-rm9200dk.c +++ b/arch/arm/mach-at91/board-rm9200dk.c | |||
@@ -45,10 +45,10 @@ | |||
45 | #include "generic.h" | 45 | #include "generic.h" |
46 | 46 | ||
47 | 47 | ||
48 | static void __init dk_map_io(void) | 48 | static void __init dk_init_early(void) |
49 | { | 49 | { |
50 | /* Initialize processor: 18.432 MHz crystal */ | 50 | /* Initialize processor: 18.432 MHz crystal */ |
51 | at91rm9200_initialize(18432000, AT91RM9200_BGA); | 51 | at91rm9200_initialize(18432000); |
52 | 52 | ||
53 | /* Setup the LEDs */ | 53 | /* Setup the LEDs */ |
54 | at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2); | 54 | at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2); |
@@ -227,9 +227,9 @@ static void __init dk_board_init(void) | |||
227 | 227 | ||
228 | MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK") | 228 | MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK") |
229 | /* Maintainer: SAN People/Atmel */ | 229 | /* Maintainer: SAN People/Atmel */ |
230 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
231 | .timer = &at91rm9200_timer, | 230 | .timer = &at91rm9200_timer, |
232 | .map_io = dk_map_io, | 231 | .map_io = at91rm9200_map_io, |
232 | .init_early = dk_init_early, | ||
233 | .init_irq = dk_init_irq, | 233 | .init_irq = dk_init_irq, |
234 | .init_machine = dk_board_init, | 234 | .init_machine = dk_board_init, |
235 | MACHINE_END | 235 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c index 9df1be8818c0..015a02183080 100644 --- a/arch/arm/mach-at91/board-rm9200ek.c +++ b/arch/arm/mach-at91/board-rm9200ek.c | |||
@@ -45,10 +45,10 @@ | |||
45 | #include "generic.h" | 45 | #include "generic.h" |
46 | 46 | ||
47 | 47 | ||
48 | static void __init ek_map_io(void) | 48 | static void __init ek_init_early(void) |
49 | { | 49 | { |
50 | /* Initialize processor: 18.432 MHz crystal */ | 50 | /* Initialize processor: 18.432 MHz crystal */ |
51 | at91rm9200_initialize(18432000, AT91RM9200_BGA); | 51 | at91rm9200_initialize(18432000); |
52 | 52 | ||
53 | /* Setup the LEDs */ | 53 | /* Setup the LEDs */ |
54 | at91_init_leds(AT91_PIN_PB1, AT91_PIN_PB2); | 54 | at91_init_leds(AT91_PIN_PB1, AT91_PIN_PB2); |
@@ -193,9 +193,9 @@ static void __init ek_board_init(void) | |||
193 | 193 | ||
194 | MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK") | 194 | MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK") |
195 | /* Maintainer: SAN People/Atmel */ | 195 | /* Maintainer: SAN People/Atmel */ |
196 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
197 | .timer = &at91rm9200_timer, | 196 | .timer = &at91rm9200_timer, |
198 | .map_io = ek_map_io, | 197 | .map_io = at91rm9200_map_io, |
198 | .init_early = ek_init_early, | ||
199 | .init_irq = ek_init_irq, | 199 | .init_irq = ek_init_irq, |
200 | .init_machine = ek_board_init, | 200 | .init_machine = ek_board_init, |
201 | MACHINE_END | 201 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c index 25a26beaa728..aaf1bf0989b3 100644 --- a/arch/arm/mach-at91/board-sam9-l9260.c +++ b/arch/arm/mach-at91/board-sam9-l9260.c | |||
@@ -44,7 +44,7 @@ | |||
44 | #include "generic.h" | 44 | #include "generic.h" |
45 | 45 | ||
46 | 46 | ||
47 | static void __init ek_map_io(void) | 47 | static void __init ek_init_early(void) |
48 | { | 48 | { |
49 | /* Initialize processor: 18.432 MHz crystal */ | 49 | /* Initialize processor: 18.432 MHz crystal */ |
50 | at91sam9260_initialize(18432000); | 50 | at91sam9260_initialize(18432000); |
@@ -212,9 +212,9 @@ static void __init ek_board_init(void) | |||
212 | 212 | ||
213 | MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260") | 213 | MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260") |
214 | /* Maintainer: Olimex */ | 214 | /* Maintainer: Olimex */ |
215 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
216 | .timer = &at91sam926x_timer, | 215 | .timer = &at91sam926x_timer, |
217 | .map_io = ek_map_io, | 216 | .map_io = at91sam9260_map_io, |
217 | .init_early = ek_init_early, | ||
218 | .init_irq = ek_init_irq, | 218 | .init_irq = ek_init_irq, |
219 | .init_machine = ek_board_init, | 219 | .init_machine = ek_board_init, |
220 | MACHINE_END | 220 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c index de1816e0e1d9..d600dc123227 100644 --- a/arch/arm/mach-at91/board-sam9260ek.c +++ b/arch/arm/mach-at91/board-sam9260ek.c | |||
@@ -44,12 +44,13 @@ | |||
44 | #include <mach/gpio.h> | 44 | #include <mach/gpio.h> |
45 | #include <mach/at91sam9_smc.h> | 45 | #include <mach/at91sam9_smc.h> |
46 | #include <mach/at91_shdwc.h> | 46 | #include <mach/at91_shdwc.h> |
47 | #include <mach/system_rev.h> | ||
47 | 48 | ||
48 | #include "sam9_smc.h" | 49 | #include "sam9_smc.h" |
49 | #include "generic.h" | 50 | #include "generic.h" |
50 | 51 | ||
51 | 52 | ||
52 | static void __init ek_map_io(void) | 53 | static void __init ek_init_early(void) |
53 | { | 54 | { |
54 | /* Initialize processor: 18.432 MHz crystal */ | 55 | /* Initialize processor: 18.432 MHz crystal */ |
55 | at91sam9260_initialize(18432000); | 56 | at91sam9260_initialize(18432000); |
@@ -191,11 +192,6 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
191 | .rdy_pin = AT91_PIN_PC13, | 192 | .rdy_pin = AT91_PIN_PC13, |
192 | .enable_pin = AT91_PIN_PC14, | 193 | .enable_pin = AT91_PIN_PC14, |
193 | .partition_info = nand_partitions, | 194 | .partition_info = nand_partitions, |
194 | #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) | ||
195 | .bus_width_16 = 1, | ||
196 | #else | ||
197 | .bus_width_16 = 0, | ||
198 | #endif | ||
199 | }; | 195 | }; |
200 | 196 | ||
201 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | 197 | static struct sam9_smc_config __initdata ek_nand_smc_config = { |
@@ -218,6 +214,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = { | |||
218 | 214 | ||
219 | static void __init ek_add_device_nand(void) | 215 | static void __init ek_add_device_nand(void) |
220 | { | 216 | { |
217 | ek_nand_data.bus_width_16 = !board_have_nand_8bit(); | ||
221 | /* setup bus-width (8 or 16) */ | 218 | /* setup bus-width (8 or 16) */ |
222 | if (ek_nand_data.bus_width_16) | 219 | if (ek_nand_data.bus_width_16) |
223 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; | 220 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; |
@@ -356,9 +353,9 @@ static void __init ek_board_init(void) | |||
356 | 353 | ||
357 | MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK") | 354 | MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK") |
358 | /* Maintainer: Atmel */ | 355 | /* Maintainer: Atmel */ |
359 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
360 | .timer = &at91sam926x_timer, | 356 | .timer = &at91sam926x_timer, |
361 | .map_io = ek_map_io, | 357 | .map_io = at91sam9260_map_io, |
358 | .init_early = ek_init_early, | ||
362 | .init_irq = ek_init_irq, | 359 | .init_irq = ek_init_irq, |
363 | .init_machine = ek_board_init, | 360 | .init_machine = ek_board_init, |
364 | MACHINE_END | 361 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index 14acc901e24c..f897f84d43dc 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c | |||
@@ -48,12 +48,13 @@ | |||
48 | #include <mach/gpio.h> | 48 | #include <mach/gpio.h> |
49 | #include <mach/at91sam9_smc.h> | 49 | #include <mach/at91sam9_smc.h> |
50 | #include <mach/at91_shdwc.h> | 50 | #include <mach/at91_shdwc.h> |
51 | #include <mach/system_rev.h> | ||
51 | 52 | ||
52 | #include "sam9_smc.h" | 53 | #include "sam9_smc.h" |
53 | #include "generic.h" | 54 | #include "generic.h" |
54 | 55 | ||
55 | 56 | ||
56 | static void __init ek_map_io(void) | 57 | static void __init ek_init_early(void) |
57 | { | 58 | { |
58 | /* Initialize processor: 18.432 MHz crystal */ | 59 | /* Initialize processor: 18.432 MHz crystal */ |
59 | at91sam9261_initialize(18432000); | 60 | at91sam9261_initialize(18432000); |
@@ -197,11 +198,6 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
197 | .rdy_pin = AT91_PIN_PC15, | 198 | .rdy_pin = AT91_PIN_PC15, |
198 | .enable_pin = AT91_PIN_PC14, | 199 | .enable_pin = AT91_PIN_PC14, |
199 | .partition_info = nand_partitions, | 200 | .partition_info = nand_partitions, |
200 | #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) | ||
201 | .bus_width_16 = 1, | ||
202 | #else | ||
203 | .bus_width_16 = 0, | ||
204 | #endif | ||
205 | }; | 201 | }; |
206 | 202 | ||
207 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | 203 | static struct sam9_smc_config __initdata ek_nand_smc_config = { |
@@ -224,6 +220,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = { | |||
224 | 220 | ||
225 | static void __init ek_add_device_nand(void) | 221 | static void __init ek_add_device_nand(void) |
226 | { | 222 | { |
223 | ek_nand_data.bus_width_16 = !board_have_nand_8bit(); | ||
227 | /* setup bus-width (8 or 16) */ | 224 | /* setup bus-width (8 or 16) */ |
228 | if (ek_nand_data.bus_width_16) | 225 | if (ek_nand_data.bus_width_16) |
229 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; | 226 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; |
@@ -623,9 +620,9 @@ MACHINE_START(AT91SAM9261EK, "Atmel AT91SAM9261-EK") | |||
623 | MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK") | 620 | MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK") |
624 | #endif | 621 | #endif |
625 | /* Maintainer: Atmel */ | 622 | /* Maintainer: Atmel */ |
626 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
627 | .timer = &at91sam926x_timer, | 623 | .timer = &at91sam926x_timer, |
628 | .map_io = ek_map_io, | 624 | .map_io = at91sam9261_map_io, |
625 | .init_early = ek_init_early, | ||
629 | .init_irq = ek_init_irq, | 626 | .init_irq = ek_init_irq, |
630 | .init_machine = ek_board_init, | 627 | .init_machine = ek_board_init, |
631 | MACHINE_END | 628 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index bfe490df58be..605b26f40a4c 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c | |||
@@ -47,12 +47,13 @@ | |||
47 | #include <mach/gpio.h> | 47 | #include <mach/gpio.h> |
48 | #include <mach/at91sam9_smc.h> | 48 | #include <mach/at91sam9_smc.h> |
49 | #include <mach/at91_shdwc.h> | 49 | #include <mach/at91_shdwc.h> |
50 | #include <mach/system_rev.h> | ||
50 | 51 | ||
51 | #include "sam9_smc.h" | 52 | #include "sam9_smc.h" |
52 | #include "generic.h" | 53 | #include "generic.h" |
53 | 54 | ||
54 | 55 | ||
55 | static void __init ek_map_io(void) | 56 | static void __init ek_init_early(void) |
56 | { | 57 | { |
57 | /* Initialize processor: 16.367 MHz crystal */ | 58 | /* Initialize processor: 16.367 MHz crystal */ |
58 | at91sam9263_initialize(16367660); | 59 | at91sam9263_initialize(16367660); |
@@ -198,11 +199,6 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
198 | .rdy_pin = AT91_PIN_PA22, | 199 | .rdy_pin = AT91_PIN_PA22, |
199 | .enable_pin = AT91_PIN_PD15, | 200 | .enable_pin = AT91_PIN_PD15, |
200 | .partition_info = nand_partitions, | 201 | .partition_info = nand_partitions, |
201 | #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) | ||
202 | .bus_width_16 = 1, | ||
203 | #else | ||
204 | .bus_width_16 = 0, | ||
205 | #endif | ||
206 | }; | 202 | }; |
207 | 203 | ||
208 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | 204 | static struct sam9_smc_config __initdata ek_nand_smc_config = { |
@@ -225,6 +221,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = { | |||
225 | 221 | ||
226 | static void __init ek_add_device_nand(void) | 222 | static void __init ek_add_device_nand(void) |
227 | { | 223 | { |
224 | ek_nand_data.bus_width_16 = !board_have_nand_8bit(); | ||
228 | /* setup bus-width (8 or 16) */ | 225 | /* setup bus-width (8 or 16) */ |
229 | if (ek_nand_data.bus_width_16) | 226 | if (ek_nand_data.bus_width_16) |
230 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; | 227 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; |
@@ -454,9 +451,9 @@ static void __init ek_board_init(void) | |||
454 | 451 | ||
455 | MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK") | 452 | MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK") |
456 | /* Maintainer: Atmel */ | 453 | /* Maintainer: Atmel */ |
457 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
458 | .timer = &at91sam926x_timer, | 454 | .timer = &at91sam926x_timer, |
459 | .map_io = ek_map_io, | 455 | .map_io = at91sam9263_map_io, |
456 | .init_early = ek_init_early, | ||
460 | .init_irq = ek_init_irq, | 457 | .init_irq = ek_init_irq, |
461 | .init_machine = ek_board_init, | 458 | .init_machine = ek_board_init, |
462 | MACHINE_END | 459 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index ca8198b3c168..7624cf0d006b 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <mach/board.h> | 43 | #include <mach/board.h> |
44 | #include <mach/gpio.h> | 44 | #include <mach/gpio.h> |
45 | #include <mach/at91sam9_smc.h> | 45 | #include <mach/at91sam9_smc.h> |
46 | #include <mach/system_rev.h> | ||
46 | 47 | ||
47 | #include "sam9_smc.h" | 48 | #include "sam9_smc.h" |
48 | #include "generic.h" | 49 | #include "generic.h" |
@@ -60,7 +61,7 @@ static int inline ek_have_2mmc(void) | |||
60 | } | 61 | } |
61 | 62 | ||
62 | 63 | ||
63 | static void __init ek_map_io(void) | 64 | static void __init ek_init_early(void) |
64 | { | 65 | { |
65 | /* Initialize processor: 18.432 MHz crystal */ | 66 | /* Initialize processor: 18.432 MHz crystal */ |
66 | at91sam9260_initialize(18432000); | 67 | at91sam9260_initialize(18432000); |
@@ -175,11 +176,6 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
175 | .rdy_pin = AT91_PIN_PC13, | 176 | .rdy_pin = AT91_PIN_PC13, |
176 | .enable_pin = AT91_PIN_PC14, | 177 | .enable_pin = AT91_PIN_PC14, |
177 | .partition_info = nand_partitions, | 178 | .partition_info = nand_partitions, |
178 | #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) | ||
179 | .bus_width_16 = 1, | ||
180 | #else | ||
181 | .bus_width_16 = 0, | ||
182 | #endif | ||
183 | }; | 179 | }; |
184 | 180 | ||
185 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | 181 | static struct sam9_smc_config __initdata ek_nand_smc_config = { |
@@ -202,6 +198,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = { | |||
202 | 198 | ||
203 | static void __init ek_add_device_nand(void) | 199 | static void __init ek_add_device_nand(void) |
204 | { | 200 | { |
201 | ek_nand_data.bus_width_16 = !board_have_nand_8bit(); | ||
205 | /* setup bus-width (8 or 16) */ | 202 | /* setup bus-width (8 or 16) */ |
206 | if (ek_nand_data.bus_width_16) | 203 | if (ek_nand_data.bus_width_16) |
207 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; | 204 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; |
@@ -406,18 +403,18 @@ static void __init ek_board_init(void) | |||
406 | 403 | ||
407 | MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK") | 404 | MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK") |
408 | /* Maintainer: Atmel */ | 405 | /* Maintainer: Atmel */ |
409 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
410 | .timer = &at91sam926x_timer, | 406 | .timer = &at91sam926x_timer, |
411 | .map_io = ek_map_io, | 407 | .map_io = at91sam9260_map_io, |
408 | .init_early = ek_init_early, | ||
412 | .init_irq = ek_init_irq, | 409 | .init_irq = ek_init_irq, |
413 | .init_machine = ek_board_init, | 410 | .init_machine = ek_board_init, |
414 | MACHINE_END | 411 | MACHINE_END |
415 | 412 | ||
416 | MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod") | 413 | MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod") |
417 | /* Maintainer: Atmel */ | 414 | /* Maintainer: Atmel */ |
418 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
419 | .timer = &at91sam926x_timer, | 415 | .timer = &at91sam926x_timer, |
420 | .map_io = ek_map_io, | 416 | .map_io = at91sam9260_map_io, |
417 | .init_early = ek_init_early, | ||
421 | .init_irq = ek_init_irq, | 418 | .init_irq = ek_init_irq, |
422 | .init_machine = ek_board_init, | 419 | .init_machine = ek_board_init, |
423 | MACHINE_END | 420 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index 6c999dbd2bcf..063c95d0e8f0 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c | |||
@@ -41,12 +41,13 @@ | |||
41 | #include <mach/gpio.h> | 41 | #include <mach/gpio.h> |
42 | #include <mach/at91sam9_smc.h> | 42 | #include <mach/at91sam9_smc.h> |
43 | #include <mach/at91_shdwc.h> | 43 | #include <mach/at91_shdwc.h> |
44 | #include <mach/system_rev.h> | ||
44 | 45 | ||
45 | #include "sam9_smc.h" | 46 | #include "sam9_smc.h" |
46 | #include "generic.h" | 47 | #include "generic.h" |
47 | 48 | ||
48 | 49 | ||
49 | static void __init ek_map_io(void) | 50 | static void __init ek_init_early(void) |
50 | { | 51 | { |
51 | /* Initialize processor: 12.000 MHz crystal */ | 52 | /* Initialize processor: 12.000 MHz crystal */ |
52 | at91sam9g45_initialize(12000000); | 53 | at91sam9g45_initialize(12000000); |
@@ -155,11 +156,6 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
155 | .rdy_pin = AT91_PIN_PC8, | 156 | .rdy_pin = AT91_PIN_PC8, |
156 | .enable_pin = AT91_PIN_PC14, | 157 | .enable_pin = AT91_PIN_PC14, |
157 | .partition_info = nand_partitions, | 158 | .partition_info = nand_partitions, |
158 | #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) | ||
159 | .bus_width_16 = 1, | ||
160 | #else | ||
161 | .bus_width_16 = 0, | ||
162 | #endif | ||
163 | }; | 159 | }; |
164 | 160 | ||
165 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | 161 | static struct sam9_smc_config __initdata ek_nand_smc_config = { |
@@ -182,6 +178,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = { | |||
182 | 178 | ||
183 | static void __init ek_add_device_nand(void) | 179 | static void __init ek_add_device_nand(void) |
184 | { | 180 | { |
181 | ek_nand_data.bus_width_16 = !board_have_nand_8bit(); | ||
185 | /* setup bus-width (8 or 16) */ | 182 | /* setup bus-width (8 or 16) */ |
186 | if (ek_nand_data.bus_width_16) | 183 | if (ek_nand_data.bus_width_16) |
187 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; | 184 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; |
@@ -424,9 +421,9 @@ static void __init ek_board_init(void) | |||
424 | 421 | ||
425 | MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK") | 422 | MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK") |
426 | /* Maintainer: Atmel */ | 423 | /* Maintainer: Atmel */ |
427 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
428 | .timer = &at91sam926x_timer, | 424 | .timer = &at91sam926x_timer, |
429 | .map_io = ek_map_io, | 425 | .map_io = at91sam9g45_map_io, |
426 | .init_early = ek_init_early, | ||
430 | .init_irq = ek_init_irq, | 427 | .init_irq = ek_init_irq, |
431 | .init_machine = ek_board_init, | 428 | .init_machine = ek_board_init, |
432 | MACHINE_END | 429 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index 3bf3408e94c1..effb399a80a6 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c | |||
@@ -38,7 +38,7 @@ | |||
38 | #include "generic.h" | 38 | #include "generic.h" |
39 | 39 | ||
40 | 40 | ||
41 | static void __init ek_map_io(void) | 41 | static void __init ek_init_early(void) |
42 | { | 42 | { |
43 | /* Initialize processor: 12.000 MHz crystal */ | 43 | /* Initialize processor: 12.000 MHz crystal */ |
44 | at91sam9rl_initialize(12000000); | 44 | at91sam9rl_initialize(12000000); |
@@ -329,9 +329,9 @@ static void __init ek_board_init(void) | |||
329 | 329 | ||
330 | MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK") | 330 | MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK") |
331 | /* Maintainer: Atmel */ | 331 | /* Maintainer: Atmel */ |
332 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
333 | .timer = &at91sam926x_timer, | 332 | .timer = &at91sam926x_timer, |
334 | .map_io = ek_map_io, | 333 | .map_io = at91sam9rl_map_io, |
334 | .init_early = ek_init_early, | ||
335 | .init_irq = ek_init_irq, | 335 | .init_irq = ek_init_irq, |
336 | .init_machine = ek_board_init, | 336 | .init_machine = ek_board_init, |
337 | MACHINE_END | 337 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c index 17f7d9b32142..3eb0a1153cc8 100644 --- a/arch/arm/mach-at91/board-snapper9260.c +++ b/arch/arm/mach-at91/board-snapper9260.c | |||
@@ -40,7 +40,7 @@ | |||
40 | 40 | ||
41 | #define SNAPPER9260_IO_EXP_GPIO(x) (NR_BUILTIN_GPIO + (x)) | 41 | #define SNAPPER9260_IO_EXP_GPIO(x) (NR_BUILTIN_GPIO + (x)) |
42 | 42 | ||
43 | static void __init snapper9260_map_io(void) | 43 | static void __init snapper9260_init_early(void) |
44 | { | 44 | { |
45 | at91sam9260_initialize(18432000); | 45 | at91sam9260_initialize(18432000); |
46 | 46 | ||
@@ -178,9 +178,9 @@ static void __init snapper9260_board_init(void) | |||
178 | } | 178 | } |
179 | 179 | ||
180 | MACHINE_START(SNAPPER_9260, "Bluewater Systems Snapper 9260/9G20 module") | 180 | MACHINE_START(SNAPPER_9260, "Bluewater Systems Snapper 9260/9G20 module") |
181 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
182 | .timer = &at91sam926x_timer, | 181 | .timer = &at91sam926x_timer, |
183 | .map_io = snapper9260_map_io, | 182 | .map_io = at91sam9260_map_io, |
183 | .init_early = snapper9260_init_early, | ||
184 | .init_irq = snapper9260_init_irq, | 184 | .init_irq = snapper9260_init_irq, |
185 | .init_machine = snapper9260_board_init, | 185 | .init_machine = snapper9260_board_init, |
186 | MACHINE_END | 186 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c index f8902b118960..5e5c85688f5f 100644 --- a/arch/arm/mach-at91/board-stamp9g20.c +++ b/arch/arm/mach-at91/board-stamp9g20.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include "generic.h" | 32 | #include "generic.h" |
33 | 33 | ||
34 | 34 | ||
35 | void __init stamp9g20_map_io(void) | 35 | void __init stamp9g20_init_early(void) |
36 | { | 36 | { |
37 | /* Initialize processor: 18.432 MHz crystal */ | 37 | /* Initialize processor: 18.432 MHz crystal */ |
38 | at91sam9260_initialize(18432000); | 38 | at91sam9260_initialize(18432000); |
@@ -44,9 +44,9 @@ void __init stamp9g20_map_io(void) | |||
44 | at91_set_serial_console(0); | 44 | at91_set_serial_console(0); |
45 | } | 45 | } |
46 | 46 | ||
47 | static void __init stamp9g20evb_map_io(void) | 47 | static void __init stamp9g20evb_init_early(void) |
48 | { | 48 | { |
49 | stamp9g20_map_io(); | 49 | stamp9g20_init_early(); |
50 | 50 | ||
51 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ | 51 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ |
52 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS | 52 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS |
@@ -54,9 +54,9 @@ static void __init stamp9g20evb_map_io(void) | |||
54 | | ATMEL_UART_DCD | ATMEL_UART_RI); | 54 | | ATMEL_UART_DCD | ATMEL_UART_RI); |
55 | } | 55 | } |
56 | 56 | ||
57 | static void __init portuxg20_map_io(void) | 57 | static void __init portuxg20_init_early(void) |
58 | { | 58 | { |
59 | stamp9g20_map_io(); | 59 | stamp9g20_init_early(); |
60 | 60 | ||
61 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ | 61 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ |
62 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS | 62 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS |
@@ -298,18 +298,18 @@ static void __init stamp9g20evb_board_init(void) | |||
298 | 298 | ||
299 | MACHINE_START(PORTUXG20, "taskit PortuxG20") | 299 | MACHINE_START(PORTUXG20, "taskit PortuxG20") |
300 | /* Maintainer: taskit GmbH */ | 300 | /* Maintainer: taskit GmbH */ |
301 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
302 | .timer = &at91sam926x_timer, | 301 | .timer = &at91sam926x_timer, |
303 | .map_io = portuxg20_map_io, | 302 | .map_io = at91sam9260_map_io, |
303 | .init_early = portuxg20_init_early, | ||
304 | .init_irq = init_irq, | 304 | .init_irq = init_irq, |
305 | .init_machine = portuxg20_board_init, | 305 | .init_machine = portuxg20_board_init, |
306 | MACHINE_END | 306 | MACHINE_END |
307 | 307 | ||
308 | MACHINE_START(STAMP9G20, "taskit Stamp9G20") | 308 | MACHINE_START(STAMP9G20, "taskit Stamp9G20") |
309 | /* Maintainer: taskit GmbH */ | 309 | /* Maintainer: taskit GmbH */ |
310 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
311 | .timer = &at91sam926x_timer, | 310 | .timer = &at91sam926x_timer, |
312 | .map_io = stamp9g20evb_map_io, | 311 | .map_io = at91sam9260_map_io, |
312 | .init_early = stamp9g20evb_init_early, | ||
313 | .init_irq = init_irq, | 313 | .init_irq = init_irq, |
314 | .init_machine = stamp9g20evb_board_init, | 314 | .init_machine = stamp9g20evb_board_init, |
315 | MACHINE_END | 315 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-usb-a9260.c b/arch/arm/mach-at91/board-usb-a9260.c index 07784baeae84..0e784e6fedec 100644 --- a/arch/arm/mach-at91/board-usb-a9260.c +++ b/arch/arm/mach-at91/board-usb-a9260.c | |||
@@ -48,7 +48,7 @@ | |||
48 | #include "generic.h" | 48 | #include "generic.h" |
49 | 49 | ||
50 | 50 | ||
51 | static void __init ek_map_io(void) | 51 | static void __init ek_init_early(void) |
52 | { | 52 | { |
53 | /* Initialize processor: 12.000 MHz crystal */ | 53 | /* Initialize processor: 12.000 MHz crystal */ |
54 | at91sam9260_initialize(12000000); | 54 | at91sam9260_initialize(12000000); |
@@ -228,9 +228,9 @@ static void __init ek_board_init(void) | |||
228 | 228 | ||
229 | MACHINE_START(USB_A9260, "CALAO USB_A9260") | 229 | MACHINE_START(USB_A9260, "CALAO USB_A9260") |
230 | /* Maintainer: calao-systems */ | 230 | /* Maintainer: calao-systems */ |
231 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
232 | .timer = &at91sam926x_timer, | 231 | .timer = &at91sam926x_timer, |
233 | .map_io = ek_map_io, | 232 | .map_io = at91sam9260_map_io, |
233 | .init_early = ek_init_early, | ||
234 | .init_irq = ek_init_irq, | 234 | .init_irq = ek_init_irq, |
235 | .init_machine = ek_board_init, | 235 | .init_machine = ek_board_init, |
236 | MACHINE_END | 236 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-usb-a9263.c b/arch/arm/mach-at91/board-usb-a9263.c index b614508931fd..cf626dd14b2c 100644 --- a/arch/arm/mach-at91/board-usb-a9263.c +++ b/arch/arm/mach-at91/board-usb-a9263.c | |||
@@ -47,7 +47,7 @@ | |||
47 | #include "generic.h" | 47 | #include "generic.h" |
48 | 48 | ||
49 | 49 | ||
50 | static void __init ek_map_io(void) | 50 | static void __init ek_init_early(void) |
51 | { | 51 | { |
52 | /* Initialize processor: 12.00 MHz crystal */ | 52 | /* Initialize processor: 12.00 MHz crystal */ |
53 | at91sam9263_initialize(12000000); | 53 | at91sam9263_initialize(12000000); |
@@ -244,9 +244,9 @@ static void __init ek_board_init(void) | |||
244 | 244 | ||
245 | MACHINE_START(USB_A9263, "CALAO USB_A9263") | 245 | MACHINE_START(USB_A9263, "CALAO USB_A9263") |
246 | /* Maintainer: calao-systems */ | 246 | /* Maintainer: calao-systems */ |
247 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
248 | .timer = &at91sam926x_timer, | 247 | .timer = &at91sam926x_timer, |
249 | .map_io = ek_map_io, | 248 | .map_io = at91sam9263_map_io, |
249 | .init_early = ek_init_early, | ||
250 | .init_irq = ek_init_irq, | 250 | .init_irq = ek_init_irq, |
251 | .init_machine = ek_board_init, | 251 | .init_machine = ek_board_init, |
252 | MACHINE_END | 252 | MACHINE_END |
diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c index e0f0080eb639..c208cc334d7d 100644 --- a/arch/arm/mach-at91/board-yl-9200.c +++ b/arch/arm/mach-at91/board-yl-9200.c | |||
@@ -45,14 +45,18 @@ | |||
45 | #include <mach/board.h> | 45 | #include <mach/board.h> |
46 | #include <mach/gpio.h> | 46 | #include <mach/gpio.h> |
47 | #include <mach/at91rm9200_mc.h> | 47 | #include <mach/at91rm9200_mc.h> |
48 | #include <mach/cpu.h> | ||
48 | 49 | ||
49 | #include "generic.h" | 50 | #include "generic.h" |
50 | 51 | ||
51 | 52 | ||
52 | static void __init yl9200_map_io(void) | 53 | static void __init yl9200_init_early(void) |
53 | { | 54 | { |
55 | /* Set cpu type: PQFP */ | ||
56 | at91rm9200_set_type(ARCH_REVISON_9200_PQFP); | ||
57 | |||
54 | /* Initialize processor: 18.432 MHz crystal */ | 58 | /* Initialize processor: 18.432 MHz crystal */ |
55 | at91rm9200_initialize(18432000, AT91RM9200_PQFP); | 59 | at91rm9200_initialize(18432000); |
56 | 60 | ||
57 | /* Setup the LEDs D2=PB17 (timer), D3=PB16 (cpu) */ | 61 | /* Setup the LEDs D2=PB17 (timer), D3=PB16 (cpu) */ |
58 | at91_init_leds(AT91_PIN_PB16, AT91_PIN_PB17); | 62 | at91_init_leds(AT91_PIN_PB16, AT91_PIN_PB17); |
@@ -594,9 +598,9 @@ static void __init yl9200_board_init(void) | |||
594 | 598 | ||
595 | MACHINE_START(YL9200, "uCdragon YL-9200") | 599 | MACHINE_START(YL9200, "uCdragon YL-9200") |
596 | /* Maintainer: S.Birtles */ | 600 | /* Maintainer: S.Birtles */ |
597 | .boot_params = AT91_SDRAM_BASE + 0x100, | ||
598 | .timer = &at91rm9200_timer, | 601 | .timer = &at91rm9200_timer, |
599 | .map_io = yl9200_map_io, | 602 | .map_io = at91rm9200_map_io, |
603 | .init_early = yl9200_init_early, | ||
600 | .init_irq = yl9200_init_irq, | 604 | .init_irq = yl9200_init_irq, |
601 | .init_machine = yl9200_board_init, | 605 | .init_machine = yl9200_board_init, |
602 | MACHINE_END | 606 | MACHINE_END |
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c index 9113da6845f1..61873f3aa92d 100644 --- a/arch/arm/mach-at91/clock.c +++ b/arch/arm/mach-at91/clock.c | |||
@@ -163,7 +163,7 @@ static struct clk udpck = { | |||
163 | .parent = &pllb, | 163 | .parent = &pllb, |
164 | .mode = pmc_sys_mode, | 164 | .mode = pmc_sys_mode, |
165 | }; | 165 | }; |
166 | static struct clk utmi_clk = { | 166 | struct clk utmi_clk = { |
167 | .name = "utmi_clk", | 167 | .name = "utmi_clk", |
168 | .parent = &main_clk, | 168 | .parent = &main_clk, |
169 | .pmc_mask = AT91_PMC_UPLLEN, /* in CKGR_UCKR */ | 169 | .pmc_mask = AT91_PMC_UPLLEN, /* in CKGR_UCKR */ |
@@ -182,7 +182,7 @@ static struct clk uhpck = { | |||
182 | * memory, interfaces to on-chip peripherals, the AIC, and sometimes more | 182 | * memory, interfaces to on-chip peripherals, the AIC, and sometimes more |
183 | * (e.g baud rate generation). It's sourced from one of the primary clocks. | 183 | * (e.g baud rate generation). It's sourced from one of the primary clocks. |
184 | */ | 184 | */ |
185 | static struct clk mck = { | 185 | struct clk mck = { |
186 | .name = "mck", | 186 | .name = "mck", |
187 | .pmc_mask = AT91_PMC_MCKRDY, /* in PMC_SR */ | 187 | .pmc_mask = AT91_PMC_MCKRDY, /* in PMC_SR */ |
188 | }; | 188 | }; |
@@ -215,43 +215,6 @@ static struct clk __init *at91_css_to_clk(unsigned long css) | |||
215 | return NULL; | 215 | return NULL; |
216 | } | 216 | } |
217 | 217 | ||
218 | /* | ||
219 | * Associate a particular clock with a function (eg, "uart") and device. | ||
220 | * The drivers can then request the same 'function' with several different | ||
221 | * devices and not care about which clock name to use. | ||
222 | */ | ||
223 | void __init at91_clock_associate(const char *id, struct device *dev, const char *func) | ||
224 | { | ||
225 | struct clk *clk = clk_get(NULL, id); | ||
226 | |||
227 | if (!dev || !clk || !IS_ERR(clk_get(dev, func))) | ||
228 | return; | ||
229 | |||
230 | clk->function = func; | ||
231 | clk->dev = dev; | ||
232 | } | ||
233 | |||
234 | /* clocks cannot be de-registered no refcounting necessary */ | ||
235 | struct clk *clk_get(struct device *dev, const char *id) | ||
236 | { | ||
237 | struct clk *clk; | ||
238 | |||
239 | list_for_each_entry(clk, &clocks, node) { | ||
240 | if (strcmp(id, clk->name) == 0) | ||
241 | return clk; | ||
242 | if (clk->function && (dev == clk->dev) && strcmp(id, clk->function) == 0) | ||
243 | return clk; | ||
244 | } | ||
245 | |||
246 | return ERR_PTR(-ENOENT); | ||
247 | } | ||
248 | EXPORT_SYMBOL(clk_get); | ||
249 | |||
250 | void clk_put(struct clk *clk) | ||
251 | { | ||
252 | } | ||
253 | EXPORT_SYMBOL(clk_put); | ||
254 | |||
255 | static void __clk_enable(struct clk *clk) | 218 | static void __clk_enable(struct clk *clk) |
256 | { | 219 | { |
257 | if (clk->parent) | 220 | if (clk->parent) |
@@ -498,32 +461,38 @@ postcore_initcall(at91_clk_debugfs_init); | |||
498 | /*------------------------------------------------------------------------*/ | 461 | /*------------------------------------------------------------------------*/ |
499 | 462 | ||
500 | /* Register a new clock */ | 463 | /* Register a new clock */ |
464 | static void __init at91_clk_add(struct clk *clk) | ||
465 | { | ||
466 | list_add_tail(&clk->node, &clocks); | ||
467 | |||
468 | clk->cl.con_id = clk->name; | ||
469 | clk->cl.clk = clk; | ||
470 | clkdev_add(&clk->cl); | ||
471 | } | ||
472 | |||
501 | int __init clk_register(struct clk *clk) | 473 | int __init clk_register(struct clk *clk) |
502 | { | 474 | { |
503 | if (clk_is_peripheral(clk)) { | 475 | if (clk_is_peripheral(clk)) { |
504 | if (!clk->parent) | 476 | if (!clk->parent) |
505 | clk->parent = &mck; | 477 | clk->parent = &mck; |
506 | clk->mode = pmc_periph_mode; | 478 | clk->mode = pmc_periph_mode; |
507 | list_add_tail(&clk->node, &clocks); | ||
508 | } | 479 | } |
509 | else if (clk_is_sys(clk)) { | 480 | else if (clk_is_sys(clk)) { |
510 | clk->parent = &mck; | 481 | clk->parent = &mck; |
511 | clk->mode = pmc_sys_mode; | 482 | clk->mode = pmc_sys_mode; |
512 | |||
513 | list_add_tail(&clk->node, &clocks); | ||
514 | } | 483 | } |
515 | #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS | 484 | #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS |
516 | else if (clk_is_programmable(clk)) { | 485 | else if (clk_is_programmable(clk)) { |
517 | clk->mode = pmc_sys_mode; | 486 | clk->mode = pmc_sys_mode; |
518 | init_programmable_clock(clk); | 487 | init_programmable_clock(clk); |
519 | list_add_tail(&clk->node, &clocks); | ||
520 | } | 488 | } |
521 | #endif | 489 | #endif |
522 | 490 | ||
491 | at91_clk_add(clk); | ||
492 | |||
523 | return 0; | 493 | return 0; |
524 | } | 494 | } |
525 | 495 | ||
526 | |||
527 | /*------------------------------------------------------------------------*/ | 496 | /*------------------------------------------------------------------------*/ |
528 | 497 | ||
529 | static u32 __init at91_pll_rate(struct clk *pll, u32 freq, u32 reg) | 498 | static u32 __init at91_pll_rate(struct clk *pll, u32 freq, u32 reg) |
@@ -630,7 +599,7 @@ static void __init at91_pllb_usbfs_clock_init(unsigned long main_clock) | |||
630 | at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP); | 599 | at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP); |
631 | } else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || | 600 | } else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || |
632 | cpu_is_at91sam9263() || cpu_is_at91sam9g20() || | 601 | cpu_is_at91sam9263() || cpu_is_at91sam9g20() || |
633 | cpu_is_at91sam9g10() || cpu_is_at572d940hf()) { | 602 | cpu_is_at91sam9g10()) { |
634 | uhpck.pmc_mask = AT91SAM926x_PMC_UHP; | 603 | uhpck.pmc_mask = AT91SAM926x_PMC_UHP; |
635 | udpck.pmc_mask = AT91SAM926x_PMC_UDP; | 604 | udpck.pmc_mask = AT91SAM926x_PMC_UDP; |
636 | } else if (cpu_is_at91cap9()) { | 605 | } else if (cpu_is_at91cap9()) { |
@@ -754,19 +723,19 @@ int __init at91_clock_init(unsigned long main_clock) | |||
754 | 723 | ||
755 | /* Register the PMC's standard clocks */ | 724 | /* Register the PMC's standard clocks */ |
756 | for (i = 0; i < ARRAY_SIZE(standard_pmc_clocks); i++) | 725 | for (i = 0; i < ARRAY_SIZE(standard_pmc_clocks); i++) |
757 | list_add_tail(&standard_pmc_clocks[i]->node, &clocks); | 726 | at91_clk_add(standard_pmc_clocks[i]); |
758 | 727 | ||
759 | if (cpu_has_pllb()) | 728 | if (cpu_has_pllb()) |
760 | list_add_tail(&pllb.node, &clocks); | 729 | at91_clk_add(&pllb); |
761 | 730 | ||
762 | if (cpu_has_uhp()) | 731 | if (cpu_has_uhp()) |
763 | list_add_tail(&uhpck.node, &clocks); | 732 | at91_clk_add(&uhpck); |
764 | 733 | ||
765 | if (cpu_has_udpfs()) | 734 | if (cpu_has_udpfs()) |
766 | list_add_tail(&udpck.node, &clocks); | 735 | at91_clk_add(&udpck); |
767 | 736 | ||
768 | if (cpu_has_utmi()) | 737 | if (cpu_has_utmi()) |
769 | list_add_tail(&utmi_clk.node, &clocks); | 738 | at91_clk_add(&utmi_clk); |
770 | 739 | ||
771 | /* MCK and CPU clock are "always on" */ | 740 | /* MCK and CPU clock are "always on" */ |
772 | clk_enable(&mck); | 741 | clk_enable(&mck); |
diff --git a/arch/arm/mach-at91/clock.h b/arch/arm/mach-at91/clock.h index 6cf4b78e175d..c2e63e47dcbe 100644 --- a/arch/arm/mach-at91/clock.h +++ b/arch/arm/mach-at91/clock.h | |||
@@ -6,6 +6,8 @@ | |||
6 | * published by the Free Software Foundation. | 6 | * published by the Free Software Foundation. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/clkdev.h> | ||
10 | |||
9 | #define CLK_TYPE_PRIMARY 0x1 | 11 | #define CLK_TYPE_PRIMARY 0x1 |
10 | #define CLK_TYPE_PLL 0x2 | 12 | #define CLK_TYPE_PLL 0x2 |
11 | #define CLK_TYPE_PROGRAMMABLE 0x4 | 13 | #define CLK_TYPE_PROGRAMMABLE 0x4 |
@@ -16,8 +18,7 @@ | |||
16 | struct clk { | 18 | struct clk { |
17 | struct list_head node; | 19 | struct list_head node; |
18 | const char *name; /* unique clock name */ | 20 | const char *name; /* unique clock name */ |
19 | const char *function; /* function of the clock */ | 21 | struct clk_lookup cl; |
20 | struct device *dev; /* device associated with function */ | ||
21 | unsigned long rate_hz; | 22 | unsigned long rate_hz; |
22 | struct clk *parent; | 23 | struct clk *parent; |
23 | u32 pmc_mask; | 24 | u32 pmc_mask; |
@@ -29,3 +30,18 @@ struct clk { | |||
29 | 30 | ||
30 | 31 | ||
31 | extern int __init clk_register(struct clk *clk); | 32 | extern int __init clk_register(struct clk *clk); |
33 | extern struct clk mck; | ||
34 | extern struct clk utmi_clk; | ||
35 | |||
36 | #define CLKDEV_CON_ID(_id, _clk) \ | ||
37 | { \ | ||
38 | .con_id = _id, \ | ||
39 | .clk = _clk, \ | ||
40 | } | ||
41 | |||
42 | #define CLKDEV_CON_DEV_ID(_con_id, _dev_id, _clk) \ | ||
43 | { \ | ||
44 | .con_id = _con_id, \ | ||
45 | .dev_id = _dev_id, \ | ||
46 | .clk = _clk, \ | ||
47 | } | ||
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 0c66deb2db39..8ff3418f3430 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h | |||
@@ -8,8 +8,21 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/clkdev.h> | ||
12 | |||
13 | /* Map io */ | ||
14 | extern void __init at91rm9200_map_io(void); | ||
15 | extern void __init at91sam9260_map_io(void); | ||
16 | extern void __init at91sam9261_map_io(void); | ||
17 | extern void __init at91sam9263_map_io(void); | ||
18 | extern void __init at91sam9rl_map_io(void); | ||
19 | extern void __init at91sam9g45_map_io(void); | ||
20 | extern void __init at91x40_map_io(void); | ||
21 | extern void __init at91cap9_map_io(void); | ||
22 | |||
11 | /* Processors */ | 23 | /* Processors */ |
12 | extern void __init at91rm9200_initialize(unsigned long main_clock, unsigned short banks); | 24 | extern void __init at91rm9200_set_type(int type); |
25 | extern void __init at91rm9200_initialize(unsigned long main_clock); | ||
13 | extern void __init at91sam9260_initialize(unsigned long main_clock); | 26 | extern void __init at91sam9260_initialize(unsigned long main_clock); |
14 | extern void __init at91sam9261_initialize(unsigned long main_clock); | 27 | extern void __init at91sam9261_initialize(unsigned long main_clock); |
15 | extern void __init at91sam9263_initialize(unsigned long main_clock); | 28 | extern void __init at91sam9263_initialize(unsigned long main_clock); |
@@ -17,7 +30,6 @@ extern void __init at91sam9rl_initialize(unsigned long main_clock); | |||
17 | extern void __init at91sam9g45_initialize(unsigned long main_clock); | 30 | extern void __init at91sam9g45_initialize(unsigned long main_clock); |
18 | extern void __init at91x40_initialize(unsigned long main_clock); | 31 | extern void __init at91x40_initialize(unsigned long main_clock); |
19 | extern void __init at91cap9_initialize(unsigned long main_clock); | 32 | extern void __init at91cap9_initialize(unsigned long main_clock); |
20 | extern void __init at572d940hf_initialize(unsigned long main_clock); | ||
21 | 33 | ||
22 | /* Interrupts */ | 34 | /* Interrupts */ |
23 | extern void __init at91rm9200_init_interrupts(unsigned int priority[]); | 35 | extern void __init at91rm9200_init_interrupts(unsigned int priority[]); |
@@ -28,7 +40,6 @@ extern void __init at91sam9rl_init_interrupts(unsigned int priority[]); | |||
28 | extern void __init at91sam9g45_init_interrupts(unsigned int priority[]); | 40 | extern void __init at91sam9g45_init_interrupts(unsigned int priority[]); |
29 | extern void __init at91x40_init_interrupts(unsigned int priority[]); | 41 | extern void __init at91x40_init_interrupts(unsigned int priority[]); |
30 | extern void __init at91cap9_init_interrupts(unsigned int priority[]); | 42 | extern void __init at91cap9_init_interrupts(unsigned int priority[]); |
31 | extern void __init at572d940hf_init_interrupts(unsigned int priority[]); | ||
32 | extern void __init at91_aic_init(unsigned int priority[]); | 43 | extern void __init at91_aic_init(unsigned int priority[]); |
33 | 44 | ||
34 | /* Timer */ | 45 | /* Timer */ |
@@ -39,8 +50,19 @@ extern struct sys_timer at91x40_timer; | |||
39 | 50 | ||
40 | /* Clocks */ | 51 | /* Clocks */ |
41 | extern int __init at91_clock_init(unsigned long main_clock); | 52 | extern int __init at91_clock_init(unsigned long main_clock); |
53 | /* | ||
54 | * function to specify the clock of the default console. As we do not | ||
55 | * use the device/driver bus, the dev_name is not intialize. So we need | ||
56 | * to link the clock to a specific con_id only "usart" | ||
57 | */ | ||
58 | extern void __init at91rm9200_set_console_clock(int id); | ||
59 | extern void __init at91sam9260_set_console_clock(int id); | ||
60 | extern void __init at91sam9261_set_console_clock(int id); | ||
61 | extern void __init at91sam9263_set_console_clock(int id); | ||
62 | extern void __init at91sam9rl_set_console_clock(int id); | ||
63 | extern void __init at91sam9g45_set_console_clock(int id); | ||
64 | extern void __init at91cap9_set_console_clock(int id); | ||
42 | struct device; | 65 | struct device; |
43 | extern void __init at91_clock_associate(const char *id, struct device *dev, const char *func); | ||
44 | 66 | ||
45 | /* Power Management */ | 67 | /* Power Management */ |
46 | extern void at91_irq_suspend(void); | 68 | extern void at91_irq_suspend(void); |
diff --git a/arch/arm/mach-at91/include/mach/at572d940hf.h b/arch/arm/mach-at91/include/mach/at572d940hf.h deleted file mode 100644 index be510cfc56be..000000000000 --- a/arch/arm/mach-at91/include/mach/at572d940hf.h +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | /* | ||
2 | * include/mach/at572d940hf.h | ||
3 | * | ||
4 | * Antonio R. Costa <costa.antonior@gmail.com> | ||
5 | * Copyright (C) 2008 Atmel | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #ifndef AT572D940HF_H | ||
24 | #define AT572D940HF_H | ||
25 | |||
26 | /* | ||
27 | * Peripheral identifiers/interrupts. | ||
28 | */ | ||
29 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
30 | #define AT91_ID_SYS 1 /* System Peripherals */ | ||
31 | #define AT572D940HF_ID_PIOA 2 /* Parallel IO Controller A */ | ||
32 | #define AT572D940HF_ID_PIOB 3 /* Parallel IO Controller B */ | ||
33 | #define AT572D940HF_ID_PIOC 4 /* Parallel IO Controller C */ | ||
34 | #define AT572D940HF_ID_EMAC 5 /* MACB ethernet controller */ | ||
35 | #define AT572D940HF_ID_US0 6 /* USART 0 */ | ||
36 | #define AT572D940HF_ID_US1 7 /* USART 1 */ | ||
37 | #define AT572D940HF_ID_US2 8 /* USART 2 */ | ||
38 | #define AT572D940HF_ID_MCI 9 /* Multimedia Card Interface */ | ||
39 | #define AT572D940HF_ID_UDP 10 /* USB Device Port */ | ||
40 | #define AT572D940HF_ID_TWI0 11 /* Two-Wire Interface 0 */ | ||
41 | #define AT572D940HF_ID_SPI0 12 /* Serial Peripheral Interface 0 */ | ||
42 | #define AT572D940HF_ID_SPI1 13 /* Serial Peripheral Interface 1 */ | ||
43 | #define AT572D940HF_ID_SSC0 14 /* Serial Synchronous Controller 0 */ | ||
44 | #define AT572D940HF_ID_SSC1 15 /* Serial Synchronous Controller 1 */ | ||
45 | #define AT572D940HF_ID_SSC2 16 /* Serial Synchronous Controller 2 */ | ||
46 | #define AT572D940HF_ID_TC0 17 /* Timer Counter 0 */ | ||
47 | #define AT572D940HF_ID_TC1 18 /* Timer Counter 1 */ | ||
48 | #define AT572D940HF_ID_TC2 19 /* Timer Counter 2 */ | ||
49 | #define AT572D940HF_ID_UHP 20 /* USB Host port */ | ||
50 | #define AT572D940HF_ID_SSC3 21 /* Serial Synchronous Controller 3 */ | ||
51 | #define AT572D940HF_ID_TWI1 22 /* Two-Wire Interface 1 */ | ||
52 | #define AT572D940HF_ID_CAN0 23 /* CAN Controller 0 */ | ||
53 | #define AT572D940HF_ID_CAN1 24 /* CAN Controller 1 */ | ||
54 | #define AT572D940HF_ID_MHALT 25 /* mAgicV HALT line */ | ||
55 | #define AT572D940HF_ID_MSIRQ0 26 /* mAgicV SIRQ0 line */ | ||
56 | #define AT572D940HF_ID_MEXC 27 /* mAgicV exception line */ | ||
57 | #define AT572D940HF_ID_MEDMA 28 /* mAgicV end of DMA line */ | ||
58 | #define AT572D940HF_ID_IRQ0 29 /* External Interrupt Source (IRQ0) */ | ||
59 | #define AT572D940HF_ID_IRQ1 30 /* External Interrupt Source (IRQ1) */ | ||
60 | #define AT572D940HF_ID_IRQ2 31 /* External Interrupt Source (IRQ2) */ | ||
61 | |||
62 | |||
63 | /* | ||
64 | * User Peripheral physical base addresses. | ||
65 | */ | ||
66 | #define AT572D940HF_BASE_TCB 0xfffa0000 | ||
67 | #define AT572D940HF_BASE_TC0 0xfffa0000 | ||
68 | #define AT572D940HF_BASE_TC1 0xfffa0040 | ||
69 | #define AT572D940HF_BASE_TC2 0xfffa0080 | ||
70 | #define AT572D940HF_BASE_UDP 0xfffa4000 | ||
71 | #define AT572D940HF_BASE_MCI 0xfffa8000 | ||
72 | #define AT572D940HF_BASE_TWI0 0xfffac000 | ||
73 | #define AT572D940HF_BASE_US0 0xfffb0000 | ||
74 | #define AT572D940HF_BASE_US1 0xfffb4000 | ||
75 | #define AT572D940HF_BASE_US2 0xfffb8000 | ||
76 | #define AT572D940HF_BASE_SSC0 0xfffbc000 | ||
77 | #define AT572D940HF_BASE_SSC1 0xfffc0000 | ||
78 | #define AT572D940HF_BASE_SSC2 0xfffc4000 | ||
79 | #define AT572D940HF_BASE_SPI0 0xfffc8000 | ||
80 | #define AT572D940HF_BASE_SPI1 0xfffcc000 | ||
81 | #define AT572D940HF_BASE_SSC3 0xfffd0000 | ||
82 | #define AT572D940HF_BASE_TWI1 0xfffd4000 | ||
83 | #define AT572D940HF_BASE_EMAC 0xfffd8000 | ||
84 | #define AT572D940HF_BASE_CAN0 0xfffdc000 | ||
85 | #define AT572D940HF_BASE_CAN1 0xfffe0000 | ||
86 | #define AT91_BASE_SYS 0xffffea00 | ||
87 | |||
88 | |||
89 | /* | ||
90 | * System Peripherals (offset from AT91_BASE_SYS) | ||
91 | */ | ||
92 | #define AT91_SDRAMC0 (0xffffea00 - AT91_BASE_SYS) | ||
93 | #define AT91_SMC (0xffffec00 - AT91_BASE_SYS) | ||
94 | #define AT91_MATRIX (0xffffee00 - AT91_BASE_SYS) | ||
95 | #define AT91_AIC (0xfffff000 - AT91_BASE_SYS) | ||
96 | #define AT91_DBGU (0xfffff200 - AT91_BASE_SYS) | ||
97 | #define AT91_PIOA (0xfffff400 - AT91_BASE_SYS) | ||
98 | #define AT91_PIOB (0xfffff600 - AT91_BASE_SYS) | ||
99 | #define AT91_PIOC (0xfffff800 - AT91_BASE_SYS) | ||
100 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | ||
101 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
102 | #define AT91_RTT (0xfffffd20 - AT91_BASE_SYS) | ||
103 | #define AT91_PIT (0xfffffd30 - AT91_BASE_SYS) | ||
104 | #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS) | ||
105 | |||
106 | #define AT91_USART0 AT572D940HF_ID_US0 | ||
107 | #define AT91_USART1 AT572D940HF_ID_US1 | ||
108 | #define AT91_USART2 AT572D940HF_ID_US2 | ||
109 | |||
110 | |||
111 | /* | ||
112 | * Internal Memory. | ||
113 | */ | ||
114 | #define AT572D940HF_SRAM_BASE 0x00300000 /* Internal SRAM base address */ | ||
115 | #define AT572D940HF_SRAM_SIZE (48 * SZ_1K) /* Internal SRAM size (48Kb) */ | ||
116 | |||
117 | #define AT572D940HF_ROM_BASE 0x00400000 /* Internal ROM base address */ | ||
118 | #define AT572D940HF_ROM_SIZE SZ_32K /* Internal ROM size (32Kb) */ | ||
119 | |||
120 | #define AT572D940HF_UHP_BASE 0x00500000 /* USB Host controller */ | ||
121 | |||
122 | |||
123 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at572d940hf_matrix.h b/arch/arm/mach-at91/include/mach/at572d940hf_matrix.h deleted file mode 100644 index b6751df09488..000000000000 --- a/arch/arm/mach-at91/include/mach/at572d940hf_matrix.h +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | /* | ||
2 | * include/mach//at572d940hf_matrix.h | ||
3 | * | ||
4 | * Antonio R. Costa <costa.antonior@gmail.com> | ||
5 | * Copyright (C) 2008 Atmel | ||
6 | * | ||
7 | * Copyright (C) 2005 SAN People | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22 | */ | ||
23 | |||
24 | #ifndef AT572D940HF_MATRIX_H | ||
25 | #define AT572D940HF_MATRIX_H | ||
26 | |||
27 | #define AT91_MATRIX_MCFG0 (AT91_MATRIX + 0x00) /* Master Configuration Register 0 */ | ||
28 | #define AT91_MATRIX_MCFG1 (AT91_MATRIX + 0x04) /* Master Configuration Register 1 */ | ||
29 | #define AT91_MATRIX_MCFG2 (AT91_MATRIX + 0x08) /* Master Configuration Register 2 */ | ||
30 | #define AT91_MATRIX_MCFG3 (AT91_MATRIX + 0x0C) /* Master Configuration Register 3 */ | ||
31 | #define AT91_MATRIX_MCFG4 (AT91_MATRIX + 0x10) /* Master Configuration Register 4 */ | ||
32 | #define AT91_MATRIX_MCFG5 (AT91_MATRIX + 0x14) /* Master Configuration Register 5 */ | ||
33 | |||
34 | #define AT91_MATRIX_ULBT (7 << 0) /* Undefined Length Burst Type */ | ||
35 | #define AT91_MATRIX_ULBT_INFINITE (0 << 0) | ||
36 | #define AT91_MATRIX_ULBT_SINGLE (1 << 0) | ||
37 | #define AT91_MATRIX_ULBT_FOUR (2 << 0) | ||
38 | #define AT91_MATRIX_ULBT_EIGHT (3 << 0) | ||
39 | #define AT91_MATRIX_ULBT_SIXTEEN (4 << 0) | ||
40 | |||
41 | #define AT91_MATRIX_SCFG0 (AT91_MATRIX + 0x40) /* Slave Configuration Register 0 */ | ||
42 | #define AT91_MATRIX_SCFG1 (AT91_MATRIX + 0x44) /* Slave Configuration Register 1 */ | ||
43 | #define AT91_MATRIX_SCFG2 (AT91_MATRIX + 0x48) /* Slave Configuration Register 2 */ | ||
44 | #define AT91_MATRIX_SCFG3 (AT91_MATRIX + 0x4C) /* Slave Configuration Register 3 */ | ||
45 | #define AT91_MATRIX_SCFG4 (AT91_MATRIX + 0x50) /* Slave Configuration Register 4 */ | ||
46 | #define AT91_MATRIX_SLOT_CYCLE (0xff << 0) /* Maximum Number of Allowed Cycles for a Burst */ | ||
47 | #define AT91_MATRIX_DEFMSTR_TYPE (3 << 16) /* Default Master Type */ | ||
48 | #define AT91_MATRIX_DEFMSTR_TYPE_NONE (0 << 16) | ||
49 | #define AT91_MATRIX_DEFMSTR_TYPE_LAST (1 << 16) | ||
50 | #define AT91_MATRIX_DEFMSTR_TYPE_FIXED (2 << 16) | ||
51 | #define AT91_MATRIX_FIXED_DEFMSTR (0x7 << 18) /* Fixed Index of Default Master */ | ||
52 | #define AT91_MATRIX_ARBT (3 << 24) /* Arbitration Type */ | ||
53 | #define AT91_MATRIX_ARBT_ROUND_ROBIN (0 << 24) | ||
54 | #define AT91_MATRIX_ARBT_FIXED_PRIORITY (1 << 24) | ||
55 | |||
56 | #define AT91_MATRIX_PRAS0 (AT91_MATRIX + 0x80) /* Priority Register A for Slave 0 */ | ||
57 | #define AT91_MATRIX_PRAS1 (AT91_MATRIX + 0x88) /* Priority Register A for Slave 1 */ | ||
58 | #define AT91_MATRIX_PRAS2 (AT91_MATRIX + 0x90) /* Priority Register A for Slave 2 */ | ||
59 | #define AT91_MATRIX_PRAS3 (AT91_MATRIX + 0x98) /* Priority Register A for Slave 3 */ | ||
60 | #define AT91_MATRIX_PRAS4 (AT91_MATRIX + 0xA0) /* Priority Register A for Slave 4 */ | ||
61 | |||
62 | #define AT91_MATRIX_M0PR (3 << 0) /* Master 0 Priority */ | ||
63 | #define AT91_MATRIX_M1PR (3 << 4) /* Master 1 Priority */ | ||
64 | #define AT91_MATRIX_M2PR (3 << 8) /* Master 2 Priority */ | ||
65 | #define AT91_MATRIX_M3PR (3 << 12) /* Master 3 Priority */ | ||
66 | #define AT91_MATRIX_M4PR (3 << 16) /* Master 4 Priority */ | ||
67 | #define AT91_MATRIX_M5PR (3 << 20) /* Master 5 Priority */ | ||
68 | #define AT91_MATRIX_M6PR (3 << 24) /* Master 6 Priority */ | ||
69 | |||
70 | #define AT91_MATRIX_MRCR (AT91_MATRIX + 0x100) /* Master Remap Control Register */ | ||
71 | #define AT91_MATRIX_RCB0 (1 << 0) /* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */ | ||
72 | #define AT91_MATRIX_RCB1 (1 << 1) /* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ | ||
73 | |||
74 | #define AT91_MATRIX_SFR0 (AT91_MATRIX + 0x110) /* Special Function Register 0 */ | ||
75 | #define AT91_MATRIX_SFR1 (AT91_MATRIX + 0x114) /* Special Function Register 1 */ | ||
76 | #define AT91_MATRIX_SFR2 (AT91_MATRIX + 0x118) /* Special Function Register 2 */ | ||
77 | #define AT91_MATRIX_SFR3 (AT91_MATRIX + 0x11C) /* Special Function Register 3 */ | ||
78 | #define AT91_MATRIX_SFR4 (AT91_MATRIX + 0x120) /* Special Function Register 4 */ | ||
79 | #define AT91_MATRIX_SFR5 (AT91_MATRIX + 0x124) /* Special Function Register 5 */ | ||
80 | #define AT91_MATRIX_SFR6 (AT91_MATRIX + 0x128) /* Special Function Register 6 */ | ||
81 | #define AT91_MATRIX_SFR7 (AT91_MATRIX + 0x12C) /* Special Function Register 7 */ | ||
82 | #define AT91_MATRIX_SFR8 (AT91_MATRIX + 0x130) /* Special Function Register 8 */ | ||
83 | #define AT91_MATRIX_SFR9 (AT91_MATRIX + 0x134) /* Special Function Register 9 */ | ||
84 | #define AT91_MATRIX_SFR10 (AT91_MATRIX + 0x138) /* Special Function Register 10 */ | ||
85 | #define AT91_MATRIX_SFR11 (AT91_MATRIX + 0x13C) /* Special Function Register 11 */ | ||
86 | #define AT91_MATRIX_SFR12 (AT91_MATRIX + 0x140) /* Special Function Register 12 */ | ||
87 | #define AT91_MATRIX_SFR13 (AT91_MATRIX + 0x144) /* Special Function Register 13 */ | ||
88 | #define AT91_MATRIX_SFR14 (AT91_MATRIX + 0x148) /* Special Function Register 14 */ | ||
89 | #define AT91_MATRIX_SFR15 (AT91_MATRIX + 0x14C) /* Special Function Register 15 */ | ||
90 | |||
91 | |||
92 | /* | ||
93 | * The following registers / bits are not defined in the Datasheet (Revision A) | ||
94 | */ | ||
95 | |||
96 | #define AT91_MATRIX_TCR (AT91_MATRIX + 0x100) /* TCM Configuration Register */ | ||
97 | #define AT91_MATRIX_ITCM_SIZE (0xf << 0) /* Size of ITCM enabled memory block */ | ||
98 | #define AT91_MATRIX_ITCM_0 (0 << 0) | ||
99 | #define AT91_MATRIX_ITCM_16 (5 << 0) | ||
100 | #define AT91_MATRIX_ITCM_32 (6 << 0) | ||
101 | #define AT91_MATRIX_ITCM_64 (7 << 0) | ||
102 | #define AT91_MATRIX_DTCM_SIZE (0xf << 4) /* Size of DTCM enabled memory block */ | ||
103 | #define AT91_MATRIX_DTCM_0 (0 << 4) | ||
104 | #define AT91_MATRIX_DTCM_16 (5 << 4) | ||
105 | #define AT91_MATRIX_DTCM_32 (6 << 4) | ||
106 | #define AT91_MATRIX_DTCM_64 (7 << 4) | ||
107 | |||
108 | #define AT91_MATRIX_EBICSA (AT91_MATRIX + 0x11C) /* EBI Chip Select Assignment Register */ | ||
109 | #define AT91_MATRIX_CS1A (1 << 1) /* Chip Select 1 Assignment */ | ||
110 | #define AT91_MATRIX_CS1A_SMC (0 << 1) | ||
111 | #define AT91_MATRIX_CS1A_SDRAMC (1 << 1) | ||
112 | #define AT91_MATRIX_CS3A (1 << 3) /* Chip Select 3 Assignment */ | ||
113 | #define AT91_MATRIX_CS3A_SMC (0 << 3) | ||
114 | #define AT91_MATRIX_CS3A_SMC_SMARTMEDIA (1 << 3) | ||
115 | #define AT91_MATRIX_CS4A (1 << 4) /* Chip Select 4 Assignment */ | ||
116 | #define AT91_MATRIX_CS4A_SMC (0 << 4) | ||
117 | #define AT91_MATRIX_CS4A_SMC_CF1 (1 << 4) | ||
118 | #define AT91_MATRIX_CS5A (1 << 5) /* Chip Select 5 Assignment */ | ||
119 | #define AT91_MATRIX_CS5A_SMC (0 << 5) | ||
120 | #define AT91_MATRIX_CS5A_SMC_CF2 (1 << 5) | ||
121 | #define AT91_MATRIX_DBPUC (1 << 8) /* Data Bus Pull-up Configuration */ | ||
122 | |||
123 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91cap9.h b/arch/arm/mach-at91/include/mach/at91cap9.h index 9c6af9737485..665993849a7b 100644 --- a/arch/arm/mach-at91/include/mach/at91cap9.h +++ b/arch/arm/mach-at91/include/mach/at91cap9.h | |||
@@ -20,8 +20,6 @@ | |||
20 | /* | 20 | /* |
21 | * Peripheral identifiers/interrupts. | 21 | * Peripheral identifiers/interrupts. |
22 | */ | 22 | */ |
23 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
24 | #define AT91_ID_SYS 1 /* System Peripherals */ | ||
25 | #define AT91CAP9_ID_PIOABCD 2 /* Parallel IO Controller A, B, C and D */ | 23 | #define AT91CAP9_ID_PIOABCD 2 /* Parallel IO Controller A, B, C and D */ |
26 | #define AT91CAP9_ID_MPB0 3 /* MP Block Peripheral 0 */ | 24 | #define AT91CAP9_ID_MPB0 3 /* MP Block Peripheral 0 */ |
27 | #define AT91CAP9_ID_MPB1 4 /* MP Block Peripheral 1 */ | 25 | #define AT91CAP9_ID_MPB1 4 /* MP Block Peripheral 1 */ |
@@ -123,6 +121,4 @@ | |||
123 | #define AT91CAP9_UDPHS_FIFO 0x00600000 /* USB High Speed Device Port */ | 121 | #define AT91CAP9_UDPHS_FIFO 0x00600000 /* USB High Speed Device Port */ |
124 | #define AT91CAP9_UHP_BASE 0x00700000 /* USB Host controller */ | 122 | #define AT91CAP9_UHP_BASE 0x00700000 /* USB Host controller */ |
125 | 123 | ||
126 | #define CONFIG_DRAM_BASE AT91_CHIPSELECT_6 | ||
127 | |||
128 | #endif | 124 | #endif |
diff --git a/arch/arm/mach-at91/include/mach/at91rm9200.h b/arch/arm/mach-at91/include/mach/at91rm9200.h index 78983155a074..99e0f8d02d7b 100644 --- a/arch/arm/mach-at91/include/mach/at91rm9200.h +++ b/arch/arm/mach-at91/include/mach/at91rm9200.h | |||
@@ -19,8 +19,6 @@ | |||
19 | /* | 19 | /* |
20 | * Peripheral identifiers/interrupts. | 20 | * Peripheral identifiers/interrupts. |
21 | */ | 21 | */ |
22 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
23 | #define AT91_ID_SYS 1 /* System Peripheral */ | ||
24 | #define AT91RM9200_ID_PIOA 2 /* Parallel IO Controller A */ | 22 | #define AT91RM9200_ID_PIOA 2 /* Parallel IO Controller A */ |
25 | #define AT91RM9200_ID_PIOB 3 /* Parallel IO Controller B */ | 23 | #define AT91RM9200_ID_PIOB 3 /* Parallel IO Controller B */ |
26 | #define AT91RM9200_ID_PIOC 4 /* Parallel IO Controller C */ | 24 | #define AT91RM9200_ID_PIOC 4 /* Parallel IO Controller C */ |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9260.h b/arch/arm/mach-at91/include/mach/at91sam9260.h index 4e79036d3b80..8b6bf835cd73 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9260.h +++ b/arch/arm/mach-at91/include/mach/at91sam9260.h | |||
@@ -20,8 +20,6 @@ | |||
20 | /* | 20 | /* |
21 | * Peripheral identifiers/interrupts. | 21 | * Peripheral identifiers/interrupts. |
22 | */ | 22 | */ |
23 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
24 | #define AT91_ID_SYS 1 /* System Peripherals */ | ||
25 | #define AT91SAM9260_ID_PIOA 2 /* Parallel IO Controller A */ | 23 | #define AT91SAM9260_ID_PIOA 2 /* Parallel IO Controller A */ |
26 | #define AT91SAM9260_ID_PIOB 3 /* Parallel IO Controller B */ | 24 | #define AT91SAM9260_ID_PIOB 3 /* Parallel IO Controller B */ |
27 | #define AT91SAM9260_ID_PIOC 4 /* Parallel IO Controller C */ | 25 | #define AT91SAM9260_ID_PIOC 4 /* Parallel IO Controller C */ |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9261.h b/arch/arm/mach-at91/include/mach/at91sam9261.h index 2b5618518129..eafbddaf523c 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9261.h +++ b/arch/arm/mach-at91/include/mach/at91sam9261.h | |||
@@ -18,8 +18,6 @@ | |||
18 | /* | 18 | /* |
19 | * Peripheral identifiers/interrupts. | 19 | * Peripheral identifiers/interrupts. |
20 | */ | 20 | */ |
21 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
22 | #define AT91_ID_SYS 1 /* System Peripherals */ | ||
23 | #define AT91SAM9261_ID_PIOA 2 /* Parallel IO Controller A */ | 21 | #define AT91SAM9261_ID_PIOA 2 /* Parallel IO Controller A */ |
24 | #define AT91SAM9261_ID_PIOB 3 /* Parallel IO Controller B */ | 22 | #define AT91SAM9261_ID_PIOB 3 /* Parallel IO Controller B */ |
25 | #define AT91SAM9261_ID_PIOC 4 /* Parallel IO Controller C */ | 23 | #define AT91SAM9261_ID_PIOC 4 /* Parallel IO Controller C */ |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9263.h b/arch/arm/mach-at91/include/mach/at91sam9263.h index 2091f1e42d43..e2d348213a7b 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9263.h +++ b/arch/arm/mach-at91/include/mach/at91sam9263.h | |||
@@ -18,8 +18,6 @@ | |||
18 | /* | 18 | /* |
19 | * Peripheral identifiers/interrupts. | 19 | * Peripheral identifiers/interrupts. |
20 | */ | 20 | */ |
21 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
22 | #define AT91_ID_SYS 1 /* System Peripherals */ | ||
23 | #define AT91SAM9263_ID_PIOA 2 /* Parallel IO Controller A */ | 21 | #define AT91SAM9263_ID_PIOA 2 /* Parallel IO Controller A */ |
24 | #define AT91SAM9263_ID_PIOB 3 /* Parallel IO Controller B */ | 22 | #define AT91SAM9263_ID_PIOB 3 /* Parallel IO Controller B */ |
25 | #define AT91SAM9263_ID_PIOCDE 4 /* Parallel IO Controller C, D and E */ | 23 | #define AT91SAM9263_ID_PIOCDE 4 /* Parallel IO Controller C, D and E */ |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h index a526869aee37..659304aa73d9 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9g45.h +++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h | |||
@@ -18,8 +18,6 @@ | |||
18 | /* | 18 | /* |
19 | * Peripheral identifiers/interrupts. | 19 | * Peripheral identifiers/interrupts. |
20 | */ | 20 | */ |
21 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
22 | #define AT91_ID_SYS 1 /* System Controller Interrupt */ | ||
23 | #define AT91SAM9G45_ID_PIOA 2 /* Parallel I/O Controller A */ | 21 | #define AT91SAM9G45_ID_PIOA 2 /* Parallel I/O Controller A */ |
24 | #define AT91SAM9G45_ID_PIOB 3 /* Parallel I/O Controller B */ | 22 | #define AT91SAM9G45_ID_PIOB 3 /* Parallel I/O Controller B */ |
25 | #define AT91SAM9G45_ID_PIOC 4 /* Parallel I/O Controller C */ | 23 | #define AT91SAM9G45_ID_PIOC 4 /* Parallel I/O Controller C */ |
@@ -131,8 +129,6 @@ | |||
131 | #define AT91SAM9G45_EHCI_BASE 0x00800000 /* USB Host controller (EHCI) */ | 129 | #define AT91SAM9G45_EHCI_BASE 0x00800000 /* USB Host controller (EHCI) */ |
132 | #define AT91SAM9G45_VDEC_BASE 0x00900000 /* Video Decoder Controller */ | 130 | #define AT91SAM9G45_VDEC_BASE 0x00900000 /* Video Decoder Controller */ |
133 | 131 | ||
134 | #define CONFIG_DRAM_BASE AT91_CHIPSELECT_6 | ||
135 | |||
136 | #define CONSISTENT_DMA_SIZE SZ_4M | 132 | #define CONSISTENT_DMA_SIZE SZ_4M |
137 | 133 | ||
138 | /* | 134 | /* |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9rl.h b/arch/arm/mach-at91/include/mach/at91sam9rl.h index 87ba8517ad98..41dbbe61055c 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9rl.h +++ b/arch/arm/mach-at91/include/mach/at91sam9rl.h | |||
@@ -17,8 +17,6 @@ | |||
17 | /* | 17 | /* |
18 | * Peripheral identifiers/interrupts. | 18 | * Peripheral identifiers/interrupts. |
19 | */ | 19 | */ |
20 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
21 | #define AT91_ID_SYS 1 /* System Controller */ | ||
22 | #define AT91SAM9RL_ID_PIOA 2 /* Parallel IO Controller A */ | 20 | #define AT91SAM9RL_ID_PIOA 2 /* Parallel IO Controller A */ |
23 | #define AT91SAM9RL_ID_PIOB 3 /* Parallel IO Controller B */ | 21 | #define AT91SAM9RL_ID_PIOB 3 /* Parallel IO Controller B */ |
24 | #define AT91SAM9RL_ID_PIOC 4 /* Parallel IO Controller C */ | 22 | #define AT91SAM9RL_ID_PIOC 4 /* Parallel IO Controller C */ |
diff --git a/arch/arm/mach-at91/include/mach/at91x40.h b/arch/arm/mach-at91/include/mach/at91x40.h index 063ac44a0204..a152ff87e688 100644 --- a/arch/arm/mach-at91/include/mach/at91x40.h +++ b/arch/arm/mach-at91/include/mach/at91x40.h | |||
@@ -15,8 +15,6 @@ | |||
15 | /* | 15 | /* |
16 | * IRQ list. | 16 | * IRQ list. |
17 | */ | 17 | */ |
18 | #define AT91_ID_FIQ 0 /* FIQ */ | ||
19 | #define AT91_ID_SYS 1 /* System Peripheral */ | ||
20 | #define AT91X40_ID_USART0 2 /* USART port 0 */ | 18 | #define AT91X40_ID_USART0 2 /* USART port 0 */ |
21 | #define AT91X40_ID_USART1 3 /* USART port 1 */ | 19 | #define AT91X40_ID_USART1 3 /* USART port 1 */ |
22 | #define AT91X40_ID_TC0 4 /* Timer/Counter 0 */ | 20 | #define AT91X40_ID_TC0 4 /* Timer/Counter 0 */ |
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index 2b499eb343a1..ed544a0d5a1d 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
@@ -90,7 +90,7 @@ struct at91_eth_data { | |||
90 | extern void __init at91_add_device_eth(struct at91_eth_data *data); | 90 | extern void __init at91_add_device_eth(struct at91_eth_data *data); |
91 | 91 | ||
92 | #if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9G20) || defined(CONFIG_ARCH_AT91CAP9) \ | 92 | #if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9G20) || defined(CONFIG_ARCH_AT91CAP9) \ |
93 | || defined(CONFIG_ARCH_AT91SAM9G45) || defined(CONFIG_ARCH_AT572D940HF) | 93 | || defined(CONFIG_ARCH_AT91SAM9G45) |
94 | #define eth_platform_data at91_eth_data | 94 | #define eth_platform_data at91_eth_data |
95 | #endif | 95 | #endif |
96 | 96 | ||
@@ -140,6 +140,7 @@ extern void __init at91_set_serial_console(unsigned portnr); | |||
140 | extern struct platform_device *atmel_default_console_device; | 140 | extern struct platform_device *atmel_default_console_device; |
141 | 141 | ||
142 | struct atmel_uart_data { | 142 | struct atmel_uart_data { |
143 | int num; /* port num */ | ||
143 | short use_dma_tx; /* use transmit DMA? */ | 144 | short use_dma_tx; /* use transmit DMA? */ |
144 | short use_dma_rx; /* use receive DMA? */ | 145 | short use_dma_rx; /* use receive DMA? */ |
145 | void __iomem *regs; /* virt. base address, if any */ | 146 | void __iomem *regs; /* virt. base address, if any */ |
@@ -203,9 +204,6 @@ extern void __init at91_init_leds(u8 cpu_led, u8 timer_led); | |||
203 | extern void __init at91_gpio_leds(struct gpio_led *leds, int nr); | 204 | extern void __init at91_gpio_leds(struct gpio_led *leds, int nr); |
204 | extern void __init at91_pwm_leds(struct gpio_led *leds, int nr); | 205 | extern void __init at91_pwm_leds(struct gpio_led *leds, int nr); |
205 | 206 | ||
206 | /* AT572D940HF DSP */ | ||
207 | extern void __init at91_add_device_mAgic(void); | ||
208 | |||
209 | /* FIXME: this needs a better location, but gets stuff building again */ | 207 | /* FIXME: this needs a better location, but gets stuff building again */ |
210 | extern int at91_suspend_entering_slow_clock(void); | 208 | extern int at91_suspend_entering_slow_clock(void); |
211 | 209 | ||
diff --git a/arch/arm/mach-at91/include/mach/clkdev.h b/arch/arm/mach-at91/include/mach/clkdev.h new file mode 100644 index 000000000000..04b37a89801c --- /dev/null +++ b/arch/arm/mach-at91/include/mach/clkdev.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __ASM_MACH_CLKDEV_H | ||
2 | #define __ASM_MACH_CLKDEV_H | ||
3 | |||
4 | #define __clk_get(clk) ({ 1; }) | ||
5 | #define __clk_put(clk) do { } while (0) | ||
6 | |||
7 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/cpu.h b/arch/arm/mach-at91/include/mach/cpu.h index 0700f2125305..df966c2bc2d4 100644 --- a/arch/arm/mach-at91/include/mach/cpu.h +++ b/arch/arm/mach-at91/include/mach/cpu.h | |||
@@ -34,8 +34,6 @@ | |||
34 | #define ARCH_ID_AT91SAM9XE256 0x329a93a0 | 34 | #define ARCH_ID_AT91SAM9XE256 0x329a93a0 |
35 | #define ARCH_ID_AT91SAM9XE512 0x329aa3a0 | 35 | #define ARCH_ID_AT91SAM9XE512 0x329aa3a0 |
36 | 36 | ||
37 | #define ARCH_ID_AT572D940HF 0x0e0303e0 | ||
38 | |||
39 | #define ARCH_ID_AT91M40800 0x14080044 | 37 | #define ARCH_ID_AT91M40800 0x14080044 |
40 | #define ARCH_ID_AT91R40807 0x44080746 | 38 | #define ARCH_ID_AT91R40807 0x44080746 |
41 | #define ARCH_ID_AT91M40807 0x14080745 | 39 | #define ARCH_ID_AT91M40807 0x14080745 |
@@ -90,9 +88,16 @@ static inline unsigned long at91cap9_rev_identify(void) | |||
90 | #endif | 88 | #endif |
91 | 89 | ||
92 | #ifdef CONFIG_ARCH_AT91RM9200 | 90 | #ifdef CONFIG_ARCH_AT91RM9200 |
91 | extern int rm9200_type; | ||
92 | #define ARCH_REVISON_9200_BGA (0 << 0) | ||
93 | #define ARCH_REVISON_9200_PQFP (1 << 0) | ||
93 | #define cpu_is_at91rm9200() (at91_cpu_identify() == ARCH_ID_AT91RM9200) | 94 | #define cpu_is_at91rm9200() (at91_cpu_identify() == ARCH_ID_AT91RM9200) |
95 | #define cpu_is_at91rm9200_bga() (!cpu_is_at91rm9200_pqfp()) | ||
96 | #define cpu_is_at91rm9200_pqfp() (cpu_is_at91rm9200() && rm9200_type & ARCH_REVISON_9200_PQFP) | ||
94 | #else | 97 | #else |
95 | #define cpu_is_at91rm9200() (0) | 98 | #define cpu_is_at91rm9200() (0) |
99 | #define cpu_is_at91rm9200_bga() (0) | ||
100 | #define cpu_is_at91rm9200_pqfp() (0) | ||
96 | #endif | 101 | #endif |
97 | 102 | ||
98 | #ifdef CONFIG_ARCH_AT91SAM9260 | 103 | #ifdef CONFIG_ARCH_AT91SAM9260 |
@@ -181,12 +186,6 @@ static inline unsigned long at91cap9_rev_identify(void) | |||
181 | #define cpu_is_at91cap9_revC() (0) | 186 | #define cpu_is_at91cap9_revC() (0) |
182 | #endif | 187 | #endif |
183 | 188 | ||
184 | #ifdef CONFIG_ARCH_AT572D940HF | ||
185 | #define cpu_is_at572d940hf() (at91_cpu_identify() == ARCH_ID_AT572D940HF) | ||
186 | #else | ||
187 | #define cpu_is_at572d940hf() (0) | ||
188 | #endif | ||
189 | |||
190 | /* | 189 | /* |
191 | * Since this is ARM, we will never run on any AVR32 CPU. But these | 190 | * Since this is ARM, we will never run on any AVR32 CPU. But these |
192 | * definitions may reduce clutter in common drivers. | 191 | * definitions may reduce clutter in common drivers. |
diff --git a/arch/arm/mach-at91/include/mach/hardware.h b/arch/arm/mach-at91/include/mach/hardware.h index 3d64a75e3ed5..1008b9fb5074 100644 --- a/arch/arm/mach-at91/include/mach/hardware.h +++ b/arch/arm/mach-at91/include/mach/hardware.h | |||
@@ -32,13 +32,17 @@ | |||
32 | #include <mach/at91cap9.h> | 32 | #include <mach/at91cap9.h> |
33 | #elif defined(CONFIG_ARCH_AT91X40) | 33 | #elif defined(CONFIG_ARCH_AT91X40) |
34 | #include <mach/at91x40.h> | 34 | #include <mach/at91x40.h> |
35 | #elif defined(CONFIG_ARCH_AT572D940HF) | ||
36 | #include <mach/at572d940hf.h> | ||
37 | #else | 35 | #else |
38 | #error "Unsupported AT91 processor" | 36 | #error "Unsupported AT91 processor" |
39 | #endif | 37 | #endif |
40 | 38 | ||
41 | 39 | ||
40 | /* | ||
41 | * Peripheral identifiers/interrupts. | ||
42 | */ | ||
43 | #define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ | ||
44 | #define AT91_ID_SYS 1 /* System Peripherals */ | ||
45 | |||
42 | #ifdef CONFIG_MMU | 46 | #ifdef CONFIG_MMU |
43 | /* | 47 | /* |
44 | * Remap the peripherals from address 0xFFF78000 .. 0xFFFFFFFF | 48 | * Remap the peripherals from address 0xFFF78000 .. 0xFFFFFFFF |
@@ -82,13 +86,6 @@ | |||
82 | #define AT91_CHIPSELECT_6 0x70000000 | 86 | #define AT91_CHIPSELECT_6 0x70000000 |
83 | #define AT91_CHIPSELECT_7 0x80000000 | 87 | #define AT91_CHIPSELECT_7 0x80000000 |
84 | 88 | ||
85 | /* SDRAM */ | ||
86 | #ifdef CONFIG_DRAM_BASE | ||
87 | #define AT91_SDRAM_BASE CONFIG_DRAM_BASE | ||
88 | #else | ||
89 | #define AT91_SDRAM_BASE AT91_CHIPSELECT_1 | ||
90 | #endif | ||
91 | |||
92 | /* Clocks */ | 89 | /* Clocks */ |
93 | #define AT91_SLOW_CLOCK 32768 /* slow clock */ | 90 | #define AT91_SLOW_CLOCK 32768 /* slow clock */ |
94 | 91 | ||
diff --git a/arch/arm/mach-at91/include/mach/memory.h b/arch/arm/mach-at91/include/mach/memory.h index c2cfe5040642..401c207f2f39 100644 --- a/arch/arm/mach-at91/include/mach/memory.h +++ b/arch/arm/mach-at91/include/mach/memory.h | |||
@@ -23,6 +23,4 @@ | |||
23 | 23 | ||
24 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
25 | 25 | ||
26 | #define PLAT_PHYS_OFFSET (AT91_SDRAM_BASE) | ||
27 | |||
28 | #endif | 26 | #endif |
diff --git a/arch/arm/mach-at91/include/mach/stamp9g20.h b/arch/arm/mach-at91/include/mach/stamp9g20.h index 6120f9c46d59..f62c0abca4b4 100644 --- a/arch/arm/mach-at91/include/mach/stamp9g20.h +++ b/arch/arm/mach-at91/include/mach/stamp9g20.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef __MACH_STAMP9G20_H | 1 | #ifndef __MACH_STAMP9G20_H |
2 | #define __MACH_STAMP9G20_H | 2 | #define __MACH_STAMP9G20_H |
3 | 3 | ||
4 | void stamp9g20_map_io(void); | 4 | void stamp9g20_init_early(void); |
5 | void stamp9g20_board_init(void); | 5 | void stamp9g20_board_init(void); |
6 | 6 | ||
7 | #endif | 7 | #endif |
diff --git a/arch/arm/mach-at91/include/mach/system_rev.h b/arch/arm/mach-at91/include/mach/system_rev.h new file mode 100644 index 000000000000..b855ee75f72c --- /dev/null +++ b/arch/arm/mach-at91/include/mach/system_rev.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
3 | * | ||
4 | * Under GPLv2 only | ||
5 | */ | ||
6 | |||
7 | #ifndef __ARCH_SYSTEM_REV_H__ | ||
8 | #define __ARCH_SYSTEM_REV_H__ | ||
9 | |||
10 | /* | ||
11 | * board revision encoding | ||
12 | * mach specific | ||
13 | * the 16-31 bit are reserved for at91 generic information | ||
14 | * | ||
15 | * bit 31: | ||
16 | * 0 => nand 16 bit | ||
17 | * 1 => nand 8 bit | ||
18 | */ | ||
19 | #define BOARD_HAVE_NAND_8BIT (1 << 31) | ||
20 | static int inline board_have_nand_8bit(void) | ||
21 | { | ||
22 | return system_rev & BOARD_HAVE_NAND_8BIT; | ||
23 | } | ||
24 | |||
25 | #endif /* __ARCH_SYSTEM_REV_H__ */ | ||
diff --git a/arch/arm/mach-at91/include/mach/timex.h b/arch/arm/mach-at91/include/mach/timex.h index 05a6e8af80c4..31ac2d97f14c 100644 --- a/arch/arm/mach-at91/include/mach/timex.h +++ b/arch/arm/mach-at91/include/mach/timex.h | |||
@@ -82,11 +82,6 @@ | |||
82 | #define AT91X40_MASTER_CLOCK 40000000 | 82 | #define AT91X40_MASTER_CLOCK 40000000 |
83 | #define CLOCK_TICK_RATE (AT91X40_MASTER_CLOCK) | 83 | #define CLOCK_TICK_RATE (AT91X40_MASTER_CLOCK) |
84 | 84 | ||
85 | #elif defined(CONFIG_ARCH_AT572D940HF) | ||
86 | |||
87 | #define AT572D940HF_MASTER_CLOCK 80000000 | ||
88 | #define CLOCK_TICK_RATE (AT572D940HF_MASTER_CLOCK/16) | ||
89 | |||
90 | #endif | 85 | #endif |
91 | 86 | ||
92 | #endif | 87 | #endif |
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index b95b9196deed..133aac405853 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c | |||
@@ -1055,7 +1055,7 @@ int da850_register_pm(struct platform_device *pdev) | |||
1055 | if (!pdata->cpupll_reg_base) | 1055 | if (!pdata->cpupll_reg_base) |
1056 | return -ENOMEM; | 1056 | return -ENOMEM; |
1057 | 1057 | ||
1058 | pdata->ddrpll_reg_base = ioremap(DA8XX_PLL1_BASE, SZ_4K); | 1058 | pdata->ddrpll_reg_base = ioremap(DA850_PLL1_BASE, SZ_4K); |
1059 | if (!pdata->ddrpll_reg_base) { | 1059 | if (!pdata->ddrpll_reg_base) { |
1060 | ret = -ENOMEM; | 1060 | ret = -ENOMEM; |
1061 | goto no_ddrpll_mem; | 1061 | goto no_ddrpll_mem; |
diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 58a02dc7b15a..4e66881c7aee 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c | |||
@@ -24,23 +24,25 @@ | |||
24 | #include "clock.h" | 24 | #include "clock.h" |
25 | 25 | ||
26 | #define DA8XX_TPCC_BASE 0x01c00000 | 26 | #define DA8XX_TPCC_BASE 0x01c00000 |
27 | #define DA850_MMCSD1_BASE 0x01e1b000 | ||
28 | #define DA850_TPCC1_BASE 0x01e30000 | ||
29 | #define DA8XX_TPTC0_BASE 0x01c08000 | 27 | #define DA8XX_TPTC0_BASE 0x01c08000 |
30 | #define DA8XX_TPTC1_BASE 0x01c08400 | 28 | #define DA8XX_TPTC1_BASE 0x01c08400 |
31 | #define DA850_TPTC2_BASE 0x01e38000 | ||
32 | #define DA8XX_WDOG_BASE 0x01c21000 /* DA8XX_TIMER64P1_BASE */ | 29 | #define DA8XX_WDOG_BASE 0x01c21000 /* DA8XX_TIMER64P1_BASE */ |
33 | #define DA8XX_I2C0_BASE 0x01c22000 | 30 | #define DA8XX_I2C0_BASE 0x01c22000 |
34 | #define DA8XX_RTC_BASE 0x01C23000 | 31 | #define DA8XX_RTC_BASE 0x01c23000 |
32 | #define DA8XX_MMCSD0_BASE 0x01c40000 | ||
33 | #define DA8XX_SPI0_BASE 0x01c41000 | ||
34 | #define DA830_SPI1_BASE 0x01e12000 | ||
35 | #define DA8XX_LCD_CNTRL_BASE 0x01e13000 | ||
36 | #define DA850_MMCSD1_BASE 0x01e1b000 | ||
35 | #define DA8XX_EMAC_CPPI_PORT_BASE 0x01e20000 | 37 | #define DA8XX_EMAC_CPPI_PORT_BASE 0x01e20000 |
36 | #define DA8XX_EMAC_CPGMACSS_BASE 0x01e22000 | 38 | #define DA8XX_EMAC_CPGMACSS_BASE 0x01e22000 |
37 | #define DA8XX_EMAC_CPGMAC_BASE 0x01e23000 | 39 | #define DA8XX_EMAC_CPGMAC_BASE 0x01e23000 |
38 | #define DA8XX_EMAC_MDIO_BASE 0x01e24000 | 40 | #define DA8XX_EMAC_MDIO_BASE 0x01e24000 |
39 | #define DA8XX_GPIO_BASE 0x01e26000 | ||
40 | #define DA8XX_I2C1_BASE 0x01e28000 | 41 | #define DA8XX_I2C1_BASE 0x01e28000 |
41 | #define DA8XX_SPI0_BASE 0x01c41000 | 42 | #define DA850_TPCC1_BASE 0x01e30000 |
42 | #define DA830_SPI1_BASE 0x01e12000 | 43 | #define DA850_TPTC2_BASE 0x01e38000 |
43 | #define DA850_SPI1_BASE 0x01f0e000 | 44 | #define DA850_SPI1_BASE 0x01f0e000 |
45 | #define DA8XX_DDR2_CTL_BASE 0xb0000000 | ||
44 | 46 | ||
45 | #define DA8XX_EMAC_CTRL_REG_OFFSET 0x3000 | 47 | #define DA8XX_EMAC_CTRL_REG_OFFSET 0x3000 |
46 | #define DA8XX_EMAC_MOD_REG_OFFSET 0x2000 | 48 | #define DA8XX_EMAC_MOD_REG_OFFSET 0x2000 |
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c index 22ebc64bc9d9..8f4f736aa267 100644 --- a/arch/arm/mach-davinci/devices.c +++ b/arch/arm/mach-davinci/devices.c | |||
@@ -33,6 +33,9 @@ | |||
33 | #define DM365_MMCSD0_BASE 0x01D11000 | 33 | #define DM365_MMCSD0_BASE 0x01D11000 |
34 | #define DM365_MMCSD1_BASE 0x01D00000 | 34 | #define DM365_MMCSD1_BASE 0x01D00000 |
35 | 35 | ||
36 | /* System control register offsets */ | ||
37 | #define DM64XX_VDD3P3V_PWDN 0x48 | ||
38 | |||
36 | static struct resource i2c_resources[] = { | 39 | static struct resource i2c_resources[] = { |
37 | { | 40 | { |
38 | .start = DAVINCI_I2C_BASE, | 41 | .start = DAVINCI_I2C_BASE, |
diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h index e4fc1af8500e..ad64da713fc8 100644 --- a/arch/arm/mach-davinci/include/mach/da8xx.h +++ b/arch/arm/mach-davinci/include/mach/da8xx.h | |||
@@ -64,13 +64,9 @@ extern unsigned int da850_max_speed; | |||
64 | #define DA8XX_TIMER64P1_BASE 0x01c21000 | 64 | #define DA8XX_TIMER64P1_BASE 0x01c21000 |
65 | #define DA8XX_GPIO_BASE 0x01e26000 | 65 | #define DA8XX_GPIO_BASE 0x01e26000 |
66 | #define DA8XX_PSC1_BASE 0x01e27000 | 66 | #define DA8XX_PSC1_BASE 0x01e27000 |
67 | #define DA8XX_LCD_CNTRL_BASE 0x01e13000 | ||
68 | #define DA8XX_PLL1_BASE 0x01e1a000 | ||
69 | #define DA8XX_MMCSD0_BASE 0x01c40000 | ||
70 | #define DA8XX_AEMIF_CS2_BASE 0x60000000 | 67 | #define DA8XX_AEMIF_CS2_BASE 0x60000000 |
71 | #define DA8XX_AEMIF_CS3_BASE 0x62000000 | 68 | #define DA8XX_AEMIF_CS3_BASE 0x62000000 |
72 | #define DA8XX_AEMIF_CTL_BASE 0x68000000 | 69 | #define DA8XX_AEMIF_CTL_BASE 0x68000000 |
73 | #define DA8XX_DDR2_CTL_BASE 0xb0000000 | ||
74 | #define DA8XX_ARM_RAM_BASE 0xffff0000 | 70 | #define DA8XX_ARM_RAM_BASE 0xffff0000 |
75 | 71 | ||
76 | void __init da830_init(void); | 72 | void __init da830_init(void); |
diff --git a/arch/arm/mach-davinci/include/mach/hardware.h b/arch/arm/mach-davinci/include/mach/hardware.h index c45ba1f62a11..414e0b93e741 100644 --- a/arch/arm/mach-davinci/include/mach/hardware.h +++ b/arch/arm/mach-davinci/include/mach/hardware.h | |||
@@ -21,9 +21,6 @@ | |||
21 | */ | 21 | */ |
22 | #define DAVINCI_SYSTEM_MODULE_BASE 0x01C40000 | 22 | #define DAVINCI_SYSTEM_MODULE_BASE 0x01C40000 |
23 | 23 | ||
24 | /* System control register offsets */ | ||
25 | #define DM64XX_VDD3P3V_PWDN 0x48 | ||
26 | |||
27 | /* | 24 | /* |
28 | * I/O mapping | 25 | * I/O mapping |
29 | */ | 26 | */ |
diff --git a/arch/arm/mach-exynos4/Kconfig b/arch/arm/mach-exynos4/Kconfig index 805196207ce8..b92c1e557145 100644 --- a/arch/arm/mach-exynos4/Kconfig +++ b/arch/arm/mach-exynos4/Kconfig | |||
@@ -169,9 +169,11 @@ config MACH_NURI | |||
169 | select S3C_DEV_HSMMC2 | 169 | select S3C_DEV_HSMMC2 |
170 | select S3C_DEV_HSMMC3 | 170 | select S3C_DEV_HSMMC3 |
171 | select S3C_DEV_I2C1 | 171 | select S3C_DEV_I2C1 |
172 | select S3C_DEV_I2C3 | ||
172 | select S3C_DEV_I2C5 | 173 | select S3C_DEV_I2C5 |
173 | select S5P_DEV_USB_EHCI | 174 | select S5P_DEV_USB_EHCI |
174 | select EXYNOS4_SETUP_I2C1 | 175 | select EXYNOS4_SETUP_I2C1 |
176 | select EXYNOS4_SETUP_I2C3 | ||
175 | select EXYNOS4_SETUP_I2C5 | 177 | select EXYNOS4_SETUP_I2C5 |
176 | select EXYNOS4_SETUP_SDHCI | 178 | select EXYNOS4_SETUP_SDHCI |
177 | select SAMSUNG_DEV_PWM | 179 | select SAMSUNG_DEV_PWM |
diff --git a/arch/arm/mach-exynos4/Makefile b/arch/arm/mach-exynos4/Makefile index 777897551e42..a9bb94fabaa7 100644 --- a/arch/arm/mach-exynos4/Makefile +++ b/arch/arm/mach-exynos4/Makefile | |||
@@ -13,9 +13,10 @@ obj- := | |||
13 | # Core support for EXYNOS4 system | 13 | # Core support for EXYNOS4 system |
14 | 14 | ||
15 | obj-$(CONFIG_CPU_EXYNOS4210) += cpu.o init.o clock.o irq-combiner.o | 15 | obj-$(CONFIG_CPU_EXYNOS4210) += cpu.o init.o clock.o irq-combiner.o |
16 | obj-$(CONFIG_CPU_EXYNOS4210) += setup-i2c0.o gpiolib.o irq-eint.o dma.o | 16 | obj-$(CONFIG_CPU_EXYNOS4210) += setup-i2c0.o irq-eint.o dma.o |
17 | obj-$(CONFIG_PM) += pm.o sleep.o | 17 | obj-$(CONFIG_PM) += pm.o sleep.o |
18 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o | 18 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o |
19 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o | ||
19 | 20 | ||
20 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o | 21 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o |
21 | 22 | ||
diff --git a/arch/arm/mach-exynos4/cpuidle.c b/arch/arm/mach-exynos4/cpuidle.c new file mode 100644 index 000000000000..bf7e96f2793a --- /dev/null +++ b/arch/arm/mach-exynos4/cpuidle.c | |||
@@ -0,0 +1,86 @@ | |||
1 | /* linux/arch/arm/mach-exynos4/cpuidle.c | ||
2 | * | ||
3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/cpuidle.h> | ||
14 | #include <linux/io.h> | ||
15 | |||
16 | #include <asm/proc-fns.h> | ||
17 | |||
18 | static int exynos4_enter_idle(struct cpuidle_device *dev, | ||
19 | struct cpuidle_state *state); | ||
20 | |||
21 | static struct cpuidle_state exynos4_cpuidle_set[] = { | ||
22 | [0] = { | ||
23 | .enter = exynos4_enter_idle, | ||
24 | .exit_latency = 1, | ||
25 | .target_residency = 100000, | ||
26 | .flags = CPUIDLE_FLAG_TIME_VALID, | ||
27 | .name = "IDLE", | ||
28 | .desc = "ARM clock gating(WFI)", | ||
29 | }, | ||
30 | }; | ||
31 | |||
32 | static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device); | ||
33 | |||
34 | static struct cpuidle_driver exynos4_idle_driver = { | ||
35 | .name = "exynos4_idle", | ||
36 | .owner = THIS_MODULE, | ||
37 | }; | ||
38 | |||
39 | static int exynos4_enter_idle(struct cpuidle_device *dev, | ||
40 | struct cpuidle_state *state) | ||
41 | { | ||
42 | struct timeval before, after; | ||
43 | int idle_time; | ||
44 | |||
45 | local_irq_disable(); | ||
46 | do_gettimeofday(&before); | ||
47 | |||
48 | cpu_do_idle(); | ||
49 | |||
50 | do_gettimeofday(&after); | ||
51 | local_irq_enable(); | ||
52 | idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + | ||
53 | (after.tv_usec - before.tv_usec); | ||
54 | |||
55 | return idle_time; | ||
56 | } | ||
57 | |||
58 | static int __init exynos4_init_cpuidle(void) | ||
59 | { | ||
60 | int i, max_cpuidle_state, cpu_id; | ||
61 | struct cpuidle_device *device; | ||
62 | |||
63 | cpuidle_register_driver(&exynos4_idle_driver); | ||
64 | |||
65 | for_each_cpu(cpu_id, cpu_online_mask) { | ||
66 | device = &per_cpu(exynos4_cpuidle_device, cpu_id); | ||
67 | device->cpu = cpu_id; | ||
68 | |||
69 | device->state_count = (sizeof(exynos4_cpuidle_set) / | ||
70 | sizeof(struct cpuidle_state)); | ||
71 | |||
72 | max_cpuidle_state = device->state_count; | ||
73 | |||
74 | for (i = 0; i < max_cpuidle_state; i++) { | ||
75 | memcpy(&device->states[i], &exynos4_cpuidle_set[i], | ||
76 | sizeof(struct cpuidle_state)); | ||
77 | } | ||
78 | |||
79 | if (cpuidle_register_device(device)) { | ||
80 | printk(KERN_ERR "CPUidle register device failed\n,"); | ||
81 | return -EIO; | ||
82 | } | ||
83 | } | ||
84 | return 0; | ||
85 | } | ||
86 | device_initcall(exynos4_init_cpuidle); | ||
diff --git a/arch/arm/mach-exynos4/gpiolib.c b/arch/arm/mach-exynos4/gpiolib.c deleted file mode 100644 index d54ca6adb660..000000000000 --- a/arch/arm/mach-exynos4/gpiolib.c +++ /dev/null | |||
@@ -1,365 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-exynos4/gpiolib.c | ||
2 | * | ||
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * EXYNOS4 - GPIOlib support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/gpio.h> | ||
17 | |||
18 | #include <mach/map.h> | ||
19 | |||
20 | #include <plat/gpio-core.h> | ||
21 | #include <plat/gpio-cfg.h> | ||
22 | #include <plat/gpio-cfg-helpers.h> | ||
23 | |||
24 | static struct s3c_gpio_cfg gpio_cfg = { | ||
25 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
26 | .set_pull = s3c_gpio_setpull_updown, | ||
27 | .get_pull = s3c_gpio_getpull_updown, | ||
28 | }; | ||
29 | |||
30 | static struct s3c_gpio_cfg gpio_cfg_noint = { | ||
31 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
32 | .set_pull = s3c_gpio_setpull_updown, | ||
33 | .get_pull = s3c_gpio_getpull_updown, | ||
34 | }; | ||
35 | |||
36 | /* | ||
37 | * Following are the gpio banks in v310. | ||
38 | * | ||
39 | * The 'config' member when left to NULL, is initialized to the default | ||
40 | * structure gpio_cfg in the init function below. | ||
41 | * | ||
42 | * The 'base' member is also initialized in the init function below. | ||
43 | * Note: The initialization of 'base' member of s3c_gpio_chip structure | ||
44 | * uses the above macro and depends on the banks being listed in order here. | ||
45 | */ | ||
46 | static struct s3c_gpio_chip exynos4_gpio_part1_4bit[] = { | ||
47 | { | ||
48 | .chip = { | ||
49 | .base = EXYNOS4_GPA0(0), | ||
50 | .ngpio = EXYNOS4_GPIO_A0_NR, | ||
51 | .label = "GPA0", | ||
52 | }, | ||
53 | }, { | ||
54 | .chip = { | ||
55 | .base = EXYNOS4_GPA1(0), | ||
56 | .ngpio = EXYNOS4_GPIO_A1_NR, | ||
57 | .label = "GPA1", | ||
58 | }, | ||
59 | }, { | ||
60 | .chip = { | ||
61 | .base = EXYNOS4_GPB(0), | ||
62 | .ngpio = EXYNOS4_GPIO_B_NR, | ||
63 | .label = "GPB", | ||
64 | }, | ||
65 | }, { | ||
66 | .chip = { | ||
67 | .base = EXYNOS4_GPC0(0), | ||
68 | .ngpio = EXYNOS4_GPIO_C0_NR, | ||
69 | .label = "GPC0", | ||
70 | }, | ||
71 | }, { | ||
72 | .chip = { | ||
73 | .base = EXYNOS4_GPC1(0), | ||
74 | .ngpio = EXYNOS4_GPIO_C1_NR, | ||
75 | .label = "GPC1", | ||
76 | }, | ||
77 | }, { | ||
78 | .chip = { | ||
79 | .base = EXYNOS4_GPD0(0), | ||
80 | .ngpio = EXYNOS4_GPIO_D0_NR, | ||
81 | .label = "GPD0", | ||
82 | }, | ||
83 | }, { | ||
84 | .chip = { | ||
85 | .base = EXYNOS4_GPD1(0), | ||
86 | .ngpio = EXYNOS4_GPIO_D1_NR, | ||
87 | .label = "GPD1", | ||
88 | }, | ||
89 | }, { | ||
90 | .chip = { | ||
91 | .base = EXYNOS4_GPE0(0), | ||
92 | .ngpio = EXYNOS4_GPIO_E0_NR, | ||
93 | .label = "GPE0", | ||
94 | }, | ||
95 | }, { | ||
96 | .chip = { | ||
97 | .base = EXYNOS4_GPE1(0), | ||
98 | .ngpio = EXYNOS4_GPIO_E1_NR, | ||
99 | .label = "GPE1", | ||
100 | }, | ||
101 | }, { | ||
102 | .chip = { | ||
103 | .base = EXYNOS4_GPE2(0), | ||
104 | .ngpio = EXYNOS4_GPIO_E2_NR, | ||
105 | .label = "GPE2", | ||
106 | }, | ||
107 | }, { | ||
108 | .chip = { | ||
109 | .base = EXYNOS4_GPE3(0), | ||
110 | .ngpio = EXYNOS4_GPIO_E3_NR, | ||
111 | .label = "GPE3", | ||
112 | }, | ||
113 | }, { | ||
114 | .chip = { | ||
115 | .base = EXYNOS4_GPE4(0), | ||
116 | .ngpio = EXYNOS4_GPIO_E4_NR, | ||
117 | .label = "GPE4", | ||
118 | }, | ||
119 | }, { | ||
120 | .chip = { | ||
121 | .base = EXYNOS4_GPF0(0), | ||
122 | .ngpio = EXYNOS4_GPIO_F0_NR, | ||
123 | .label = "GPF0", | ||
124 | }, | ||
125 | }, { | ||
126 | .chip = { | ||
127 | .base = EXYNOS4_GPF1(0), | ||
128 | .ngpio = EXYNOS4_GPIO_F1_NR, | ||
129 | .label = "GPF1", | ||
130 | }, | ||
131 | }, { | ||
132 | .chip = { | ||
133 | .base = EXYNOS4_GPF2(0), | ||
134 | .ngpio = EXYNOS4_GPIO_F2_NR, | ||
135 | .label = "GPF2", | ||
136 | }, | ||
137 | }, { | ||
138 | .chip = { | ||
139 | .base = EXYNOS4_GPF3(0), | ||
140 | .ngpio = EXYNOS4_GPIO_F3_NR, | ||
141 | .label = "GPF3", | ||
142 | }, | ||
143 | }, | ||
144 | }; | ||
145 | |||
146 | static struct s3c_gpio_chip exynos4_gpio_part2_4bit[] = { | ||
147 | { | ||
148 | .chip = { | ||
149 | .base = EXYNOS4_GPJ0(0), | ||
150 | .ngpio = EXYNOS4_GPIO_J0_NR, | ||
151 | .label = "GPJ0", | ||
152 | }, | ||
153 | }, { | ||
154 | .chip = { | ||
155 | .base = EXYNOS4_GPJ1(0), | ||
156 | .ngpio = EXYNOS4_GPIO_J1_NR, | ||
157 | .label = "GPJ1", | ||
158 | }, | ||
159 | }, { | ||
160 | .chip = { | ||
161 | .base = EXYNOS4_GPK0(0), | ||
162 | .ngpio = EXYNOS4_GPIO_K0_NR, | ||
163 | .label = "GPK0", | ||
164 | }, | ||
165 | }, { | ||
166 | .chip = { | ||
167 | .base = EXYNOS4_GPK1(0), | ||
168 | .ngpio = EXYNOS4_GPIO_K1_NR, | ||
169 | .label = "GPK1", | ||
170 | }, | ||
171 | }, { | ||
172 | .chip = { | ||
173 | .base = EXYNOS4_GPK2(0), | ||
174 | .ngpio = EXYNOS4_GPIO_K2_NR, | ||
175 | .label = "GPK2", | ||
176 | }, | ||
177 | }, { | ||
178 | .chip = { | ||
179 | .base = EXYNOS4_GPK3(0), | ||
180 | .ngpio = EXYNOS4_GPIO_K3_NR, | ||
181 | .label = "GPK3", | ||
182 | }, | ||
183 | }, { | ||
184 | .chip = { | ||
185 | .base = EXYNOS4_GPL0(0), | ||
186 | .ngpio = EXYNOS4_GPIO_L0_NR, | ||
187 | .label = "GPL0", | ||
188 | }, | ||
189 | }, { | ||
190 | .chip = { | ||
191 | .base = EXYNOS4_GPL1(0), | ||
192 | .ngpio = EXYNOS4_GPIO_L1_NR, | ||
193 | .label = "GPL1", | ||
194 | }, | ||
195 | }, { | ||
196 | .chip = { | ||
197 | .base = EXYNOS4_GPL2(0), | ||
198 | .ngpio = EXYNOS4_GPIO_L2_NR, | ||
199 | .label = "GPL2", | ||
200 | }, | ||
201 | }, { | ||
202 | .config = &gpio_cfg_noint, | ||
203 | .chip = { | ||
204 | .base = EXYNOS4_GPY0(0), | ||
205 | .ngpio = EXYNOS4_GPIO_Y0_NR, | ||
206 | .label = "GPY0", | ||
207 | }, | ||
208 | }, { | ||
209 | .config = &gpio_cfg_noint, | ||
210 | .chip = { | ||
211 | .base = EXYNOS4_GPY1(0), | ||
212 | .ngpio = EXYNOS4_GPIO_Y1_NR, | ||
213 | .label = "GPY1", | ||
214 | }, | ||
215 | }, { | ||
216 | .config = &gpio_cfg_noint, | ||
217 | .chip = { | ||
218 | .base = EXYNOS4_GPY2(0), | ||
219 | .ngpio = EXYNOS4_GPIO_Y2_NR, | ||
220 | .label = "GPY2", | ||
221 | }, | ||
222 | }, { | ||
223 | .config = &gpio_cfg_noint, | ||
224 | .chip = { | ||
225 | .base = EXYNOS4_GPY3(0), | ||
226 | .ngpio = EXYNOS4_GPIO_Y3_NR, | ||
227 | .label = "GPY3", | ||
228 | }, | ||
229 | }, { | ||
230 | .config = &gpio_cfg_noint, | ||
231 | .chip = { | ||
232 | .base = EXYNOS4_GPY4(0), | ||
233 | .ngpio = EXYNOS4_GPIO_Y4_NR, | ||
234 | .label = "GPY4", | ||
235 | }, | ||
236 | }, { | ||
237 | .config = &gpio_cfg_noint, | ||
238 | .chip = { | ||
239 | .base = EXYNOS4_GPY5(0), | ||
240 | .ngpio = EXYNOS4_GPIO_Y5_NR, | ||
241 | .label = "GPY5", | ||
242 | }, | ||
243 | }, { | ||
244 | .config = &gpio_cfg_noint, | ||
245 | .chip = { | ||
246 | .base = EXYNOS4_GPY6(0), | ||
247 | .ngpio = EXYNOS4_GPIO_Y6_NR, | ||
248 | .label = "GPY6", | ||
249 | }, | ||
250 | }, { | ||
251 | .base = (S5P_VA_GPIO2 + 0xC00), | ||
252 | .config = &gpio_cfg_noint, | ||
253 | .irq_base = IRQ_EINT(0), | ||
254 | .chip = { | ||
255 | .base = EXYNOS4_GPX0(0), | ||
256 | .ngpio = EXYNOS4_GPIO_X0_NR, | ||
257 | .label = "GPX0", | ||
258 | .to_irq = samsung_gpiolib_to_irq, | ||
259 | }, | ||
260 | }, { | ||
261 | .base = (S5P_VA_GPIO2 + 0xC20), | ||
262 | .config = &gpio_cfg_noint, | ||
263 | .irq_base = IRQ_EINT(8), | ||
264 | .chip = { | ||
265 | .base = EXYNOS4_GPX1(0), | ||
266 | .ngpio = EXYNOS4_GPIO_X1_NR, | ||
267 | .label = "GPX1", | ||
268 | .to_irq = samsung_gpiolib_to_irq, | ||
269 | }, | ||
270 | }, { | ||
271 | .base = (S5P_VA_GPIO2 + 0xC40), | ||
272 | .config = &gpio_cfg_noint, | ||
273 | .irq_base = IRQ_EINT(16), | ||
274 | .chip = { | ||
275 | .base = EXYNOS4_GPX2(0), | ||
276 | .ngpio = EXYNOS4_GPIO_X2_NR, | ||
277 | .label = "GPX2", | ||
278 | .to_irq = samsung_gpiolib_to_irq, | ||
279 | }, | ||
280 | }, { | ||
281 | .base = (S5P_VA_GPIO2 + 0xC60), | ||
282 | .config = &gpio_cfg_noint, | ||
283 | .irq_base = IRQ_EINT(24), | ||
284 | .chip = { | ||
285 | .base = EXYNOS4_GPX3(0), | ||
286 | .ngpio = EXYNOS4_GPIO_X3_NR, | ||
287 | .label = "GPX3", | ||
288 | .to_irq = samsung_gpiolib_to_irq, | ||
289 | }, | ||
290 | }, | ||
291 | }; | ||
292 | |||
293 | static struct s3c_gpio_chip exynos4_gpio_part3_4bit[] = { | ||
294 | { | ||
295 | .chip = { | ||
296 | .base = EXYNOS4_GPZ(0), | ||
297 | .ngpio = EXYNOS4_GPIO_Z_NR, | ||
298 | .label = "GPZ", | ||
299 | }, | ||
300 | }, | ||
301 | }; | ||
302 | |||
303 | static __init int exynos4_gpiolib_init(void) | ||
304 | { | ||
305 | struct s3c_gpio_chip *chip; | ||
306 | int i; | ||
307 | int group = 0; | ||
308 | int nr_chips; | ||
309 | |||
310 | /* GPIO part 1 */ | ||
311 | |||
312 | chip = exynos4_gpio_part1_4bit; | ||
313 | nr_chips = ARRAY_SIZE(exynos4_gpio_part1_4bit); | ||
314 | |||
315 | for (i = 0; i < nr_chips; i++, chip++) { | ||
316 | if (chip->config == NULL) { | ||
317 | chip->config = &gpio_cfg; | ||
318 | /* Assign the GPIO interrupt group */ | ||
319 | chip->group = group++; | ||
320 | } | ||
321 | if (chip->base == NULL) | ||
322 | chip->base = S5P_VA_GPIO1 + (i) * 0x20; | ||
323 | } | ||
324 | |||
325 | samsung_gpiolib_add_4bit_chips(exynos4_gpio_part1_4bit, nr_chips); | ||
326 | |||
327 | /* GPIO part 2 */ | ||
328 | |||
329 | chip = exynos4_gpio_part2_4bit; | ||
330 | nr_chips = ARRAY_SIZE(exynos4_gpio_part2_4bit); | ||
331 | |||
332 | for (i = 0; i < nr_chips; i++, chip++) { | ||
333 | if (chip->config == NULL) { | ||
334 | chip->config = &gpio_cfg; | ||
335 | /* Assign the GPIO interrupt group */ | ||
336 | chip->group = group++; | ||
337 | } | ||
338 | if (chip->base == NULL) | ||
339 | chip->base = S5P_VA_GPIO2 + (i) * 0x20; | ||
340 | } | ||
341 | |||
342 | samsung_gpiolib_add_4bit_chips(exynos4_gpio_part2_4bit, nr_chips); | ||
343 | |||
344 | /* GPIO part 3 */ | ||
345 | |||
346 | chip = exynos4_gpio_part3_4bit; | ||
347 | nr_chips = ARRAY_SIZE(exynos4_gpio_part3_4bit); | ||
348 | |||
349 | for (i = 0; i < nr_chips; i++, chip++) { | ||
350 | if (chip->config == NULL) { | ||
351 | chip->config = &gpio_cfg; | ||
352 | /* Assign the GPIO interrupt group */ | ||
353 | chip->group = group++; | ||
354 | } | ||
355 | if (chip->base == NULL) | ||
356 | chip->base = S5P_VA_GPIO3 + (i) * 0x20; | ||
357 | } | ||
358 | |||
359 | samsung_gpiolib_add_4bit_chips(exynos4_gpio_part3_4bit, nr_chips); | ||
360 | s5p_register_gpioint_bank(IRQ_GPIO_XA, 0, IRQ_GPIO1_NR_GROUPS); | ||
361 | s5p_register_gpioint_bank(IRQ_GPIO_XB, IRQ_GPIO1_NR_GROUPS, IRQ_GPIO2_NR_GROUPS); | ||
362 | |||
363 | return 0; | ||
364 | } | ||
365 | core_initcall(exynos4_gpiolib_init); | ||
diff --git a/arch/arm/mach-exynos4/mach-nuri.c b/arch/arm/mach-exynos4/mach-nuri.c index bb5d12f43af8..642702bb5b12 100644 --- a/arch/arm/mach-exynos4/mach-nuri.c +++ b/arch/arm/mach-exynos4/mach-nuri.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/serial_core.h> | 12 | #include <linux/serial_core.h> |
13 | #include <linux/input.h> | 13 | #include <linux/input.h> |
14 | #include <linux/i2c.h> | 14 | #include <linux/i2c.h> |
15 | #include <linux/i2c/atmel_mxt_ts.h> | ||
15 | #include <linux/gpio_keys.h> | 16 | #include <linux/gpio_keys.h> |
16 | #include <linux/gpio.h> | 17 | #include <linux/gpio.h> |
17 | #include <linux/regulator/machine.h> | 18 | #include <linux/regulator/machine.h> |
@@ -32,6 +33,8 @@ | |||
32 | #include <plat/sdhci.h> | 33 | #include <plat/sdhci.h> |
33 | #include <plat/ehci.h> | 34 | #include <plat/ehci.h> |
34 | #include <plat/clock.h> | 35 | #include <plat/clock.h> |
36 | #include <plat/gpio-cfg.h> | ||
37 | #include <plat/iic.h> | ||
35 | 38 | ||
36 | #include <mach/map.h> | 39 | #include <mach/map.h> |
37 | 40 | ||
@@ -259,6 +262,88 @@ static struct i2c_board_info i2c1_devs[] __initdata = { | |||
259 | /* Gyro, To be updated */ | 262 | /* Gyro, To be updated */ |
260 | }; | 263 | }; |
261 | 264 | ||
265 | /* TSP */ | ||
266 | static u8 mxt_init_vals[] = { | ||
267 | /* MXT_GEN_COMMAND(6) */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
269 | /* MXT_GEN_POWER(7) */ | ||
270 | 0x20, 0xff, 0x32, | ||
271 | /* MXT_GEN_ACQUIRE(8) */ | ||
272 | 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23, | ||
273 | /* MXT_TOUCH_MULTI(9) */ | ||
274 | 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, | ||
275 | 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00, | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
277 | 0x00, | ||
278 | /* MXT_TOUCH_KEYARRAY(15) */ | ||
279 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, | ||
280 | 0x00, | ||
281 | /* MXT_SPT_GPIOPWM(19) */ | ||
282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
284 | /* MXT_PROCI_GRIPFACE(20) */ | ||
285 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04, | ||
286 | 0x0f, 0x0a, | ||
287 | /* MXT_PROCG_NOISE(22) */ | ||
288 | 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00, | ||
289 | 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03, | ||
290 | /* MXT_TOUCH_PROXIMITY(23) */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, | ||
293 | /* MXT_PROCI_ONETOUCH(24) */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
296 | /* MXT_SPT_SELFTEST(25) */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
298 | 0x00, 0x00, 0x00, 0x00, | ||
299 | /* MXT_PROCI_TWOTOUCH(27) */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
301 | /* MXT_SPT_CTECONFIG(28) */ | ||
302 | 0x00, 0x00, 0x02, 0x08, 0x10, 0x00, | ||
303 | }; | ||
304 | |||
305 | static struct mxt_platform_data mxt_platform_data = { | ||
306 | .config = mxt_init_vals, | ||
307 | .config_length = ARRAY_SIZE(mxt_init_vals), | ||
308 | |||
309 | .x_line = 18, | ||
310 | .y_line = 11, | ||
311 | .x_size = 1024, | ||
312 | .y_size = 600, | ||
313 | .blen = 0x1, | ||
314 | .threshold = 0x28, | ||
315 | .voltage = 2800000, /* 2.8V */ | ||
316 | .orient = MXT_DIAGONAL_COUNTER, | ||
317 | .irqflags = IRQF_TRIGGER_FALLING, | ||
318 | }; | ||
319 | |||
320 | static struct s3c2410_platform_i2c i2c3_data __initdata = { | ||
321 | .flags = 0, | ||
322 | .bus_num = 3, | ||
323 | .slave_addr = 0x10, | ||
324 | .frequency = 400 * 1000, | ||
325 | .sda_delay = 100, | ||
326 | }; | ||
327 | |||
328 | static struct i2c_board_info i2c3_devs[] __initdata = { | ||
329 | { | ||
330 | I2C_BOARD_INFO("atmel_mxt_ts", 0x4a), | ||
331 | .platform_data = &mxt_platform_data, | ||
332 | .irq = IRQ_EINT(4), | ||
333 | }, | ||
334 | }; | ||
335 | |||
336 | static void __init nuri_tsp_init(void) | ||
337 | { | ||
338 | int gpio; | ||
339 | |||
340 | /* TOUCH_INT: XEINT_4 */ | ||
341 | gpio = EXYNOS4_GPX0(4); | ||
342 | gpio_request(gpio, "TOUCH_INT"); | ||
343 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf)); | ||
344 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
345 | } | ||
346 | |||
262 | /* GPIO I2C 5 (PMIC) */ | 347 | /* GPIO I2C 5 (PMIC) */ |
263 | static struct i2c_board_info i2c5_devs[] __initdata = { | 348 | static struct i2c_board_info i2c5_devs[] __initdata = { |
264 | /* max8997, To be updated */ | 349 | /* max8997, To be updated */ |
@@ -283,6 +368,7 @@ static struct platform_device *nuri_devices[] __initdata = { | |||
283 | &s3c_device_wdt, | 368 | &s3c_device_wdt, |
284 | &s3c_device_timer[0], | 369 | &s3c_device_timer[0], |
285 | &s5p_device_ehci, | 370 | &s5p_device_ehci, |
371 | &s3c_device_i2c3, | ||
286 | 372 | ||
287 | /* NURI Devices */ | 373 | /* NURI Devices */ |
288 | &nuri_gpio_keys, | 374 | &nuri_gpio_keys, |
@@ -300,8 +386,11 @@ static void __init nuri_map_io(void) | |||
300 | static void __init nuri_machine_init(void) | 386 | static void __init nuri_machine_init(void) |
301 | { | 387 | { |
302 | nuri_sdhci_init(); | 388 | nuri_sdhci_init(); |
389 | nuri_tsp_init(); | ||
303 | 390 | ||
304 | i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs)); | 391 | i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs)); |
392 | s3c_i2c3_set_platdata(&i2c3_data); | ||
393 | i2c_register_board_info(3, i2c3_devs, ARRAY_SIZE(i2c3_devs)); | ||
305 | i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs)); | 394 | i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs)); |
306 | 395 | ||
307 | nuri_ehci_init(); | 396 | nuri_ehci_init(); |
diff --git a/arch/arm/mach-gemini/board-wbd111.c b/arch/arm/mach-gemini/board-wbd111.c index af7b68a6b258..88cc422ee444 100644 --- a/arch/arm/mach-gemini/board-wbd111.c +++ b/arch/arm/mach-gemini/board-wbd111.c | |||
@@ -84,7 +84,6 @@ static struct sys_timer wbd111_timer = { | |||
84 | .init = gemini_timer_init, | 84 | .init = gemini_timer_init, |
85 | }; | 85 | }; |
86 | 86 | ||
87 | #ifdef CONFIG_MTD_PARTITIONS | ||
88 | static struct mtd_partition wbd111_partitions[] = { | 87 | static struct mtd_partition wbd111_partitions[] = { |
89 | { | 88 | { |
90 | .name = "RedBoot", | 89 | .name = "RedBoot", |
@@ -116,11 +115,7 @@ static struct mtd_partition wbd111_partitions[] = { | |||
116 | .mask_flags = MTD_WRITEABLE, | 115 | .mask_flags = MTD_WRITEABLE, |
117 | } | 116 | } |
118 | }; | 117 | }; |
119 | #define wbd111_num_partitions ARRAY_SIZE(wbd111_partitions) | 118 | #define wbd111_num_partitions ARRAY_SIZE(wbd111_partitions) |
120 | #else | ||
121 | #define wbd111_partitions NULL | ||
122 | #define wbd111_num_partitions 0 | ||
123 | #endif /* CONFIG_MTD_PARTITIONS */ | ||
124 | 119 | ||
125 | static void __init wbd111_init(void) | 120 | static void __init wbd111_init(void) |
126 | { | 121 | { |
diff --git a/arch/arm/mach-gemini/board-wbd222.c b/arch/arm/mach-gemini/board-wbd222.c index 99e5bbecf923..3a220347bc88 100644 --- a/arch/arm/mach-gemini/board-wbd222.c +++ b/arch/arm/mach-gemini/board-wbd222.c | |||
@@ -84,7 +84,6 @@ static struct sys_timer wbd222_timer = { | |||
84 | .init = gemini_timer_init, | 84 | .init = gemini_timer_init, |
85 | }; | 85 | }; |
86 | 86 | ||
87 | #ifdef CONFIG_MTD_PARTITIONS | ||
88 | static struct mtd_partition wbd222_partitions[] = { | 87 | static struct mtd_partition wbd222_partitions[] = { |
89 | { | 88 | { |
90 | .name = "RedBoot", | 89 | .name = "RedBoot", |
@@ -116,11 +115,7 @@ static struct mtd_partition wbd222_partitions[] = { | |||
116 | .mask_flags = MTD_WRITEABLE, | 115 | .mask_flags = MTD_WRITEABLE, |
117 | } | 116 | } |
118 | }; | 117 | }; |
119 | #define wbd222_num_partitions ARRAY_SIZE(wbd222_partitions) | 118 | #define wbd222_num_partitions ARRAY_SIZE(wbd222_partitions) |
120 | #else | ||
121 | #define wbd222_partitions NULL | ||
122 | #define wbd222_num_partitions 0 | ||
123 | #endif /* CONFIG_MTD_PARTITIONS */ | ||
124 | 119 | ||
125 | static void __init wbd222_init(void) | 120 | static void __init wbd222_init(void) |
126 | { | 121 | { |
diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c index 140783386785..dca4f7f9f4f7 100644 --- a/arch/arm/mach-ixp4xx/ixdp425-setup.c +++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c | |||
@@ -60,7 +60,6 @@ static struct platform_device ixdp425_flash = { | |||
60 | #if defined(CONFIG_MTD_NAND_PLATFORM) || \ | 60 | #if defined(CONFIG_MTD_NAND_PLATFORM) || \ |
61 | defined(CONFIG_MTD_NAND_PLATFORM_MODULE) | 61 | defined(CONFIG_MTD_NAND_PLATFORM_MODULE) |
62 | 62 | ||
63 | #ifdef CONFIG_MTD_PARTITIONS | ||
64 | const char *part_probes[] = { "cmdlinepart", NULL }; | 63 | const char *part_probes[] = { "cmdlinepart", NULL }; |
65 | 64 | ||
66 | static struct mtd_partition ixdp425_partitions[] = { | 65 | static struct mtd_partition ixdp425_partitions[] = { |
@@ -74,7 +73,6 @@ static struct mtd_partition ixdp425_partitions[] = { | |||
74 | .size = MTDPART_SIZ_FULL | 73 | .size = MTDPART_SIZ_FULL |
75 | }, | 74 | }, |
76 | }; | 75 | }; |
77 | #endif | ||
78 | 76 | ||
79 | static void | 77 | static void |
80 | ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) | 78 | ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) |
@@ -103,11 +101,9 @@ static struct platform_nand_data ixdp425_flash_nand_data = { | |||
103 | .nr_chips = 1, | 101 | .nr_chips = 1, |
104 | .chip_delay = 30, | 102 | .chip_delay = 30, |
105 | .options = NAND_NO_AUTOINCR, | 103 | .options = NAND_NO_AUTOINCR, |
106 | #ifdef CONFIG_MTD_PARTITIONS | ||
107 | .part_probe_types = part_probes, | 104 | .part_probe_types = part_probes, |
108 | .partitions = ixdp425_partitions, | 105 | .partitions = ixdp425_partitions, |
109 | .nr_partitions = ARRAY_SIZE(ixdp425_partitions), | 106 | .nr_partitions = ARRAY_SIZE(ixdp425_partitions), |
110 | #endif | ||
111 | }, | 107 | }, |
112 | .ctrl = { | 108 | .ctrl = { |
113 | .cmd_ctrl = ixdp425_flash_nand_cmd_ctrl | 109 | .cmd_ctrl = ixdp425_flash_nand_cmd_ctrl |
diff --git a/arch/arm/mach-netx/fb.c b/arch/arm/mach-netx/fb.c index 5b84bcd30271..b9913234bbf6 100644 --- a/arch/arm/mach-netx/fb.c +++ b/arch/arm/mach-netx/fb.c | |||
@@ -103,7 +103,6 @@ static struct amba_device fb_device = { | |||
103 | .flags = IORESOURCE_MEM, | 103 | .flags = IORESOURCE_MEM, |
104 | }, | 104 | }, |
105 | .irq = { NETX_IRQ_LCD, NO_IRQ }, | 105 | .irq = { NETX_IRQ_LCD, NO_IRQ }, |
106 | .periphid = 0x10112400, | ||
107 | }; | 106 | }; |
108 | 107 | ||
109 | int netx_fb_init(struct clcd_board *board, struct clcd_panel *panel) | 108 | int netx_fb_init(struct clcd_board *board, struct clcd_panel *panel) |
diff --git a/arch/arm/mach-nomadik/Kconfig b/arch/arm/mach-nomadik/Kconfig index 71f3ea623974..3c5e0f522e9c 100644 --- a/arch/arm/mach-nomadik/Kconfig +++ b/arch/arm/mach-nomadik/Kconfig | |||
@@ -6,7 +6,6 @@ config MACH_NOMADIK_8815NHK | |||
6 | bool "ST 8815 Nomadik Hardware Kit (evaluation board)" | 6 | bool "ST 8815 Nomadik Hardware Kit (evaluation board)" |
7 | select NOMADIK_8815 | 7 | select NOMADIK_8815 |
8 | select HAS_MTU | 8 | select HAS_MTU |
9 | select NOMADIK_GPIO | ||
10 | 9 | ||
11 | endmenu | 10 | endmenu |
12 | 11 | ||
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index b997a35830fc..19d5891c48e3 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -288,6 +288,7 @@ config MACH_IGEP0030 | |||
288 | depends on ARCH_OMAP3 | 288 | depends on ARCH_OMAP3 |
289 | default y | 289 | default y |
290 | select OMAP_PACKAGE_CBB | 290 | select OMAP_PACKAGE_CBB |
291 | select MACH_IGEP0020 | ||
291 | 292 | ||
292 | config MACH_SBC3530 | 293 | config MACH_SBC3530 |
293 | bool "OMAP3 SBC STALKER board" | 294 | bool "OMAP3 SBC STALKER board" |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 66dfbccacd25..b14807794401 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -229,8 +229,6 @@ obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \ | |||
229 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o | 229 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o |
230 | obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \ | 230 | obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \ |
231 | hsmmc.o | 231 | hsmmc.o |
232 | obj-$(CONFIG_MACH_IGEP0030) += board-igep0030.o \ | ||
233 | hsmmc.o | ||
234 | obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \ | 232 | obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \ |
235 | hsmmc.o | 233 | hsmmc.o |
236 | obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o \ | 234 | obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o \ |
@@ -270,3 +268,5 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o | |||
270 | 268 | ||
271 | disp-$(CONFIG_OMAP2_DSS) := display.o | 269 | disp-$(CONFIG_OMAP2_DSS) := display.o |
272 | obj-y += $(disp-m) $(disp-y) | 270 | obj-y += $(disp-m) $(disp-y) |
271 | |||
272 | obj-y += common-board-devices.o | ||
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 1fa6bb896f41..d54969be0a54 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -41,6 +41,7 @@ | |||
41 | 41 | ||
42 | #include "mux.h" | 42 | #include "mux.h" |
43 | #include "hsmmc.h" | 43 | #include "hsmmc.h" |
44 | #include "common-board-devices.h" | ||
44 | 45 | ||
45 | #define SDP2430_CS0_BASE 0x04000000 | 46 | #define SDP2430_CS0_BASE 0x04000000 |
46 | #define SECONDARY_LCD_GPIO 147 | 47 | #define SECONDARY_LCD_GPIO 147 |
@@ -180,15 +181,6 @@ static struct twl4030_platform_data sdp2430_twldata = { | |||
180 | .vmmc1 = &sdp2430_vmmc1, | 181 | .vmmc1 = &sdp2430_vmmc1, |
181 | }; | 182 | }; |
182 | 183 | ||
183 | static struct i2c_board_info __initdata sdp2430_i2c_boardinfo[] = { | ||
184 | { | ||
185 | I2C_BOARD_INFO("twl4030", 0x48), | ||
186 | .flags = I2C_CLIENT_WAKE, | ||
187 | .irq = INT_24XX_SYS_NIRQ, | ||
188 | .platform_data = &sdp2430_twldata, | ||
189 | }, | ||
190 | }; | ||
191 | |||
192 | static struct i2c_board_info __initdata sdp2430_i2c1_boardinfo[] = { | 184 | static struct i2c_board_info __initdata sdp2430_i2c1_boardinfo[] = { |
193 | { | 185 | { |
194 | I2C_BOARD_INFO("isp1301_omap", 0x2D), | 186 | I2C_BOARD_INFO("isp1301_omap", 0x2D), |
@@ -201,8 +193,7 @@ static int __init omap2430_i2c_init(void) | |||
201 | { | 193 | { |
202 | omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo, | 194 | omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo, |
203 | ARRAY_SIZE(sdp2430_i2c1_boardinfo)); | 195 | ARRAY_SIZE(sdp2430_i2c1_boardinfo)); |
204 | omap_register_i2c_bus(2, 2600, sdp2430_i2c_boardinfo, | 196 | omap2_pmic_init("twl4030", &sdp2430_twldata); |
205 | ARRAY_SIZE(sdp2430_i2c_boardinfo)); | ||
206 | return 0; | 197 | return 0; |
207 | } | 198 | } |
208 | 199 | ||
@@ -217,11 +208,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | |||
217 | {} /* Terminator */ | 208 | {} /* Terminator */ |
218 | }; | 209 | }; |
219 | 210 | ||
220 | static struct omap_musb_board_data musb_board_data = { | ||
221 | .interface_type = MUSB_INTERFACE_ULPI, | ||
222 | .mode = MUSB_OTG, | ||
223 | .power = 100, | ||
224 | }; | ||
225 | static struct omap_usb_config sdp2430_usb_config __initdata = { | 211 | static struct omap_usb_config sdp2430_usb_config __initdata = { |
226 | .otg = 1, | 212 | .otg = 1, |
227 | #ifdef CONFIG_USB_GADGET_OMAP | 213 | #ifdef CONFIG_USB_GADGET_OMAP |
@@ -240,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
240 | 226 | ||
241 | static void __init omap_2430sdp_init(void) | 227 | static void __init omap_2430sdp_init(void) |
242 | { | 228 | { |
243 | int ret; | ||
244 | |||
245 | omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC); | 229 | omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC); |
246 | 230 | ||
247 | omap_board_config = sdp2430_config; | 231 | omap_board_config = sdp2430_config; |
@@ -255,14 +239,13 @@ static void __init omap_2430sdp_init(void) | |||
255 | omap2_usbfs_init(&sdp2430_usb_config); | 239 | omap2_usbfs_init(&sdp2430_usb_config); |
256 | 240 | ||
257 | omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP); | 241 | omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP); |
258 | usb_musb_init(&musb_board_data); | 242 | usb_musb_init(NULL); |
259 | 243 | ||
260 | board_smc91x_init(); | 244 | board_smc91x_init(); |
261 | 245 | ||
262 | /* Turn off secondary LCD backlight */ | 246 | /* Turn off secondary LCD backlight */ |
263 | ret = gpio_request(SECONDARY_LCD_GPIO, "Secondary LCD backlight"); | 247 | gpio_request_one(SECONDARY_LCD_GPIO, GPIOF_OUT_INIT_LOW, |
264 | if (ret == 0) | 248 | "Secondary LCD backlight"); |
265 | gpio_direction_output(SECONDARY_LCD_GPIO, 0); | ||
266 | } | 249 | } |
267 | 250 | ||
268 | static void __init omap_2430sdp_map_io(void) | 251 | static void __init omap_2430sdp_map_io(void) |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 23244cd0a5b6..ae2963a98041 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -19,7 +19,6 @@ | |||
19 | #include <linux/input.h> | 19 | #include <linux/input.h> |
20 | #include <linux/input/matrix_keypad.h> | 20 | #include <linux/input/matrix_keypad.h> |
21 | #include <linux/spi/spi.h> | 21 | #include <linux/spi/spi.h> |
22 | #include <linux/spi/ads7846.h> | ||
23 | #include <linux/i2c/twl.h> | 22 | #include <linux/i2c/twl.h> |
24 | #include <linux/regulator/machine.h> | 23 | #include <linux/regulator/machine.h> |
25 | #include <linux/io.h> | 24 | #include <linux/io.h> |
@@ -48,6 +47,7 @@ | |||
48 | #include "hsmmc.h" | 47 | #include "hsmmc.h" |
49 | #include "pm.h" | 48 | #include "pm.h" |
50 | #include "control.h" | 49 | #include "control.h" |
50 | #include "common-board-devices.h" | ||
51 | 51 | ||
52 | #define CONFIG_DISABLE_HFCLK 1 | 52 | #define CONFIG_DISABLE_HFCLK 1 |
53 | 53 | ||
@@ -59,24 +59,6 @@ | |||
59 | 59 | ||
60 | #define TWL4030_MSECURE_GPIO 22 | 60 | #define TWL4030_MSECURE_GPIO 22 |
61 | 61 | ||
62 | /* FIXME: These values need to be updated based on more profiling on 3430sdp*/ | ||
63 | static struct cpuidle_params omap3_cpuidle_params_table[] = { | ||
64 | /* C1 */ | ||
65 | {1, 2, 2, 5}, | ||
66 | /* C2 */ | ||
67 | {1, 10, 10, 30}, | ||
68 | /* C3 */ | ||
69 | {1, 50, 50, 300}, | ||
70 | /* C4 */ | ||
71 | {1, 1500, 1800, 4000}, | ||
72 | /* C5 */ | ||
73 | {1, 2500, 7500, 12000}, | ||
74 | /* C6 */ | ||
75 | {1, 3000, 8500, 15000}, | ||
76 | /* C7 */ | ||
77 | {1, 10000, 30000, 300000}, | ||
78 | }; | ||
79 | |||
80 | static uint32_t board_keymap[] = { | 62 | static uint32_t board_keymap[] = { |
81 | KEY(0, 0, KEY_LEFT), | 63 | KEY(0, 0, KEY_LEFT), |
82 | KEY(0, 1, KEY_RIGHT), | 64 | KEY(0, 1, KEY_RIGHT), |
@@ -123,63 +105,14 @@ static struct twl4030_keypad_data sdp3430_kp_data = { | |||
123 | .rep = 1, | 105 | .rep = 1, |
124 | }; | 106 | }; |
125 | 107 | ||
126 | static int ts_gpio; /* Needed for ads7846_get_pendown_state */ | ||
127 | |||
128 | /** | ||
129 | * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq | ||
130 | * | ||
131 | * @return - void. If request gpio fails then Flag KERN_ERR. | ||
132 | */ | ||
133 | static void ads7846_dev_init(void) | ||
134 | { | ||
135 | if (gpio_request(ts_gpio, "ADS7846 pendown") < 0) { | ||
136 | printk(KERN_ERR "can't get ads746 pen down GPIO\n"); | ||
137 | return; | ||
138 | } | ||
139 | |||
140 | gpio_direction_input(ts_gpio); | ||
141 | gpio_set_debounce(ts_gpio, 310); | ||
142 | } | ||
143 | |||
144 | static int ads7846_get_pendown_state(void) | ||
145 | { | ||
146 | return !gpio_get_value(ts_gpio); | ||
147 | } | ||
148 | |||
149 | static struct ads7846_platform_data tsc2046_config __initdata = { | ||
150 | .get_pendown_state = ads7846_get_pendown_state, | ||
151 | .keep_vref_on = 1, | ||
152 | .wakeup = true, | ||
153 | }; | ||
154 | |||
155 | |||
156 | static struct omap2_mcspi_device_config tsc2046_mcspi_config = { | ||
157 | .turbo_mode = 0, | ||
158 | .single_channel = 1, /* 0: slave, 1: master */ | ||
159 | }; | ||
160 | |||
161 | static struct spi_board_info sdp3430_spi_board_info[] __initdata = { | ||
162 | [0] = { | ||
163 | /* | ||
164 | * TSC2046 operates at a max freqency of 2MHz, so | ||
165 | * operate slightly below at 1.5MHz | ||
166 | */ | ||
167 | .modalias = "ads7846", | ||
168 | .bus_num = 1, | ||
169 | .chip_select = 0, | ||
170 | .max_speed_hz = 1500000, | ||
171 | .controller_data = &tsc2046_mcspi_config, | ||
172 | .irq = 0, | ||
173 | .platform_data = &tsc2046_config, | ||
174 | }, | ||
175 | }; | ||
176 | |||
177 | |||
178 | #define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8 | 108 | #define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8 |
179 | #define SDP3430_LCD_PANEL_ENABLE_GPIO 5 | 109 | #define SDP3430_LCD_PANEL_ENABLE_GPIO 5 |
180 | 110 | ||
181 | static unsigned backlight_gpio; | 111 | static struct gpio sdp3430_dss_gpios[] __initdata = { |
182 | static unsigned enable_gpio; | 112 | {SDP3430_LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, "LCD reset" }, |
113 | {SDP3430_LCD_PANEL_BACKLIGHT_GPIO, GPIOF_OUT_INIT_LOW, "LCD Backlight"}, | ||
114 | }; | ||
115 | |||
183 | static int lcd_enabled; | 116 | static int lcd_enabled; |
184 | static int dvi_enabled; | 117 | static int dvi_enabled; |
185 | 118 | ||
@@ -187,29 +120,11 @@ static void __init sdp3430_display_init(void) | |||
187 | { | 120 | { |
188 | int r; | 121 | int r; |
189 | 122 | ||
190 | enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO; | 123 | r = gpio_request_array(sdp3430_dss_gpios, |
191 | backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; | 124 | ARRAY_SIZE(sdp3430_dss_gpios)); |
192 | 125 | if (r) | |
193 | r = gpio_request(enable_gpio, "LCD reset"); | 126 | printk(KERN_ERR "failed to get LCD control GPIOs\n"); |
194 | if (r) { | ||
195 | printk(KERN_ERR "failed to get LCD reset GPIO\n"); | ||
196 | goto err0; | ||
197 | } | ||
198 | |||
199 | r = gpio_request(backlight_gpio, "LCD Backlight"); | ||
200 | if (r) { | ||
201 | printk(KERN_ERR "failed to get LCD backlight GPIO\n"); | ||
202 | goto err1; | ||
203 | } | ||
204 | |||
205 | gpio_direction_output(enable_gpio, 0); | ||
206 | gpio_direction_output(backlight_gpio, 0); | ||
207 | 127 | ||
208 | return; | ||
209 | err1: | ||
210 | gpio_free(enable_gpio); | ||
211 | err0: | ||
212 | return; | ||
213 | } | 128 | } |
214 | 129 | ||
215 | static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev) | 130 | static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev) |
@@ -219,8 +134,8 @@ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev) | |||
219 | return -EINVAL; | 134 | return -EINVAL; |
220 | } | 135 | } |
221 | 136 | ||
222 | gpio_direction_output(enable_gpio, 1); | 137 | gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 1); |
223 | gpio_direction_output(backlight_gpio, 1); | 138 | gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 1); |
224 | 139 | ||
225 | lcd_enabled = 1; | 140 | lcd_enabled = 1; |
226 | 141 | ||
@@ -231,8 +146,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev) | |||
231 | { | 146 | { |
232 | lcd_enabled = 0; | 147 | lcd_enabled = 0; |
233 | 148 | ||
234 | gpio_direction_output(enable_gpio, 0); | 149 | gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 0); |
235 | gpio_direction_output(backlight_gpio, 0); | 150 | gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 0); |
236 | } | 151 | } |
237 | 152 | ||
238 | static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev) | 153 | static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev) |
@@ -360,12 +275,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev, | |||
360 | omap2_hsmmc_init(mmc); | 275 | omap2_hsmmc_init(mmc); |
361 | 276 | ||
362 | /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */ | 277 | /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */ |
363 | gpio_request(gpio + 7, "sub_lcd_en_bkl"); | 278 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl"); |
364 | gpio_direction_output(gpio + 7, 0); | ||
365 | 279 | ||
366 | /* gpio + 15 is "sub_lcd_nRST" (output) */ | 280 | /* gpio + 15 is "sub_lcd_nRST" (output) */ |
367 | gpio_request(gpio + 15, "sub_lcd_nRST"); | 281 | gpio_request_one(gpio + 15, GPIOF_OUT_INIT_LOW, "sub_lcd_nRST"); |
368 | gpio_direction_output(gpio + 15, 0); | ||
369 | 282 | ||
370 | return 0; | 283 | return 0; |
371 | } | 284 | } |
@@ -580,20 +493,10 @@ static struct twl4030_platform_data sdp3430_twldata = { | |||
580 | .vpll2 = &sdp3430_vpll2, | 493 | .vpll2 = &sdp3430_vpll2, |
581 | }; | 494 | }; |
582 | 495 | ||
583 | static struct i2c_board_info __initdata sdp3430_i2c_boardinfo[] = { | ||
584 | { | ||
585 | I2C_BOARD_INFO("twl4030", 0x48), | ||
586 | .flags = I2C_CLIENT_WAKE, | ||
587 | .irq = INT_34XX_SYS_NIRQ, | ||
588 | .platform_data = &sdp3430_twldata, | ||
589 | }, | ||
590 | }; | ||
591 | |||
592 | static int __init omap3430_i2c_init(void) | 496 | static int __init omap3430_i2c_init(void) |
593 | { | 497 | { |
594 | /* i2c1 for PMIC only */ | 498 | /* i2c1 for PMIC only */ |
595 | omap_register_i2c_bus(1, 2600, sdp3430_i2c_boardinfo, | 499 | omap3_pmic_init("twl4030", &sdp3430_twldata); |
596 | ARRAY_SIZE(sdp3430_i2c_boardinfo)); | ||
597 | /* i2c2 on camera connector (for sensor control) and optional isp1301 */ | 500 | /* i2c2 on camera connector (for sensor control) and optional isp1301 */ |
598 | omap_register_i2c_bus(2, 400, NULL, 0); | 501 | omap_register_i2c_bus(2, 400, NULL, 0); |
599 | /* i2c3 on display connector (for DVI, tfp410) */ | 502 | /* i2c3 on display connector (for DVI, tfp410) */ |
@@ -872,30 +775,22 @@ static struct flash_partitions sdp_flash_partitions[] = { | |||
872 | }, | 775 | }, |
873 | }; | 776 | }; |
874 | 777 | ||
875 | static struct omap_musb_board_data musb_board_data = { | ||
876 | .interface_type = MUSB_INTERFACE_ULPI, | ||
877 | .mode = MUSB_OTG, | ||
878 | .power = 100, | ||
879 | }; | ||
880 | |||
881 | static void __init omap_3430sdp_init(void) | 778 | static void __init omap_3430sdp_init(void) |
882 | { | 779 | { |
780 | int gpio_pendown; | ||
781 | |||
883 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 782 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
884 | omap_board_config = sdp3430_config; | 783 | omap_board_config = sdp3430_config; |
885 | omap_board_config_size = ARRAY_SIZE(sdp3430_config); | 784 | omap_board_config_size = ARRAY_SIZE(sdp3430_config); |
886 | omap3_pm_init_cpuidle(omap3_cpuidle_params_table); | ||
887 | omap3430_i2c_init(); | 785 | omap3430_i2c_init(); |
888 | omap_display_init(&sdp3430_dss_data); | 786 | omap_display_init(&sdp3430_dss_data); |
889 | if (omap_rev() > OMAP3430_REV_ES1_0) | 787 | if (omap_rev() > OMAP3430_REV_ES1_0) |
890 | ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV2; | 788 | gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV2; |
891 | else | 789 | else |
892 | ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV1; | 790 | gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV1; |
893 | sdp3430_spi_board_info[0].irq = gpio_to_irq(ts_gpio); | 791 | omap_ads7846_init(1, gpio_pendown, 310, NULL); |
894 | spi_register_board_info(sdp3430_spi_board_info, | ||
895 | ARRAY_SIZE(sdp3430_spi_board_info)); | ||
896 | ads7846_dev_init(); | ||
897 | board_serial_init(); | 792 | board_serial_init(); |
898 | usb_musb_init(&musb_board_data); | 793 | usb_musb_init(NULL); |
899 | board_smc91x_init(); | 794 | board_smc91x_init(); |
900 | board_flash_init(sdp_flash_partitions, chip_sel_3430, 0); | 795 | board_flash_init(sdp_flash_partitions, chip_sel_3430, 0); |
901 | sdp3430_display_init(); | 796 | sdp3430_display_init(); |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 93edd7fcf451..73fa90bb6953 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include "hsmmc.h" | 42 | #include "hsmmc.h" |
43 | #include "timer-gp.h" | 43 | #include "timer-gp.h" |
44 | #include "control.h" | 44 | #include "control.h" |
45 | #include "common-board-devices.h" | ||
45 | 46 | ||
46 | #define ETH_KS8851_IRQ 34 | 47 | #define ETH_KS8851_IRQ 34 |
47 | #define ETH_KS8851_POWER_ON 48 | 48 | #define ETH_KS8851_POWER_ON 48 |
@@ -251,58 +252,22 @@ static struct spi_board_info sdp4430_spi_board_info[] __initdata = { | |||
251 | }, | 252 | }, |
252 | }; | 253 | }; |
253 | 254 | ||
255 | static struct gpio sdp4430_eth_gpios[] __initdata = { | ||
256 | { ETH_KS8851_POWER_ON, GPIOF_OUT_INIT_HIGH, "eth_power" }, | ||
257 | { ETH_KS8851_QUART, GPIOF_OUT_INIT_HIGH, "quart" }, | ||
258 | { ETH_KS8851_IRQ, GPIOF_IN, "eth_irq" }, | ||
259 | }; | ||
260 | |||
254 | static int omap_ethernet_init(void) | 261 | static int omap_ethernet_init(void) |
255 | { | 262 | { |
256 | int status; | 263 | int status; |
257 | 264 | ||
258 | /* Request of GPIO lines */ | 265 | /* Request of GPIO lines */ |
266 | status = gpio_request_array(sdp4430_eth_gpios, | ||
267 | ARRAY_SIZE(sdp4430_eth_gpios)); | ||
268 | if (status) | ||
269 | pr_err("Cannot request ETH GPIOs\n"); | ||
259 | 270 | ||
260 | status = gpio_request(ETH_KS8851_POWER_ON, "eth_power"); | ||
261 | if (status) { | ||
262 | pr_err("Cannot request GPIO %d\n", ETH_KS8851_POWER_ON); | ||
263 | return status; | ||
264 | } | ||
265 | |||
266 | status = gpio_request(ETH_KS8851_QUART, "quart"); | ||
267 | if (status) { | ||
268 | pr_err("Cannot request GPIO %d\n", ETH_KS8851_QUART); | ||
269 | goto error1; | ||
270 | } | ||
271 | |||
272 | status = gpio_request(ETH_KS8851_IRQ, "eth_irq"); | ||
273 | if (status) { | ||
274 | pr_err("Cannot request GPIO %d\n", ETH_KS8851_IRQ); | ||
275 | goto error2; | ||
276 | } | ||
277 | |||
278 | /* Configuration of requested GPIO lines */ | ||
279 | |||
280 | status = gpio_direction_output(ETH_KS8851_POWER_ON, 1); | ||
281 | if (status) { | ||
282 | pr_err("Cannot set output GPIO %d\n", ETH_KS8851_IRQ); | ||
283 | goto error3; | ||
284 | } | ||
285 | |||
286 | status = gpio_direction_output(ETH_KS8851_QUART, 1); | ||
287 | if (status) { | ||
288 | pr_err("Cannot set output GPIO %d\n", ETH_KS8851_QUART); | ||
289 | goto error3; | ||
290 | } | ||
291 | |||
292 | status = gpio_direction_input(ETH_KS8851_IRQ); | ||
293 | if (status) { | ||
294 | pr_err("Cannot set input GPIO %d\n", ETH_KS8851_IRQ); | ||
295 | goto error3; | ||
296 | } | ||
297 | |||
298 | return 0; | ||
299 | |||
300 | error3: | ||
301 | gpio_free(ETH_KS8851_IRQ); | ||
302 | error2: | ||
303 | gpio_free(ETH_KS8851_QUART); | ||
304 | error1: | ||
305 | gpio_free(ETH_KS8851_POWER_ON); | ||
306 | return status; | 271 | return status; |
307 | } | 272 | } |
308 | 273 | ||
@@ -575,14 +540,6 @@ static struct twl4030_platform_data sdp4430_twldata = { | |||
575 | .usb = &omap4_usbphy_data | 540 | .usb = &omap4_usbphy_data |
576 | }; | 541 | }; |
577 | 542 | ||
578 | static struct i2c_board_info __initdata sdp4430_i2c_boardinfo[] = { | ||
579 | { | ||
580 | I2C_BOARD_INFO("twl6030", 0x48), | ||
581 | .flags = I2C_CLIENT_WAKE, | ||
582 | .irq = OMAP44XX_IRQ_SYS_1N, | ||
583 | .platform_data = &sdp4430_twldata, | ||
584 | }, | ||
585 | }; | ||
586 | static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = { | 543 | static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = { |
587 | { | 544 | { |
588 | I2C_BOARD_INFO("tmp105", 0x48), | 545 | I2C_BOARD_INFO("tmp105", 0x48), |
@@ -598,12 +555,7 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = { | |||
598 | }; | 555 | }; |
599 | static int __init omap4_i2c_init(void) | 556 | static int __init omap4_i2c_init(void) |
600 | { | 557 | { |
601 | /* | 558 | omap4_pmic_init("twl6030", &sdp4430_twldata); |
602 | * Phoenix Audio IC needs I2C1 to | ||
603 | * start with 400 KHz or less | ||
604 | */ | ||
605 | omap_register_i2c_bus(1, 400, sdp4430_i2c_boardinfo, | ||
606 | ARRAY_SIZE(sdp4430_i2c_boardinfo)); | ||
607 | omap_register_i2c_bus(2, 400, NULL, 0); | 559 | omap_register_i2c_bus(2, 400, NULL, 0); |
608 | omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, | 560 | omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, |
609 | ARRAY_SIZE(sdp4430_i2c_3_boardinfo)); | 561 | ARRAY_SIZE(sdp4430_i2c_3_boardinfo)); |
@@ -614,21 +566,13 @@ static int __init omap4_i2c_init(void) | |||
614 | 566 | ||
615 | static void __init omap_sfh7741prox_init(void) | 567 | static void __init omap_sfh7741prox_init(void) |
616 | { | 568 | { |
617 | int error; | 569 | int error; |
618 | 570 | ||
619 | error = gpio_request(OMAP4_SFH7741_ENABLE_GPIO, "sfh7741"); | 571 | error = gpio_request_one(OMAP4_SFH7741_ENABLE_GPIO, |
620 | if (error < 0) { | 572 | GPIOF_OUT_INIT_LOW, "sfh7741"); |
573 | if (error < 0) | ||
621 | pr_err("%s:failed to request GPIO %d, error %d\n", | 574 | pr_err("%s:failed to request GPIO %d, error %d\n", |
622 | __func__, OMAP4_SFH7741_ENABLE_GPIO, error); | 575 | __func__, OMAP4_SFH7741_ENABLE_GPIO, error); |
623 | return; | ||
624 | } | ||
625 | |||
626 | error = gpio_direction_output(OMAP4_SFH7741_ENABLE_GPIO , 0); | ||
627 | if (error < 0) { | ||
628 | pr_err("%s: GPIO configuration failed: GPIO %d,error %d\n", | ||
629 | __func__, OMAP4_SFH7741_ENABLE_GPIO, error); | ||
630 | gpio_free(OMAP4_SFH7741_ENABLE_GPIO); | ||
631 | } | ||
632 | } | 576 | } |
633 | 577 | ||
634 | static void sdp4430_hdmi_mux_init(void) | 578 | static void sdp4430_hdmi_mux_init(void) |
@@ -645,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void) | |||
645 | OMAP_PIN_INPUT_PULLUP); | 589 | OMAP_PIN_INPUT_PULLUP); |
646 | } | 590 | } |
647 | 591 | ||
592 | static struct gpio sdp4430_hdmi_gpios[] = { | ||
593 | { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" }, | ||
594 | { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, | ||
595 | }; | ||
596 | |||
648 | static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) | 597 | static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) |
649 | { | 598 | { |
650 | int status; | 599 | int status; |
651 | 600 | ||
652 | status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, | 601 | status = gpio_request_array(sdp4430_hdmi_gpios, |
653 | "hdmi_gpio_hpd"); | 602 | ARRAY_SIZE(sdp4430_hdmi_gpios)); |
654 | if (status) { | 603 | if (status) |
655 | pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); | 604 | pr_err("%s: Cannot request HDMI GPIOs\n", __func__); |
656 | return status; | ||
657 | } | ||
658 | status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, | ||
659 | "hdmi_gpio_ls_oe"); | ||
660 | if (status) { | ||
661 | pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE); | ||
662 | goto error1; | ||
663 | } | ||
664 | |||
665 | return 0; | ||
666 | |||
667 | error1: | ||
668 | gpio_free(HDMI_GPIO_HPD); | ||
669 | 605 | ||
670 | return status; | 606 | return status; |
671 | } | 607 | } |
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index a890d244fec6..5e438a77cd72 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c | |||
@@ -89,19 +89,13 @@ static void __init am3517_crane_init(void) | |||
89 | return; | 89 | return; |
90 | } | 90 | } |
91 | 91 | ||
92 | ret = gpio_request(GPIO_USB_POWER, "usb_ehci_enable"); | 92 | ret = gpio_request_one(GPIO_USB_POWER, GPIOF_OUT_INIT_HIGH, |
93 | "usb_ehci_enable"); | ||
93 | if (ret < 0) { | 94 | if (ret < 0) { |
94 | pr_err("Can not request GPIO %d\n", GPIO_USB_POWER); | 95 | pr_err("Can not request GPIO %d\n", GPIO_USB_POWER); |
95 | return; | 96 | return; |
96 | } | 97 | } |
97 | 98 | ||
98 | ret = gpio_direction_output(GPIO_USB_POWER, 1); | ||
99 | if (ret < 0) { | ||
100 | gpio_free(GPIO_USB_POWER); | ||
101 | pr_err("Unable to initialize EHCI power\n"); | ||
102 | return; | ||
103 | } | ||
104 | |||
105 | usbhs_init(&usbhs_bdata); | 99 | usbhs_init(&usbhs_bdata); |
106 | } | 100 | } |
107 | 101 | ||
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index ff8c59be36e5..63af4171c043 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
@@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void) | |||
174 | int r; | 174 | int r; |
175 | 175 | ||
176 | omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP); | 176 | omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP); |
177 | r = gpio_request(GPIO_RTCS35390A_IRQ, "rtcs35390a-irq"); | 177 | |
178 | r = gpio_request_one(GPIO_RTCS35390A_IRQ, GPIOF_IN, "rtcs35390a-irq"); | ||
178 | if (r < 0) { | 179 | if (r < 0) { |
179 | printk(KERN_WARNING "failed to request GPIO#%d\n", | 180 | printk(KERN_WARNING "failed to request GPIO#%d\n", |
180 | GPIO_RTCS35390A_IRQ); | 181 | GPIO_RTCS35390A_IRQ); |
181 | return; | 182 | return; |
182 | } | 183 | } |
183 | r = gpio_direction_input(GPIO_RTCS35390A_IRQ); | 184 | |
184 | if (r < 0) { | ||
185 | printk(KERN_WARNING "GPIO#%d cannot be configured as input\n", | ||
186 | GPIO_RTCS35390A_IRQ); | ||
187 | gpio_free(GPIO_RTCS35390A_IRQ); | ||
188 | return; | ||
189 | } | ||
190 | am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ); | 185 | am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ); |
191 | } | 186 | } |
192 | 187 | ||
@@ -242,6 +237,15 @@ static int dvi_enabled; | |||
242 | 237 | ||
243 | #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ | 238 | #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ |
244 | defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) | 239 | defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) |
240 | static struct gpio am3517_evm_dss_gpios[] __initdata = { | ||
241 | /* GPIO 182 = LCD Backlight Power */ | ||
242 | { LCD_PANEL_BKLIGHT_PWR, GPIOF_OUT_INIT_HIGH, "lcd_backlight_pwr" }, | ||
243 | /* GPIO 181 = LCD Panel PWM */ | ||
244 | { LCD_PANEL_PWM, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, | ||
245 | /* GPIO 176 = LCD Panel Power enable pin */ | ||
246 | { LCD_PANEL_PWR, GPIOF_OUT_INIT_HIGH, "dvi enable" }, | ||
247 | }; | ||
248 | |||
245 | static void __init am3517_evm_display_init(void) | 249 | static void __init am3517_evm_display_init(void) |
246 | { | 250 | { |
247 | int r; | 251 | int r; |
@@ -249,41 +253,15 @@ static void __init am3517_evm_display_init(void) | |||
249 | omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP); | 253 | omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP); |
250 | omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN); | 254 | omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN); |
251 | omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN); | 255 | omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN); |
252 | /* | 256 | |
253 | * Enable GPIO 182 = LCD Backlight Power | 257 | r = gpio_request_array(am3517_evm_dss_gpios, |
254 | */ | 258 | ARRAY_SIZE(am3517_evm_dss_gpios)); |
255 | r = gpio_request(LCD_PANEL_BKLIGHT_PWR, "lcd_backlight_pwr"); | ||
256 | if (r) { | 259 | if (r) { |
257 | printk(KERN_ERR "failed to get lcd_backlight_pwr\n"); | 260 | printk(KERN_ERR "failed to get DSS panel control GPIOs\n"); |
258 | return; | 261 | return; |
259 | } | 262 | } |
260 | gpio_direction_output(LCD_PANEL_BKLIGHT_PWR, 1); | ||
261 | /* | ||
262 | * Enable GPIO 181 = LCD Panel PWM | ||
263 | */ | ||
264 | r = gpio_request(LCD_PANEL_PWM, "lcd_pwm"); | ||
265 | if (r) { | ||
266 | printk(KERN_ERR "failed to get lcd_pwm\n"); | ||
267 | goto err_1; | ||
268 | } | ||
269 | gpio_direction_output(LCD_PANEL_PWM, 1); | ||
270 | /* | ||
271 | * Enable GPIO 176 = LCD Panel Power enable pin | ||
272 | */ | ||
273 | r = gpio_request(LCD_PANEL_PWR, "lcd_panel_pwr"); | ||
274 | if (r) { | ||
275 | printk(KERN_ERR "failed to get lcd_panel_pwr\n"); | ||
276 | goto err_2; | ||
277 | } | ||
278 | gpio_direction_output(LCD_PANEL_PWR, 1); | ||
279 | 263 | ||
280 | printk(KERN_INFO "Display initialized successfully\n"); | 264 | printk(KERN_INFO "Display initialized successfully\n"); |
281 | return; | ||
282 | |||
283 | err_2: | ||
284 | gpio_free(LCD_PANEL_PWM); | ||
285 | err_1: | ||
286 | gpio_free(LCD_PANEL_BKLIGHT_PWR); | ||
287 | } | 265 | } |
288 | #else | 266 | #else |
289 | static void __init am3517_evm_display_init(void) {} | 267 | static void __init am3517_evm_display_init(void) {} |
@@ -396,7 +374,7 @@ static struct omap_musb_board_data musb_board_data = { | |||
396 | .power = 500, | 374 | .power = 500, |
397 | .set_phy_power = am35x_musb_phy_power, | 375 | .set_phy_power = am35x_musb_phy_power, |
398 | .clear_irq = am35x_musb_clear_irq, | 376 | .clear_irq = am35x_musb_clear_irq, |
399 | .set_mode = am35x_musb_set_mode, | 377 | .set_mode = am35x_set_mode, |
400 | .reset = am35x_musb_reset, | 378 | .reset = am35x_musb_reset, |
401 | }; | 379 | }; |
402 | 380 | ||
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index f4f8374a0298..f3beb8eeef77 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -202,6 +202,7 @@ static inline void __init apollon_init_smc91x(void) | |||
202 | unsigned int rate; | 202 | unsigned int rate; |
203 | struct clk *gpmc_fck; | 203 | struct clk *gpmc_fck; |
204 | int eth_cs; | 204 | int eth_cs; |
205 | int err; | ||
205 | 206 | ||
206 | gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */ | 207 | gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */ |
207 | if (IS_ERR(gpmc_fck)) { | 208 | if (IS_ERR(gpmc_fck)) { |
@@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void) | |||
245 | apollon_smc91x_resources[0].end = base + 0x30f; | 246 | apollon_smc91x_resources[0].end = base + 0x30f; |
246 | udelay(100); | 247 | udelay(100); |
247 | 248 | ||
248 | omap_mux_init_gpio(74, 0); | 249 | omap_mux_init_gpio(APOLLON_ETHR_GPIO_IRQ, 0); |
249 | if (gpio_request(APOLLON_ETHR_GPIO_IRQ, "SMC91x irq") < 0) { | 250 | err = gpio_request_one(APOLLON_ETHR_GPIO_IRQ, GPIOF_IN, "SMC91x irq"); |
251 | if (err) { | ||
250 | printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n", | 252 | printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n", |
251 | APOLLON_ETHR_GPIO_IRQ); | 253 | APOLLON_ETHR_GPIO_IRQ); |
252 | gpmc_cs_free(APOLLON_ETH_CS); | 254 | gpmc_cs_free(APOLLON_ETH_CS); |
253 | goto out; | ||
254 | } | 255 | } |
255 | gpio_direction_input(APOLLON_ETHR_GPIO_IRQ); | ||
256 | |||
257 | out: | 256 | out: |
258 | clk_disable(gpmc_fck); | 257 | clk_disable(gpmc_fck); |
259 | clk_put(gpmc_fck); | 258 | clk_put(gpmc_fck); |
@@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void) | |||
280 | omap2_init_common_devices(NULL, NULL); | 279 | omap2_init_common_devices(NULL, NULL); |
281 | } | 280 | } |
282 | 281 | ||
282 | static struct gpio apollon_gpio_leds[] __initdata = { | ||
283 | { LED0_GPIO13, GPIOF_OUT_INIT_LOW, "LED0" }, /* LED0 - AA10 */ | ||
284 | { LED1_GPIO14, GPIOF_OUT_INIT_LOW, "LED1" }, /* LED1 - AA6 */ | ||
285 | { LED2_GPIO15, GPIOF_OUT_INIT_LOW, "LED2" }, /* LED2 - AA4 */ | ||
286 | }; | ||
287 | |||
283 | static void __init apollon_led_init(void) | 288 | static void __init apollon_led_init(void) |
284 | { | 289 | { |
285 | /* LED0 - AA10 */ | ||
286 | omap_mux_init_signal("vlynq_clk.gpio_13", 0); | 290 | omap_mux_init_signal("vlynq_clk.gpio_13", 0); |
287 | gpio_request(LED0_GPIO13, "LED0"); | ||
288 | gpio_direction_output(LED0_GPIO13, 0); | ||
289 | /* LED1 - AA6 */ | ||
290 | omap_mux_init_signal("vlynq_rx1.gpio_14", 0); | 291 | omap_mux_init_signal("vlynq_rx1.gpio_14", 0); |
291 | gpio_request(LED1_GPIO14, "LED1"); | ||
292 | gpio_direction_output(LED1_GPIO14, 0); | ||
293 | /* LED2 - AA4 */ | ||
294 | omap_mux_init_signal("vlynq_rx0.gpio_15", 0); | 292 | omap_mux_init_signal("vlynq_rx0.gpio_15", 0); |
295 | gpio_request(LED2_GPIO15, "LED2"); | 293 | |
296 | gpio_direction_output(LED2_GPIO15, 0); | 294 | gpio_request_array(apollon_gpio_leds, ARRAY_SIZE(apollon_gpio_leds)); |
297 | } | 295 | } |
298 | 296 | ||
299 | static void __init apollon_usb_init(void) | 297 | static void __init apollon_usb_init(void) |
@@ -301,8 +299,7 @@ static void __init apollon_usb_init(void) | |||
301 | /* USB device */ | 299 | /* USB device */ |
302 | /* DEVICE_SUSPEND */ | 300 | /* DEVICE_SUSPEND */ |
303 | omap_mux_init_signal("mcbsp2_clkx.gpio_12", 0); | 301 | omap_mux_init_signal("mcbsp2_clkx.gpio_12", 0); |
304 | gpio_request(12, "USB suspend"); | 302 | gpio_request_one(12, GPIOF_OUT_INIT_LOW, "USB suspend"); |
305 | gpio_direction_output(12, 0); | ||
306 | omap2_usbfs_init(&apollon_usb_config); | 303 | omap2_usbfs_init(&apollon_usb_config); |
307 | } | 304 | } |
308 | 305 | ||
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index 9340f6a06f4a..c63115bc1536 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include "mux.h" | 54 | #include "mux.h" |
55 | #include "sdram-micron-mt46h32m32lf-6.h" | 55 | #include "sdram-micron-mt46h32m32lf-6.h" |
56 | #include "hsmmc.h" | 56 | #include "hsmmc.h" |
57 | #include "common-board-devices.h" | ||
57 | 58 | ||
58 | #define CM_T35_GPIO_PENDOWN 57 | 59 | #define CM_T35_GPIO_PENDOWN 57 |
59 | 60 | ||
@@ -66,86 +67,28 @@ | |||
66 | 67 | ||
67 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 68 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
68 | #include <linux/smsc911x.h> | 69 | #include <linux/smsc911x.h> |
70 | #include <plat/gpmc-smsc911x.h> | ||
69 | 71 | ||
70 | static struct smsc911x_platform_config cm_t35_smsc911x_config = { | 72 | static struct omap_smsc911x_platform_data cm_t35_smsc911x_cfg = { |
71 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
72 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
73 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, | ||
74 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
75 | }; | ||
76 | |||
77 | static struct resource cm_t35_smsc911x_resources[] = { | ||
78 | { | ||
79 | .flags = IORESOURCE_MEM, | ||
80 | }, | ||
81 | { | ||
82 | .start = OMAP_GPIO_IRQ(CM_T35_SMSC911X_GPIO), | ||
83 | .end = OMAP_GPIO_IRQ(CM_T35_SMSC911X_GPIO), | ||
84 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
85 | }, | ||
86 | }; | ||
87 | |||
88 | static struct platform_device cm_t35_smsc911x_device = { | ||
89 | .name = "smsc911x", | ||
90 | .id = 0, | 73 | .id = 0, |
91 | .num_resources = ARRAY_SIZE(cm_t35_smsc911x_resources), | 74 | .cs = CM_T35_SMSC911X_CS, |
92 | .resource = cm_t35_smsc911x_resources, | 75 | .gpio_irq = CM_T35_SMSC911X_GPIO, |
93 | .dev = { | 76 | .gpio_reset = -EINVAL, |
94 | .platform_data = &cm_t35_smsc911x_config, | 77 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, |
95 | }, | ||
96 | }; | ||
97 | |||
98 | static struct resource sb_t35_smsc911x_resources[] = { | ||
99 | { | ||
100 | .flags = IORESOURCE_MEM, | ||
101 | }, | ||
102 | { | ||
103 | .start = OMAP_GPIO_IRQ(SB_T35_SMSC911X_GPIO), | ||
104 | .end = OMAP_GPIO_IRQ(SB_T35_SMSC911X_GPIO), | ||
105 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
106 | }, | ||
107 | }; | 78 | }; |
108 | 79 | ||
109 | static struct platform_device sb_t35_smsc911x_device = { | 80 | static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = { |
110 | .name = "smsc911x", | ||
111 | .id = 1, | 81 | .id = 1, |
112 | .num_resources = ARRAY_SIZE(sb_t35_smsc911x_resources), | 82 | .cs = SB_T35_SMSC911X_CS, |
113 | .resource = sb_t35_smsc911x_resources, | 83 | .gpio_irq = SB_T35_SMSC911X_GPIO, |
114 | .dev = { | 84 | .gpio_reset = -EINVAL, |
115 | .platform_data = &cm_t35_smsc911x_config, | 85 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, |
116 | }, | ||
117 | }; | 86 | }; |
118 | 87 | ||
119 | static void __init cm_t35_init_smsc911x(struct platform_device *dev, | ||
120 | int cs, int irq_gpio) | ||
121 | { | ||
122 | unsigned long cs_mem_base; | ||
123 | |||
124 | if (gpmc_cs_request(cs, SZ_16M, &cs_mem_base) < 0) { | ||
125 | pr_err("CM-T35: Failed request for GPMC mem for smsc911x\n"); | ||
126 | return; | ||
127 | } | ||
128 | |||
129 | dev->resource[0].start = cs_mem_base + 0x0; | ||
130 | dev->resource[0].end = cs_mem_base + 0xff; | ||
131 | |||
132 | if ((gpio_request(irq_gpio, "ETH IRQ") == 0) && | ||
133 | (gpio_direction_input(irq_gpio) == 0)) { | ||
134 | gpio_export(irq_gpio, 0); | ||
135 | } else { | ||
136 | pr_err("CM-T35: could not obtain gpio for SMSC911X IRQ\n"); | ||
137 | return; | ||
138 | } | ||
139 | |||
140 | platform_device_register(dev); | ||
141 | } | ||
142 | |||
143 | static void __init cm_t35_init_ethernet(void) | 88 | static void __init cm_t35_init_ethernet(void) |
144 | { | 89 | { |
145 | cm_t35_init_smsc911x(&cm_t35_smsc911x_device, | 90 | gpmc_smsc911x_init(&cm_t35_smsc911x_cfg); |
146 | CM_T35_SMSC911X_CS, CM_T35_SMSC911X_GPIO); | 91 | gpmc_smsc911x_init(&sb_t35_smsc911x_cfg); |
147 | cm_t35_init_smsc911x(&sb_t35_smsc911x_device, | ||
148 | SB_T35_SMSC911X_CS, SB_T35_SMSC911X_GPIO); | ||
149 | } | 92 | } |
150 | #else | 93 | #else |
151 | static inline void __init cm_t35_init_ethernet(void) { return; } | 94 | static inline void __init cm_t35_init_ethernet(void) { return; } |
@@ -235,69 +178,10 @@ static void __init cm_t35_init_nand(void) | |||
235 | static inline void cm_t35_init_nand(void) {} | 178 | static inline void cm_t35_init_nand(void) {} |
236 | #endif | 179 | #endif |
237 | 180 | ||
238 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ | ||
239 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | ||
240 | #include <linux/spi/ads7846.h> | ||
241 | |||
242 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
243 | .turbo_mode = 0, | ||
244 | .single_channel = 1, /* 0: slave, 1: master */ | ||
245 | }; | ||
246 | |||
247 | static int ads7846_get_pendown_state(void) | ||
248 | { | ||
249 | return !gpio_get_value(CM_T35_GPIO_PENDOWN); | ||
250 | } | ||
251 | |||
252 | static struct ads7846_platform_data ads7846_config = { | ||
253 | .x_max = 0x0fff, | ||
254 | .y_max = 0x0fff, | ||
255 | .x_plate_ohms = 180, | ||
256 | .pressure_max = 255, | ||
257 | .debounce_max = 10, | ||
258 | .debounce_tol = 3, | ||
259 | .debounce_rep = 1, | ||
260 | .get_pendown_state = ads7846_get_pendown_state, | ||
261 | .keep_vref_on = 1, | ||
262 | }; | ||
263 | |||
264 | static struct spi_board_info cm_t35_spi_board_info[] __initdata = { | ||
265 | { | ||
266 | .modalias = "ads7846", | ||
267 | .bus_num = 1, | ||
268 | .chip_select = 0, | ||
269 | .max_speed_hz = 1500000, | ||
270 | .controller_data = &ads7846_mcspi_config, | ||
271 | .irq = OMAP_GPIO_IRQ(CM_T35_GPIO_PENDOWN), | ||
272 | .platform_data = &ads7846_config, | ||
273 | }, | ||
274 | }; | ||
275 | |||
276 | static void __init cm_t35_init_ads7846(void) | ||
277 | { | ||
278 | if ((gpio_request(CM_T35_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) && | ||
279 | (gpio_direction_input(CM_T35_GPIO_PENDOWN) == 0)) { | ||
280 | gpio_export(CM_T35_GPIO_PENDOWN, 0); | ||
281 | } else { | ||
282 | pr_err("CM-T35: could not obtain gpio for ADS7846_PENDOWN\n"); | ||
283 | return; | ||
284 | } | ||
285 | |||
286 | spi_register_board_info(cm_t35_spi_board_info, | ||
287 | ARRAY_SIZE(cm_t35_spi_board_info)); | ||
288 | } | ||
289 | #else | ||
290 | static inline void cm_t35_init_ads7846(void) {} | ||
291 | #endif | ||
292 | |||
293 | #define CM_T35_LCD_EN_GPIO 157 | 181 | #define CM_T35_LCD_EN_GPIO 157 |
294 | #define CM_T35_LCD_BL_GPIO 58 | 182 | #define CM_T35_LCD_BL_GPIO 58 |
295 | #define CM_T35_DVI_EN_GPIO 54 | 183 | #define CM_T35_DVI_EN_GPIO 54 |
296 | 184 | ||
297 | static int lcd_bl_gpio; | ||
298 | static int lcd_en_gpio; | ||
299 | static int dvi_en_gpio; | ||
300 | |||
301 | static int lcd_enabled; | 185 | static int lcd_enabled; |
302 | static int dvi_enabled; | 186 | static int dvi_enabled; |
303 | 187 | ||
@@ -308,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev) | |||
308 | return -EINVAL; | 192 | return -EINVAL; |
309 | } | 193 | } |
310 | 194 | ||
311 | gpio_set_value(lcd_en_gpio, 1); | 195 | gpio_set_value(CM_T35_LCD_EN_GPIO, 1); |
312 | gpio_set_value(lcd_bl_gpio, 1); | 196 | gpio_set_value(CM_T35_LCD_BL_GPIO, 1); |
313 | 197 | ||
314 | lcd_enabled = 1; | 198 | lcd_enabled = 1; |
315 | 199 | ||
@@ -320,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev) | |||
320 | { | 204 | { |
321 | lcd_enabled = 0; | 205 | lcd_enabled = 0; |
322 | 206 | ||
323 | gpio_set_value(lcd_bl_gpio, 0); | 207 | gpio_set_value(CM_T35_LCD_BL_GPIO, 0); |
324 | gpio_set_value(lcd_en_gpio, 0); | 208 | gpio_set_value(CM_T35_LCD_EN_GPIO, 0); |
325 | } | 209 | } |
326 | 210 | ||
327 | static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) | 211 | static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) |
@@ -331,7 +215,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) | |||
331 | return -EINVAL; | 215 | return -EINVAL; |
332 | } | 216 | } |
333 | 217 | ||
334 | gpio_set_value(dvi_en_gpio, 0); | 218 | gpio_set_value(CM_T35_DVI_EN_GPIO, 0); |
335 | dvi_enabled = 1; | 219 | dvi_enabled = 1; |
336 | 220 | ||
337 | return 0; | 221 | return 0; |
@@ -339,7 +223,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) | |||
339 | 223 | ||
340 | static void cm_t35_panel_disable_dvi(struct omap_dss_device *dssdev) | 224 | static void cm_t35_panel_disable_dvi(struct omap_dss_device *dssdev) |
341 | { | 225 | { |
342 | gpio_set_value(dvi_en_gpio, 1); | 226 | gpio_set_value(CM_T35_DVI_EN_GPIO, 1); |
343 | dvi_enabled = 0; | 227 | dvi_enabled = 0; |
344 | } | 228 | } |
345 | 229 | ||
@@ -421,62 +305,38 @@ static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = { | |||
421 | }, | 305 | }, |
422 | }; | 306 | }; |
423 | 307 | ||
308 | static struct gpio cm_t35_dss_gpios[] __initdata = { | ||
309 | { CM_T35_LCD_EN_GPIO, GPIOF_OUT_INIT_LOW, "lcd enable" }, | ||
310 | { CM_T35_LCD_BL_GPIO, GPIOF_OUT_INIT_LOW, "lcd bl enable" }, | ||
311 | { CM_T35_DVI_EN_GPIO, GPIOF_OUT_INIT_HIGH, "dvi enable" }, | ||
312 | }; | ||
313 | |||
424 | static void __init cm_t35_init_display(void) | 314 | static void __init cm_t35_init_display(void) |
425 | { | 315 | { |
426 | int err; | 316 | int err; |
427 | 317 | ||
428 | lcd_en_gpio = CM_T35_LCD_EN_GPIO; | ||
429 | lcd_bl_gpio = CM_T35_LCD_BL_GPIO; | ||
430 | dvi_en_gpio = CM_T35_DVI_EN_GPIO; | ||
431 | |||
432 | spi_register_board_info(cm_t35_lcd_spi_board_info, | 318 | spi_register_board_info(cm_t35_lcd_spi_board_info, |
433 | ARRAY_SIZE(cm_t35_lcd_spi_board_info)); | 319 | ARRAY_SIZE(cm_t35_lcd_spi_board_info)); |
434 | 320 | ||
435 | err = gpio_request(lcd_en_gpio, "LCD RST"); | 321 | err = gpio_request_array(cm_t35_dss_gpios, |
436 | if (err) { | 322 | ARRAY_SIZE(cm_t35_dss_gpios)); |
437 | pr_err("CM-T35: failed to get LCD reset GPIO\n"); | ||
438 | goto out; | ||
439 | } | ||
440 | |||
441 | err = gpio_request(lcd_bl_gpio, "LCD BL"); | ||
442 | if (err) { | 323 | if (err) { |
443 | pr_err("CM-T35: failed to get LCD backlight control GPIO\n"); | 324 | pr_err("CM-T35: failed to request DSS control GPIOs\n"); |
444 | goto err_lcd_bl; | 325 | return; |
445 | } | ||
446 | |||
447 | err = gpio_request(dvi_en_gpio, "DVI EN"); | ||
448 | if (err) { | ||
449 | pr_err("CM-T35: failed to get DVI reset GPIO\n"); | ||
450 | goto err_dvi_en; | ||
451 | } | 326 | } |
452 | 327 | ||
453 | gpio_export(lcd_en_gpio, 0); | 328 | gpio_export(CM_T35_LCD_EN_GPIO, 0); |
454 | gpio_export(lcd_bl_gpio, 0); | 329 | gpio_export(CM_T35_LCD_BL_GPIO, 0); |
455 | gpio_export(dvi_en_gpio, 0); | 330 | gpio_export(CM_T35_DVI_EN_GPIO, 0); |
456 | gpio_direction_output(lcd_en_gpio, 0); | ||
457 | gpio_direction_output(lcd_bl_gpio, 0); | ||
458 | gpio_direction_output(dvi_en_gpio, 1); | ||
459 | 331 | ||
460 | msleep(50); | 332 | msleep(50); |
461 | gpio_set_value(lcd_en_gpio, 1); | 333 | gpio_set_value(CM_T35_LCD_EN_GPIO, 1); |
462 | 334 | ||
463 | err = omap_display_init(&cm_t35_dss_data); | 335 | err = omap_display_init(&cm_t35_dss_data); |
464 | if (err) { | 336 | if (err) { |
465 | pr_err("CM-T35: failed to register DSS device\n"); | 337 | pr_err("CM-T35: failed to register DSS device\n"); |
466 | goto err_dev_reg; | 338 | gpio_free_array(cm_t35_dss_gpios, ARRAY_SIZE(cm_t35_dss_gpios)); |
467 | } | 339 | } |
468 | |||
469 | return; | ||
470 | |||
471 | err_dev_reg: | ||
472 | gpio_free(dvi_en_gpio); | ||
473 | err_dvi_en: | ||
474 | gpio_free(lcd_bl_gpio); | ||
475 | err_lcd_bl: | ||
476 | gpio_free(lcd_en_gpio); | ||
477 | out: | ||
478 | |||
479 | return; | ||
480 | } | 340 | } |
481 | 341 | ||
482 | static struct regulator_consumer_supply cm_t35_vmmc1_supply = { | 342 | static struct regulator_consumer_supply cm_t35_vmmc1_supply = { |
@@ -609,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio, | |||
609 | { | 469 | { |
610 | int wlan_rst = gpio + 2; | 470 | int wlan_rst = gpio + 2; |
611 | 471 | ||
612 | if ((gpio_request(wlan_rst, "WLAN RST") == 0) && | 472 | if (gpio_request_one(wlan_rst, GPIOF_OUT_INIT_HIGH, "WLAN RST") == 0) { |
613 | (gpio_direction_output(wlan_rst, 1) == 0)) { | ||
614 | gpio_export(wlan_rst, 0); | 473 | gpio_export(wlan_rst, 0); |
615 | |||
616 | udelay(10); | 474 | udelay(10); |
617 | gpio_set_value(wlan_rst, 0); | 475 | gpio_set_value(wlan_rst, 0); |
618 | udelay(10); | 476 | udelay(10); |
@@ -653,19 +511,9 @@ static struct twl4030_platform_data cm_t35_twldata = { | |||
653 | .vpll2 = &cm_t35_vpll2, | 511 | .vpll2 = &cm_t35_vpll2, |
654 | }; | 512 | }; |
655 | 513 | ||
656 | static struct i2c_board_info __initdata cm_t35_i2c_boardinfo[] = { | ||
657 | { | ||
658 | I2C_BOARD_INFO("tps65930", 0x48), | ||
659 | .flags = I2C_CLIENT_WAKE, | ||
660 | .irq = INT_34XX_SYS_NIRQ, | ||
661 | .platform_data = &cm_t35_twldata, | ||
662 | }, | ||
663 | }; | ||
664 | |||
665 | static void __init cm_t35_init_i2c(void) | 514 | static void __init cm_t35_init_i2c(void) |
666 | { | 515 | { |
667 | omap_register_i2c_bus(1, 2600, cm_t35_i2c_boardinfo, | 516 | omap3_pmic_init("tps65930", &cm_t35_twldata); |
668 | ARRAY_SIZE(cm_t35_i2c_boardinfo)); | ||
669 | } | 517 | } |
670 | 518 | ||
671 | static void __init cm_t35_init_early(void) | 519 | static void __init cm_t35_init_early(void) |
@@ -775,12 +623,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
775 | }; | 623 | }; |
776 | #endif | 624 | #endif |
777 | 625 | ||
778 | static struct omap_musb_board_data musb_board_data = { | ||
779 | .interface_type = MUSB_INTERFACE_ULPI, | ||
780 | .mode = MUSB_OTG, | ||
781 | .power = 100, | ||
782 | }; | ||
783 | |||
784 | static struct omap_board_config_kernel cm_t35_config[] __initdata = { | 626 | static struct omap_board_config_kernel cm_t35_config[] __initdata = { |
785 | }; | 627 | }; |
786 | 628 | ||
@@ -792,12 +634,12 @@ static void __init cm_t35_init(void) | |||
792 | omap_serial_init(); | 634 | omap_serial_init(); |
793 | cm_t35_init_i2c(); | 635 | cm_t35_init_i2c(); |
794 | cm_t35_init_nand(); | 636 | cm_t35_init_nand(); |
795 | cm_t35_init_ads7846(); | 637 | omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL); |
796 | cm_t35_init_ethernet(); | 638 | cm_t35_init_ethernet(); |
797 | cm_t35_init_led(); | 639 | cm_t35_init_led(); |
798 | cm_t35_init_display(); | 640 | cm_t35_init_display(); |
799 | 641 | ||
800 | usb_musb_init(&musb_board_data); | 642 | usb_musb_init(NULL); |
801 | usbhs_init(&usbhs_bdata); | 643 | usbhs_init(&usbhs_bdata); |
802 | } | 644 | } |
803 | 645 | ||
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index a27e3eee8292..08f08e812492 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
@@ -148,14 +148,13 @@ static void __init cm_t3517_init_rtc(void) | |||
148 | { | 148 | { |
149 | int err; | 149 | int err; |
150 | 150 | ||
151 | err = gpio_request(RTC_CS_EN_GPIO, "rtc cs en"); | 151 | err = gpio_request_one(RTC_CS_EN_GPIO, GPIOF_OUT_INIT_HIGH, |
152 | "rtc cs en"); | ||
152 | if (err) { | 153 | if (err) { |
153 | pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err); | 154 | pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err); |
154 | return; | 155 | return; |
155 | } | 156 | } |
156 | 157 | ||
157 | gpio_direction_output(RTC_CS_EN_GPIO, 1); | ||
158 | |||
159 | platform_device_register(&cm_t3517_rtc_device); | 158 | platform_device_register(&cm_t3517_rtc_device); |
160 | } | 159 | } |
161 | #else | 160 | #else |
@@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void) | |||
182 | { | 181 | { |
183 | int err; | 182 | int err; |
184 | 183 | ||
185 | err = gpio_request(USB_HUB_RESET_GPIO, "usb hub rst"); | 184 | err = gpio_request_one(USB_HUB_RESET_GPIO, GPIOF_OUT_INIT_LOW, |
185 | "usb hub rst"); | ||
186 | if (err) { | 186 | if (err) { |
187 | pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err); | 187 | pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err); |
188 | } else { | 188 | } else { |
189 | gpio_direction_output(USB_HUB_RESET_GPIO, 0); | ||
190 | udelay(10); | 189 | udelay(10); |
191 | gpio_set_value(USB_HUB_RESET_GPIO, 1); | 190 | gpio_set_value(USB_HUB_RESET_GPIO, 1); |
192 | msleep(1); | 191 | msleep(1); |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 1d1b56a29fb1..cf520d7dd614 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -51,7 +51,6 @@ | |||
51 | #include <plat/mcspi.h> | 51 | #include <plat/mcspi.h> |
52 | #include <linux/input/matrix_keypad.h> | 52 | #include <linux/input/matrix_keypad.h> |
53 | #include <linux/spi/spi.h> | 53 | #include <linux/spi/spi.h> |
54 | #include <linux/spi/ads7846.h> | ||
55 | #include <linux/dm9000.h> | 54 | #include <linux/dm9000.h> |
56 | #include <linux/interrupt.h> | 55 | #include <linux/interrupt.h> |
57 | 56 | ||
@@ -60,6 +59,7 @@ | |||
60 | #include "mux.h" | 59 | #include "mux.h" |
61 | #include "hsmmc.h" | 60 | #include "hsmmc.h" |
62 | #include "timer-gp.h" | 61 | #include "timer-gp.h" |
62 | #include "common-board-devices.h" | ||
63 | 63 | ||
64 | #define NAND_BLOCK_SIZE SZ_128K | 64 | #define NAND_BLOCK_SIZE SZ_128K |
65 | 65 | ||
@@ -97,13 +97,6 @@ static struct mtd_partition devkit8000_nand_partitions[] = { | |||
97 | }, | 97 | }, |
98 | }; | 98 | }; |
99 | 99 | ||
100 | static struct omap_nand_platform_data devkit8000_nand_data = { | ||
101 | .options = NAND_BUSWIDTH_16, | ||
102 | .parts = devkit8000_nand_partitions, | ||
103 | .nr_parts = ARRAY_SIZE(devkit8000_nand_partitions), | ||
104 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
105 | }; | ||
106 | |||
107 | static struct omap2_hsmmc_info mmc[] = { | 100 | static struct omap2_hsmmc_info mmc[] = { |
108 | { | 101 | { |
109 | .mmc = 1, | 102 | .mmc = 1, |
@@ -249,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev, | |||
249 | /* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */ | 242 | /* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */ |
250 | devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0; | 243 | devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0; |
251 | ret = gpio_request_one(devkit8000_lcd_device.reset_gpio, | 244 | ret = gpio_request_one(devkit8000_lcd_device.reset_gpio, |
252 | GPIOF_DIR_OUT | GPIOF_INIT_LOW, "LCD_PWREN"); | 245 | GPIOF_OUT_INIT_LOW, "LCD_PWREN"); |
253 | if (ret < 0) { | 246 | if (ret < 0) { |
254 | devkit8000_lcd_device.reset_gpio = -EINVAL; | 247 | devkit8000_lcd_device.reset_gpio = -EINVAL; |
255 | printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n"); | 248 | printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n"); |
@@ -258,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev, | |||
258 | /* gpio + 7 is "DVI_PD" (out, active low) */ | 251 | /* gpio + 7 is "DVI_PD" (out, active low) */ |
259 | devkit8000_dvi_device.reset_gpio = gpio + 7; | 252 | devkit8000_dvi_device.reset_gpio = gpio + 7; |
260 | ret = gpio_request_one(devkit8000_dvi_device.reset_gpio, | 253 | ret = gpio_request_one(devkit8000_dvi_device.reset_gpio, |
261 | GPIOF_DIR_OUT | GPIOF_INIT_LOW, "DVI PowerDown"); | 254 | GPIOF_OUT_INIT_LOW, "DVI PowerDown"); |
262 | if (ret < 0) { | 255 | if (ret < 0) { |
263 | devkit8000_dvi_device.reset_gpio = -EINVAL; | 256 | devkit8000_dvi_device.reset_gpio = -EINVAL; |
264 | printk(KERN_ERR "Failed to request GPIO for DVI PowerDown\n"); | 257 | printk(KERN_ERR "Failed to request GPIO for DVI PowerDown\n"); |
@@ -366,19 +359,9 @@ static struct twl4030_platform_data devkit8000_twldata = { | |||
366 | .keypad = &devkit8000_kp_data, | 359 | .keypad = &devkit8000_kp_data, |
367 | }; | 360 | }; |
368 | 361 | ||
369 | static struct i2c_board_info __initdata devkit8000_i2c_boardinfo[] = { | ||
370 | { | ||
371 | I2C_BOARD_INFO("tps65930", 0x48), | ||
372 | .flags = I2C_CLIENT_WAKE, | ||
373 | .irq = INT_34XX_SYS_NIRQ, | ||
374 | .platform_data = &devkit8000_twldata, | ||
375 | }, | ||
376 | }; | ||
377 | |||
378 | static int __init devkit8000_i2c_init(void) | 362 | static int __init devkit8000_i2c_init(void) |
379 | { | 363 | { |
380 | omap_register_i2c_bus(1, 2600, devkit8000_i2c_boardinfo, | 364 | omap3_pmic_init("tps65930", &devkit8000_twldata); |
381 | ARRAY_SIZE(devkit8000_i2c_boardinfo)); | ||
382 | /* Bus 3 is attached to the DVI port where devices like the pico DLP | 365 | /* Bus 3 is attached to the DVI port where devices like the pico DLP |
383 | * projector don't work reliably with 400kHz */ | 366 | * projector don't work reliably with 400kHz */ |
384 | omap_register_i2c_bus(3, 400, NULL, 0); | 367 | omap_register_i2c_bus(3, 400, NULL, 0); |
@@ -463,56 +446,6 @@ static void __init devkit8000_init_irq(void) | |||
463 | #endif | 446 | #endif |
464 | } | 447 | } |
465 | 448 | ||
466 | static void __init devkit8000_ads7846_init(void) | ||
467 | { | ||
468 | int gpio = OMAP3_DEVKIT_TS_GPIO; | ||
469 | int ret; | ||
470 | |||
471 | ret = gpio_request(gpio, "ads7846_pen_down"); | ||
472 | if (ret < 0) { | ||
473 | printk(KERN_ERR "Failed to request GPIO %d for " | ||
474 | "ads7846 pen down IRQ\n", gpio); | ||
475 | return; | ||
476 | } | ||
477 | |||
478 | gpio_direction_input(gpio); | ||
479 | } | ||
480 | |||
481 | static int ads7846_get_pendown_state(void) | ||
482 | { | ||
483 | return !gpio_get_value(OMAP3_DEVKIT_TS_GPIO); | ||
484 | } | ||
485 | |||
486 | static struct ads7846_platform_data ads7846_config = { | ||
487 | .x_max = 0x0fff, | ||
488 | .y_max = 0x0fff, | ||
489 | .x_plate_ohms = 180, | ||
490 | .pressure_max = 255, | ||
491 | .debounce_max = 10, | ||
492 | .debounce_tol = 5, | ||
493 | .debounce_rep = 1, | ||
494 | .get_pendown_state = ads7846_get_pendown_state, | ||
495 | .keep_vref_on = 1, | ||
496 | .settle_delay_usecs = 150, | ||
497 | }; | ||
498 | |||
499 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
500 | .turbo_mode = 0, | ||
501 | .single_channel = 1, /* 0: slave, 1: master */ | ||
502 | }; | ||
503 | |||
504 | static struct spi_board_info devkit8000_spi_board_info[] __initdata = { | ||
505 | { | ||
506 | .modalias = "ads7846", | ||
507 | .bus_num = 2, | ||
508 | .chip_select = 0, | ||
509 | .max_speed_hz = 1500000, | ||
510 | .controller_data = &ads7846_mcspi_config, | ||
511 | .irq = OMAP_GPIO_IRQ(OMAP3_DEVKIT_TS_GPIO), | ||
512 | .platform_data = &ads7846_config, | ||
513 | } | ||
514 | }; | ||
515 | |||
516 | #define OMAP_DM9000_BASE 0x2c000000 | 449 | #define OMAP_DM9000_BASE 0x2c000000 |
517 | 450 | ||
518 | static struct resource omap_dm9000_resources[] = { | 451 | static struct resource omap_dm9000_resources[] = { |
@@ -550,14 +483,14 @@ static void __init omap_dm9000_init(void) | |||
550 | { | 483 | { |
551 | unsigned char *eth_addr = omap_dm9000_platdata.dev_addr; | 484 | unsigned char *eth_addr = omap_dm9000_platdata.dev_addr; |
552 | struct omap_die_id odi; | 485 | struct omap_die_id odi; |
486 | int ret; | ||
553 | 487 | ||
554 | if (gpio_request(OMAP_DM9000_GPIO_IRQ, "dm9000 irq") < 0) { | 488 | ret = gpio_request_one(OMAP_DM9000_GPIO_IRQ, GPIOF_IN, "dm9000 irq"); |
489 | if (ret < 0) { | ||
555 | printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n", | 490 | printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n", |
556 | OMAP_DM9000_GPIO_IRQ); | 491 | OMAP_DM9000_GPIO_IRQ); |
557 | return; | 492 | return; |
558 | } | 493 | } |
559 | |||
560 | gpio_direction_input(OMAP_DM9000_GPIO_IRQ); | ||
561 | 494 | ||
562 | /* init the mac address using DIE id */ | 495 | /* init the mac address using DIE id */ |
563 | omap_get_die_id(&odi); | 496 | omap_get_die_id(&odi); |
@@ -576,45 +509,6 @@ static struct platform_device *devkit8000_devices[] __initdata = { | |||
576 | &omap_dm9000_dev, | 509 | &omap_dm9000_dev, |
577 | }; | 510 | }; |
578 | 511 | ||
579 | static void __init devkit8000_flash_init(void) | ||
580 | { | ||
581 | u8 cs = 0; | ||
582 | u8 nandcs = GPMC_CS_NUM + 1; | ||
583 | |||
584 | /* find out the chip-select on which NAND exists */ | ||
585 | while (cs < GPMC_CS_NUM) { | ||
586 | u32 ret = 0; | ||
587 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | ||
588 | |||
589 | if ((ret & 0xC00) == 0x800) { | ||
590 | printk(KERN_INFO "Found NAND on CS%d\n", cs); | ||
591 | if (nandcs > GPMC_CS_NUM) | ||
592 | nandcs = cs; | ||
593 | } | ||
594 | cs++; | ||
595 | } | ||
596 | |||
597 | if (nandcs > GPMC_CS_NUM) { | ||
598 | printk(KERN_INFO "NAND: Unable to find configuration " | ||
599 | "in GPMC\n "); | ||
600 | return; | ||
601 | } | ||
602 | |||
603 | if (nandcs < GPMC_CS_NUM) { | ||
604 | devkit8000_nand_data.cs = nandcs; | ||
605 | |||
606 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); | ||
607 | if (gpmc_nand_init(&devkit8000_nand_data) < 0) | ||
608 | printk(KERN_ERR "Unable to register NAND device\n"); | ||
609 | } | ||
610 | } | ||
611 | |||
612 | static struct omap_musb_board_data musb_board_data = { | ||
613 | .interface_type = MUSB_INTERFACE_ULPI, | ||
614 | .mode = MUSB_OTG, | ||
615 | .power = 100, | ||
616 | }; | ||
617 | |||
618 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 512 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { |
619 | 513 | ||
620 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 514 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -795,14 +689,13 @@ static void __init devkit8000_init(void) | |||
795 | ARRAY_SIZE(devkit8000_devices)); | 689 | ARRAY_SIZE(devkit8000_devices)); |
796 | 690 | ||
797 | omap_display_init(&devkit8000_dss_data); | 691 | omap_display_init(&devkit8000_dss_data); |
798 | spi_register_board_info(devkit8000_spi_board_info, | ||
799 | ARRAY_SIZE(devkit8000_spi_board_info)); | ||
800 | 692 | ||
801 | devkit8000_ads7846_init(); | 693 | omap_ads7846_init(2, OMAP3_DEVKIT_TS_GPIO, 0, NULL); |
802 | 694 | ||
803 | usb_musb_init(&musb_board_data); | 695 | usb_musb_init(NULL); |
804 | usbhs_init(&usbhs_bdata); | 696 | usbhs_init(&usbhs_bdata); |
805 | devkit8000_flash_init(); | 697 | omap_nand_flash_init(NAND_BUSWIDTH_16, devkit8000_nand_partitions, |
698 | ARRAY_SIZE(devkit8000_nand_partitions)); | ||
806 | 699 | ||
807 | /* Ensure SDRC pins are mux'd for self-refresh */ | 700 | /* Ensure SDRC pins are mux'd for self-refresh */ |
808 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 701 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 3da64d361651..0c1bfca3f731 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include "mux.h" | 38 | #include "mux.h" |
39 | #include "hsmmc.h" | 39 | #include "hsmmc.h" |
40 | #include "sdram-numonyx-m65kxxxxam.h" | 40 | #include "sdram-numonyx-m65kxxxxam.h" |
41 | #include "common-board-devices.h" | ||
41 | 42 | ||
42 | #define IGEP2_SMSC911X_CS 5 | 43 | #define IGEP2_SMSC911X_CS 5 |
43 | #define IGEP2_SMSC911X_GPIO 176 | 44 | #define IGEP2_SMSC911X_GPIO 176 |
@@ -54,6 +55,11 @@ | |||
54 | #define IGEP2_RC_GPIO_WIFI_NRESET 139 | 55 | #define IGEP2_RC_GPIO_WIFI_NRESET 139 |
55 | #define IGEP2_RC_GPIO_BT_NRESET 137 | 56 | #define IGEP2_RC_GPIO_BT_NRESET 137 |
56 | 57 | ||
58 | #define IGEP3_GPIO_LED0_GREEN 54 | ||
59 | #define IGEP3_GPIO_LED0_RED 53 | ||
60 | #define IGEP3_GPIO_LED1_RED 16 | ||
61 | #define IGEP3_GPIO_USBH_NRESET 183 | ||
62 | |||
57 | /* | 63 | /* |
58 | * IGEP2 Hardware Revision Table | 64 | * IGEP2 Hardware Revision Table |
59 | * | 65 | * |
@@ -68,6 +74,7 @@ | |||
68 | 74 | ||
69 | #define IGEP2_BOARD_HWREV_B 0 | 75 | #define IGEP2_BOARD_HWREV_B 0 |
70 | #define IGEP2_BOARD_HWREV_C 1 | 76 | #define IGEP2_BOARD_HWREV_C 1 |
77 | #define IGEP3_BOARD_HWREV 2 | ||
71 | 78 | ||
72 | static u8 hwrev; | 79 | static u8 hwrev; |
73 | 80 | ||
@@ -75,24 +82,29 @@ static void __init igep2_get_revision(void) | |||
75 | { | 82 | { |
76 | u8 ret; | 83 | u8 ret; |
77 | 84 | ||
85 | if (machine_is_igep0030()) { | ||
86 | hwrev = IGEP3_BOARD_HWREV; | ||
87 | return; | ||
88 | } | ||
89 | |||
78 | omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT); | 90 | omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT); |
79 | 91 | ||
80 | if ((gpio_request(IGEP2_GPIO_LED1_RED, "GPIO_HW0_REV") == 0) && | 92 | if (gpio_request_one(IGEP2_GPIO_LED1_RED, GPIOF_IN, "GPIO_HW0_REV")) { |
81 | (gpio_direction_input(IGEP2_GPIO_LED1_RED) == 0)) { | ||
82 | ret = gpio_get_value(IGEP2_GPIO_LED1_RED); | ||
83 | if (ret == 0) { | ||
84 | pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n"); | ||
85 | hwrev = IGEP2_BOARD_HWREV_C; | ||
86 | } else if (ret == 1) { | ||
87 | pr_info("IGEP2: Hardware Revision B/C (B compatible)\n"); | ||
88 | hwrev = IGEP2_BOARD_HWREV_B; | ||
89 | } else { | ||
90 | pr_err("IGEP2: Unknown Hardware Revision\n"); | ||
91 | hwrev = -1; | ||
92 | } | ||
93 | } else { | ||
94 | pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n"); | 93 | pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n"); |
95 | pr_err("IGEP2: Unknown Hardware Revision\n"); | 94 | pr_err("IGEP2: Unknown Hardware Revision\n"); |
95 | return; | ||
96 | } | ||
97 | |||
98 | ret = gpio_get_value(IGEP2_GPIO_LED1_RED); | ||
99 | if (ret == 0) { | ||
100 | pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n"); | ||
101 | hwrev = IGEP2_BOARD_HWREV_C; | ||
102 | } else if (ret == 1) { | ||
103 | pr_info("IGEP2: Hardware Revision B/C (B compatible)\n"); | ||
104 | hwrev = IGEP2_BOARD_HWREV_B; | ||
105 | } else { | ||
106 | pr_err("IGEP2: Unknown Hardware Revision\n"); | ||
107 | hwrev = -1; | ||
96 | } | 108 | } |
97 | 109 | ||
98 | gpio_free(IGEP2_GPIO_LED1_RED); | 110 | gpio_free(IGEP2_GPIO_LED1_RED); |
@@ -111,7 +123,7 @@ static void __init igep2_get_revision(void) | |||
111 | * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048) | 123 | * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048) |
112 | */ | 124 | */ |
113 | 125 | ||
114 | static struct mtd_partition igep2_onenand_partitions[] = { | 126 | static struct mtd_partition igep_onenand_partitions[] = { |
115 | { | 127 | { |
116 | .name = "X-Loader", | 128 | .name = "X-Loader", |
117 | .offset = 0, | 129 | .offset = 0, |
@@ -139,21 +151,21 @@ static struct mtd_partition igep2_onenand_partitions[] = { | |||
139 | }, | 151 | }, |
140 | }; | 152 | }; |
141 | 153 | ||
142 | static struct omap_onenand_platform_data igep2_onenand_data = { | 154 | static struct omap_onenand_platform_data igep_onenand_data = { |
143 | .parts = igep2_onenand_partitions, | 155 | .parts = igep_onenand_partitions, |
144 | .nr_parts = ARRAY_SIZE(igep2_onenand_partitions), | 156 | .nr_parts = ARRAY_SIZE(igep_onenand_partitions), |
145 | .dma_channel = -1, /* disable DMA in OMAP OneNAND driver */ | 157 | .dma_channel = -1, /* disable DMA in OMAP OneNAND driver */ |
146 | }; | 158 | }; |
147 | 159 | ||
148 | static struct platform_device igep2_onenand_device = { | 160 | static struct platform_device igep_onenand_device = { |
149 | .name = "omap2-onenand", | 161 | .name = "omap2-onenand", |
150 | .id = -1, | 162 | .id = -1, |
151 | .dev = { | 163 | .dev = { |
152 | .platform_data = &igep2_onenand_data, | 164 | .platform_data = &igep_onenand_data, |
153 | }, | 165 | }, |
154 | }; | 166 | }; |
155 | 167 | ||
156 | static void __init igep2_flash_init(void) | 168 | static void __init igep_flash_init(void) |
157 | { | 169 | { |
158 | u8 cs = 0; | 170 | u8 cs = 0; |
159 | u8 onenandcs = GPMC_CS_NUM + 1; | 171 | u8 onenandcs = GPMC_CS_NUM + 1; |
@@ -165,7 +177,7 @@ static void __init igep2_flash_init(void) | |||
165 | /* Check if NAND/oneNAND is configured */ | 177 | /* Check if NAND/oneNAND is configured */ |
166 | if ((ret & 0xC00) == 0x800) | 178 | if ((ret & 0xC00) == 0x800) |
167 | /* NAND found */ | 179 | /* NAND found */ |
168 | pr_err("IGEP2: Unsupported NAND found\n"); | 180 | pr_err("IGEP: Unsupported NAND found\n"); |
169 | else { | 181 | else { |
170 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); | 182 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); |
171 | if ((ret & 0x3F) == (ONENAND_MAP >> 24)) | 183 | if ((ret & 0x3F) == (ONENAND_MAP >> 24)) |
@@ -175,85 +187,46 @@ static void __init igep2_flash_init(void) | |||
175 | } | 187 | } |
176 | 188 | ||
177 | if (onenandcs > GPMC_CS_NUM) { | 189 | if (onenandcs > GPMC_CS_NUM) { |
178 | pr_err("IGEP2: Unable to find configuration in GPMC\n"); | 190 | pr_err("IGEP: Unable to find configuration in GPMC\n"); |
179 | return; | 191 | return; |
180 | } | 192 | } |
181 | 193 | ||
182 | igep2_onenand_data.cs = onenandcs; | 194 | igep_onenand_data.cs = onenandcs; |
183 | 195 | ||
184 | if (platform_device_register(&igep2_onenand_device) < 0) | 196 | if (platform_device_register(&igep_onenand_device) < 0) |
185 | pr_err("IGEP2: Unable to register OneNAND device\n"); | 197 | pr_err("IGEP: Unable to register OneNAND device\n"); |
186 | } | 198 | } |
187 | 199 | ||
188 | #else | 200 | #else |
189 | static void __init igep2_flash_init(void) {} | 201 | static void __init igep_flash_init(void) {} |
190 | #endif | 202 | #endif |
191 | 203 | ||
192 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 204 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
193 | 205 | ||
194 | #include <linux/smsc911x.h> | 206 | #include <linux/smsc911x.h> |
207 | #include <plat/gpmc-smsc911x.h> | ||
195 | 208 | ||
196 | static struct smsc911x_platform_config igep2_smsc911x_config = { | 209 | static struct omap_smsc911x_platform_data smsc911x_cfg = { |
197 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | 210 | .cs = IGEP2_SMSC911X_CS, |
198 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | 211 | .gpio_irq = IGEP2_SMSC911X_GPIO, |
199 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS , | 212 | .gpio_reset = -EINVAL, |
200 | .phy_interface = PHY_INTERFACE_MODE_MII, | 213 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, |
201 | }; | ||
202 | |||
203 | static struct resource igep2_smsc911x_resources[] = { | ||
204 | { | ||
205 | .flags = IORESOURCE_MEM, | ||
206 | }, | ||
207 | { | ||
208 | .start = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO), | ||
209 | .end = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO), | ||
210 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
211 | }, | ||
212 | }; | ||
213 | |||
214 | static struct platform_device igep2_smsc911x_device = { | ||
215 | .name = "smsc911x", | ||
216 | .id = 0, | ||
217 | .num_resources = ARRAY_SIZE(igep2_smsc911x_resources), | ||
218 | .resource = igep2_smsc911x_resources, | ||
219 | .dev = { | ||
220 | .platform_data = &igep2_smsc911x_config, | ||
221 | }, | ||
222 | }; | 214 | }; |
223 | 215 | ||
224 | static inline void __init igep2_init_smsc911x(void) | 216 | static inline void __init igep2_init_smsc911x(void) |
225 | { | 217 | { |
226 | unsigned long cs_mem_base; | 218 | gpmc_smsc911x_init(&smsc911x_cfg); |
227 | |||
228 | if (gpmc_cs_request(IGEP2_SMSC911X_CS, SZ_16M, &cs_mem_base) < 0) { | ||
229 | pr_err("IGEP v2: Failed request for GPMC mem for smsc911x\n"); | ||
230 | gpmc_cs_free(IGEP2_SMSC911X_CS); | ||
231 | return; | ||
232 | } | ||
233 | |||
234 | igep2_smsc911x_resources[0].start = cs_mem_base + 0x0; | ||
235 | igep2_smsc911x_resources[0].end = cs_mem_base + 0xff; | ||
236 | |||
237 | if ((gpio_request(IGEP2_SMSC911X_GPIO, "SMSC911X IRQ") == 0) && | ||
238 | (gpio_direction_input(IGEP2_SMSC911X_GPIO) == 0)) { | ||
239 | gpio_export(IGEP2_SMSC911X_GPIO, 0); | ||
240 | } else { | ||
241 | pr_err("IGEP v2: Could not obtain gpio for for SMSC911X IRQ\n"); | ||
242 | return; | ||
243 | } | ||
244 | |||
245 | platform_device_register(&igep2_smsc911x_device); | ||
246 | } | 219 | } |
247 | 220 | ||
248 | #else | 221 | #else |
249 | static inline void __init igep2_init_smsc911x(void) { } | 222 | static inline void __init igep2_init_smsc911x(void) { } |
250 | #endif | 223 | #endif |
251 | 224 | ||
252 | static struct regulator_consumer_supply igep2_vmmc1_supply = | 225 | static struct regulator_consumer_supply igep_vmmc1_supply = |
253 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); | 226 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); |
254 | 227 | ||
255 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ | 228 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ |
256 | static struct regulator_init_data igep2_vmmc1 = { | 229 | static struct regulator_init_data igep_vmmc1 = { |
257 | .constraints = { | 230 | .constraints = { |
258 | .min_uV = 1850000, | 231 | .min_uV = 1850000, |
259 | .max_uV = 3150000, | 232 | .max_uV = 3150000, |
@@ -264,13 +237,13 @@ static struct regulator_init_data igep2_vmmc1 = { | |||
264 | | REGULATOR_CHANGE_STATUS, | 237 | | REGULATOR_CHANGE_STATUS, |
265 | }, | 238 | }, |
266 | .num_consumer_supplies = 1, | 239 | .num_consumer_supplies = 1, |
267 | .consumer_supplies = &igep2_vmmc1_supply, | 240 | .consumer_supplies = &igep_vmmc1_supply, |
268 | }; | 241 | }; |
269 | 242 | ||
270 | static struct regulator_consumer_supply igep2_vio_supply = | 243 | static struct regulator_consumer_supply igep_vio_supply = |
271 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"); | 244 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"); |
272 | 245 | ||
273 | static struct regulator_init_data igep2_vio = { | 246 | static struct regulator_init_data igep_vio = { |
274 | .constraints = { | 247 | .constraints = { |
275 | .min_uV = 1800000, | 248 | .min_uV = 1800000, |
276 | .max_uV = 1800000, | 249 | .max_uV = 1800000, |
@@ -282,34 +255,34 @@ static struct regulator_init_data igep2_vio = { | |||
282 | | REGULATOR_CHANGE_STATUS, | 255 | | REGULATOR_CHANGE_STATUS, |
283 | }, | 256 | }, |
284 | .num_consumer_supplies = 1, | 257 | .num_consumer_supplies = 1, |
285 | .consumer_supplies = &igep2_vio_supply, | 258 | .consumer_supplies = &igep_vio_supply, |
286 | }; | 259 | }; |
287 | 260 | ||
288 | static struct regulator_consumer_supply igep2_vmmc2_supply = | 261 | static struct regulator_consumer_supply igep_vmmc2_supply = |
289 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); | 262 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); |
290 | 263 | ||
291 | static struct regulator_init_data igep2_vmmc2 = { | 264 | static struct regulator_init_data igep_vmmc2 = { |
292 | .constraints = { | 265 | .constraints = { |
293 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | 266 | .valid_modes_mask = REGULATOR_MODE_NORMAL, |
294 | .always_on = 1, | 267 | .always_on = 1, |
295 | }, | 268 | }, |
296 | .num_consumer_supplies = 1, | 269 | .num_consumer_supplies = 1, |
297 | .consumer_supplies = &igep2_vmmc2_supply, | 270 | .consumer_supplies = &igep_vmmc2_supply, |
298 | }; | 271 | }; |
299 | 272 | ||
300 | static struct fixed_voltage_config igep2_vwlan = { | 273 | static struct fixed_voltage_config igep_vwlan = { |
301 | .supply_name = "vwlan", | 274 | .supply_name = "vwlan", |
302 | .microvolts = 3300000, | 275 | .microvolts = 3300000, |
303 | .gpio = -EINVAL, | 276 | .gpio = -EINVAL, |
304 | .enabled_at_boot = 1, | 277 | .enabled_at_boot = 1, |
305 | .init_data = &igep2_vmmc2, | 278 | .init_data = &igep_vmmc2, |
306 | }; | 279 | }; |
307 | 280 | ||
308 | static struct platform_device igep2_vwlan_device = { | 281 | static struct platform_device igep_vwlan_device = { |
309 | .name = "reg-fixed-voltage", | 282 | .name = "reg-fixed-voltage", |
310 | .id = 0, | 283 | .id = 0, |
311 | .dev = { | 284 | .dev = { |
312 | .platform_data = &igep2_vwlan, | 285 | .platform_data = &igep_vwlan, |
313 | }, | 286 | }, |
314 | }; | 287 | }; |
315 | 288 | ||
@@ -334,20 +307,17 @@ static struct omap2_hsmmc_info mmc[] = { | |||
334 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | 307 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) |
335 | #include <linux/leds.h> | 308 | #include <linux/leds.h> |
336 | 309 | ||
337 | static struct gpio_led igep2_gpio_leds[] = { | 310 | static struct gpio_led igep_gpio_leds[] = { |
338 | [0] = { | 311 | [0] = { |
339 | .name = "gpio-led:red:d0", | 312 | .name = "gpio-led:red:d0", |
340 | .gpio = IGEP2_GPIO_LED0_RED, | ||
341 | .default_trigger = "default-off" | 313 | .default_trigger = "default-off" |
342 | }, | 314 | }, |
343 | [1] = { | 315 | [1] = { |
344 | .name = "gpio-led:green:d0", | 316 | .name = "gpio-led:green:d0", |
345 | .gpio = IGEP2_GPIO_LED0_GREEN, | ||
346 | .default_trigger = "default-off", | 317 | .default_trigger = "default-off", |
347 | }, | 318 | }, |
348 | [2] = { | 319 | [2] = { |
349 | .name = "gpio-led:red:d1", | 320 | .name = "gpio-led:red:d1", |
350 | .gpio = IGEP2_GPIO_LED1_RED, | ||
351 | .default_trigger = "default-off", | 321 | .default_trigger = "default-off", |
352 | }, | 322 | }, |
353 | [3] = { | 323 | [3] = { |
@@ -358,94 +328,119 @@ static struct gpio_led igep2_gpio_leds[] = { | |||
358 | }, | 328 | }, |
359 | }; | 329 | }; |
360 | 330 | ||
361 | static struct gpio_led_platform_data igep2_led_pdata = { | 331 | static struct gpio_led_platform_data igep_led_pdata = { |
362 | .leds = igep2_gpio_leds, | 332 | .leds = igep_gpio_leds, |
363 | .num_leds = ARRAY_SIZE(igep2_gpio_leds), | 333 | .num_leds = ARRAY_SIZE(igep_gpio_leds), |
364 | }; | 334 | }; |
365 | 335 | ||
366 | static struct platform_device igep2_led_device = { | 336 | static struct platform_device igep_led_device = { |
367 | .name = "leds-gpio", | 337 | .name = "leds-gpio", |
368 | .id = -1, | 338 | .id = -1, |
369 | .dev = { | 339 | .dev = { |
370 | .platform_data = &igep2_led_pdata, | 340 | .platform_data = &igep_led_pdata, |
371 | }, | 341 | }, |
372 | }; | 342 | }; |
373 | 343 | ||
374 | static void __init igep2_leds_init(void) | 344 | static void __init igep_leds_init(void) |
375 | { | 345 | { |
376 | platform_device_register(&igep2_led_device); | 346 | if (machine_is_igep0020()) { |
347 | igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED; | ||
348 | igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN; | ||
349 | igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED; | ||
350 | } else { | ||
351 | igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED; | ||
352 | igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN; | ||
353 | igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED; | ||
354 | } | ||
355 | |||
356 | platform_device_register(&igep_led_device); | ||
377 | } | 357 | } |
378 | 358 | ||
379 | #else | 359 | #else |
380 | static inline void igep2_leds_init(void) | 360 | static struct gpio igep_gpio_leds[] __initdata = { |
361 | { -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:red:d0" }, | ||
362 | { -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:green:d0" }, | ||
363 | { -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:red:d1" }, | ||
364 | }; | ||
365 | |||
366 | static inline void igep_leds_init(void) | ||
381 | { | 367 | { |
382 | if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) && | 368 | int i; |
383 | (gpio_direction_output(IGEP2_GPIO_LED0_RED, 0) == 0)) | ||
384 | gpio_export(IGEP2_GPIO_LED0_RED, 0); | ||
385 | else | ||
386 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n"); | ||
387 | 369 | ||
388 | if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) && | 370 | if (machine_is_igep0020()) { |
389 | (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 0) == 0)) | 371 | igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED; |
390 | gpio_export(IGEP2_GPIO_LED0_GREEN, 0); | 372 | igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN; |
391 | else | 373 | igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED; |
392 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n"); | 374 | } else { |
375 | igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED; | ||
376 | igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN; | ||
377 | igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED; | ||
378 | } | ||
393 | 379 | ||
394 | if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) && | 380 | if (gpio_request_array(igep_gpio_leds, ARRAY_SIZE(igep_gpio_leds))) { |
395 | (gpio_direction_output(IGEP2_GPIO_LED1_RED, 0) == 0)) | 381 | pr_warning("IGEP v2: Could not obtain leds gpios\n"); |
396 | gpio_export(IGEP2_GPIO_LED1_RED, 0); | 382 | return; |
397 | else | 383 | } |
398 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n"); | ||
399 | 384 | ||
385 | for (i = 0; i < ARRAY_SIZE(igep_gpio_leds); i++) | ||
386 | gpio_export(igep_gpio_leds[i].gpio, 0); | ||
400 | } | 387 | } |
401 | #endif | 388 | #endif |
402 | 389 | ||
403 | static int igep2_twl_gpio_setup(struct device *dev, | 390 | static struct gpio igep2_twl_gpios[] = { |
391 | { -EINVAL, GPIOF_IN, "GPIO_EHCI_NOC" }, | ||
392 | { -EINVAL, GPIOF_OUT_INIT_LOW, "GPIO_USBH_CPEN" }, | ||
393 | }; | ||
394 | |||
395 | static int igep_twl_gpio_setup(struct device *dev, | ||
404 | unsigned gpio, unsigned ngpio) | 396 | unsigned gpio, unsigned ngpio) |
405 | { | 397 | { |
398 | int ret; | ||
399 | |||
406 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ | 400 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ |
407 | mmc[0].gpio_cd = gpio + 0; | 401 | mmc[0].gpio_cd = gpio + 0; |
408 | omap2_hsmmc_init(mmc); | 402 | omap2_hsmmc_init(mmc); |
409 | 403 | ||
410 | /* | ||
411 | * REVISIT: need ehci-omap hooks for external VBUS | ||
412 | * power switch and overcurrent detect | ||
413 | */ | ||
414 | if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) || | ||
415 | (gpio_direction_input(gpio + 1) < 0)) | ||
416 | pr_err("IGEP2: Could not obtain gpio for EHCI NOC"); | ||
417 | |||
418 | /* | ||
419 | * TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN | ||
420 | * (out, active low) | ||
421 | */ | ||
422 | if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) || | ||
423 | (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0)) | ||
424 | pr_err("IGEP2: Could not obtain gpio for USBH_CPEN"); | ||
425 | |||
426 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ | 404 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ |
427 | #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) | 405 | #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) |
428 | if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0) | 406 | ret = gpio_request_one(gpio + TWL4030_GPIO_MAX + 1, GPIOF_OUT_INIT_HIGH, |
429 | && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) | 407 | "gpio-led:green:d1"); |
408 | if (ret == 0) | ||
430 | gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0); | 409 | gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0); |
431 | else | 410 | else |
432 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n"); | 411 | pr_warning("IGEP: Could not obtain gpio GPIO_LED1_GREEN\n"); |
433 | #else | 412 | #else |
434 | igep2_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1; | 413 | igep_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1; |
435 | #endif | 414 | #endif |
436 | 415 | ||
416 | if (machine_is_igep0030()) | ||
417 | return 0; | ||
418 | |||
419 | /* | ||
420 | * REVISIT: need ehci-omap hooks for external VBUS | ||
421 | * power switch and overcurrent detect | ||
422 | */ | ||
423 | igep2_twl_gpios[0].gpio = gpio + 1; | ||
424 | |||
425 | /* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN (out, active low) */ | ||
426 | igep2_twl_gpios[1].gpio = gpio + TWL4030_GPIO_MAX; | ||
427 | |||
428 | ret = gpio_request_array(igep2_twl_gpios, ARRAY_SIZE(igep2_twl_gpios)); | ||
429 | if (ret < 0) | ||
430 | pr_err("IGEP2: Could not obtain gpio for USBH_CPEN"); | ||
431 | |||
437 | return 0; | 432 | return 0; |
438 | }; | 433 | }; |
439 | 434 | ||
440 | static struct twl4030_gpio_platform_data igep2_twl4030_gpio_pdata = { | 435 | static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = { |
441 | .gpio_base = OMAP_MAX_GPIO_LINES, | 436 | .gpio_base = OMAP_MAX_GPIO_LINES, |
442 | .irq_base = TWL4030_GPIO_IRQ_BASE, | 437 | .irq_base = TWL4030_GPIO_IRQ_BASE, |
443 | .irq_end = TWL4030_GPIO_IRQ_END, | 438 | .irq_end = TWL4030_GPIO_IRQ_END, |
444 | .use_leds = true, | 439 | .use_leds = true, |
445 | .setup = igep2_twl_gpio_setup, | 440 | .setup = igep_twl_gpio_setup, |
446 | }; | 441 | }; |
447 | 442 | ||
448 | static struct twl4030_usb_data igep2_usb_data = { | 443 | static struct twl4030_usb_data igep_usb_data = { |
449 | .usb_mode = T2_USB_MODE_ULPI, | 444 | .usb_mode = T2_USB_MODE_ULPI, |
450 | }; | 445 | }; |
451 | 446 | ||
@@ -507,16 +502,17 @@ static struct regulator_init_data igep2_vpll2 = { | |||
507 | 502 | ||
508 | static void __init igep2_display_init(void) | 503 | static void __init igep2_display_init(void) |
509 | { | 504 | { |
510 | if (gpio_request(IGEP2_GPIO_DVI_PUP, "GPIO_DVI_PUP") && | 505 | int err = gpio_request_one(IGEP2_GPIO_DVI_PUP, GPIOF_OUT_INIT_HIGH, |
511 | gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1)) | 506 | "GPIO_DVI_PUP"); |
507 | if (err) | ||
512 | pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n"); | 508 | pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n"); |
513 | } | 509 | } |
514 | 510 | ||
515 | static struct platform_device *igep2_devices[] __initdata = { | 511 | static struct platform_device *igep_devices[] __initdata = { |
516 | &igep2_vwlan_device, | 512 | &igep_vwlan_device, |
517 | }; | 513 | }; |
518 | 514 | ||
519 | static void __init igep2_init_early(void) | 515 | static void __init igep_init_early(void) |
520 | { | 516 | { |
521 | omap2_init_common_infrastructure(); | 517 | omap2_init_common_infrastructure(); |
522 | omap2_init_common_devices(m65kxxxxam_sdrc_params, | 518 | omap2_init_common_devices(m65kxxxxam_sdrc_params, |
@@ -561,27 +557,15 @@ static struct twl4030_keypad_data igep2_keypad_pdata = { | |||
561 | .rep = 1, | 557 | .rep = 1, |
562 | }; | 558 | }; |
563 | 559 | ||
564 | static struct twl4030_platform_data igep2_twldata = { | 560 | static struct twl4030_platform_data igep_twldata = { |
565 | .irq_base = TWL4030_IRQ_BASE, | 561 | .irq_base = TWL4030_IRQ_BASE, |
566 | .irq_end = TWL4030_IRQ_END, | 562 | .irq_end = TWL4030_IRQ_END, |
567 | 563 | ||
568 | /* platform_data for children goes here */ | 564 | /* platform_data for children goes here */ |
569 | .usb = &igep2_usb_data, | 565 | .usb = &igep_usb_data, |
570 | .codec = &igep2_codec_data, | 566 | .gpio = &igep_twl4030_gpio_pdata, |
571 | .gpio = &igep2_twl4030_gpio_pdata, | 567 | .vmmc1 = &igep_vmmc1, |
572 | .keypad = &igep2_keypad_pdata, | 568 | .vio = &igep_vio, |
573 | .vmmc1 = &igep2_vmmc1, | ||
574 | .vpll2 = &igep2_vpll2, | ||
575 | .vio = &igep2_vio, | ||
576 | }; | ||
577 | |||
578 | static struct i2c_board_info __initdata igep2_i2c1_boardinfo[] = { | ||
579 | { | ||
580 | I2C_BOARD_INFO("twl4030", 0x48), | ||
581 | .flags = I2C_CLIENT_WAKE, | ||
582 | .irq = INT_34XX_SYS_NIRQ, | ||
583 | .platform_data = &igep2_twldata, | ||
584 | }, | ||
585 | }; | 569 | }; |
586 | 570 | ||
587 | static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = { | 571 | static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = { |
@@ -590,32 +574,29 @@ static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = { | |||
590 | }, | 574 | }, |
591 | }; | 575 | }; |
592 | 576 | ||
593 | static void __init igep2_i2c_init(void) | 577 | static void __init igep_i2c_init(void) |
594 | { | 578 | { |
595 | int ret; | 579 | int ret; |
596 | 580 | ||
597 | ret = omap_register_i2c_bus(1, 2600, igep2_i2c1_boardinfo, | 581 | if (machine_is_igep0020()) { |
598 | ARRAY_SIZE(igep2_i2c1_boardinfo)); | 582 | /* |
599 | if (ret) | 583 | * Bus 3 is attached to the DVI port where devices like the |
600 | pr_warning("IGEP2: Could not register I2C1 bus (%d)\n", ret); | 584 | * pico DLP projector don't work reliably with 400kHz |
585 | */ | ||
586 | ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo, | ||
587 | ARRAY_SIZE(igep2_i2c3_boardinfo)); | ||
588 | if (ret) | ||
589 | pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret); | ||
590 | |||
591 | igep_twldata.codec = &igep2_codec_data; | ||
592 | igep_twldata.keypad = &igep2_keypad_pdata; | ||
593 | igep_twldata.vpll2 = &igep2_vpll2; | ||
594 | } | ||
601 | 595 | ||
602 | /* | 596 | omap3_pmic_init("twl4030", &igep_twldata); |
603 | * Bus 3 is attached to the DVI port where devices like the pico DLP | ||
604 | * projector don't work reliably with 400kHz | ||
605 | */ | ||
606 | ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo, | ||
607 | ARRAY_SIZE(igep2_i2c3_boardinfo)); | ||
608 | if (ret) | ||
609 | pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret); | ||
610 | } | 597 | } |
611 | 598 | ||
612 | static struct omap_musb_board_data musb_board_data = { | 599 | static const struct usbhs_omap_board_data igep2_usbhs_bdata __initconst = { |
613 | .interface_type = MUSB_INTERFACE_ULPI, | ||
614 | .mode = MUSB_OTG, | ||
615 | .power = 100, | ||
616 | }; | ||
617 | |||
618 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | ||
619 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 600 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
620 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, | 601 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, |
621 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 602 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -626,6 +607,17 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | |||
626 | .reset_gpio_port[2] = -EINVAL, | 607 | .reset_gpio_port[2] = -EINVAL, |
627 | }; | 608 | }; |
628 | 609 | ||
610 | static const struct usbhs_omap_board_data igep3_usbhs_bdata __initconst = { | ||
611 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | ||
612 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | ||
613 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | ||
614 | |||
615 | .phy_reset = true, | ||
616 | .reset_gpio_port[0] = -EINVAL, | ||
617 | .reset_gpio_port[1] = IGEP3_GPIO_USBH_NRESET, | ||
618 | .reset_gpio_port[2] = -EINVAL, | ||
619 | }; | ||
620 | |||
629 | #ifdef CONFIG_OMAP_MUX | 621 | #ifdef CONFIG_OMAP_MUX |
630 | static struct omap_board_mux board_mux[] __initdata = { | 622 | static struct omap_board_mux board_mux[] __initdata = { |
631 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 623 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
@@ -633,82 +625,95 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
633 | #endif | 625 | #endif |
634 | 626 | ||
635 | #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) | 627 | #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) |
628 | static struct gpio igep_wlan_bt_gpios[] __initdata = { | ||
629 | { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NPD" }, | ||
630 | { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NRESET" }, | ||
631 | { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_BT_NRESET" }, | ||
632 | }; | ||
636 | 633 | ||
637 | static void __init igep2_wlan_bt_init(void) | 634 | static void __init igep_wlan_bt_init(void) |
638 | { | 635 | { |
639 | unsigned npd, wreset, btreset; | 636 | int err; |
640 | 637 | ||
641 | /* GPIO's for WLAN-BT combo depends on hardware revision */ | 638 | /* GPIO's for WLAN-BT combo depends on hardware revision */ |
642 | if (hwrev == IGEP2_BOARD_HWREV_B) { | 639 | if (hwrev == IGEP2_BOARD_HWREV_B) { |
643 | npd = IGEP2_RB_GPIO_WIFI_NPD; | 640 | igep_wlan_bt_gpios[0].gpio = IGEP2_RB_GPIO_WIFI_NPD; |
644 | wreset = IGEP2_RB_GPIO_WIFI_NRESET; | 641 | igep_wlan_bt_gpios[1].gpio = IGEP2_RB_GPIO_WIFI_NRESET; |
645 | btreset = IGEP2_RB_GPIO_BT_NRESET; | 642 | igep_wlan_bt_gpios[2].gpio = IGEP2_RB_GPIO_BT_NRESET; |
646 | } else if (hwrev == IGEP2_BOARD_HWREV_C) { | 643 | } else if (hwrev == IGEP2_BOARD_HWREV_C || machine_is_igep0030()) { |
647 | npd = IGEP2_RC_GPIO_WIFI_NPD; | 644 | igep_wlan_bt_gpios[0].gpio = IGEP2_RC_GPIO_WIFI_NPD; |
648 | wreset = IGEP2_RC_GPIO_WIFI_NRESET; | 645 | igep_wlan_bt_gpios[1].gpio = IGEP2_RC_GPIO_WIFI_NRESET; |
649 | btreset = IGEP2_RC_GPIO_BT_NRESET; | 646 | igep_wlan_bt_gpios[2].gpio = IGEP2_RC_GPIO_BT_NRESET; |
650 | } else | 647 | } else |
651 | return; | 648 | return; |
652 | 649 | ||
653 | /* Set GPIO's for WLAN-BT combo module */ | 650 | err = gpio_request_array(igep_wlan_bt_gpios, |
654 | if ((gpio_request(npd, "GPIO_WIFI_NPD") == 0) && | 651 | ARRAY_SIZE(igep_wlan_bt_gpios)); |
655 | (gpio_direction_output(npd, 1) == 0)) { | 652 | if (err) { |
656 | gpio_export(npd, 0); | 653 | pr_warning("IGEP2: Could not obtain WIFI/BT gpios\n"); |
657 | } else | 654 | return; |
658 | pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NPD\n"); | 655 | } |
659 | 656 | ||
660 | if ((gpio_request(wreset, "GPIO_WIFI_NRESET") == 0) && | 657 | gpio_export(igep_wlan_bt_gpios[0].gpio, 0); |
661 | (gpio_direction_output(wreset, 1) == 0)) { | 658 | gpio_export(igep_wlan_bt_gpios[1].gpio, 0); |
662 | gpio_export(wreset, 0); | 659 | gpio_export(igep_wlan_bt_gpios[2].gpio, 0); |
663 | gpio_set_value(wreset, 0); | 660 | |
664 | udelay(10); | 661 | gpio_set_value(igep_wlan_bt_gpios[1].gpio, 0); |
665 | gpio_set_value(wreset, 1); | 662 | udelay(10); |
666 | } else | 663 | gpio_set_value(igep_wlan_bt_gpios[1].gpio, 1); |
667 | pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NRESET\n"); | ||
668 | 664 | ||
669 | if ((gpio_request(btreset, "GPIO_BT_NRESET") == 0) && | ||
670 | (gpio_direction_output(btreset, 1) == 0)) { | ||
671 | gpio_export(btreset, 0); | ||
672 | } else | ||
673 | pr_warning("IGEP2: Could not obtain gpio GPIO_BT_NRESET\n"); | ||
674 | } | 665 | } |
675 | #else | 666 | #else |
676 | static inline void __init igep2_wlan_bt_init(void) { } | 667 | static inline void __init igep_wlan_bt_init(void) { } |
677 | #endif | 668 | #endif |
678 | 669 | ||
679 | static void __init igep2_init(void) | 670 | static void __init igep_init(void) |
680 | { | 671 | { |
681 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 672 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
682 | 673 | ||
683 | /* Get IGEP2 hardware revision */ | 674 | /* Get IGEP2 hardware revision */ |
684 | igep2_get_revision(); | 675 | igep2_get_revision(); |
685 | /* Register I2C busses and drivers */ | 676 | /* Register I2C busses and drivers */ |
686 | igep2_i2c_init(); | 677 | igep_i2c_init(); |
687 | platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices)); | 678 | platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices)); |
688 | omap_display_init(&igep2_dss_data); | ||
689 | omap_serial_init(); | 679 | omap_serial_init(); |
690 | usb_musb_init(&musb_board_data); | 680 | usb_musb_init(NULL); |
691 | usbhs_init(&usbhs_bdata); | ||
692 | 681 | ||
693 | igep2_flash_init(); | 682 | igep_flash_init(); |
694 | igep2_leds_init(); | 683 | igep_leds_init(); |
695 | igep2_display_init(); | ||
696 | igep2_init_smsc911x(); | ||
697 | 684 | ||
698 | /* | 685 | /* |
699 | * WLAN-BT combo module from MuRata which has a Marvell WLAN | 686 | * WLAN-BT combo module from MuRata which has a Marvell WLAN |
700 | * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface. | 687 | * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface. |
701 | */ | 688 | */ |
702 | igep2_wlan_bt_init(); | 689 | igep_wlan_bt_init(); |
703 | 690 | ||
691 | if (machine_is_igep0020()) { | ||
692 | omap_display_init(&igep2_dss_data); | ||
693 | igep2_display_init(); | ||
694 | igep2_init_smsc911x(); | ||
695 | usbhs_init(&igep2_usbhs_bdata); | ||
696 | } else { | ||
697 | usbhs_init(&igep3_usbhs_bdata); | ||
698 | } | ||
704 | } | 699 | } |
705 | 700 | ||
706 | MACHINE_START(IGEP0020, "IGEP v2 board") | 701 | MACHINE_START(IGEP0020, "IGEP v2 board") |
707 | .boot_params = 0x80000100, | 702 | .boot_params = 0x80000100, |
708 | .reserve = omap_reserve, | 703 | .reserve = omap_reserve, |
709 | .map_io = omap3_map_io, | 704 | .map_io = omap3_map_io, |
710 | .init_early = igep2_init_early, | 705 | .init_early = igep_init_early, |
706 | .init_irq = omap_init_irq, | ||
707 | .init_machine = igep_init, | ||
708 | .timer = &omap_timer, | ||
709 | MACHINE_END | ||
710 | |||
711 | MACHINE_START(IGEP0030, "IGEP OMAP3 module") | ||
712 | .boot_params = 0x80000100, | ||
713 | .reserve = omap_reserve, | ||
714 | .map_io = omap3_map_io, | ||
715 | .init_early = igep_init_early, | ||
711 | .init_irq = omap_init_irq, | 716 | .init_irq = omap_init_irq, |
712 | .init_machine = igep2_init, | 717 | .init_machine = igep_init, |
713 | .timer = &omap_timer, | 718 | .timer = &omap_timer, |
714 | MACHINE_END | 719 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-igep0030.c b/arch/arm/mach-omap2/board-igep0030.c deleted file mode 100644 index 2cf86c3cb1a3..000000000000 --- a/arch/arm/mach-omap2/board-igep0030.c +++ /dev/null | |||
@@ -1,458 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010 - ISEE 2007 SL | ||
3 | * | ||
4 | * Modified from mach-omap2/board-generic.c | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/delay.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/clk.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | |||
21 | #include <linux/regulator/machine.h> | ||
22 | #include <linux/regulator/fixed.h> | ||
23 | #include <linux/i2c/twl.h> | ||
24 | #include <linux/mmc/host.h> | ||
25 | |||
26 | #include <asm/mach-types.h> | ||
27 | #include <asm/mach/arch.h> | ||
28 | |||
29 | #include <plat/board.h> | ||
30 | #include <plat/common.h> | ||
31 | #include <plat/gpmc.h> | ||
32 | #include <plat/usb.h> | ||
33 | #include <plat/onenand.h> | ||
34 | |||
35 | #include "mux.h" | ||
36 | #include "hsmmc.h" | ||
37 | #include "sdram-numonyx-m65kxxxxam.h" | ||
38 | |||
39 | #define IGEP3_GPIO_LED0_GREEN 54 | ||
40 | #define IGEP3_GPIO_LED0_RED 53 | ||
41 | #define IGEP3_GPIO_LED1_RED 16 | ||
42 | |||
43 | #define IGEP3_GPIO_WIFI_NPD 138 | ||
44 | #define IGEP3_GPIO_WIFI_NRESET 139 | ||
45 | #define IGEP3_GPIO_BT_NRESET 137 | ||
46 | |||
47 | #define IGEP3_GPIO_USBH_NRESET 183 | ||
48 | |||
49 | |||
50 | #if defined(CONFIG_MTD_ONENAND_OMAP2) || \ | ||
51 | defined(CONFIG_MTD_ONENAND_OMAP2_MODULE) | ||
52 | |||
53 | #define ONENAND_MAP 0x20000000 | ||
54 | |||
55 | /* | ||
56 | * x2 Flash built-in COMBO POP MEMORY | ||
57 | * Since the device is equipped with two DataRAMs, and two-plane NAND | ||
58 | * Flash memory array, these two component enables simultaneous program | ||
59 | * of 4KiB. Plane1 has only even blocks such as block0, block2, block4 | ||
60 | * while Plane2 has only odd blocks such as block1, block3, block5. | ||
61 | * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048) | ||
62 | */ | ||
63 | |||
64 | static struct mtd_partition igep3_onenand_partitions[] = { | ||
65 | { | ||
66 | .name = "X-Loader", | ||
67 | .offset = 0, | ||
68 | .size = 2 * (64*(2*2048)) | ||
69 | }, | ||
70 | { | ||
71 | .name = "U-Boot", | ||
72 | .offset = MTDPART_OFS_APPEND, | ||
73 | .size = 6 * (64*(2*2048)), | ||
74 | }, | ||
75 | { | ||
76 | .name = "Environment", | ||
77 | .offset = MTDPART_OFS_APPEND, | ||
78 | .size = 2 * (64*(2*2048)), | ||
79 | }, | ||
80 | { | ||
81 | .name = "Kernel", | ||
82 | .offset = MTDPART_OFS_APPEND, | ||
83 | .size = 12 * (64*(2*2048)), | ||
84 | }, | ||
85 | { | ||
86 | .name = "File System", | ||
87 | .offset = MTDPART_OFS_APPEND, | ||
88 | .size = MTDPART_SIZ_FULL, | ||
89 | }, | ||
90 | }; | ||
91 | |||
92 | static struct omap_onenand_platform_data igep3_onenand_pdata = { | ||
93 | .parts = igep3_onenand_partitions, | ||
94 | .nr_parts = ARRAY_SIZE(igep3_onenand_partitions), | ||
95 | .onenand_setup = NULL, | ||
96 | .dma_channel = -1, /* disable DMA in OMAP OneNAND driver */ | ||
97 | }; | ||
98 | |||
99 | static struct platform_device igep3_onenand_device = { | ||
100 | .name = "omap2-onenand", | ||
101 | .id = -1, | ||
102 | .dev = { | ||
103 | .platform_data = &igep3_onenand_pdata, | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | static void __init igep3_flash_init(void) | ||
108 | { | ||
109 | u8 cs = 0; | ||
110 | u8 onenandcs = GPMC_CS_NUM + 1; | ||
111 | |||
112 | for (cs = 0; cs < GPMC_CS_NUM; cs++) { | ||
113 | u32 ret; | ||
114 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | ||
115 | |||
116 | /* Check if NAND/oneNAND is configured */ | ||
117 | if ((ret & 0xC00) == 0x800) | ||
118 | /* NAND found */ | ||
119 | pr_err("IGEP3: Unsupported NAND found\n"); | ||
120 | else { | ||
121 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); | ||
122 | |||
123 | if ((ret & 0x3F) == (ONENAND_MAP >> 24)) | ||
124 | /* OneNAND found */ | ||
125 | onenandcs = cs; | ||
126 | } | ||
127 | } | ||
128 | |||
129 | if (onenandcs > GPMC_CS_NUM) { | ||
130 | pr_err("IGEP3: Unable to find configuration in GPMC\n"); | ||
131 | return; | ||
132 | } | ||
133 | |||
134 | igep3_onenand_pdata.cs = onenandcs; | ||
135 | |||
136 | if (platform_device_register(&igep3_onenand_device) < 0) | ||
137 | pr_err("IGEP3: Unable to register OneNAND device\n"); | ||
138 | } | ||
139 | |||
140 | #else | ||
141 | static void __init igep3_flash_init(void) {} | ||
142 | #endif | ||
143 | |||
144 | static struct regulator_consumer_supply igep3_vmmc1_supply = | ||
145 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); | ||
146 | |||
147 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ | ||
148 | static struct regulator_init_data igep3_vmmc1 = { | ||
149 | .constraints = { | ||
150 | .min_uV = 1850000, | ||
151 | .max_uV = 3150000, | ||
152 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
153 | | REGULATOR_MODE_STANDBY, | ||
154 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
155 | | REGULATOR_CHANGE_MODE | ||
156 | | REGULATOR_CHANGE_STATUS, | ||
157 | }, | ||
158 | .num_consumer_supplies = 1, | ||
159 | .consumer_supplies = &igep3_vmmc1_supply, | ||
160 | }; | ||
161 | |||
162 | static struct regulator_consumer_supply igep3_vio_supply = | ||
163 | REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"); | ||
164 | |||
165 | static struct regulator_init_data igep3_vio = { | ||
166 | .constraints = { | ||
167 | .min_uV = 1800000, | ||
168 | .max_uV = 1800000, | ||
169 | .apply_uV = 1, | ||
170 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
171 | | REGULATOR_MODE_STANDBY, | ||
172 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
173 | | REGULATOR_CHANGE_MODE | ||
174 | | REGULATOR_CHANGE_STATUS, | ||
175 | }, | ||
176 | .num_consumer_supplies = 1, | ||
177 | .consumer_supplies = &igep3_vio_supply, | ||
178 | }; | ||
179 | |||
180 | static struct regulator_consumer_supply igep3_vmmc2_supply = | ||
181 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); | ||
182 | |||
183 | static struct regulator_init_data igep3_vmmc2 = { | ||
184 | .constraints = { | ||
185 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | ||
186 | .always_on = 1, | ||
187 | }, | ||
188 | .num_consumer_supplies = 1, | ||
189 | .consumer_supplies = &igep3_vmmc2_supply, | ||
190 | }; | ||
191 | |||
192 | static struct fixed_voltage_config igep3_vwlan = { | ||
193 | .supply_name = "vwlan", | ||
194 | .microvolts = 3300000, | ||
195 | .gpio = -EINVAL, | ||
196 | .enabled_at_boot = 1, | ||
197 | .init_data = &igep3_vmmc2, | ||
198 | }; | ||
199 | |||
200 | static struct platform_device igep3_vwlan_device = { | ||
201 | .name = "reg-fixed-voltage", | ||
202 | .id = 0, | ||
203 | .dev = { | ||
204 | .platform_data = &igep3_vwlan, | ||
205 | }, | ||
206 | }; | ||
207 | |||
208 | static struct omap2_hsmmc_info mmc[] = { | ||
209 | [0] = { | ||
210 | .mmc = 1, | ||
211 | .caps = MMC_CAP_4_BIT_DATA, | ||
212 | .gpio_cd = -EINVAL, | ||
213 | .gpio_wp = -EINVAL, | ||
214 | }, | ||
215 | #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) | ||
216 | [1] = { | ||
217 | .mmc = 2, | ||
218 | .caps = MMC_CAP_4_BIT_DATA, | ||
219 | .gpio_cd = -EINVAL, | ||
220 | .gpio_wp = -EINVAL, | ||
221 | }, | ||
222 | #endif | ||
223 | {} /* Terminator */ | ||
224 | }; | ||
225 | |||
226 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | ||
227 | #include <linux/leds.h> | ||
228 | |||
229 | static struct gpio_led igep3_gpio_leds[] = { | ||
230 | [0] = { | ||
231 | .name = "gpio-led:red:d0", | ||
232 | .gpio = IGEP3_GPIO_LED0_RED, | ||
233 | .default_trigger = "default-off" | ||
234 | }, | ||
235 | [1] = { | ||
236 | .name = "gpio-led:green:d0", | ||
237 | .gpio = IGEP3_GPIO_LED0_GREEN, | ||
238 | .default_trigger = "default-off", | ||
239 | }, | ||
240 | [2] = { | ||
241 | .name = "gpio-led:red:d1", | ||
242 | .gpio = IGEP3_GPIO_LED1_RED, | ||
243 | .default_trigger = "default-off", | ||
244 | }, | ||
245 | [3] = { | ||
246 | .name = "gpio-led:green:d1", | ||
247 | .default_trigger = "heartbeat", | ||
248 | .gpio = -EINVAL, /* gets replaced */ | ||
249 | }, | ||
250 | }; | ||
251 | |||
252 | static struct gpio_led_platform_data igep3_led_pdata = { | ||
253 | .leds = igep3_gpio_leds, | ||
254 | .num_leds = ARRAY_SIZE(igep3_gpio_leds), | ||
255 | }; | ||
256 | |||
257 | static struct platform_device igep3_led_device = { | ||
258 | .name = "leds-gpio", | ||
259 | .id = -1, | ||
260 | .dev = { | ||
261 | .platform_data = &igep3_led_pdata, | ||
262 | }, | ||
263 | }; | ||
264 | |||
265 | static void __init igep3_leds_init(void) | ||
266 | { | ||
267 | platform_device_register(&igep3_led_device); | ||
268 | } | ||
269 | |||
270 | #else | ||
271 | static inline void igep3_leds_init(void) | ||
272 | { | ||
273 | if ((gpio_request(IGEP3_GPIO_LED0_RED, "gpio-led:red:d0") == 0) && | ||
274 | (gpio_direction_output(IGEP3_GPIO_LED0_RED, 1) == 0)) { | ||
275 | gpio_export(IGEP3_GPIO_LED0_RED, 0); | ||
276 | gpio_set_value(IGEP3_GPIO_LED0_RED, 1); | ||
277 | } else | ||
278 | pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_RED\n"); | ||
279 | |||
280 | if ((gpio_request(IGEP3_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) && | ||
281 | (gpio_direction_output(IGEP3_GPIO_LED0_GREEN, 1) == 0)) { | ||
282 | gpio_export(IGEP3_GPIO_LED0_GREEN, 0); | ||
283 | gpio_set_value(IGEP3_GPIO_LED0_GREEN, 1); | ||
284 | } else | ||
285 | pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_GREEN\n"); | ||
286 | |||
287 | if ((gpio_request(IGEP3_GPIO_LED1_RED, "gpio-led:red:d1") == 0) && | ||
288 | (gpio_direction_output(IGEP3_GPIO_LED1_RED, 1) == 0)) { | ||
289 | gpio_export(IGEP3_GPIO_LED1_RED, 0); | ||
290 | gpio_set_value(IGEP3_GPIO_LED1_RED, 1); | ||
291 | } else | ||
292 | pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_RED\n"); | ||
293 | } | ||
294 | #endif | ||
295 | |||
296 | static int igep3_twl4030_gpio_setup(struct device *dev, | ||
297 | unsigned gpio, unsigned ngpio) | ||
298 | { | ||
299 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ | ||
300 | mmc[0].gpio_cd = gpio + 0; | ||
301 | omap2_hsmmc_init(mmc); | ||
302 | |||
303 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ | ||
304 | #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) | ||
305 | if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0) | ||
306 | && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) { | ||
307 | gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0); | ||
308 | gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0); | ||
309 | } else | ||
310 | pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_GREEN\n"); | ||
311 | #else | ||
312 | igep3_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1; | ||
313 | #endif | ||
314 | |||
315 | return 0; | ||
316 | }; | ||
317 | |||
318 | static struct twl4030_gpio_platform_data igep3_twl4030_gpio_pdata = { | ||
319 | .gpio_base = OMAP_MAX_GPIO_LINES, | ||
320 | .irq_base = TWL4030_GPIO_IRQ_BASE, | ||
321 | .irq_end = TWL4030_GPIO_IRQ_END, | ||
322 | .use_leds = true, | ||
323 | .setup = igep3_twl4030_gpio_setup, | ||
324 | }; | ||
325 | |||
326 | static struct twl4030_usb_data igep3_twl4030_usb_data = { | ||
327 | .usb_mode = T2_USB_MODE_ULPI, | ||
328 | }; | ||
329 | |||
330 | static struct platform_device *igep3_devices[] __initdata = { | ||
331 | &igep3_vwlan_device, | ||
332 | }; | ||
333 | |||
334 | static void __init igep3_init_early(void) | ||
335 | { | ||
336 | omap2_init_common_infrastructure(); | ||
337 | omap2_init_common_devices(m65kxxxxam_sdrc_params, | ||
338 | m65kxxxxam_sdrc_params); | ||
339 | } | ||
340 | |||
341 | static struct twl4030_platform_data igep3_twl4030_pdata = { | ||
342 | .irq_base = TWL4030_IRQ_BASE, | ||
343 | .irq_end = TWL4030_IRQ_END, | ||
344 | |||
345 | /* platform_data for children goes here */ | ||
346 | .usb = &igep3_twl4030_usb_data, | ||
347 | .gpio = &igep3_twl4030_gpio_pdata, | ||
348 | .vmmc1 = &igep3_vmmc1, | ||
349 | .vio = &igep3_vio, | ||
350 | }; | ||
351 | |||
352 | static struct i2c_board_info __initdata igep3_i2c_boardinfo[] = { | ||
353 | { | ||
354 | I2C_BOARD_INFO("twl4030", 0x48), | ||
355 | .flags = I2C_CLIENT_WAKE, | ||
356 | .irq = INT_34XX_SYS_NIRQ, | ||
357 | .platform_data = &igep3_twl4030_pdata, | ||
358 | }, | ||
359 | }; | ||
360 | |||
361 | static int __init igep3_i2c_init(void) | ||
362 | { | ||
363 | omap_register_i2c_bus(1, 2600, igep3_i2c_boardinfo, | ||
364 | ARRAY_SIZE(igep3_i2c_boardinfo)); | ||
365 | |||
366 | return 0; | ||
367 | } | ||
368 | |||
369 | static struct omap_musb_board_data musb_board_data = { | ||
370 | .interface_type = MUSB_INTERFACE_ULPI, | ||
371 | .mode = MUSB_OTG, | ||
372 | .power = 100, | ||
373 | }; | ||
374 | |||
375 | #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) | ||
376 | |||
377 | static void __init igep3_wifi_bt_init(void) | ||
378 | { | ||
379 | /* Configure MUX values for W-LAN + Bluetooth GPIO's */ | ||
380 | omap_mux_init_gpio(IGEP3_GPIO_WIFI_NPD, OMAP_PIN_OUTPUT); | ||
381 | omap_mux_init_gpio(IGEP3_GPIO_WIFI_NRESET, OMAP_PIN_OUTPUT); | ||
382 | omap_mux_init_gpio(IGEP3_GPIO_BT_NRESET, OMAP_PIN_OUTPUT); | ||
383 | |||
384 | /* Set GPIO's for W-LAN + Bluetooth combo module */ | ||
385 | if ((gpio_request(IGEP3_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) && | ||
386 | (gpio_direction_output(IGEP3_GPIO_WIFI_NPD, 1) == 0)) { | ||
387 | gpio_export(IGEP3_GPIO_WIFI_NPD, 0); | ||
388 | } else | ||
389 | pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NPD\n"); | ||
390 | |||
391 | if ((gpio_request(IGEP3_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) && | ||
392 | (gpio_direction_output(IGEP3_GPIO_WIFI_NRESET, 1) == 0)) { | ||
393 | gpio_export(IGEP3_GPIO_WIFI_NRESET, 0); | ||
394 | gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 0); | ||
395 | udelay(10); | ||
396 | gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 1); | ||
397 | } else | ||
398 | pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NRESET\n"); | ||
399 | |||
400 | if ((gpio_request(IGEP3_GPIO_BT_NRESET, "GPIO_BT_NRESET") == 0) && | ||
401 | (gpio_direction_output(IGEP3_GPIO_BT_NRESET, 1) == 0)) { | ||
402 | gpio_export(IGEP3_GPIO_BT_NRESET, 0); | ||
403 | } else | ||
404 | pr_warning("IGEP3: Could not obtain gpio GPIO_BT_NRESET\n"); | ||
405 | } | ||
406 | #else | ||
407 | void __init igep3_wifi_bt_init(void) {} | ||
408 | #endif | ||
409 | |||
410 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | ||
411 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | ||
412 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | ||
413 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | ||
414 | |||
415 | .phy_reset = true, | ||
416 | .reset_gpio_port[0] = -EINVAL, | ||
417 | .reset_gpio_port[1] = IGEP3_GPIO_USBH_NRESET, | ||
418 | .reset_gpio_port[2] = -EINVAL, | ||
419 | }; | ||
420 | |||
421 | #ifdef CONFIG_OMAP_MUX | ||
422 | static struct omap_board_mux board_mux[] __initdata = { | ||
423 | OMAP3_MUX(I2C2_SDA, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), | ||
424 | { .reg_offset = OMAP_MUX_TERMINATOR }, | ||
425 | }; | ||
426 | #endif | ||
427 | |||
428 | static void __init igep3_init(void) | ||
429 | { | ||
430 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | ||
431 | |||
432 | /* Register I2C busses and drivers */ | ||
433 | igep3_i2c_init(); | ||
434 | platform_add_devices(igep3_devices, ARRAY_SIZE(igep3_devices)); | ||
435 | omap_serial_init(); | ||
436 | usb_musb_init(&musb_board_data); | ||
437 | usbhs_init(&usbhs_bdata); | ||
438 | |||
439 | igep3_flash_init(); | ||
440 | igep3_leds_init(); | ||
441 | |||
442 | /* | ||
443 | * WLAN-BT combo module from MuRata which has a Marvell WLAN | ||
444 | * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface. | ||
445 | */ | ||
446 | igep3_wifi_bt_init(); | ||
447 | |||
448 | } | ||
449 | |||
450 | MACHINE_START(IGEP0030, "IGEP OMAP3 module") | ||
451 | .boot_params = 0x80000100, | ||
452 | .reserve = omap_reserve, | ||
453 | .map_io = omap3_map_io, | ||
454 | .init_early = igep3_init_early, | ||
455 | .init_irq = omap_init_irq, | ||
456 | .init_machine = igep3_init, | ||
457 | .timer = &omap_timer, | ||
458 | MACHINE_END | ||
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index e2ba77957a8c..f7d6038075f0 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
23 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
24 | #include <linux/spi/spi.h> | 24 | #include <linux/spi/spi.h> |
25 | #include <linux/spi/ads7846.h> | ||
26 | #include <linux/regulator/machine.h> | 25 | #include <linux/regulator/machine.h> |
27 | #include <linux/i2c/twl.h> | 26 | #include <linux/i2c/twl.h> |
28 | #include <linux/io.h> | 27 | #include <linux/io.h> |
@@ -43,47 +42,19 @@ | |||
43 | 42 | ||
44 | #include <asm/delay.h> | 43 | #include <asm/delay.h> |
45 | #include <plat/usb.h> | 44 | #include <plat/usb.h> |
45 | #include <plat/gpmc-smsc911x.h> | ||
46 | 46 | ||
47 | #include "board-flash.h" | 47 | #include "board-flash.h" |
48 | #include "mux.h" | 48 | #include "mux.h" |
49 | #include "hsmmc.h" | 49 | #include "hsmmc.h" |
50 | #include "control.h" | 50 | #include "control.h" |
51 | #include "common-board-devices.h" | ||
51 | 52 | ||
52 | #define LDP_SMSC911X_CS 1 | 53 | #define LDP_SMSC911X_CS 1 |
53 | #define LDP_SMSC911X_GPIO 152 | 54 | #define LDP_SMSC911X_GPIO 152 |
54 | #define DEBUG_BASE 0x08000000 | 55 | #define DEBUG_BASE 0x08000000 |
55 | #define LDP_ETHR_START DEBUG_BASE | 56 | #define LDP_ETHR_START DEBUG_BASE |
56 | 57 | ||
57 | static struct resource ldp_smsc911x_resources[] = { | ||
58 | [0] = { | ||
59 | .start = LDP_ETHR_START, | ||
60 | .end = LDP_ETHR_START + SZ_4K, | ||
61 | .flags = IORESOURCE_MEM, | ||
62 | }, | ||
63 | [1] = { | ||
64 | .start = 0, | ||
65 | .end = 0, | ||
66 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
67 | }, | ||
68 | }; | ||
69 | |||
70 | static struct smsc911x_platform_config ldp_smsc911x_config = { | ||
71 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
72 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
73 | .flags = SMSC911X_USE_32BIT, | ||
74 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
75 | }; | ||
76 | |||
77 | static struct platform_device ldp_smsc911x_device = { | ||
78 | .name = "smsc911x", | ||
79 | .id = -1, | ||
80 | .num_resources = ARRAY_SIZE(ldp_smsc911x_resources), | ||
81 | .resource = ldp_smsc911x_resources, | ||
82 | .dev = { | ||
83 | .platform_data = &ldp_smsc911x_config, | ||
84 | }, | ||
85 | }; | ||
86 | |||
87 | static uint32_t board_keymap[] = { | 58 | static uint32_t board_keymap[] = { |
88 | KEY(0, 0, KEY_1), | 59 | KEY(0, 0, KEY_1), |
89 | KEY(1, 0, KEY_2), | 60 | KEY(1, 0, KEY_2), |
@@ -197,82 +168,16 @@ static struct platform_device ldp_gpio_keys_device = { | |||
197 | }, | 168 | }, |
198 | }; | 169 | }; |
199 | 170 | ||
200 | static int ts_gpio; | 171 | static struct omap_smsc911x_platform_data smsc911x_cfg = { |
201 | 172 | .cs = LDP_SMSC911X_CS, | |
202 | /** | 173 | .gpio_irq = LDP_SMSC911X_GPIO, |
203 | * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq | 174 | .gpio_reset = -EINVAL, |
204 | * | 175 | .flags = SMSC911X_USE_32BIT, |
205 | * @return - void. If request gpio fails then Flag KERN_ERR. | ||
206 | */ | ||
207 | static void ads7846_dev_init(void) | ||
208 | { | ||
209 | if (gpio_request(ts_gpio, "ads7846 irq") < 0) { | ||
210 | printk(KERN_ERR "can't get ads746 pen down GPIO\n"); | ||
211 | return; | ||
212 | } | ||
213 | |||
214 | gpio_direction_input(ts_gpio); | ||
215 | gpio_set_debounce(ts_gpio, 310); | ||
216 | } | ||
217 | |||
218 | static int ads7846_get_pendown_state(void) | ||
219 | { | ||
220 | return !gpio_get_value(ts_gpio); | ||
221 | } | ||
222 | |||
223 | static struct ads7846_platform_data tsc2046_config __initdata = { | ||
224 | .get_pendown_state = ads7846_get_pendown_state, | ||
225 | .keep_vref_on = 1, | ||
226 | }; | ||
227 | |||
228 | static struct omap2_mcspi_device_config tsc2046_mcspi_config = { | ||
229 | .turbo_mode = 0, | ||
230 | .single_channel = 1, /* 0: slave, 1: master */ | ||
231 | }; | ||
232 | |||
233 | static struct spi_board_info ldp_spi_board_info[] __initdata = { | ||
234 | [0] = { | ||
235 | /* | ||
236 | * TSC2046 operates at a max freqency of 2MHz, so | ||
237 | * operate slightly below at 1.5MHz | ||
238 | */ | ||
239 | .modalias = "ads7846", | ||
240 | .bus_num = 1, | ||
241 | .chip_select = 0, | ||
242 | .max_speed_hz = 1500000, | ||
243 | .controller_data = &tsc2046_mcspi_config, | ||
244 | .irq = 0, | ||
245 | .platform_data = &tsc2046_config, | ||
246 | }, | ||
247 | }; | 176 | }; |
248 | 177 | ||
249 | static inline void __init ldp_init_smsc911x(void) | 178 | static inline void __init ldp_init_smsc911x(void) |
250 | { | 179 | { |
251 | int eth_cs; | 180 | gpmc_smsc911x_init(&smsc911x_cfg); |
252 | unsigned long cs_mem_base; | ||
253 | int eth_gpio = 0; | ||
254 | |||
255 | eth_cs = LDP_SMSC911X_CS; | ||
256 | |||
257 | if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) { | ||
258 | printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n"); | ||
259 | return; | ||
260 | } | ||
261 | |||
262 | ldp_smsc911x_resources[0].start = cs_mem_base + 0x0; | ||
263 | ldp_smsc911x_resources[0].end = cs_mem_base + 0xff; | ||
264 | udelay(100); | ||
265 | |||
266 | eth_gpio = LDP_SMSC911X_GPIO; | ||
267 | |||
268 | ldp_smsc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio); | ||
269 | |||
270 | if (gpio_request(eth_gpio, "smsc911x irq") < 0) { | ||
271 | printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n", | ||
272 | eth_gpio); | ||
273 | return; | ||
274 | } | ||
275 | gpio_direction_input(eth_gpio); | ||
276 | } | 181 | } |
277 | 182 | ||
278 | static struct platform_device ldp_lcd_device = { | 183 | static struct platform_device ldp_lcd_device = { |
@@ -360,19 +265,9 @@ static struct twl4030_platform_data ldp_twldata = { | |||
360 | .keypad = &ldp_kp_twl4030_data, | 265 | .keypad = &ldp_kp_twl4030_data, |
361 | }; | 266 | }; |
362 | 267 | ||
363 | static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = { | ||
364 | { | ||
365 | I2C_BOARD_INFO("twl4030", 0x48), | ||
366 | .flags = I2C_CLIENT_WAKE, | ||
367 | .irq = INT_34XX_SYS_NIRQ, | ||
368 | .platform_data = &ldp_twldata, | ||
369 | }, | ||
370 | }; | ||
371 | |||
372 | static int __init omap_i2c_init(void) | 268 | static int __init omap_i2c_init(void) |
373 | { | 269 | { |
374 | omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo, | 270 | omap3_pmic_init("twl4030", &ldp_twldata); |
375 | ARRAY_SIZE(ldp_i2c_boardinfo)); | ||
376 | omap_register_i2c_bus(2, 400, NULL, 0); | 271 | omap_register_i2c_bus(2, 400, NULL, 0); |
377 | omap_register_i2c_bus(3, 400, NULL, 0); | 272 | omap_register_i2c_bus(3, 400, NULL, 0); |
378 | return 0; | 273 | return 0; |
@@ -389,7 +284,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | |||
389 | }; | 284 | }; |
390 | 285 | ||
391 | static struct platform_device *ldp_devices[] __initdata = { | 286 | static struct platform_device *ldp_devices[] __initdata = { |
392 | &ldp_smsc911x_device, | ||
393 | &ldp_lcd_device, | 287 | &ldp_lcd_device, |
394 | &ldp_gpio_keys_device, | 288 | &ldp_gpio_keys_device, |
395 | }; | 289 | }; |
@@ -400,12 +294,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
400 | }; | 294 | }; |
401 | #endif | 295 | #endif |
402 | 296 | ||
403 | static struct omap_musb_board_data musb_board_data = { | ||
404 | .interface_type = MUSB_INTERFACE_ULPI, | ||
405 | .mode = MUSB_OTG, | ||
406 | .power = 100, | ||
407 | }; | ||
408 | |||
409 | static struct mtd_partition ldp_nand_partitions[] = { | 297 | static struct mtd_partition ldp_nand_partitions[] = { |
410 | /* All the partition sizes are listed in terms of NAND block size */ | 298 | /* All the partition sizes are listed in terms of NAND block size */ |
411 | { | 299 | { |
@@ -446,13 +334,9 @@ static void __init omap_ldp_init(void) | |||
446 | ldp_init_smsc911x(); | 334 | ldp_init_smsc911x(); |
447 | omap_i2c_init(); | 335 | omap_i2c_init(); |
448 | platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices)); | 336 | platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices)); |
449 | ts_gpio = 54; | 337 | omap_ads7846_init(1, 54, 310, NULL); |
450 | ldp_spi_board_info[0].irq = gpio_to_irq(ts_gpio); | ||
451 | spi_register_board_info(ldp_spi_board_info, | ||
452 | ARRAY_SIZE(ldp_spi_board_info)); | ||
453 | ads7846_dev_init(); | ||
454 | omap_serial_init(); | 338 | omap_serial_init(); |
455 | usb_musb_init(&musb_board_data); | 339 | usb_musb_init(NULL); |
456 | board_nand_init(ldp_nand_partitions, | 340 | board_nand_init(ldp_nand_partitions, |
457 | ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); | 341 | ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); |
458 | 342 | ||
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index e710cd9e079b..8d74318ed495 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -106,14 +106,13 @@ static void __init n8x0_usb_init(void) | |||
106 | static char announce[] __initdata = KERN_INFO "TUSB 6010\n"; | 106 | static char announce[] __initdata = KERN_INFO "TUSB 6010\n"; |
107 | 107 | ||
108 | /* PM companion chip power control pin */ | 108 | /* PM companion chip power control pin */ |
109 | ret = gpio_request(TUSB6010_GPIO_ENABLE, "TUSB6010 enable"); | 109 | ret = gpio_request_one(TUSB6010_GPIO_ENABLE, GPIOF_OUT_INIT_LOW, |
110 | "TUSB6010 enable"); | ||
110 | if (ret != 0) { | 111 | if (ret != 0) { |
111 | printk(KERN_ERR "Could not get TUSB power GPIO%i\n", | 112 | printk(KERN_ERR "Could not get TUSB power GPIO%i\n", |
112 | TUSB6010_GPIO_ENABLE); | 113 | TUSB6010_GPIO_ENABLE); |
113 | return; | 114 | return; |
114 | } | 115 | } |
115 | gpio_direction_output(TUSB6010_GPIO_ENABLE, 0); | ||
116 | |||
117 | tusb_set_power(0); | 116 | tusb_set_power(0); |
118 | 117 | ||
119 | ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2, | 118 | ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2, |
@@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = { | |||
494 | 493 | ||
495 | static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC]; | 494 | static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC]; |
496 | 495 | ||
497 | static void __init n8x0_mmc_init(void) | 496 | static struct gpio n810_emmc_gpios[] __initdata = { |
497 | { N810_EMMC_VSD_GPIO, GPIOF_OUT_INIT_LOW, "MMC slot 2 Vddf" }, | ||
498 | { N810_EMMC_VIO_GPIO, GPIOF_OUT_INIT_LOW, "MMC slot 2 Vdd" }, | ||
499 | }; | ||
498 | 500 | ||
501 | static void __init n8x0_mmc_init(void) | ||
499 | { | 502 | { |
500 | int err; | 503 | int err; |
501 | 504 | ||
@@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void) | |||
512 | mmc1_data.slots[1].ban_openended = 1; | 515 | mmc1_data.slots[1].ban_openended = 1; |
513 | } | 516 | } |
514 | 517 | ||
515 | err = gpio_request(N8X0_SLOT_SWITCH_GPIO, "MMC slot switch"); | 518 | err = gpio_request_one(N8X0_SLOT_SWITCH_GPIO, GPIOF_OUT_INIT_LOW, |
519 | "MMC slot switch"); | ||
516 | if (err) | 520 | if (err) |
517 | return; | 521 | return; |
518 | 522 | ||
519 | gpio_direction_output(N8X0_SLOT_SWITCH_GPIO, 0); | ||
520 | |||
521 | if (machine_is_nokia_n810()) { | 523 | if (machine_is_nokia_n810()) { |
522 | err = gpio_request(N810_EMMC_VSD_GPIO, "MMC slot 2 Vddf"); | 524 | err = gpio_request_array(n810_emmc_gpios, |
523 | if (err) { | 525 | ARRAY_SIZE(n810_emmc_gpios)); |
524 | gpio_free(N8X0_SLOT_SWITCH_GPIO); | ||
525 | return; | ||
526 | } | ||
527 | gpio_direction_output(N810_EMMC_VSD_GPIO, 0); | ||
528 | |||
529 | err = gpio_request(N810_EMMC_VIO_GPIO, "MMC slot 2 Vdd"); | ||
530 | if (err) { | 526 | if (err) { |
531 | gpio_free(N8X0_SLOT_SWITCH_GPIO); | 527 | gpio_free(N8X0_SLOT_SWITCH_GPIO); |
532 | gpio_free(N810_EMMC_VSD_GPIO); | ||
533 | return; | 528 | return; |
534 | } | 529 | } |
535 | gpio_direction_output(N810_EMMC_VIO_GPIO, 0); | ||
536 | } | 530 | } |
537 | 531 | ||
538 | mmc_data[0] = &mmc1_data; | 532 | mmc_data[0] = &mmc1_data; |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 97750d483a70..be71426359f2 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include "hsmmc.h" | 52 | #include "hsmmc.h" |
53 | #include "timer-gp.h" | 53 | #include "timer-gp.h" |
54 | #include "pm.h" | 54 | #include "pm.h" |
55 | #include "common-board-devices.h" | ||
55 | 56 | ||
56 | #define NAND_BLOCK_SIZE SZ_128K | 57 | #define NAND_BLOCK_SIZE SZ_128K |
57 | 58 | ||
@@ -79,6 +80,12 @@ static u8 omap3_beagle_get_rev(void) | |||
79 | return omap3_beagle_version; | 80 | return omap3_beagle_version; |
80 | } | 81 | } |
81 | 82 | ||
83 | static struct gpio omap3_beagle_rev_gpios[] __initdata = { | ||
84 | { 171, GPIOF_IN, "rev_id_0" }, | ||
85 | { 172, GPIOF_IN, "rev_id_1" }, | ||
86 | { 173, GPIOF_IN, "rev_id_2" }, | ||
87 | }; | ||
88 | |||
82 | static void __init omap3_beagle_init_rev(void) | 89 | static void __init omap3_beagle_init_rev(void) |
83 | { | 90 | { |
84 | int ret; | 91 | int ret; |
@@ -88,21 +95,13 @@ static void __init omap3_beagle_init_rev(void) | |||
88 | omap_mux_init_gpio(172, OMAP_PIN_INPUT_PULLUP); | 95 | omap_mux_init_gpio(172, OMAP_PIN_INPUT_PULLUP); |
89 | omap_mux_init_gpio(173, OMAP_PIN_INPUT_PULLUP); | 96 | omap_mux_init_gpio(173, OMAP_PIN_INPUT_PULLUP); |
90 | 97 | ||
91 | ret = gpio_request(171, "rev_id_0"); | 98 | ret = gpio_request_array(omap3_beagle_rev_gpios, |
92 | if (ret < 0) | 99 | ARRAY_SIZE(omap3_beagle_rev_gpios)); |
93 | goto fail0; | 100 | if (ret < 0) { |
94 | 101 | printk(KERN_ERR "Unable to get revision detection GPIO pins\n"); | |
95 | ret = gpio_request(172, "rev_id_1"); | 102 | omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN; |
96 | if (ret < 0) | 103 | return; |
97 | goto fail1; | 104 | } |
98 | |||
99 | ret = gpio_request(173, "rev_id_2"); | ||
100 | if (ret < 0) | ||
101 | goto fail2; | ||
102 | |||
103 | gpio_direction_input(171); | ||
104 | gpio_direction_input(172); | ||
105 | gpio_direction_input(173); | ||
106 | 105 | ||
107 | beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1) | 106 | beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1) |
108 | | (gpio_get_value(173) << 2); | 107 | | (gpio_get_value(173) << 2); |
@@ -128,18 +127,6 @@ static void __init omap3_beagle_init_rev(void) | |||
128 | printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev); | 127 | printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev); |
129 | omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN; | 128 | omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN; |
130 | } | 129 | } |
131 | |||
132 | return; | ||
133 | |||
134 | fail2: | ||
135 | gpio_free(172); | ||
136 | fail1: | ||
137 | gpio_free(171); | ||
138 | fail0: | ||
139 | printk(KERN_ERR "Unable to get revision detection GPIO pins\n"); | ||
140 | omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN; | ||
141 | |||
142 | return; | ||
143 | } | 130 | } |
144 | 131 | ||
145 | static struct mtd_partition omap3beagle_nand_partitions[] = { | 132 | static struct mtd_partition omap3beagle_nand_partitions[] = { |
@@ -173,15 +160,6 @@ static struct mtd_partition omap3beagle_nand_partitions[] = { | |||
173 | }, | 160 | }, |
174 | }; | 161 | }; |
175 | 162 | ||
176 | static struct omap_nand_platform_data omap3beagle_nand_data = { | ||
177 | .options = NAND_BUSWIDTH_16, | ||
178 | .parts = omap3beagle_nand_partitions, | ||
179 | .nr_parts = ARRAY_SIZE(omap3beagle_nand_partitions), | ||
180 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
181 | .nand_setup = NULL, | ||
182 | .dev_ready = NULL, | ||
183 | }; | ||
184 | |||
185 | /* DSS */ | 163 | /* DSS */ |
186 | 164 | ||
187 | static int beagle_enable_dvi(struct omap_dss_device *dssdev) | 165 | static int beagle_enable_dvi(struct omap_dss_device *dssdev) |
@@ -243,13 +221,10 @@ static void __init beagle_display_init(void) | |||
243 | { | 221 | { |
244 | int r; | 222 | int r; |
245 | 223 | ||
246 | r = gpio_request(beagle_dvi_device.reset_gpio, "DVI reset"); | 224 | r = gpio_request_one(beagle_dvi_device.reset_gpio, GPIOF_OUT_INIT_LOW, |
247 | if (r < 0) { | 225 | "DVI reset"); |
226 | if (r < 0) | ||
248 | printk(KERN_ERR "Unable to get DVI reset GPIO\n"); | 227 | printk(KERN_ERR "Unable to get DVI reset GPIO\n"); |
249 | return; | ||
250 | } | ||
251 | |||
252 | gpio_direction_output(beagle_dvi_device.reset_gpio, 0); | ||
253 | } | 228 | } |
254 | 229 | ||
255 | #include "sdram-micron-mt46h32m32lf-6.h" | 230 | #include "sdram-micron-mt46h32m32lf-6.h" |
@@ -276,7 +251,7 @@ static struct gpio_led gpio_leds[]; | |||
276 | static int beagle_twl_gpio_setup(struct device *dev, | 251 | static int beagle_twl_gpio_setup(struct device *dev, |
277 | unsigned gpio, unsigned ngpio) | 252 | unsigned gpio, unsigned ngpio) |
278 | { | 253 | { |
279 | int r; | 254 | int r, usb_pwr_level; |
280 | 255 | ||
281 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { | 256 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { |
282 | mmc[0].gpio_wp = -EINVAL; | 257 | mmc[0].gpio_wp = -EINVAL; |
@@ -295,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev, | |||
295 | beagle_vmmc1_supply.dev = mmc[0].dev; | 270 | beagle_vmmc1_supply.dev = mmc[0].dev; |
296 | beagle_vsim_supply.dev = mmc[0].dev; | 271 | beagle_vsim_supply.dev = mmc[0].dev; |
297 | 272 | ||
298 | /* REVISIT: need ehci-omap hooks for external VBUS | ||
299 | * power switch and overcurrent detect | ||
300 | */ | ||
301 | if (omap3_beagle_get_rev() != OMAP3BEAGLE_BOARD_XM) { | ||
302 | r = gpio_request(gpio + 1, "EHCI_nOC"); | ||
303 | if (!r) { | ||
304 | r = gpio_direction_input(gpio + 1); | ||
305 | if (r) | ||
306 | gpio_free(gpio + 1); | ||
307 | } | ||
308 | if (r) | ||
309 | pr_err("%s: unable to configure EHCI_nOC\n", __func__); | ||
310 | } | ||
311 | |||
312 | /* | 273 | /* |
313 | * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active | 274 | * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active |
314 | * high / others active low) | 275 | * high / others active low) |
315 | */ | 276 | * DVI reset GPIO is different between beagle revisions |
316 | gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); | ||
317 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) | ||
318 | gpio_direction_output(gpio + TWL4030_GPIO_MAX, 1); | ||
319 | else | ||
320 | gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); | ||
321 | |||
322 | /* DVI reset GPIO is different between beagle revisions */ | ||
323 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) | ||
324 | beagle_dvi_device.reset_gpio = 129; | ||
325 | else | ||
326 | beagle_dvi_device.reset_gpio = 170; | ||
327 | |||
328 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ | ||
329 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | ||
330 | |||
331 | /* | ||
332 | * gpio + 1 on Xm controls the TFP410's enable line (active low) | ||
333 | * gpio + 2 control varies depending on the board rev as follows: | ||
334 | * P7/P8 revisions(prototype): Camera EN | ||
335 | * A2+ revisions (production): LDO (supplies DVI, serial, led blocks) | ||
336 | */ | 277 | */ |
337 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { | 278 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { |
338 | r = gpio_request(gpio + 1, "nDVI_PWR_EN"); | 279 | usb_pwr_level = GPIOF_OUT_INIT_HIGH; |
339 | if (!r) { | 280 | beagle_dvi_device.reset_gpio = 129; |
340 | r = gpio_direction_output(gpio + 1, 0); | 281 | /* |
341 | if (r) | 282 | * gpio + 1 on Xm controls the TFP410's enable line (active low) |
342 | gpio_free(gpio + 1); | 283 | * gpio + 2 control varies depending on the board rev as below: |
343 | } | 284 | * P7/P8 revisions(prototype): Camera EN |
285 | * A2+ revisions (production): LDO (DVI, serial, led blocks) | ||
286 | */ | ||
287 | r = gpio_request_one(gpio + 1, GPIOF_OUT_INIT_LOW, | ||
288 | "nDVI_PWR_EN"); | ||
344 | if (r) | 289 | if (r) |
345 | pr_err("%s: unable to configure nDVI_PWR_EN\n", | 290 | pr_err("%s: unable to configure nDVI_PWR_EN\n", |
346 | __func__); | 291 | __func__); |
347 | r = gpio_request(gpio + 2, "DVI_LDO_EN"); | 292 | r = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH, |
348 | if (!r) { | 293 | "DVI_LDO_EN"); |
349 | r = gpio_direction_output(gpio + 2, 1); | ||
350 | if (r) | ||
351 | gpio_free(gpio + 2); | ||
352 | } | ||
353 | if (r) | 294 | if (r) |
354 | pr_err("%s: unable to configure DVI_LDO_EN\n", | 295 | pr_err("%s: unable to configure DVI_LDO_EN\n", |
355 | __func__); | 296 | __func__); |
297 | } else { | ||
298 | usb_pwr_level = GPIOF_OUT_INIT_LOW; | ||
299 | beagle_dvi_device.reset_gpio = 170; | ||
300 | /* | ||
301 | * REVISIT: need ehci-omap hooks for external VBUS | ||
302 | * power switch and overcurrent detect | ||
303 | */ | ||
304 | if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC")) | ||
305 | pr_err("%s: unable to configure EHCI_nOC\n", __func__); | ||
356 | } | 306 | } |
357 | 307 | ||
308 | gpio_request_one(gpio + TWL4030_GPIO_MAX, usb_pwr_level, "nEN_USB_PWR"); | ||
309 | |||
310 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ | ||
311 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | ||
312 | |||
358 | return 0; | 313 | return 0; |
359 | } | 314 | } |
360 | 315 | ||
@@ -453,15 +408,6 @@ static struct twl4030_platform_data beagle_twldata = { | |||
453 | .vpll2 = &beagle_vpll2, | 408 | .vpll2 = &beagle_vpll2, |
454 | }; | 409 | }; |
455 | 410 | ||
456 | static struct i2c_board_info __initdata beagle_i2c_boardinfo[] = { | ||
457 | { | ||
458 | I2C_BOARD_INFO("twl4030", 0x48), | ||
459 | .flags = I2C_CLIENT_WAKE, | ||
460 | .irq = INT_34XX_SYS_NIRQ, | ||
461 | .platform_data = &beagle_twldata, | ||
462 | }, | ||
463 | }; | ||
464 | |||
465 | static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { | 411 | static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { |
466 | { | 412 | { |
467 | I2C_BOARD_INFO("eeprom", 0x50), | 413 | I2C_BOARD_INFO("eeprom", 0x50), |
@@ -470,8 +416,7 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { | |||
470 | 416 | ||
471 | static int __init omap3_beagle_i2c_init(void) | 417 | static int __init omap3_beagle_i2c_init(void) |
472 | { | 418 | { |
473 | omap_register_i2c_bus(1, 2600, beagle_i2c_boardinfo, | 419 | omap3_pmic_init("twl4030", &beagle_twldata); |
474 | ARRAY_SIZE(beagle_i2c_boardinfo)); | ||
475 | /* Bus 3 is attached to the DVI port where devices like the pico DLP | 420 | /* Bus 3 is attached to the DVI port where devices like the pico DLP |
476 | * projector don't work reliably with 400kHz */ | 421 | * projector don't work reliably with 400kHz */ |
477 | omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom)); | 422 | omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom)); |
@@ -551,39 +496,6 @@ static struct platform_device *omap3_beagle_devices[] __initdata = { | |||
551 | &keys_gpio, | 496 | &keys_gpio, |
552 | }; | 497 | }; |
553 | 498 | ||
554 | static void __init omap3beagle_flash_init(void) | ||
555 | { | ||
556 | u8 cs = 0; | ||
557 | u8 nandcs = GPMC_CS_NUM + 1; | ||
558 | |||
559 | /* find out the chip-select on which NAND exists */ | ||
560 | while (cs < GPMC_CS_NUM) { | ||
561 | u32 ret = 0; | ||
562 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | ||
563 | |||
564 | if ((ret & 0xC00) == 0x800) { | ||
565 | printk(KERN_INFO "Found NAND on CS%d\n", cs); | ||
566 | if (nandcs > GPMC_CS_NUM) | ||
567 | nandcs = cs; | ||
568 | } | ||
569 | cs++; | ||
570 | } | ||
571 | |||
572 | if (nandcs > GPMC_CS_NUM) { | ||
573 | printk(KERN_INFO "NAND: Unable to find configuration " | ||
574 | "in GPMC\n "); | ||
575 | return; | ||
576 | } | ||
577 | |||
578 | if (nandcs < GPMC_CS_NUM) { | ||
579 | omap3beagle_nand_data.cs = nandcs; | ||
580 | |||
581 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); | ||
582 | if (gpmc_nand_init(&omap3beagle_nand_data) < 0) | ||
583 | printk(KERN_ERR "Unable to register NAND device\n"); | ||
584 | } | ||
585 | } | ||
586 | |||
587 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 499 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { |
588 | 500 | ||
589 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 501 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -602,12 +514,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
602 | }; | 514 | }; |
603 | #endif | 515 | #endif |
604 | 516 | ||
605 | static struct omap_musb_board_data musb_board_data = { | ||
606 | .interface_type = MUSB_INTERFACE_ULPI, | ||
607 | .mode = MUSB_OTG, | ||
608 | .power = 100, | ||
609 | }; | ||
610 | |||
611 | static void __init beagle_opp_init(void) | 517 | static void __init beagle_opp_init(void) |
612 | { | 518 | { |
613 | int r = 0; | 519 | int r = 0; |
@@ -665,13 +571,13 @@ static void __init omap3_beagle_init(void) | |||
665 | omap_serial_init(); | 571 | omap_serial_init(); |
666 | 572 | ||
667 | omap_mux_init_gpio(170, OMAP_PIN_INPUT); | 573 | omap_mux_init_gpio(170, OMAP_PIN_INPUT); |
668 | gpio_request(170, "DVI_nPD"); | ||
669 | /* REVISIT leave DVI powered down until it's needed ... */ | 574 | /* REVISIT leave DVI powered down until it's needed ... */ |
670 | gpio_direction_output(170, true); | 575 | gpio_request_one(170, GPIOF_OUT_INIT_HIGH, "DVI_nPD"); |
671 | 576 | ||
672 | usb_musb_init(&musb_board_data); | 577 | usb_musb_init(NULL); |
673 | usbhs_init(&usbhs_bdata); | 578 | usbhs_init(&usbhs_bdata); |
674 | omap3beagle_flash_init(); | 579 | omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions, |
580 | ARRAY_SIZE(omap3beagle_nand_partitions)); | ||
675 | 581 | ||
676 | /* Ensure SDRC pins are mux'd for self-refresh */ | 582 | /* Ensure SDRC pins are mux'd for self-refresh */ |
677 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 583 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 7f94cccdb076..b4d43464a303 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include "mux.h" | 50 | #include "mux.h" |
51 | #include "sdram-micron-mt46h32m32lf-6.h" | 51 | #include "sdram-micron-mt46h32m32lf-6.h" |
52 | #include "hsmmc.h" | 52 | #include "hsmmc.h" |
53 | #include "common-board-devices.h" | ||
53 | 54 | ||
54 | #define OMAP3_EVM_TS_GPIO 175 | 55 | #define OMAP3_EVM_TS_GPIO 175 |
55 | #define OMAP3_EVM_EHCI_VBUS 22 | 56 | #define OMAP3_EVM_EHCI_VBUS 22 |
@@ -101,49 +102,20 @@ static void __init omap3_evm_get_revision(void) | |||
101 | } | 102 | } |
102 | 103 | ||
103 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 104 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
104 | static struct resource omap3evm_smsc911x_resources[] = { | 105 | #include <plat/gpmc-smsc911x.h> |
105 | [0] = { | ||
106 | .start = OMAP3EVM_ETHR_START, | ||
107 | .end = (OMAP3EVM_ETHR_START + OMAP3EVM_ETHR_SIZE - 1), | ||
108 | .flags = IORESOURCE_MEM, | ||
109 | }, | ||
110 | [1] = { | ||
111 | .start = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ), | ||
112 | .end = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ), | ||
113 | .flags = (IORESOURCE_IRQ | IRQF_TRIGGER_LOW), | ||
114 | }, | ||
115 | }; | ||
116 | 106 | ||
117 | static struct smsc911x_platform_config smsc911x_config = { | 107 | static struct omap_smsc911x_platform_data smsc911x_cfg = { |
118 | .phy_interface = PHY_INTERFACE_MODE_MII, | 108 | .cs = OMAP3EVM_SMSC911X_CS, |
119 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | 109 | .gpio_irq = OMAP3EVM_ETHR_GPIO_IRQ, |
120 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | 110 | .gpio_reset = -EINVAL, |
121 | .flags = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS), | 111 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, |
122 | }; | ||
123 | |||
124 | static struct platform_device omap3evm_smsc911x_device = { | ||
125 | .name = "smsc911x", | ||
126 | .id = -1, | ||
127 | .num_resources = ARRAY_SIZE(omap3evm_smsc911x_resources), | ||
128 | .resource = &omap3evm_smsc911x_resources[0], | ||
129 | .dev = { | ||
130 | .platform_data = &smsc911x_config, | ||
131 | }, | ||
132 | }; | 112 | }; |
133 | 113 | ||
134 | static inline void __init omap3evm_init_smsc911x(void) | 114 | static inline void __init omap3evm_init_smsc911x(void) |
135 | { | 115 | { |
136 | int eth_cs, eth_rst; | ||
137 | struct clk *l3ck; | 116 | struct clk *l3ck; |
138 | unsigned int rate; | 117 | unsigned int rate; |
139 | 118 | ||
140 | if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) | ||
141 | eth_rst = OMAP3EVM_GEN1_ETHR_GPIO_RST; | ||
142 | else | ||
143 | eth_rst = OMAP3EVM_GEN2_ETHR_GPIO_RST; | ||
144 | |||
145 | eth_cs = OMAP3EVM_SMSC911X_CS; | ||
146 | |||
147 | l3ck = clk_get(NULL, "l3_ck"); | 119 | l3ck = clk_get(NULL, "l3_ck"); |
148 | if (IS_ERR(l3ck)) | 120 | if (IS_ERR(l3ck)) |
149 | rate = 100000000; | 121 | rate = 100000000; |
@@ -152,33 +124,13 @@ static inline void __init omap3evm_init_smsc911x(void) | |||
152 | 124 | ||
153 | /* Configure ethernet controller reset gpio */ | 125 | /* Configure ethernet controller reset gpio */ |
154 | if (cpu_is_omap3430()) { | 126 | if (cpu_is_omap3430()) { |
155 | if (gpio_request(eth_rst, "SMSC911x gpio") < 0) { | 127 | if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) |
156 | pr_err(KERN_ERR "Failed to request %d for smsc911x\n", | 128 | smsc911x_cfg.gpio_reset = OMAP3EVM_GEN1_ETHR_GPIO_RST; |
157 | eth_rst); | 129 | else |
158 | return; | 130 | smsc911x_cfg.gpio_reset = OMAP3EVM_GEN2_ETHR_GPIO_RST; |
159 | } | ||
160 | |||
161 | if (gpio_direction_output(eth_rst, 1) < 0) { | ||
162 | pr_err(KERN_ERR "Failed to set direction of %d for" \ | ||
163 | " smsc911x\n", eth_rst); | ||
164 | return; | ||
165 | } | ||
166 | /* reset pulse to ethernet controller*/ | ||
167 | usleep_range(150, 220); | ||
168 | gpio_set_value(eth_rst, 0); | ||
169 | usleep_range(150, 220); | ||
170 | gpio_set_value(eth_rst, 1); | ||
171 | usleep_range(1, 2); | ||
172 | } | ||
173 | |||
174 | if (gpio_request(OMAP3EVM_ETHR_GPIO_IRQ, "SMSC911x irq") < 0) { | ||
175 | printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n", | ||
176 | OMAP3EVM_ETHR_GPIO_IRQ); | ||
177 | return; | ||
178 | } | 131 | } |
179 | 132 | ||
180 | gpio_direction_input(OMAP3EVM_ETHR_GPIO_IRQ); | 133 | gpmc_smsc911x_init(&smsc911x_cfg); |
181 | platform_device_register(&omap3evm_smsc911x_device); | ||
182 | } | 134 | } |
183 | 135 | ||
184 | #else | 136 | #else |
@@ -197,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; } | |||
197 | #define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210 | 149 | #define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210 |
198 | #define OMAP3EVM_DVI_PANEL_EN_GPIO 199 | 150 | #define OMAP3EVM_DVI_PANEL_EN_GPIO 199 |
199 | 151 | ||
152 | static struct gpio omap3_evm_dss_gpios[] __initdata = { | ||
153 | { OMAP3EVM_LCD_PANEL_RESB, GPIOF_OUT_INIT_HIGH, "lcd_panel_resb" }, | ||
154 | { OMAP3EVM_LCD_PANEL_INI, GPIOF_OUT_INIT_HIGH, "lcd_panel_ini" }, | ||
155 | { OMAP3EVM_LCD_PANEL_QVGA, GPIOF_OUT_INIT_LOW, "lcd_panel_qvga" }, | ||
156 | { OMAP3EVM_LCD_PANEL_LR, GPIOF_OUT_INIT_HIGH, "lcd_panel_lr" }, | ||
157 | { OMAP3EVM_LCD_PANEL_UD, GPIOF_OUT_INIT_HIGH, "lcd_panel_ud" }, | ||
158 | { OMAP3EVM_LCD_PANEL_ENVDD, GPIOF_OUT_INIT_LOW, "lcd_panel_envdd" }, | ||
159 | }; | ||
160 | |||
200 | static int lcd_enabled; | 161 | static int lcd_enabled; |
201 | static int dvi_enabled; | 162 | static int dvi_enabled; |
202 | 163 | ||
@@ -204,61 +165,10 @@ static void __init omap3_evm_display_init(void) | |||
204 | { | 165 | { |
205 | int r; | 166 | int r; |
206 | 167 | ||
207 | r = gpio_request(OMAP3EVM_LCD_PANEL_RESB, "lcd_panel_resb"); | 168 | r = gpio_request_array(omap3_evm_dss_gpios, |
208 | if (r) { | 169 | ARRAY_SIZE(omap3_evm_dss_gpios)); |
209 | printk(KERN_ERR "failed to get lcd_panel_resb\n"); | 170 | if (r) |
210 | return; | 171 | printk(KERN_ERR "failed to get lcd_panel_* gpios\n"); |
211 | } | ||
212 | gpio_direction_output(OMAP3EVM_LCD_PANEL_RESB, 1); | ||
213 | |||
214 | r = gpio_request(OMAP3EVM_LCD_PANEL_INI, "lcd_panel_ini"); | ||
215 | if (r) { | ||
216 | printk(KERN_ERR "failed to get lcd_panel_ini\n"); | ||
217 | goto err_1; | ||
218 | } | ||
219 | gpio_direction_output(OMAP3EVM_LCD_PANEL_INI, 1); | ||
220 | |||
221 | r = gpio_request(OMAP3EVM_LCD_PANEL_QVGA, "lcd_panel_qvga"); | ||
222 | if (r) { | ||
223 | printk(KERN_ERR "failed to get lcd_panel_qvga\n"); | ||
224 | goto err_2; | ||
225 | } | ||
226 | gpio_direction_output(OMAP3EVM_LCD_PANEL_QVGA, 0); | ||
227 | |||
228 | r = gpio_request(OMAP3EVM_LCD_PANEL_LR, "lcd_panel_lr"); | ||
229 | if (r) { | ||
230 | printk(KERN_ERR "failed to get lcd_panel_lr\n"); | ||
231 | goto err_3; | ||
232 | } | ||
233 | gpio_direction_output(OMAP3EVM_LCD_PANEL_LR, 1); | ||
234 | |||
235 | r = gpio_request(OMAP3EVM_LCD_PANEL_UD, "lcd_panel_ud"); | ||
236 | if (r) { | ||
237 | printk(KERN_ERR "failed to get lcd_panel_ud\n"); | ||
238 | goto err_4; | ||
239 | } | ||
240 | gpio_direction_output(OMAP3EVM_LCD_PANEL_UD, 1); | ||
241 | |||
242 | r = gpio_request(OMAP3EVM_LCD_PANEL_ENVDD, "lcd_panel_envdd"); | ||
243 | if (r) { | ||
244 | printk(KERN_ERR "failed to get lcd_panel_envdd\n"); | ||
245 | goto err_5; | ||
246 | } | ||
247 | gpio_direction_output(OMAP3EVM_LCD_PANEL_ENVDD, 0); | ||
248 | |||
249 | return; | ||
250 | |||
251 | err_5: | ||
252 | gpio_free(OMAP3EVM_LCD_PANEL_UD); | ||
253 | err_4: | ||
254 | gpio_free(OMAP3EVM_LCD_PANEL_LR); | ||
255 | err_3: | ||
256 | gpio_free(OMAP3EVM_LCD_PANEL_QVGA); | ||
257 | err_2: | ||
258 | gpio_free(OMAP3EVM_LCD_PANEL_INI); | ||
259 | err_1: | ||
260 | gpio_free(OMAP3EVM_LCD_PANEL_RESB); | ||
261 | |||
262 | } | 172 | } |
263 | 173 | ||
264 | static int omap3_evm_enable_lcd(struct omap_dss_device *dssdev) | 174 | static int omap3_evm_enable_lcd(struct omap_dss_device *dssdev) |
@@ -448,7 +358,7 @@ static struct platform_device leds_gpio = { | |||
448 | static int omap3evm_twl_gpio_setup(struct device *dev, | 358 | static int omap3evm_twl_gpio_setup(struct device *dev, |
449 | unsigned gpio, unsigned ngpio) | 359 | unsigned gpio, unsigned ngpio) |
450 | { | 360 | { |
451 | int r; | 361 | int r, lcd_bl_en; |
452 | 362 | ||
453 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ | 363 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ |
454 | omap_mux_init_gpio(63, OMAP_PIN_INPUT); | 364 | omap_mux_init_gpio(63, OMAP_PIN_INPUT); |
@@ -465,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev, | |||
465 | */ | 375 | */ |
466 | 376 | ||
467 | /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ | 377 | /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ |
468 | r = gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL"); | 378 | lcd_bl_en = get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2 ? |
469 | if (!r) | 379 | GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; |
470 | r = gpio_direction_output(gpio + TWL4030_GPIO_MAX, | 380 | r = gpio_request_one(gpio + TWL4030_GPIO_MAX, lcd_bl_en, "EN_LCD_BKL"); |
471 | (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) ? 1 : 0); | ||
472 | if (r) | 381 | if (r) |
473 | printk(KERN_ERR "failed to get/set lcd_bkl gpio\n"); | 382 | printk(KERN_ERR "failed to get/set lcd_bkl gpio\n"); |
474 | 383 | ||
475 | /* gpio + 7 == DVI Enable */ | 384 | /* gpio + 7 == DVI Enable */ |
476 | gpio_request(gpio + 7, "EN_DVI"); | 385 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI"); |
477 | gpio_direction_output(gpio + 7, 0); | ||
478 | 386 | ||
479 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ | 387 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ |
480 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | 388 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; |
@@ -652,78 +560,18 @@ static struct twl4030_platform_data omap3evm_twldata = { | |||
652 | .vdac = &omap3_evm_vdac, | 560 | .vdac = &omap3_evm_vdac, |
653 | .vpll2 = &omap3_evm_vpll2, | 561 | .vpll2 = &omap3_evm_vpll2, |
654 | .vio = &omap3evm_vio, | 562 | .vio = &omap3evm_vio, |
655 | }; | 563 | .vmmc1 = &omap3evm_vmmc1, |
656 | 564 | .vsim = &omap3evm_vsim, | |
657 | static struct i2c_board_info __initdata omap3evm_i2c_boardinfo[] = { | ||
658 | { | ||
659 | I2C_BOARD_INFO("twl4030", 0x48), | ||
660 | .flags = I2C_CLIENT_WAKE, | ||
661 | .irq = INT_34XX_SYS_NIRQ, | ||
662 | .platform_data = &omap3evm_twldata, | ||
663 | }, | ||
664 | }; | 565 | }; |
665 | 566 | ||
666 | static int __init omap3_evm_i2c_init(void) | 567 | static int __init omap3_evm_i2c_init(void) |
667 | { | 568 | { |
668 | /* | 569 | omap3_pmic_init("twl4030", &omap3evm_twldata); |
669 | * REVISIT: These entries can be set in omap3evm_twl_data | ||
670 | * after a merge with MFD tree | ||
671 | */ | ||
672 | omap3evm_twldata.vmmc1 = &omap3evm_vmmc1; | ||
673 | omap3evm_twldata.vsim = &omap3evm_vsim; | ||
674 | |||
675 | omap_register_i2c_bus(1, 2600, omap3evm_i2c_boardinfo, | ||
676 | ARRAY_SIZE(omap3evm_i2c_boardinfo)); | ||
677 | omap_register_i2c_bus(2, 400, NULL, 0); | 570 | omap_register_i2c_bus(2, 400, NULL, 0); |
678 | omap_register_i2c_bus(3, 400, NULL, 0); | 571 | omap_register_i2c_bus(3, 400, NULL, 0); |
679 | return 0; | 572 | return 0; |
680 | } | 573 | } |
681 | 574 | ||
682 | static void ads7846_dev_init(void) | ||
683 | { | ||
684 | if (gpio_request(OMAP3_EVM_TS_GPIO, "ADS7846 pendown") < 0) | ||
685 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); | ||
686 | |||
687 | gpio_direction_input(OMAP3_EVM_TS_GPIO); | ||
688 | gpio_set_debounce(OMAP3_EVM_TS_GPIO, 310); | ||
689 | } | ||
690 | |||
691 | static int ads7846_get_pendown_state(void) | ||
692 | { | ||
693 | return !gpio_get_value(OMAP3_EVM_TS_GPIO); | ||
694 | } | ||
695 | |||
696 | static struct ads7846_platform_data ads7846_config = { | ||
697 | .x_max = 0x0fff, | ||
698 | .y_max = 0x0fff, | ||
699 | .x_plate_ohms = 180, | ||
700 | .pressure_max = 255, | ||
701 | .debounce_max = 10, | ||
702 | .debounce_tol = 3, | ||
703 | .debounce_rep = 1, | ||
704 | .get_pendown_state = ads7846_get_pendown_state, | ||
705 | .keep_vref_on = 1, | ||
706 | .settle_delay_usecs = 150, | ||
707 | .wakeup = true, | ||
708 | }; | ||
709 | |||
710 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
711 | .turbo_mode = 0, | ||
712 | .single_channel = 1, /* 0: slave, 1: master */ | ||
713 | }; | ||
714 | |||
715 | static struct spi_board_info omap3evm_spi_board_info[] = { | ||
716 | [0] = { | ||
717 | .modalias = "ads7846", | ||
718 | .bus_num = 1, | ||
719 | .chip_select = 0, | ||
720 | .max_speed_hz = 1500000, | ||
721 | .controller_data = &ads7846_mcspi_config, | ||
722 | .irq = OMAP_GPIO_IRQ(OMAP3_EVM_TS_GPIO), | ||
723 | .platform_data = &ads7846_config, | ||
724 | }, | ||
725 | }; | ||
726 | |||
727 | static struct omap_board_config_kernel omap3_evm_config[] __initdata = { | 575 | static struct omap_board_config_kernel omap3_evm_config[] __initdata = { |
728 | }; | 576 | }; |
729 | 577 | ||
@@ -825,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = { | |||
825 | .power = 100, | 673 | .power = 100, |
826 | }; | 674 | }; |
827 | 675 | ||
676 | static struct gpio omap3_evm_ehci_gpios[] __initdata = { | ||
677 | { OMAP3_EVM_EHCI_VBUS, GPIOF_OUT_INIT_HIGH, "enable EHCI VBUS" }, | ||
678 | { OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW, "select EHCI port" }, | ||
679 | }; | ||
680 | |||
828 | static void __init omap3_evm_init(void) | 681 | static void __init omap3_evm_init(void) |
829 | { | 682 | { |
830 | omap3_evm_get_revision(); | 683 | omap3_evm_get_revision(); |
@@ -841,9 +694,6 @@ static void __init omap3_evm_init(void) | |||
841 | 694 | ||
842 | omap_display_init(&omap3_evm_dss_data); | 695 | omap_display_init(&omap3_evm_dss_data); |
843 | 696 | ||
844 | spi_register_board_info(omap3evm_spi_board_info, | ||
845 | ARRAY_SIZE(omap3evm_spi_board_info)); | ||
846 | |||
847 | omap_serial_init(); | 697 | omap_serial_init(); |
848 | 698 | ||
849 | /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */ | 699 | /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */ |
@@ -851,16 +701,12 @@ static void __init omap3_evm_init(void) | |||
851 | 701 | ||
852 | if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) { | 702 | if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) { |
853 | /* enable EHCI VBUS using GPIO22 */ | 703 | /* enable EHCI VBUS using GPIO22 */ |
854 | omap_mux_init_gpio(22, OMAP_PIN_INPUT_PULLUP); | 704 | omap_mux_init_gpio(OMAP3_EVM_EHCI_VBUS, OMAP_PIN_INPUT_PULLUP); |
855 | gpio_request(OMAP3_EVM_EHCI_VBUS, "enable EHCI VBUS"); | ||
856 | gpio_direction_output(OMAP3_EVM_EHCI_VBUS, 0); | ||
857 | gpio_set_value(OMAP3_EVM_EHCI_VBUS, 1); | ||
858 | |||
859 | /* Select EHCI port on main board */ | 705 | /* Select EHCI port on main board */ |
860 | omap_mux_init_gpio(61, OMAP_PIN_INPUT_PULLUP); | 706 | omap_mux_init_gpio(OMAP3_EVM_EHCI_SELECT, |
861 | gpio_request(OMAP3_EVM_EHCI_SELECT, "select EHCI port"); | 707 | OMAP_PIN_INPUT_PULLUP); |
862 | gpio_direction_output(OMAP3_EVM_EHCI_SELECT, 0); | 708 | gpio_request_array(omap3_evm_ehci_gpios, |
863 | gpio_set_value(OMAP3_EVM_EHCI_SELECT, 0); | 709 | ARRAY_SIZE(omap3_evm_ehci_gpios)); |
864 | 710 | ||
865 | /* setup EHCI phy reset config */ | 711 | /* setup EHCI phy reset config */ |
866 | omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP); | 712 | omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP); |
@@ -876,7 +722,7 @@ static void __init omap3_evm_init(void) | |||
876 | } | 722 | } |
877 | usb_musb_init(&musb_board_data); | 723 | usb_musb_init(&musb_board_data); |
878 | usbhs_init(&usbhs_bdata); | 724 | usbhs_init(&usbhs_bdata); |
879 | ads7846_dev_init(); | 725 | omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL); |
880 | omap3evm_init_smsc911x(); | 726 | omap3evm_init_smsc911x(); |
881 | omap3_evm_display_init(); | 727 | omap3_evm_display_init(); |
882 | 728 | ||
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index b726943d7c93..60d9be49dbab 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include "hsmmc.h" | 37 | #include "hsmmc.h" |
38 | #include "timer-gp.h" | 38 | #include "timer-gp.h" |
39 | #include "control.h" | 39 | #include "control.h" |
40 | #include "common-board-devices.h" | ||
40 | 41 | ||
41 | #include <plat/mux.h> | 42 | #include <plat/mux.h> |
42 | #include <plat/board.h> | 43 | #include <plat/board.h> |
@@ -93,19 +94,9 @@ static struct twl4030_platform_data omap3logic_twldata = { | |||
93 | .vmmc1 = &omap3logic_vmmc1, | 94 | .vmmc1 = &omap3logic_vmmc1, |
94 | }; | 95 | }; |
95 | 96 | ||
96 | static struct i2c_board_info __initdata omap3logic_i2c_boardinfo[] = { | ||
97 | { | ||
98 | I2C_BOARD_INFO("twl4030", 0x48), | ||
99 | .flags = I2C_CLIENT_WAKE, | ||
100 | .irq = INT_34XX_SYS_NIRQ, | ||
101 | .platform_data = &omap3logic_twldata, | ||
102 | }, | ||
103 | }; | ||
104 | |||
105 | static int __init omap3logic_i2c_init(void) | 97 | static int __init omap3logic_i2c_init(void) |
106 | { | 98 | { |
107 | omap_register_i2c_bus(1, 2600, omap3logic_i2c_boardinfo, | 99 | omap3_pmic_init("twl4030", &omap3logic_twldata); |
108 | ARRAY_SIZE(omap3logic_i2c_boardinfo)); | ||
109 | return 0; | 100 | return 0; |
110 | } | 101 | } |
111 | 102 | ||
@@ -147,7 +138,6 @@ static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = { | |||
147 | .cs = OMAP3LOGIC_SMSC911X_CS, | 138 | .cs = OMAP3LOGIC_SMSC911X_CS, |
148 | .gpio_irq = -EINVAL, | 139 | .gpio_irq = -EINVAL, |
149 | .gpio_reset = -EINVAL, | 140 | .gpio_reset = -EINVAL, |
150 | .flags = IORESOURCE_IRQ_LOWLEVEL, | ||
151 | }; | 141 | }; |
152 | 142 | ||
153 | /* TODO/FIXME (comment by Peter Barada, LogicPD): | 143 | /* TODO/FIXME (comment by Peter Barada, LogicPD): |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 1db15492d82b..1d10736c6d3c 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | 23 | ||
24 | #include <linux/spi/spi.h> | 24 | #include <linux/spi/spi.h> |
25 | #include <linux/spi/ads7846.h> | ||
26 | #include <linux/regulator/machine.h> | 25 | #include <linux/regulator/machine.h> |
27 | #include <linux/i2c/twl.h> | 26 | #include <linux/i2c/twl.h> |
28 | #include <linux/wl12xx.h> | 27 | #include <linux/wl12xx.h> |
@@ -52,6 +51,7 @@ | |||
52 | #include "mux.h" | 51 | #include "mux.h" |
53 | #include "sdram-micron-mt46h32m32lf-6.h" | 52 | #include "sdram-micron-mt46h32m32lf-6.h" |
54 | #include "hsmmc.h" | 53 | #include "hsmmc.h" |
54 | #include "common-board-devices.h" | ||
55 | 55 | ||
56 | #define PANDORA_WIFI_IRQ_GPIO 21 | 56 | #define PANDORA_WIFI_IRQ_GPIO 21 |
57 | #define PANDORA_WIFI_NRESET_GPIO 23 | 57 | #define PANDORA_WIFI_NRESET_GPIO 23 |
@@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev, | |||
305 | 305 | ||
306 | /* gpio + 13 drives 32kHz buffer for wifi module */ | 306 | /* gpio + 13 drives 32kHz buffer for wifi module */ |
307 | gpio_32khz = gpio + 13; | 307 | gpio_32khz = gpio + 13; |
308 | ret = gpio_request(gpio_32khz, "wifi 32kHz"); | 308 | ret = gpio_request_one(gpio_32khz, GPIOF_OUT_INIT_HIGH, "wifi 32kHz"); |
309 | if (ret < 0) { | 309 | if (ret < 0) { |
310 | pr_err("Cannot get GPIO line %d, ret=%d\n", gpio_32khz, ret); | 310 | pr_err("Cannot get GPIO line %d, ret=%d\n", gpio_32khz, ret); |
311 | goto fail; | 311 | return -ENODEV; |
312 | } | ||
313 | |||
314 | ret = gpio_direction_output(gpio_32khz, 1); | ||
315 | if (ret < 0) { | ||
316 | pr_err("Cannot set GPIO line %d, ret=%d\n", gpio_32khz, ret); | ||
317 | goto fail_direction; | ||
318 | } | 312 | } |
319 | 313 | ||
320 | return 0; | 314 | return 0; |
321 | |||
322 | fail_direction: | ||
323 | gpio_free(gpio_32khz); | ||
324 | fail: | ||
325 | return -ENODEV; | ||
326 | } | 315 | } |
327 | 316 | ||
328 | static struct twl4030_gpio_platform_data omap3pandora_gpio_data = { | 317 | static struct twl4030_gpio_platform_data omap3pandora_gpio_data = { |
@@ -544,15 +533,6 @@ static struct twl4030_platform_data omap3pandora_twldata = { | |||
544 | .bci = &pandora_bci_data, | 533 | .bci = &pandora_bci_data, |
545 | }; | 534 | }; |
546 | 535 | ||
547 | static struct i2c_board_info __initdata omap3pandora_i2c_boardinfo[] = { | ||
548 | { | ||
549 | I2C_BOARD_INFO("tps65950", 0x48), | ||
550 | .flags = I2C_CLIENT_WAKE, | ||
551 | .irq = INT_34XX_SYS_NIRQ, | ||
552 | .platform_data = &omap3pandora_twldata, | ||
553 | }, | ||
554 | }; | ||
555 | |||
556 | static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = { | 536 | static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = { |
557 | { | 537 | { |
558 | I2C_BOARD_INFO("bq27500", 0x55), | 538 | I2C_BOARD_INFO("bq27500", 0x55), |
@@ -562,61 +542,15 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = { | |||
562 | 542 | ||
563 | static int __init omap3pandora_i2c_init(void) | 543 | static int __init omap3pandora_i2c_init(void) |
564 | { | 544 | { |
565 | omap_register_i2c_bus(1, 2600, omap3pandora_i2c_boardinfo, | 545 | omap3_pmic_init("tps65950", &omap3pandora_twldata); |
566 | ARRAY_SIZE(omap3pandora_i2c_boardinfo)); | ||
567 | /* i2c2 pins are not connected */ | 546 | /* i2c2 pins are not connected */ |
568 | omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo, | 547 | omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo, |
569 | ARRAY_SIZE(omap3pandora_i2c3_boardinfo)); | 548 | ARRAY_SIZE(omap3pandora_i2c3_boardinfo)); |
570 | return 0; | 549 | return 0; |
571 | } | 550 | } |
572 | 551 | ||
573 | static void __init omap3pandora_ads7846_init(void) | ||
574 | { | ||
575 | int gpio = OMAP3_PANDORA_TS_GPIO; | ||
576 | int ret; | ||
577 | |||
578 | ret = gpio_request(gpio, "ads7846_pen_down"); | ||
579 | if (ret < 0) { | ||
580 | printk(KERN_ERR "Failed to request GPIO %d for " | ||
581 | "ads7846 pen down IRQ\n", gpio); | ||
582 | return; | ||
583 | } | ||
584 | |||
585 | gpio_direction_input(gpio); | ||
586 | } | ||
587 | |||
588 | static int ads7846_get_pendown_state(void) | ||
589 | { | ||
590 | return !gpio_get_value(OMAP3_PANDORA_TS_GPIO); | ||
591 | } | ||
592 | |||
593 | static struct ads7846_platform_data ads7846_config = { | ||
594 | .x_max = 0x0fff, | ||
595 | .y_max = 0x0fff, | ||
596 | .x_plate_ohms = 180, | ||
597 | .pressure_max = 255, | ||
598 | .debounce_max = 10, | ||
599 | .debounce_tol = 3, | ||
600 | .debounce_rep = 1, | ||
601 | .get_pendown_state = ads7846_get_pendown_state, | ||
602 | .keep_vref_on = 1, | ||
603 | }; | ||
604 | |||
605 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
606 | .turbo_mode = 0, | ||
607 | .single_channel = 1, /* 0: slave, 1: master */ | ||
608 | }; | ||
609 | |||
610 | static struct spi_board_info omap3pandora_spi_board_info[] __initdata = { | 552 | static struct spi_board_info omap3pandora_spi_board_info[] __initdata = { |
611 | { | 553 | { |
612 | .modalias = "ads7846", | ||
613 | .bus_num = 1, | ||
614 | .chip_select = 0, | ||
615 | .max_speed_hz = 1500000, | ||
616 | .controller_data = &ads7846_mcspi_config, | ||
617 | .irq = OMAP_GPIO_IRQ(OMAP3_PANDORA_TS_GPIO), | ||
618 | .platform_data = &ads7846_config, | ||
619 | }, { | ||
620 | .modalias = "tpo_td043mtea1_panel_spi", | 554 | .modalias = "tpo_td043mtea1_panel_spi", |
621 | .bus_num = 1, | 555 | .bus_num = 1, |
622 | .chip_select = 1, | 556 | .chip_select = 1, |
@@ -639,14 +573,10 @@ static void __init pandora_wl1251_init(void) | |||
639 | 573 | ||
640 | memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); | 574 | memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); |
641 | 575 | ||
642 | ret = gpio_request(PANDORA_WIFI_IRQ_GPIO, "wl1251 irq"); | 576 | ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq"); |
643 | if (ret < 0) | 577 | if (ret < 0) |
644 | goto fail; | 578 | goto fail; |
645 | 579 | ||
646 | ret = gpio_direction_input(PANDORA_WIFI_IRQ_GPIO); | ||
647 | if (ret < 0) | ||
648 | goto fail_irq; | ||
649 | |||
650 | pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO); | 580 | pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO); |
651 | if (pandora_wl1251_pdata.irq < 0) | 581 | if (pandora_wl1251_pdata.irq < 0) |
652 | goto fail_irq; | 582 | goto fail_irq; |
@@ -688,12 +618,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
688 | }; | 618 | }; |
689 | #endif | 619 | #endif |
690 | 620 | ||
691 | static struct omap_musb_board_data musb_board_data = { | ||
692 | .interface_type = MUSB_INTERFACE_ULPI, | ||
693 | .mode = MUSB_OTG, | ||
694 | .power = 100, | ||
695 | }; | ||
696 | |||
697 | static void __init omap3pandora_init(void) | 621 | static void __init omap3pandora_init(void) |
698 | { | 622 | { |
699 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 623 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
@@ -705,9 +629,9 @@ static void __init omap3pandora_init(void) | |||
705 | omap_serial_init(); | 629 | omap_serial_init(); |
706 | spi_register_board_info(omap3pandora_spi_board_info, | 630 | spi_register_board_info(omap3pandora_spi_board_info, |
707 | ARRAY_SIZE(omap3pandora_spi_board_info)); | 631 | ARRAY_SIZE(omap3pandora_spi_board_info)); |
708 | omap3pandora_ads7846_init(); | 632 | omap_ads7846_init(1, OMAP3_PANDORA_TS_GPIO, 0, NULL); |
709 | usbhs_init(&usbhs_bdata); | 633 | usbhs_init(&usbhs_bdata); |
710 | usb_musb_init(&musb_board_data); | 634 | usb_musb_init(NULL); |
711 | gpmc_nand_init(&pandora_nand_data); | 635 | gpmc_nand_init(&pandora_nand_data); |
712 | 636 | ||
713 | /* Ensure SDRC pins are mux'd for self-refresh */ | 637 | /* Ensure SDRC pins are mux'd for self-refresh */ |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index a72c90a08c8a..0c108a212ea2 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -45,7 +45,6 @@ | |||
45 | #include <plat/mcspi.h> | 45 | #include <plat/mcspi.h> |
46 | #include <linux/input/matrix_keypad.h> | 46 | #include <linux/input/matrix_keypad.h> |
47 | #include <linux/spi/spi.h> | 47 | #include <linux/spi/spi.h> |
48 | #include <linux/spi/ads7846.h> | ||
49 | #include <linux/interrupt.h> | 48 | #include <linux/interrupt.h> |
50 | #include <linux/smsc911x.h> | 49 | #include <linux/smsc911x.h> |
51 | #include <linux/i2c/at24.h> | 50 | #include <linux/i2c/at24.h> |
@@ -54,52 +53,28 @@ | |||
54 | #include "mux.h" | 53 | #include "mux.h" |
55 | #include "hsmmc.h" | 54 | #include "hsmmc.h" |
56 | #include "timer-gp.h" | 55 | #include "timer-gp.h" |
56 | #include "common-board-devices.h" | ||
57 | 57 | ||
58 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 58 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
59 | #include <plat/gpmc-smsc911x.h> | ||
60 | |||
59 | #define OMAP3STALKER_ETHR_START 0x2c000000 | 61 | #define OMAP3STALKER_ETHR_START 0x2c000000 |
60 | #define OMAP3STALKER_ETHR_SIZE 1024 | 62 | #define OMAP3STALKER_ETHR_SIZE 1024 |
61 | #define OMAP3STALKER_ETHR_GPIO_IRQ 19 | 63 | #define OMAP3STALKER_ETHR_GPIO_IRQ 19 |
62 | #define OMAP3STALKER_SMC911X_CS 5 | 64 | #define OMAP3STALKER_SMC911X_CS 5 |
63 | 65 | ||
64 | static struct resource omap3stalker_smsc911x_resources[] = { | 66 | static struct omap_smsc911x_platform_data smsc911x_cfg = { |
65 | [0] = { | 67 | .cs = OMAP3STALKER_SMC911X_CS, |
66 | .start = OMAP3STALKER_ETHR_START, | 68 | .gpio_irq = OMAP3STALKER_ETHR_GPIO_IRQ, |
67 | .end = | 69 | .gpio_reset = -EINVAL, |
68 | (OMAP3STALKER_ETHR_START + OMAP3STALKER_ETHR_SIZE - 1), | ||
69 | .flags = IORESOURCE_MEM, | ||
70 | }, | ||
71 | [1] = { | ||
72 | .start = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ), | ||
73 | .end = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ), | ||
74 | .flags = (IORESOURCE_IRQ | IRQF_TRIGGER_LOW), | ||
75 | }, | ||
76 | }; | ||
77 | |||
78 | static struct smsc911x_platform_config smsc911x_config = { | ||
79 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
80 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
81 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
82 | .flags = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS), | 70 | .flags = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS), |
83 | }; | 71 | }; |
84 | 72 | ||
85 | static struct platform_device omap3stalker_smsc911x_device = { | ||
86 | .name = "smsc911x", | ||
87 | .id = -1, | ||
88 | .num_resources = ARRAY_SIZE(omap3stalker_smsc911x_resources), | ||
89 | .resource = &omap3stalker_smsc911x_resources[0], | ||
90 | .dev = { | ||
91 | .platform_data = &smsc911x_config, | ||
92 | }, | ||
93 | }; | ||
94 | |||
95 | static inline void __init omap3stalker_init_eth(void) | 73 | static inline void __init omap3stalker_init_eth(void) |
96 | { | 74 | { |
97 | int eth_cs; | ||
98 | struct clk *l3ck; | 75 | struct clk *l3ck; |
99 | unsigned int rate; | 76 | unsigned int rate; |
100 | 77 | ||
101 | eth_cs = OMAP3STALKER_SMC911X_CS; | ||
102 | |||
103 | l3ck = clk_get(NULL, "l3_ck"); | 78 | l3ck = clk_get(NULL, "l3_ck"); |
104 | if (IS_ERR(l3ck)) | 79 | if (IS_ERR(l3ck)) |
105 | rate = 100000000; | 80 | rate = 100000000; |
@@ -107,16 +82,7 @@ static inline void __init omap3stalker_init_eth(void) | |||
107 | rate = clk_get_rate(l3ck); | 82 | rate = clk_get_rate(l3ck); |
108 | 83 | ||
109 | omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); | 84 | omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); |
110 | if (gpio_request(OMAP3STALKER_ETHR_GPIO_IRQ, "SMC911x irq") < 0) { | 85 | gpmc_smsc911x_init(&smsc911x_cfg); |
111 | printk(KERN_ERR | ||
112 | "Failed to request GPIO%d for smc911x IRQ\n", | ||
113 | OMAP3STALKER_ETHR_GPIO_IRQ); | ||
114 | return; | ||
115 | } | ||
116 | |||
117 | gpio_direction_input(OMAP3STALKER_ETHR_GPIO_IRQ); | ||
118 | |||
119 | platform_device_register(&omap3stalker_smsc911x_device); | ||
120 | } | 86 | } |
121 | 87 | ||
122 | #else | 88 | #else |
@@ -365,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev, | |||
365 | */ | 331 | */ |
366 | 332 | ||
367 | /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ | 333 | /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ |
368 | gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL"); | 334 | gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW, |
369 | gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); | 335 | "EN_LCD_BKL"); |
370 | 336 | ||
371 | /* gpio + 7 == DVI Enable */ | 337 | /* gpio + 7 == DVI Enable */ |
372 | gpio_request(gpio + 7, "EN_DVI"); | 338 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI"); |
373 | gpio_direction_output(gpio + 7, 0); | ||
374 | 339 | ||
375 | /* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */ | 340 | /* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */ |
376 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | 341 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; |
@@ -489,15 +454,8 @@ static struct twl4030_platform_data omap3stalker_twldata = { | |||
489 | .codec = &omap3stalker_codec_data, | 454 | .codec = &omap3stalker_codec_data, |
490 | .vdac = &omap3_stalker_vdac, | 455 | .vdac = &omap3_stalker_vdac, |
491 | .vpll2 = &omap3_stalker_vpll2, | 456 | .vpll2 = &omap3_stalker_vpll2, |
492 | }; | 457 | .vmmc1 = &omap3stalker_vmmc1, |
493 | 458 | .vsim = &omap3stalker_vsim, | |
494 | static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo[] = { | ||
495 | { | ||
496 | I2C_BOARD_INFO("twl4030", 0x48), | ||
497 | .flags = I2C_CLIENT_WAKE, | ||
498 | .irq = INT_34XX_SYS_NIRQ, | ||
499 | .platform_data = &omap3stalker_twldata, | ||
500 | }, | ||
501 | }; | 459 | }; |
502 | 460 | ||
503 | static struct at24_platform_data fram_info = { | 461 | static struct at24_platform_data fram_info = { |
@@ -516,15 +474,7 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = { | |||
516 | 474 | ||
517 | static int __init omap3_stalker_i2c_init(void) | 475 | static int __init omap3_stalker_i2c_init(void) |
518 | { | 476 | { |
519 | /* | 477 | omap3_pmic_init("twl4030", &omap3stalker_twldata); |
520 | * REVISIT: These entries can be set in omap3evm_twl_data | ||
521 | * after a merge with MFD tree | ||
522 | */ | ||
523 | omap3stalker_twldata.vmmc1 = &omap3stalker_vmmc1; | ||
524 | omap3stalker_twldata.vsim = &omap3stalker_vsim; | ||
525 | |||
526 | omap_register_i2c_bus(1, 2600, omap3stalker_i2c_boardinfo, | ||
527 | ARRAY_SIZE(omap3stalker_i2c_boardinfo)); | ||
528 | omap_register_i2c_bus(2, 400, NULL, 0); | 478 | omap_register_i2c_bus(2, 400, NULL, 0); |
529 | omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3, | 479 | omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3, |
530 | ARRAY_SIZE(omap3stalker_i2c_boardinfo3)); | 480 | ARRAY_SIZE(omap3stalker_i2c_boardinfo3)); |
@@ -532,49 +482,6 @@ static int __init omap3_stalker_i2c_init(void) | |||
532 | } | 482 | } |
533 | 483 | ||
534 | #define OMAP3_STALKER_TS_GPIO 175 | 484 | #define OMAP3_STALKER_TS_GPIO 175 |
535 | static void ads7846_dev_init(void) | ||
536 | { | ||
537 | if (gpio_request(OMAP3_STALKER_TS_GPIO, "ADS7846 pendown") < 0) | ||
538 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); | ||
539 | |||
540 | gpio_direction_input(OMAP3_STALKER_TS_GPIO); | ||
541 | gpio_set_debounce(OMAP3_STALKER_TS_GPIO, 310); | ||
542 | } | ||
543 | |||
544 | static int ads7846_get_pendown_state(void) | ||
545 | { | ||
546 | return !gpio_get_value(OMAP3_STALKER_TS_GPIO); | ||
547 | } | ||
548 | |||
549 | static struct ads7846_platform_data ads7846_config = { | ||
550 | .x_max = 0x0fff, | ||
551 | .y_max = 0x0fff, | ||
552 | .x_plate_ohms = 180, | ||
553 | .pressure_max = 255, | ||
554 | .debounce_max = 10, | ||
555 | .debounce_tol = 3, | ||
556 | .debounce_rep = 1, | ||
557 | .get_pendown_state = ads7846_get_pendown_state, | ||
558 | .keep_vref_on = 1, | ||
559 | .settle_delay_usecs = 150, | ||
560 | }; | ||
561 | |||
562 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
563 | .turbo_mode = 0, | ||
564 | .single_channel = 1, /* 0: slave, 1: master */ | ||
565 | }; | ||
566 | |||
567 | static struct spi_board_info omap3stalker_spi_board_info[] = { | ||
568 | [0] = { | ||
569 | .modalias = "ads7846", | ||
570 | .bus_num = 1, | ||
571 | .chip_select = 0, | ||
572 | .max_speed_hz = 1500000, | ||
573 | .controller_data = &ads7846_mcspi_config, | ||
574 | .irq = OMAP_GPIO_IRQ(OMAP3_STALKER_TS_GPIO), | ||
575 | .platform_data = &ads7846_config, | ||
576 | }, | ||
577 | }; | ||
578 | 485 | ||
579 | static struct omap_board_config_kernel omap3_stalker_config[] __initdata = { | 486 | static struct omap_board_config_kernel omap3_stalker_config[] __initdata = { |
580 | }; | 487 | }; |
@@ -618,12 +525,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
618 | }; | 525 | }; |
619 | #endif | 526 | #endif |
620 | 527 | ||
621 | static struct omap_musb_board_data musb_board_data = { | ||
622 | .interface_type = MUSB_INTERFACE_ULPI, | ||
623 | .mode = MUSB_OTG, | ||
624 | .power = 100, | ||
625 | }; | ||
626 | |||
627 | static void __init omap3_stalker_init(void) | 528 | static void __init omap3_stalker_init(void) |
628 | { | 529 | { |
629 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); | 530 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); |
@@ -636,13 +537,11 @@ static void __init omap3_stalker_init(void) | |||
636 | ARRAY_SIZE(omap3_stalker_devices)); | 537 | ARRAY_SIZE(omap3_stalker_devices)); |
637 | 538 | ||
638 | omap_display_init(&omap3_stalker_dss_data); | 539 | omap_display_init(&omap3_stalker_dss_data); |
639 | spi_register_board_info(omap3stalker_spi_board_info, | ||
640 | ARRAY_SIZE(omap3stalker_spi_board_info)); | ||
641 | 540 | ||
642 | omap_serial_init(); | 541 | omap_serial_init(); |
643 | usb_musb_init(&musb_board_data); | 542 | usb_musb_init(NULL); |
644 | usbhs_init(&usbhs_bdata); | 543 | usbhs_init(&usbhs_bdata); |
645 | ads7846_dev_init(); | 544 | omap_ads7846_init(1, OMAP3_STALKER_TS_GPIO, 310, NULL); |
646 | 545 | ||
647 | omap_mux_init_gpio(21, OMAP_PIN_OUTPUT); | 546 | omap_mux_init_gpio(21, OMAP_PIN_OUTPUT); |
648 | omap_mux_init_gpio(18, OMAP_PIN_INPUT_PULLUP); | 547 | omap_mux_init_gpio(18, OMAP_PIN_INPUT_PULLUP); |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 127cb1752bdd..82872d7d313b 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include "mux.h" | 52 | #include "mux.h" |
53 | #include "hsmmc.h" | 53 | #include "hsmmc.h" |
54 | #include "timer-gp.h" | 54 | #include "timer-gp.h" |
55 | #include "common-board-devices.h" | ||
55 | 56 | ||
56 | #include <asm/setup.h> | 57 | #include <asm/setup.h> |
57 | 58 | ||
@@ -95,15 +96,6 @@ static struct mtd_partition omap3touchbook_nand_partitions[] = { | |||
95 | }, | 96 | }, |
96 | }; | 97 | }; |
97 | 98 | ||
98 | static struct omap_nand_platform_data omap3touchbook_nand_data = { | ||
99 | .options = NAND_BUSWIDTH_16, | ||
100 | .parts = omap3touchbook_nand_partitions, | ||
101 | .nr_parts = ARRAY_SIZE(omap3touchbook_nand_partitions), | ||
102 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
103 | .nand_setup = NULL, | ||
104 | .dev_ready = NULL, | ||
105 | }; | ||
106 | |||
107 | #include "sdram-micron-mt46h32m32lf-6.h" | 99 | #include "sdram-micron-mt46h32m32lf-6.h" |
108 | 100 | ||
109 | static struct omap2_hsmmc_info mmc[] = { | 101 | static struct omap2_hsmmc_info mmc[] = { |
@@ -154,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev, | |||
154 | /* REVISIT: need ehci-omap hooks for external VBUS | 146 | /* REVISIT: need ehci-omap hooks for external VBUS |
155 | * power switch and overcurrent detect | 147 | * power switch and overcurrent detect |
156 | */ | 148 | */ |
157 | 149 | gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC"); | |
158 | gpio_request(gpio + 1, "EHCI_nOC"); | ||
159 | gpio_direction_input(gpio + 1); | ||
160 | 150 | ||
161 | /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */ | 151 | /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */ |
162 | gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); | 152 | gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW, |
163 | gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); | 153 | "nEN_USB_PWR"); |
164 | 154 | ||
165 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ | 155 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ |
166 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | 156 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; |
@@ -273,15 +263,6 @@ static struct twl4030_platform_data touchbook_twldata = { | |||
273 | .vpll2 = &touchbook_vpll2, | 263 | .vpll2 = &touchbook_vpll2, |
274 | }; | 264 | }; |
275 | 265 | ||
276 | static struct i2c_board_info __initdata touchbook_i2c_boardinfo[] = { | ||
277 | { | ||
278 | I2C_BOARD_INFO("twl4030", 0x48), | ||
279 | .flags = I2C_CLIENT_WAKE, | ||
280 | .irq = INT_34XX_SYS_NIRQ, | ||
281 | .platform_data = &touchbook_twldata, | ||
282 | }, | ||
283 | }; | ||
284 | |||
285 | static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { | 266 | static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { |
286 | { | 267 | { |
287 | I2C_BOARD_INFO("bq27200", 0x55), | 268 | I2C_BOARD_INFO("bq27200", 0x55), |
@@ -291,8 +272,7 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { | |||
291 | static int __init omap3_touchbook_i2c_init(void) | 272 | static int __init omap3_touchbook_i2c_init(void) |
292 | { | 273 | { |
293 | /* Standard TouchBook bus */ | 274 | /* Standard TouchBook bus */ |
294 | omap_register_i2c_bus(1, 2600, touchbook_i2c_boardinfo, | 275 | omap3_pmic_init("twl4030", &touchbook_twldata); |
295 | ARRAY_SIZE(touchbook_i2c_boardinfo)); | ||
296 | 276 | ||
297 | /* Additional TouchBook bus */ | 277 | /* Additional TouchBook bus */ |
298 | omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo, | 278 | omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo, |
@@ -301,19 +281,7 @@ static int __init omap3_touchbook_i2c_init(void) | |||
301 | return 0; | 281 | return 0; |
302 | } | 282 | } |
303 | 283 | ||
304 | static void __init omap3_ads7846_init(void) | 284 | static struct ads7846_platform_data ads7846_pdata = { |
305 | { | ||
306 | if (gpio_request(OMAP3_TS_GPIO, "ads7846_pen_down")) { | ||
307 | printk(KERN_ERR "Failed to request GPIO %d for " | ||
308 | "ads7846 pen down IRQ\n", OMAP3_TS_GPIO); | ||
309 | return; | ||
310 | } | ||
311 | |||
312 | gpio_direction_input(OMAP3_TS_GPIO); | ||
313 | gpio_set_debounce(OMAP3_TS_GPIO, 310); | ||
314 | } | ||
315 | |||
316 | static struct ads7846_platform_data ads7846_config = { | ||
317 | .x_min = 100, | 285 | .x_min = 100, |
318 | .y_min = 265, | 286 | .y_min = 265, |
319 | .x_max = 3950, | 287 | .x_max = 3950, |
@@ -327,23 +295,6 @@ static struct ads7846_platform_data ads7846_config = { | |||
327 | .keep_vref_on = 1, | 295 | .keep_vref_on = 1, |
328 | }; | 296 | }; |
329 | 297 | ||
330 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
331 | .turbo_mode = 0, | ||
332 | .single_channel = 1, /* 0: slave, 1: master */ | ||
333 | }; | ||
334 | |||
335 | static struct spi_board_info omap3_ads7846_spi_board_info[] __initdata = { | ||
336 | { | ||
337 | .modalias = "ads7846", | ||
338 | .bus_num = 4, | ||
339 | .chip_select = 0, | ||
340 | .max_speed_hz = 1500000, | ||
341 | .controller_data = &ads7846_mcspi_config, | ||
342 | .irq = OMAP_GPIO_IRQ(OMAP3_TS_GPIO), | ||
343 | .platform_data = &ads7846_config, | ||
344 | } | ||
345 | }; | ||
346 | |||
347 | static struct gpio_led gpio_leds[] = { | 298 | static struct gpio_led gpio_leds[] = { |
348 | { | 299 | { |
349 | .name = "touchbook::usr0", | 300 | .name = "touchbook::usr0", |
@@ -434,39 +385,6 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = { | |||
434 | &keys_gpio, | 385 | &keys_gpio, |
435 | }; | 386 | }; |
436 | 387 | ||
437 | static void __init omap3touchbook_flash_init(void) | ||
438 | { | ||
439 | u8 cs = 0; | ||
440 | u8 nandcs = GPMC_CS_NUM + 1; | ||
441 | |||
442 | /* find out the chip-select on which NAND exists */ | ||
443 | while (cs < GPMC_CS_NUM) { | ||
444 | u32 ret = 0; | ||
445 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | ||
446 | |||
447 | if ((ret & 0xC00) == 0x800) { | ||
448 | printk(KERN_INFO "Found NAND on CS%d\n", cs); | ||
449 | if (nandcs > GPMC_CS_NUM) | ||
450 | nandcs = cs; | ||
451 | } | ||
452 | cs++; | ||
453 | } | ||
454 | |||
455 | if (nandcs > GPMC_CS_NUM) { | ||
456 | printk(KERN_INFO "NAND: Unable to find configuration " | ||
457 | "in GPMC\n "); | ||
458 | return; | ||
459 | } | ||
460 | |||
461 | if (nandcs < GPMC_CS_NUM) { | ||
462 | omap3touchbook_nand_data.cs = nandcs; | ||
463 | |||
464 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); | ||
465 | if (gpmc_nand_init(&omap3touchbook_nand_data) < 0) | ||
466 | printk(KERN_ERR "Unable to register NAND device\n"); | ||
467 | } | ||
468 | } | ||
469 | |||
470 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 388 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { |
471 | 389 | ||
472 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 390 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -481,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | |||
481 | 399 | ||
482 | static void omap3_touchbook_poweroff(void) | 400 | static void omap3_touchbook_poweroff(void) |
483 | { | 401 | { |
484 | int r; | 402 | int pwr_off = TB_KILL_POWER_GPIO; |
485 | 403 | ||
486 | r = gpio_request(TB_KILL_POWER_GPIO, "DVI reset"); | 404 | if (gpio_request_one(pwr_off, GPIOF_OUT_INIT_LOW, "DVI reset") < 0) |
487 | if (r < 0) { | ||
488 | printk(KERN_ERR "Unable to get kill power GPIO\n"); | 405 | printk(KERN_ERR "Unable to get kill power GPIO\n"); |
489 | return; | ||
490 | } | ||
491 | |||
492 | gpio_direction_output(TB_KILL_POWER_GPIO, 0); | ||
493 | } | 406 | } |
494 | 407 | ||
495 | static int __init early_touchbook_revision(char *p) | 408 | static int __init early_touchbook_revision(char *p) |
@@ -501,12 +414,6 @@ static int __init early_touchbook_revision(char *p) | |||
501 | } | 414 | } |
502 | early_param("tbr", early_touchbook_revision); | 415 | early_param("tbr", early_touchbook_revision); |
503 | 416 | ||
504 | static struct omap_musb_board_data musb_board_data = { | ||
505 | .interface_type = MUSB_INTERFACE_ULPI, | ||
506 | .mode = MUSB_OTG, | ||
507 | .power = 100, | ||
508 | }; | ||
509 | |||
510 | static void __init omap3_touchbook_init(void) | 417 | static void __init omap3_touchbook_init(void) |
511 | { | 418 | { |
512 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 419 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
@@ -521,17 +428,15 @@ static void __init omap3_touchbook_init(void) | |||
521 | omap_serial_init(); | 428 | omap_serial_init(); |
522 | 429 | ||
523 | omap_mux_init_gpio(170, OMAP_PIN_INPUT); | 430 | omap_mux_init_gpio(170, OMAP_PIN_INPUT); |
524 | gpio_request(176, "DVI_nPD"); | ||
525 | /* REVISIT leave DVI powered down until it's needed ... */ | 431 | /* REVISIT leave DVI powered down until it's needed ... */ |
526 | gpio_direction_output(176, true); | 432 | gpio_request_one(176, GPIOF_OUT_INIT_HIGH, "DVI_nPD"); |
527 | 433 | ||
528 | /* Touchscreen and accelerometer */ | 434 | /* Touchscreen and accelerometer */ |
529 | spi_register_board_info(omap3_ads7846_spi_board_info, | 435 | omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata); |
530 | ARRAY_SIZE(omap3_ads7846_spi_board_info)); | 436 | usb_musb_init(NULL); |
531 | omap3_ads7846_init(); | ||
532 | usb_musb_init(&musb_board_data); | ||
533 | usbhs_init(&usbhs_bdata); | 437 | usbhs_init(&usbhs_bdata); |
534 | omap3touchbook_flash_init(); | 438 | omap_nand_flash_init(NAND_BUSWIDTH_16, omap3touchbook_nand_partitions, |
439 | ARRAY_SIZE(omap3touchbook_nand_partitions)); | ||
535 | 440 | ||
536 | /* Ensure SDRC pins are mux'd for self-refresh */ | 441 | /* Ensure SDRC pins are mux'd for self-refresh */ |
537 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 442 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index e4973ac77cbc..90485fced973 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include "hsmmc.h" | 46 | #include "hsmmc.h" |
47 | #include "control.h" | 47 | #include "control.h" |
48 | #include "mux.h" | 48 | #include "mux.h" |
49 | #include "common-board-devices.h" | ||
49 | 50 | ||
50 | #define GPIO_HUB_POWER 1 | 51 | #define GPIO_HUB_POWER 1 |
51 | #define GPIO_HUB_NRESET 62 | 52 | #define GPIO_HUB_NRESET 62 |
@@ -111,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | |||
111 | .reset_gpio_port[2] = -EINVAL | 112 | .reset_gpio_port[2] = -EINVAL |
112 | }; | 113 | }; |
113 | 114 | ||
115 | static struct gpio panda_ehci_gpios[] __initdata = { | ||
116 | { GPIO_HUB_POWER, GPIOF_OUT_INIT_LOW, "hub_power" }, | ||
117 | { GPIO_HUB_NRESET, GPIOF_OUT_INIT_LOW, "hub_nreset" }, | ||
118 | }; | ||
119 | |||
114 | static void __init omap4_ehci_init(void) | 120 | static void __init omap4_ehci_init(void) |
115 | { | 121 | { |
116 | int ret; | 122 | int ret; |
@@ -120,44 +126,27 @@ static void __init omap4_ehci_init(void) | |||
120 | phy_ref_clk = clk_get(NULL, "auxclk3_ck"); | 126 | phy_ref_clk = clk_get(NULL, "auxclk3_ck"); |
121 | if (IS_ERR(phy_ref_clk)) { | 127 | if (IS_ERR(phy_ref_clk)) { |
122 | pr_err("Cannot request auxclk3\n"); | 128 | pr_err("Cannot request auxclk3\n"); |
123 | goto error1; | 129 | return; |
124 | } | 130 | } |
125 | clk_set_rate(phy_ref_clk, 19200000); | 131 | clk_set_rate(phy_ref_clk, 19200000); |
126 | clk_enable(phy_ref_clk); | 132 | clk_enable(phy_ref_clk); |
127 | 133 | ||
128 | /* disable the power to the usb hub prior to init */ | 134 | /* disable the power to the usb hub prior to init and reset phy+hub */ |
129 | ret = gpio_request(GPIO_HUB_POWER, "hub_power"); | 135 | ret = gpio_request_array(panda_ehci_gpios, |
136 | ARRAY_SIZE(panda_ehci_gpios)); | ||
130 | if (ret) { | 137 | if (ret) { |
131 | pr_err("Cannot request GPIO %d\n", GPIO_HUB_POWER); | 138 | pr_err("Unable to initialize EHCI power/reset\n"); |
132 | goto error1; | 139 | return; |
133 | } | 140 | } |
134 | gpio_export(GPIO_HUB_POWER, 0); | ||
135 | gpio_direction_output(GPIO_HUB_POWER, 0); | ||
136 | gpio_set_value(GPIO_HUB_POWER, 0); | ||
137 | 141 | ||
138 | /* reset phy+hub */ | 142 | gpio_export(GPIO_HUB_POWER, 0); |
139 | ret = gpio_request(GPIO_HUB_NRESET, "hub_nreset"); | ||
140 | if (ret) { | ||
141 | pr_err("Cannot request GPIO %d\n", GPIO_HUB_NRESET); | ||
142 | goto error2; | ||
143 | } | ||
144 | gpio_export(GPIO_HUB_NRESET, 0); | 143 | gpio_export(GPIO_HUB_NRESET, 0); |
145 | gpio_direction_output(GPIO_HUB_NRESET, 0); | ||
146 | gpio_set_value(GPIO_HUB_NRESET, 0); | ||
147 | gpio_set_value(GPIO_HUB_NRESET, 1); | 144 | gpio_set_value(GPIO_HUB_NRESET, 1); |
148 | 145 | ||
149 | usbhs_init(&usbhs_bdata); | 146 | usbhs_init(&usbhs_bdata); |
150 | 147 | ||
151 | /* enable power to hub */ | 148 | /* enable power to hub */ |
152 | gpio_set_value(GPIO_HUB_POWER, 1); | 149 | gpio_set_value(GPIO_HUB_POWER, 1); |
153 | return; | ||
154 | |||
155 | error2: | ||
156 | gpio_free(GPIO_HUB_POWER); | ||
157 | error1: | ||
158 | pr_err("Unable to initialize EHCI power/reset\n"); | ||
159 | return; | ||
160 | |||
161 | } | 150 | } |
162 | 151 | ||
163 | static struct omap_musb_board_data musb_board_data = { | 152 | static struct omap_musb_board_data musb_board_data = { |
@@ -408,15 +397,6 @@ static struct twl4030_platform_data omap4_panda_twldata = { | |||
408 | .usb = &omap4_usbphy_data, | 397 | .usb = &omap4_usbphy_data, |
409 | }; | 398 | }; |
410 | 399 | ||
411 | static struct i2c_board_info __initdata omap4_panda_i2c_boardinfo[] = { | ||
412 | { | ||
413 | I2C_BOARD_INFO("twl6030", 0x48), | ||
414 | .flags = I2C_CLIENT_WAKE, | ||
415 | .irq = OMAP44XX_IRQ_SYS_1N, | ||
416 | .platform_data = &omap4_panda_twldata, | ||
417 | }, | ||
418 | }; | ||
419 | |||
420 | /* | 400 | /* |
421 | * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM | 401 | * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM |
422 | * is connected as I2C slave device, and can be accessed at address 0x50 | 402 | * is connected as I2C slave device, and can be accessed at address 0x50 |
@@ -429,12 +409,7 @@ static struct i2c_board_info __initdata panda_i2c_eeprom[] = { | |||
429 | 409 | ||
430 | static int __init omap4_panda_i2c_init(void) | 410 | static int __init omap4_panda_i2c_init(void) |
431 | { | 411 | { |
432 | /* | 412 | omap4_pmic_init("twl6030", &omap4_panda_twldata); |
433 | * Phoenix Audio IC needs I2C1 to | ||
434 | * start with 400 KHz or less | ||
435 | */ | ||
436 | omap_register_i2c_bus(1, 400, omap4_panda_i2c_boardinfo, | ||
437 | ARRAY_SIZE(omap4_panda_i2c_boardinfo)); | ||
438 | omap_register_i2c_bus(2, 400, NULL, 0); | 413 | omap_register_i2c_bus(2, 400, NULL, 0); |
439 | /* | 414 | /* |
440 | * Bus 3 is attached to the DVI port where devices like the pico DLP | 415 | * Bus 3 is attached to the DVI port where devices like the pico DLP |
@@ -651,27 +626,19 @@ static void omap4_panda_hdmi_mux_init(void) | |||
651 | OMAP_PIN_INPUT_PULLUP); | 626 | OMAP_PIN_INPUT_PULLUP); |
652 | } | 627 | } |
653 | 628 | ||
629 | static struct gpio panda_hdmi_gpios[] = { | ||
630 | { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" }, | ||
631 | { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, | ||
632 | }; | ||
633 | |||
654 | static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) | 634 | static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) |
655 | { | 635 | { |
656 | int status; | 636 | int status; |
657 | 637 | ||
658 | status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, | 638 | status = gpio_request_array(panda_hdmi_gpios, |
659 | "hdmi_gpio_hpd"); | 639 | ARRAY_SIZE(panda_hdmi_gpios)); |
660 | if (status) { | 640 | if (status) |
661 | pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); | 641 | pr_err("Cannot request HDMI GPIOs\n"); |
662 | return status; | ||
663 | } | ||
664 | status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, | ||
665 | "hdmi_gpio_ls_oe"); | ||
666 | if (status) { | ||
667 | pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE); | ||
668 | goto error1; | ||
669 | } | ||
670 | |||
671 | return 0; | ||
672 | |||
673 | error1: | ||
674 | gpio_free(HDMI_GPIO_HPD); | ||
675 | 642 | ||
676 | return status; | 643 | return status; |
677 | } | 644 | } |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 9d192ff3b9ac..1555918e3ffa 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -56,6 +56,7 @@ | |||
56 | #include "mux.h" | 56 | #include "mux.h" |
57 | #include "sdram-micron-mt46h32m32lf-6.h" | 57 | #include "sdram-micron-mt46h32m32lf-6.h" |
58 | #include "hsmmc.h" | 58 | #include "hsmmc.h" |
59 | #include "common-board-devices.h" | ||
59 | 60 | ||
60 | #define OVERO_GPIO_BT_XGATE 15 | 61 | #define OVERO_GPIO_BT_XGATE 15 |
61 | #define OVERO_GPIO_W2W_NRESET 16 | 62 | #define OVERO_GPIO_W2W_NRESET 16 |
@@ -74,30 +75,6 @@ | |||
74 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ | 75 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ |
75 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | 76 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) |
76 | 77 | ||
77 | #include <linux/spi/ads7846.h> | ||
78 | |||
79 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
80 | .turbo_mode = 0, | ||
81 | .single_channel = 1, /* 0: slave, 1: master */ | ||
82 | }; | ||
83 | |||
84 | static int ads7846_get_pendown_state(void) | ||
85 | { | ||
86 | return !gpio_get_value(OVERO_GPIO_PENDOWN); | ||
87 | } | ||
88 | |||
89 | static struct ads7846_platform_data ads7846_config = { | ||
90 | .x_max = 0x0fff, | ||
91 | .y_max = 0x0fff, | ||
92 | .x_plate_ohms = 180, | ||
93 | .pressure_max = 255, | ||
94 | .debounce_max = 10, | ||
95 | .debounce_tol = 3, | ||
96 | .debounce_rep = 1, | ||
97 | .get_pendown_state = ads7846_get_pendown_state, | ||
98 | .keep_vref_on = 1, | ||
99 | }; | ||
100 | |||
101 | /* fixed regulator for ads7846 */ | 78 | /* fixed regulator for ads7846 */ |
102 | static struct regulator_consumer_supply ads7846_supply = | 79 | static struct regulator_consumer_supply ads7846_supply = |
103 | REGULATOR_SUPPLY("vcc", "spi1.0"); | 80 | REGULATOR_SUPPLY("vcc", "spi1.0"); |
@@ -128,14 +105,7 @@ static struct platform_device vads7846_device = { | |||
128 | 105 | ||
129 | static void __init overo_ads7846_init(void) | 106 | static void __init overo_ads7846_init(void) |
130 | { | 107 | { |
131 | if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) && | 108 | omap_ads7846_init(1, OVERO_GPIO_PENDOWN, 0, NULL); |
132 | (gpio_direction_input(OVERO_GPIO_PENDOWN) == 0)) { | ||
133 | gpio_export(OVERO_GPIO_PENDOWN, 0); | ||
134 | } else { | ||
135 | printk(KERN_ERR "could not obtain gpio for ADS7846_PENDOWN\n"); | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | platform_device_register(&vads7846_device); | 109 | platform_device_register(&vads7846_device); |
140 | } | 110 | } |
141 | 111 | ||
@@ -146,106 +116,28 @@ static inline void __init overo_ads7846_init(void) { return; } | |||
146 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 116 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
147 | 117 | ||
148 | #include <linux/smsc911x.h> | 118 | #include <linux/smsc911x.h> |
119 | #include <plat/gpmc-smsc911x.h> | ||
149 | 120 | ||
150 | static struct resource overo_smsc911x_resources[] = { | 121 | static struct omap_smsc911x_platform_data smsc911x_cfg = { |
151 | { | ||
152 | .name = "smsc911x-memory", | ||
153 | .flags = IORESOURCE_MEM, | ||
154 | }, | ||
155 | { | ||
156 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
157 | }, | ||
158 | }; | ||
159 | |||
160 | static struct resource overo_smsc911x2_resources[] = { | ||
161 | { | ||
162 | .name = "smsc911x2-memory", | ||
163 | .flags = IORESOURCE_MEM, | ||
164 | }, | ||
165 | { | ||
166 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
167 | }, | ||
168 | }; | ||
169 | |||
170 | static struct smsc911x_platform_config overo_smsc911x_config = { | ||
171 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
172 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
173 | .flags = SMSC911X_USE_32BIT , | ||
174 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
175 | }; | ||
176 | |||
177 | static struct platform_device overo_smsc911x_device = { | ||
178 | .name = "smsc911x", | ||
179 | .id = 0, | 122 | .id = 0, |
180 | .num_resources = ARRAY_SIZE(overo_smsc911x_resources), | 123 | .cs = OVERO_SMSC911X_CS, |
181 | .resource = overo_smsc911x_resources, | 124 | .gpio_irq = OVERO_SMSC911X_GPIO, |
182 | .dev = { | 125 | .gpio_reset = -EINVAL, |
183 | .platform_data = &overo_smsc911x_config, | 126 | .flags = SMSC911X_USE_32BIT, |
184 | }, | ||
185 | }; | 127 | }; |
186 | 128 | ||
187 | static struct platform_device overo_smsc911x2_device = { | 129 | static struct omap_smsc911x_platform_data smsc911x2_cfg = { |
188 | .name = "smsc911x", | ||
189 | .id = 1, | 130 | .id = 1, |
190 | .num_resources = ARRAY_SIZE(overo_smsc911x2_resources), | 131 | .cs = OVERO_SMSC911X2_CS, |
191 | .resource = overo_smsc911x2_resources, | 132 | .gpio_irq = OVERO_SMSC911X2_GPIO, |
192 | .dev = { | 133 | .gpio_reset = -EINVAL, |
193 | .platform_data = &overo_smsc911x_config, | 134 | .flags = SMSC911X_USE_32BIT, |
194 | }, | ||
195 | }; | 135 | }; |
196 | 136 | ||
197 | static struct platform_device *smsc911x_devices[] = { | 137 | static void __init overo_init_smsc911x(void) |
198 | &overo_smsc911x_device, | ||
199 | &overo_smsc911x2_device, | ||
200 | }; | ||
201 | |||
202 | static inline void __init overo_init_smsc911x(void) | ||
203 | { | 138 | { |
204 | unsigned long cs_mem_base, cs_mem_base2; | 139 | gpmc_smsc911x_init(&smsc911x_cfg); |
205 | 140 | gpmc_smsc911x_init(&smsc911x2_cfg); | |
206 | /* set up first smsc911x chip */ | ||
207 | |||
208 | if (gpmc_cs_request(OVERO_SMSC911X_CS, SZ_16M, &cs_mem_base) < 0) { | ||
209 | printk(KERN_ERR "Failed request for GPMC mem for smsc911x\n"); | ||
210 | return; | ||
211 | } | ||
212 | |||
213 | overo_smsc911x_resources[0].start = cs_mem_base + 0x0; | ||
214 | overo_smsc911x_resources[0].end = cs_mem_base + 0xff; | ||
215 | |||
216 | if ((gpio_request(OVERO_SMSC911X_GPIO, "SMSC911X IRQ") == 0) && | ||
217 | (gpio_direction_input(OVERO_SMSC911X_GPIO) == 0)) { | ||
218 | gpio_export(OVERO_SMSC911X_GPIO, 0); | ||
219 | } else { | ||
220 | printk(KERN_ERR "could not obtain gpio for SMSC911X IRQ\n"); | ||
221 | return; | ||
222 | } | ||
223 | |||
224 | overo_smsc911x_resources[1].start = OMAP_GPIO_IRQ(OVERO_SMSC911X_GPIO); | ||
225 | overo_smsc911x_resources[1].end = 0; | ||
226 | |||
227 | /* set up second smsc911x chip */ | ||
228 | |||
229 | if (gpmc_cs_request(OVERO_SMSC911X2_CS, SZ_16M, &cs_mem_base2) < 0) { | ||
230 | printk(KERN_ERR "Failed request for GPMC mem for smsc911x2\n"); | ||
231 | return; | ||
232 | } | ||
233 | |||
234 | overo_smsc911x2_resources[0].start = cs_mem_base2 + 0x0; | ||
235 | overo_smsc911x2_resources[0].end = cs_mem_base2 + 0xff; | ||
236 | |||
237 | if ((gpio_request(OVERO_SMSC911X2_GPIO, "SMSC911X2 IRQ") == 0) && | ||
238 | (gpio_direction_input(OVERO_SMSC911X2_GPIO) == 0)) { | ||
239 | gpio_export(OVERO_SMSC911X2_GPIO, 0); | ||
240 | } else { | ||
241 | printk(KERN_ERR "could not obtain gpio for SMSC911X2 IRQ\n"); | ||
242 | return; | ||
243 | } | ||
244 | |||
245 | overo_smsc911x2_resources[1].start = OMAP_GPIO_IRQ(OVERO_SMSC911X2_GPIO); | ||
246 | overo_smsc911x2_resources[1].end = 0; | ||
247 | |||
248 | platform_add_devices(smsc911x_devices, ARRAY_SIZE(smsc911x_devices)); | ||
249 | } | 141 | } |
250 | 142 | ||
251 | #else | 143 | #else |
@@ -259,21 +151,20 @@ static int dvi_enabled; | |||
259 | #define OVERO_GPIO_LCD_EN 144 | 151 | #define OVERO_GPIO_LCD_EN 144 |
260 | #define OVERO_GPIO_LCD_BL 145 | 152 | #define OVERO_GPIO_LCD_BL 145 |
261 | 153 | ||
154 | static struct gpio overo_dss_gpios[] __initdata = { | ||
155 | { OVERO_GPIO_LCD_EN, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_EN" }, | ||
156 | { OVERO_GPIO_LCD_BL, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_BL" }, | ||
157 | }; | ||
158 | |||
262 | static void __init overo_display_init(void) | 159 | static void __init overo_display_init(void) |
263 | { | 160 | { |
264 | if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) && | 161 | if (gpio_request_array(overo_dss_gpios, ARRAY_SIZE(overo_dss_gpios))) { |
265 | (gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0)) | 162 | printk(KERN_ERR "could not obtain DSS control GPIOs\n"); |
266 | gpio_export(OVERO_GPIO_LCD_EN, 0); | 163 | return; |
267 | else | 164 | } |
268 | printk(KERN_ERR "could not obtain gpio for " | ||
269 | "OVERO_GPIO_LCD_EN\n"); | ||
270 | 165 | ||
271 | if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) && | 166 | gpio_export(OVERO_GPIO_LCD_EN, 0); |
272 | (gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0)) | 167 | gpio_export(OVERO_GPIO_LCD_BL, 0); |
273 | gpio_export(OVERO_GPIO_LCD_BL, 0); | ||
274 | else | ||
275 | printk(KERN_ERR "could not obtain gpio for " | ||
276 | "OVERO_GPIO_LCD_BL\n"); | ||
277 | } | 168 | } |
278 | 169 | ||
279 | static int overo_panel_enable_dvi(struct omap_dss_device *dssdev) | 170 | static int overo_panel_enable_dvi(struct omap_dss_device *dssdev) |
@@ -412,45 +303,6 @@ static struct mtd_partition overo_nand_partitions[] = { | |||
412 | }, | 303 | }, |
413 | }; | 304 | }; |
414 | 305 | ||
415 | static struct omap_nand_platform_data overo_nand_data = { | ||
416 | .parts = overo_nand_partitions, | ||
417 | .nr_parts = ARRAY_SIZE(overo_nand_partitions), | ||
418 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
419 | }; | ||
420 | |||
421 | static void __init overo_flash_init(void) | ||
422 | { | ||
423 | u8 cs = 0; | ||
424 | u8 nandcs = GPMC_CS_NUM + 1; | ||
425 | |||
426 | /* find out the chip-select on which NAND exists */ | ||
427 | while (cs < GPMC_CS_NUM) { | ||
428 | u32 ret = 0; | ||
429 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | ||
430 | |||
431 | if ((ret & 0xC00) == 0x800) { | ||
432 | printk(KERN_INFO "Found NAND on CS%d\n", cs); | ||
433 | if (nandcs > GPMC_CS_NUM) | ||
434 | nandcs = cs; | ||
435 | } | ||
436 | cs++; | ||
437 | } | ||
438 | |||
439 | if (nandcs > GPMC_CS_NUM) { | ||
440 | printk(KERN_INFO "NAND: Unable to find configuration " | ||
441 | "in GPMC\n "); | ||
442 | return; | ||
443 | } | ||
444 | |||
445 | if (nandcs < GPMC_CS_NUM) { | ||
446 | overo_nand_data.cs = nandcs; | ||
447 | |||
448 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); | ||
449 | if (gpmc_nand_init(&overo_nand_data) < 0) | ||
450 | printk(KERN_ERR "Unable to register NAND device\n"); | ||
451 | } | ||
452 | } | ||
453 | |||
454 | static struct omap2_hsmmc_info mmc[] = { | 306 | static struct omap2_hsmmc_info mmc[] = { |
455 | { | 307 | { |
456 | .mmc = 1, | 308 | .mmc = 1, |
@@ -648,37 +500,15 @@ static struct twl4030_platform_data overo_twldata = { | |||
648 | .vpll2 = &overo_vpll2, | 500 | .vpll2 = &overo_vpll2, |
649 | }; | 501 | }; |
650 | 502 | ||
651 | static struct i2c_board_info __initdata overo_i2c_boardinfo[] = { | ||
652 | { | ||
653 | I2C_BOARD_INFO("tps65950", 0x48), | ||
654 | .flags = I2C_CLIENT_WAKE, | ||
655 | .irq = INT_34XX_SYS_NIRQ, | ||
656 | .platform_data = &overo_twldata, | ||
657 | }, | ||
658 | }; | ||
659 | |||
660 | static int __init overo_i2c_init(void) | 503 | static int __init overo_i2c_init(void) |
661 | { | 504 | { |
662 | omap_register_i2c_bus(1, 2600, overo_i2c_boardinfo, | 505 | omap3_pmic_init("tps65950", &overo_twldata); |
663 | ARRAY_SIZE(overo_i2c_boardinfo)); | ||
664 | /* i2c2 pins are used for gpio */ | 506 | /* i2c2 pins are used for gpio */ |
665 | omap_register_i2c_bus(3, 400, NULL, 0); | 507 | omap_register_i2c_bus(3, 400, NULL, 0); |
666 | return 0; | 508 | return 0; |
667 | } | 509 | } |
668 | 510 | ||
669 | static struct spi_board_info overo_spi_board_info[] __initdata = { | 511 | static struct spi_board_info overo_spi_board_info[] __initdata = { |
670 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ | ||
671 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | ||
672 | { | ||
673 | .modalias = "ads7846", | ||
674 | .bus_num = 1, | ||
675 | .chip_select = 0, | ||
676 | .max_speed_hz = 1500000, | ||
677 | .controller_data = &ads7846_mcspi_config, | ||
678 | .irq = OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN), | ||
679 | .platform_data = &ads7846_config, | ||
680 | }, | ||
681 | #endif | ||
682 | #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ | 512 | #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ |
683 | defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) | 513 | defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) |
684 | { | 514 | { |
@@ -722,20 +552,22 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
722 | }; | 552 | }; |
723 | #endif | 553 | #endif |
724 | 554 | ||
725 | static struct omap_musb_board_data musb_board_data = { | 555 | static struct gpio overo_bt_gpios[] __initdata = { |
726 | .interface_type = MUSB_INTERFACE_ULPI, | 556 | { OVERO_GPIO_BT_XGATE, GPIOF_OUT_INIT_LOW, "lcd enable" }, |
727 | .mode = MUSB_OTG, | 557 | { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, |
728 | .power = 100, | ||
729 | }; | 558 | }; |
730 | 559 | ||
731 | static void __init overo_init(void) | 560 | static void __init overo_init(void) |
732 | { | 561 | { |
562 | int ret; | ||
563 | |||
733 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 564 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
734 | overo_i2c_init(); | 565 | overo_i2c_init(); |
735 | omap_display_init(&overo_dss_data); | 566 | omap_display_init(&overo_dss_data); |
736 | omap_serial_init(); | 567 | omap_serial_init(); |
737 | overo_flash_init(); | 568 | omap_nand_flash_init(0, overo_nand_partitions, |
738 | usb_musb_init(&musb_board_data); | 569 | ARRAY_SIZE(overo_nand_partitions)); |
570 | usb_musb_init(NULL); | ||
739 | usbhs_init(&usbhs_bdata); | 571 | usbhs_init(&usbhs_bdata); |
740 | overo_spi_init(); | 572 | overo_spi_init(); |
741 | overo_ads7846_init(); | 573 | overo_ads7846_init(); |
@@ -748,9 +580,9 @@ static void __init overo_init(void) | |||
748 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 580 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
749 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); | 581 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); |
750 | 582 | ||
751 | if ((gpio_request(OVERO_GPIO_W2W_NRESET, | 583 | ret = gpio_request_one(OVERO_GPIO_W2W_NRESET, GPIOF_OUT_INIT_HIGH, |
752 | "OVERO_GPIO_W2W_NRESET") == 0) && | 584 | "OVERO_GPIO_W2W_NRESET"); |
753 | (gpio_direction_output(OVERO_GPIO_W2W_NRESET, 1) == 0)) { | 585 | if (ret == 0) { |
754 | gpio_export(OVERO_GPIO_W2W_NRESET, 0); | 586 | gpio_export(OVERO_GPIO_W2W_NRESET, 0); |
755 | gpio_set_value(OVERO_GPIO_W2W_NRESET, 0); | 587 | gpio_set_value(OVERO_GPIO_W2W_NRESET, 0); |
756 | udelay(10); | 588 | udelay(10); |
@@ -760,25 +592,20 @@ static void __init overo_init(void) | |||
760 | "OVERO_GPIO_W2W_NRESET\n"); | 592 | "OVERO_GPIO_W2W_NRESET\n"); |
761 | } | 593 | } |
762 | 594 | ||
763 | if ((gpio_request(OVERO_GPIO_BT_XGATE, "OVERO_GPIO_BT_XGATE") == 0) && | 595 | ret = gpio_request_array(overo_bt_gpios, ARRAY_SIZE(overo_bt_gpios)); |
764 | (gpio_direction_output(OVERO_GPIO_BT_XGATE, 0) == 0)) | 596 | if (ret) { |
597 | pr_err("%s: could not obtain BT gpios\n", __func__); | ||
598 | } else { | ||
765 | gpio_export(OVERO_GPIO_BT_XGATE, 0); | 599 | gpio_export(OVERO_GPIO_BT_XGATE, 0); |
766 | else | ||
767 | printk(KERN_ERR "could not obtain gpio for OVERO_GPIO_BT_XGATE\n"); | ||
768 | |||
769 | if ((gpio_request(OVERO_GPIO_BT_NRESET, "OVERO_GPIO_BT_NRESET") == 0) && | ||
770 | (gpio_direction_output(OVERO_GPIO_BT_NRESET, 1) == 0)) { | ||
771 | gpio_export(OVERO_GPIO_BT_NRESET, 0); | 600 | gpio_export(OVERO_GPIO_BT_NRESET, 0); |
772 | gpio_set_value(OVERO_GPIO_BT_NRESET, 0); | 601 | gpio_set_value(OVERO_GPIO_BT_NRESET, 0); |
773 | mdelay(6); | 602 | mdelay(6); |
774 | gpio_set_value(OVERO_GPIO_BT_NRESET, 1); | 603 | gpio_set_value(OVERO_GPIO_BT_NRESET, 1); |
775 | } else { | ||
776 | printk(KERN_ERR "could not obtain gpio for " | ||
777 | "OVERO_GPIO_BT_NRESET\n"); | ||
778 | } | 604 | } |
779 | 605 | ||
780 | if ((gpio_request(OVERO_GPIO_USBH_CPEN, "OVERO_GPIO_USBH_CPEN") == 0) && | 606 | ret = gpio_request_one(OVERO_GPIO_USBH_CPEN, GPIOF_OUT_INIT_HIGH, |
781 | (gpio_direction_output(OVERO_GPIO_USBH_CPEN, 1) == 0)) | 607 | "OVERO_GPIO_USBH_CPEN"); |
608 | if (ret == 0) | ||
782 | gpio_export(OVERO_GPIO_USBH_CPEN, 0); | 609 | gpio_export(OVERO_GPIO_USBH_CPEN, 0); |
783 | else | 610 | else |
784 | printk(KERN_ERR "could not obtain gpio for " | 611 | printk(KERN_ERR "could not obtain gpio for " |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index 2af8b05e786d..42d10b12da3c 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include "mux.h" | 31 | #include "mux.h" |
32 | #include "hsmmc.h" | 32 | #include "hsmmc.h" |
33 | #include "sdram-nokia.h" | 33 | #include "sdram-nokia.h" |
34 | #include "common-board-devices.h" | ||
34 | 35 | ||
35 | static struct regulator_consumer_supply rm680_vemmc_consumers[] = { | 36 | static struct regulator_consumer_supply rm680_vemmc_consumers[] = { |
36 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), | 37 | REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), |
@@ -90,19 +91,9 @@ static struct twl4030_platform_data rm680_twl_data = { | |||
90 | /* add rest of the children here */ | 91 | /* add rest of the children here */ |
91 | }; | 92 | }; |
92 | 93 | ||
93 | static struct i2c_board_info __initdata rm680_twl_i2c_board_info[] = { | ||
94 | { | ||
95 | I2C_BOARD_INFO("twl5031", 0x48), | ||
96 | .flags = I2C_CLIENT_WAKE, | ||
97 | .irq = INT_34XX_SYS_NIRQ, | ||
98 | .platform_data = &rm680_twl_data, | ||
99 | }, | ||
100 | }; | ||
101 | |||
102 | static void __init rm680_i2c_init(void) | 94 | static void __init rm680_i2c_init(void) |
103 | { | 95 | { |
104 | omap_register_i2c_bus(1, 2900, rm680_twl_i2c_board_info, | 96 | omap_pmic_init(1, 2900, "twl5031", INT_34XX_SYS_NIRQ, &rm680_twl_data); |
105 | ARRAY_SIZE(rm680_twl_i2c_board_info)); | ||
106 | omap_register_i2c_bus(2, 400, NULL, 0); | 97 | omap_register_i2c_bus(2, 400, NULL, 0); |
107 | omap_register_i2c_bus(3, 400, NULL, 0); | 98 | omap_register_i2c_bus(3, 400, NULL, 0); |
108 | } | 99 | } |
@@ -153,17 +144,11 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
153 | }; | 144 | }; |
154 | #endif | 145 | #endif |
155 | 146 | ||
156 | static struct omap_musb_board_data rm680_musb_data = { | ||
157 | .interface_type = MUSB_INTERFACE_ULPI, | ||
158 | .mode = MUSB_PERIPHERAL, | ||
159 | .power = 100, | ||
160 | }; | ||
161 | |||
162 | static void __init rm680_init(void) | 147 | static void __init rm680_init(void) |
163 | { | 148 | { |
164 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 149 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
165 | omap_serial_init(); | 150 | omap_serial_init(); |
166 | usb_musb_init(&rm680_musb_data); | 151 | usb_musb_init(NULL); |
167 | rm680_peripherals_init(); | 152 | rm680_peripherals_init(); |
168 | } | 153 | } |
169 | 154 | ||
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index bbcb6775a6a3..f6247e71a194 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
24 | #include <linux/gpio_keys.h> | 24 | #include <linux/gpio_keys.h> |
25 | #include <linux/mmc/host.h> | 25 | #include <linux/mmc/host.h> |
26 | #include <linux/power/isp1704_charger.h> | ||
26 | 27 | ||
27 | #include <plat/mcspi.h> | 28 | #include <plat/mcspi.h> |
28 | #include <plat/board.h> | 29 | #include <plat/board.h> |
@@ -43,6 +44,7 @@ | |||
43 | 44 | ||
44 | #include "mux.h" | 45 | #include "mux.h" |
45 | #include "hsmmc.h" | 46 | #include "hsmmc.h" |
47 | #include "common-board-devices.h" | ||
46 | 48 | ||
47 | #define SYSTEM_REV_B_USES_VAUX3 0x1699 | 49 | #define SYSTEM_REV_B_USES_VAUX3 0x1699 |
48 | #define SYSTEM_REV_S_USES_VAUX3 0x8 | 50 | #define SYSTEM_REV_S_USES_VAUX3 0x8 |
@@ -52,6 +54,8 @@ | |||
52 | #define RX51_FMTX_RESET_GPIO 163 | 54 | #define RX51_FMTX_RESET_GPIO 163 |
53 | #define RX51_FMTX_IRQ 53 | 55 | #define RX51_FMTX_IRQ 53 |
54 | 56 | ||
57 | #define RX51_USB_TRANSCEIVER_RST_GPIO 67 | ||
58 | |||
55 | /* list all spi devices here */ | 59 | /* list all spi devices here */ |
56 | enum { | 60 | enum { |
57 | RX51_SPI_WL1251, | 61 | RX51_SPI_WL1251, |
@@ -110,10 +114,30 @@ static struct spi_board_info rx51_peripherals_spi_board_info[] __initdata = { | |||
110 | }, | 114 | }, |
111 | }; | 115 | }; |
112 | 116 | ||
117 | static void rx51_charger_set_power(bool on) | ||
118 | { | ||
119 | gpio_set_value(RX51_USB_TRANSCEIVER_RST_GPIO, on); | ||
120 | } | ||
121 | |||
122 | static struct isp1704_charger_data rx51_charger_data = { | ||
123 | .set_power = rx51_charger_set_power, | ||
124 | }; | ||
125 | |||
113 | static struct platform_device rx51_charger_device = { | 126 | static struct platform_device rx51_charger_device = { |
114 | .name = "isp1704_charger", | 127 | .name = "isp1704_charger", |
128 | .dev = { | ||
129 | .platform_data = &rx51_charger_data, | ||
130 | }, | ||
115 | }; | 131 | }; |
116 | 132 | ||
133 | static void __init rx51_charger_init(void) | ||
134 | { | ||
135 | WARN_ON(gpio_request_one(RX51_USB_TRANSCEIVER_RST_GPIO, | ||
136 | GPIOF_OUT_INIT_LOW, "isp1704_reset")); | ||
137 | |||
138 | platform_device_register(&rx51_charger_device); | ||
139 | } | ||
140 | |||
117 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 141 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
118 | 142 | ||
119 | #define RX51_GPIO_CAMERA_LENS_COVER 110 | 143 | #define RX51_GPIO_CAMERA_LENS_COVER 110 |
@@ -557,10 +581,8 @@ static __init void rx51_init_si4713(void) | |||
557 | static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n) | 581 | static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n) |
558 | { | 582 | { |
559 | /* FIXME this gpio setup is just a placeholder for now */ | 583 | /* FIXME this gpio setup is just a placeholder for now */ |
560 | gpio_request(gpio + 6, "backlight_pwm"); | 584 | gpio_request_one(gpio + 6, GPIOF_OUT_INIT_LOW, "backlight_pwm"); |
561 | gpio_direction_output(gpio + 6, 0); | 585 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_HIGH, "speaker_en"); |
562 | gpio_request(gpio + 7, "speaker_en"); | ||
563 | gpio_direction_output(gpio + 7, 1); | ||
564 | 586 | ||
565 | return 0; | 587 | return 0; |
566 | } | 588 | } |
@@ -730,7 +752,7 @@ static struct twl4030_resconfig twl4030_rconfig[] __initdata = { | |||
730 | { .resource = RES_RESET, .devgroup = -1, | 752 | { .resource = RES_RESET, .devgroup = -1, |
731 | .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1 | 753 | .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1 |
732 | }, | 754 | }, |
733 | { .resource = RES_Main_Ref, .devgroup = -1, | 755 | { .resource = RES_MAIN_REF, .devgroup = -1, |
734 | .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1 | 756 | .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1 |
735 | }, | 757 | }, |
736 | { 0, 0}, | 758 | { 0, 0}, |
@@ -777,15 +799,6 @@ static struct tpa6130a2_platform_data rx51_tpa6130a2_data __initdata_or_module = | |||
777 | .power_gpio = 98, | 799 | .power_gpio = 98, |
778 | }; | 800 | }; |
779 | 801 | ||
780 | static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_1[] = { | ||
781 | { | ||
782 | I2C_BOARD_INFO("twl5030", 0x48), | ||
783 | .flags = I2C_CLIENT_WAKE, | ||
784 | .irq = INT_34XX_SYS_NIRQ, | ||
785 | .platform_data = &rx51_twldata, | ||
786 | }, | ||
787 | }; | ||
788 | |||
789 | /* Audio setup data */ | 802 | /* Audio setup data */ |
790 | static struct aic3x_setup_data rx51_aic34_setup = { | 803 | static struct aic3x_setup_data rx51_aic34_setup = { |
791 | .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED, | 804 | .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED, |
@@ -833,8 +846,7 @@ static int __init rx51_i2c_init(void) | |||
833 | rx51_twldata.vaux3 = &rx51_vaux3_cam; | 846 | rx51_twldata.vaux3 = &rx51_vaux3_cam; |
834 | } | 847 | } |
835 | rx51_twldata.vmmc2 = &rx51_vmmc2; | 848 | rx51_twldata.vmmc2 = &rx51_vmmc2; |
836 | omap_register_i2c_bus(1, 2200, rx51_peripherals_i2c_board_info_1, | 849 | omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata); |
837 | ARRAY_SIZE(rx51_peripherals_i2c_board_info_1)); | ||
838 | omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2, | 850 | omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2, |
839 | ARRAY_SIZE(rx51_peripherals_i2c_board_info_2)); | 851 | ARRAY_SIZE(rx51_peripherals_i2c_board_info_2)); |
840 | omap_register_i2c_bus(3, 400, NULL, 0); | 852 | omap_register_i2c_bus(3, 400, NULL, 0); |
@@ -921,26 +933,20 @@ static void rx51_wl1251_set_power(bool enable) | |||
921 | gpio_set_value(RX51_WL1251_POWER_GPIO, enable); | 933 | gpio_set_value(RX51_WL1251_POWER_GPIO, enable); |
922 | } | 934 | } |
923 | 935 | ||
936 | static struct gpio rx51_wl1251_gpios[] __initdata = { | ||
937 | { RX51_WL1251_POWER_GPIO, GPIOF_OUT_INIT_LOW, "wl1251 power" }, | ||
938 | { RX51_WL1251_IRQ_GPIO, GPIOF_IN, "wl1251 irq" }, | ||
939 | }; | ||
940 | |||
924 | static void __init rx51_init_wl1251(void) | 941 | static void __init rx51_init_wl1251(void) |
925 | { | 942 | { |
926 | int irq, ret; | 943 | int irq, ret; |
927 | 944 | ||
928 | ret = gpio_request(RX51_WL1251_POWER_GPIO, "wl1251 power"); | 945 | ret = gpio_request_array(rx51_wl1251_gpios, |
946 | ARRAY_SIZE(rx51_wl1251_gpios)); | ||
929 | if (ret < 0) | 947 | if (ret < 0) |
930 | goto error; | 948 | goto error; |
931 | 949 | ||
932 | ret = gpio_direction_output(RX51_WL1251_POWER_GPIO, 0); | ||
933 | if (ret < 0) | ||
934 | goto err_power; | ||
935 | |||
936 | ret = gpio_request(RX51_WL1251_IRQ_GPIO, "wl1251 irq"); | ||
937 | if (ret < 0) | ||
938 | goto err_power; | ||
939 | |||
940 | ret = gpio_direction_input(RX51_WL1251_IRQ_GPIO); | ||
941 | if (ret < 0) | ||
942 | goto err_irq; | ||
943 | |||
944 | irq = gpio_to_irq(RX51_WL1251_IRQ_GPIO); | 950 | irq = gpio_to_irq(RX51_WL1251_IRQ_GPIO); |
945 | if (irq < 0) | 951 | if (irq < 0) |
946 | goto err_irq; | 952 | goto err_irq; |
@@ -952,10 +958,7 @@ static void __init rx51_init_wl1251(void) | |||
952 | 958 | ||
953 | err_irq: | 959 | err_irq: |
954 | gpio_free(RX51_WL1251_IRQ_GPIO); | 960 | gpio_free(RX51_WL1251_IRQ_GPIO); |
955 | |||
956 | err_power: | ||
957 | gpio_free(RX51_WL1251_POWER_GPIO); | 961 | gpio_free(RX51_WL1251_POWER_GPIO); |
958 | |||
959 | error: | 962 | error: |
960 | printk(KERN_ERR "wl1251 board initialisation failed\n"); | 963 | printk(KERN_ERR "wl1251 board initialisation failed\n"); |
961 | wl1251_pdata.set_power = NULL; | 964 | wl1251_pdata.set_power = NULL; |
@@ -981,6 +984,6 @@ void __init rx51_peripherals_init(void) | |||
981 | if (partition) | 984 | if (partition) |
982 | omap2_hsmmc_init(mmc); | 985 | omap2_hsmmc_init(mmc); |
983 | 986 | ||
984 | platform_device_register(&rx51_charger_device); | 987 | rx51_charger_init(); |
985 | } | 988 | } |
986 | 989 | ||
diff --git a/arch/arm/mach-omap2/board-rx51-video.c b/arch/arm/mach-omap2/board-rx51-video.c index 2df10b6a5940..2c1289bd5e6a 100644 --- a/arch/arm/mach-omap2/board-rx51-video.c +++ b/arch/arm/mach-omap2/board-rx51-video.c | |||
@@ -76,13 +76,12 @@ static int __init rx51_video_init(void) | |||
76 | return 0; | 76 | return 0; |
77 | } | 77 | } |
78 | 78 | ||
79 | if (gpio_request(RX51_LCD_RESET_GPIO, "LCD ACX565AKM reset")) { | 79 | if (gpio_request_one(RX51_LCD_RESET_GPIO, GPIOF_OUT_INIT_HIGH, |
80 | "LCD ACX565AKM reset")) { | ||
80 | pr_err("%s failed to get LCD Reset GPIO\n", __func__); | 81 | pr_err("%s failed to get LCD Reset GPIO\n", __func__); |
81 | return 0; | 82 | return 0; |
82 | } | 83 | } |
83 | 84 | ||
84 | gpio_direction_output(RX51_LCD_RESET_GPIO, 1); | ||
85 | |||
86 | omap_display_init(&rx51_dss_board_info); | 85 | omap_display_init(&rx51_dss_board_info); |
87 | return 0; | 86 | return 0; |
88 | } | 87 | } |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index f8ba20a14e62..fec4cac8fa0a 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -58,21 +58,25 @@ static struct platform_device leds_gpio = { | |||
58 | }, | 58 | }, |
59 | }; | 59 | }; |
60 | 60 | ||
61 | /* | ||
62 | * cpuidle C-states definition override from the default values. | ||
63 | * The 'exit_latency' field is the sum of sleep and wake-up latencies. | ||
64 | */ | ||
61 | static struct cpuidle_params rx51_cpuidle_params[] = { | 65 | static struct cpuidle_params rx51_cpuidle_params[] = { |
62 | /* C1 */ | 66 | /* C1 */ |
63 | {1, 110, 162, 5}, | 67 | {110 + 162, 5 , 1}, |
64 | /* C2 */ | 68 | /* C2 */ |
65 | {1, 106, 180, 309}, | 69 | {106 + 180, 309, 1}, |
66 | /* C3 */ | 70 | /* C3 */ |
67 | {0, 107, 410, 46057}, | 71 | {107 + 410, 46057, 0}, |
68 | /* C4 */ | 72 | /* C4 */ |
69 | {0, 121, 3374, 46057}, | 73 | {121 + 3374, 46057, 0}, |
70 | /* C5 */ | 74 | /* C5 */ |
71 | {1, 855, 1146, 46057}, | 75 | {855 + 1146, 46057, 1}, |
72 | /* C6 */ | 76 | /* C6 */ |
73 | {0, 7580, 4134, 484329}, | 77 | {7580 + 4134, 484329, 0}, |
74 | /* C7 */ | 78 | /* C7 */ |
75 | {1, 7505, 15274, 484329}, | 79 | {7505 + 15274, 484329, 1}, |
76 | }; | 80 | }; |
77 | 81 | ||
78 | static struct omap_lcd_config rx51_lcd_config = { | 82 | static struct omap_lcd_config rx51_lcd_config = { |
diff --git a/arch/arm/mach-omap2/board-zoom-debugboard.c b/arch/arm/mach-omap2/board-zoom-debugboard.c index 007ebdc6c993..6402e781c458 100644 --- a/arch/arm/mach-omap2/board-zoom-debugboard.c +++ b/arch/arm/mach-omap2/board-zoom-debugboard.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | 16 | ||
17 | #include <plat/gpmc.h> | 17 | #include <plat/gpmc.h> |
18 | #include <plat/gpmc-smsc911x.h> | ||
18 | 19 | ||
19 | #include <mach/board-zoom.h> | 20 | #include <mach/board-zoom.h> |
20 | 21 | ||
@@ -26,60 +27,16 @@ | |||
26 | #define DEBUG_BASE 0x08000000 | 27 | #define DEBUG_BASE 0x08000000 |
27 | #define ZOOM_ETHR_START DEBUG_BASE | 28 | #define ZOOM_ETHR_START DEBUG_BASE |
28 | 29 | ||
29 | static struct resource zoom_smsc911x_resources[] = { | 30 | static struct omap_smsc911x_platform_data zoom_smsc911x_cfg = { |
30 | [0] = { | 31 | .cs = ZOOM_SMSC911X_CS, |
31 | .start = ZOOM_ETHR_START, | 32 | .gpio_irq = ZOOM_SMSC911X_GPIO, |
32 | .end = ZOOM_ETHR_START + SZ_4K, | 33 | .gpio_reset = -EINVAL, |
33 | .flags = IORESOURCE_MEM, | ||
34 | }, | ||
35 | [1] = { | ||
36 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
37 | }, | ||
38 | }; | ||
39 | |||
40 | static struct smsc911x_platform_config zoom_smsc911x_config = { | ||
41 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
42 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
43 | .flags = SMSC911X_USE_32BIT, | 34 | .flags = SMSC911X_USE_32BIT, |
44 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
45 | }; | ||
46 | |||
47 | static struct platform_device zoom_smsc911x_device = { | ||
48 | .name = "smsc911x", | ||
49 | .id = -1, | ||
50 | .num_resources = ARRAY_SIZE(zoom_smsc911x_resources), | ||
51 | .resource = zoom_smsc911x_resources, | ||
52 | .dev = { | ||
53 | .platform_data = &zoom_smsc911x_config, | ||
54 | }, | ||
55 | }; | 35 | }; |
56 | 36 | ||
57 | static inline void __init zoom_init_smsc911x(void) | 37 | static inline void __init zoom_init_smsc911x(void) |
58 | { | 38 | { |
59 | int eth_cs; | 39 | gpmc_smsc911x_init(&zoom_smsc911x_cfg); |
60 | unsigned long cs_mem_base; | ||
61 | int eth_gpio = 0; | ||
62 | |||
63 | eth_cs = ZOOM_SMSC911X_CS; | ||
64 | |||
65 | if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) { | ||
66 | printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n"); | ||
67 | return; | ||
68 | } | ||
69 | |||
70 | zoom_smsc911x_resources[0].start = cs_mem_base + 0x0; | ||
71 | zoom_smsc911x_resources[0].end = cs_mem_base + 0xff; | ||
72 | |||
73 | eth_gpio = ZOOM_SMSC911X_GPIO; | ||
74 | |||
75 | zoom_smsc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio); | ||
76 | |||
77 | if (gpio_request(eth_gpio, "smsc911x irq") < 0) { | ||
78 | printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n", | ||
79 | eth_gpio); | ||
80 | return; | ||
81 | } | ||
82 | gpio_direction_input(eth_gpio); | ||
83 | } | 40 | } |
84 | 41 | ||
85 | static struct plat_serial8250_port serial_platform_data[] = { | 42 | static struct plat_serial8250_port serial_platform_data[] = { |
@@ -120,12 +77,9 @@ static inline void __init zoom_init_quaduart(void) | |||
120 | 77 | ||
121 | quart_gpio = ZOOM_QUADUART_GPIO; | 78 | quart_gpio = ZOOM_QUADUART_GPIO; |
122 | 79 | ||
123 | if (gpio_request(quart_gpio, "TL16CP754C GPIO") < 0) { | 80 | if (gpio_request_one(quart_gpio, GPIOF_IN, "TL16CP754C GPIO") < 0) |
124 | printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n", | 81 | printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n", |
125 | quart_gpio); | 82 | quart_gpio); |
126 | return; | ||
127 | } | ||
128 | gpio_direction_input(quart_gpio); | ||
129 | } | 83 | } |
130 | 84 | ||
131 | static inline int omap_zoom_debugboard_detect(void) | 85 | static inline int omap_zoom_debugboard_detect(void) |
@@ -135,12 +89,12 @@ static inline int omap_zoom_debugboard_detect(void) | |||
135 | 89 | ||
136 | debug_board_detect = ZOOM_SMSC911X_GPIO; | 90 | debug_board_detect = ZOOM_SMSC911X_GPIO; |
137 | 91 | ||
138 | if (gpio_request(debug_board_detect, "Zoom debug board detect") < 0) { | 92 | if (gpio_request_one(debug_board_detect, GPIOF_IN, |
93 | "Zoom debug board detect") < 0) { | ||
139 | printk(KERN_ERR "Failed to request GPIO%d for Zoom debug" | 94 | printk(KERN_ERR "Failed to request GPIO%d for Zoom debug" |
140 | "board detect\n", debug_board_detect); | 95 | "board detect\n", debug_board_detect); |
141 | return 0; | 96 | return 0; |
142 | } | 97 | } |
143 | gpio_direction_input(debug_board_detect); | ||
144 | 98 | ||
145 | if (!gpio_get_value(debug_board_detect)) { | 99 | if (!gpio_get_value(debug_board_detect)) { |
146 | ret = 0; | 100 | ret = 0; |
@@ -150,7 +104,6 @@ static inline int omap_zoom_debugboard_detect(void) | |||
150 | } | 104 | } |
151 | 105 | ||
152 | static struct platform_device *zoom_devices[] __initdata = { | 106 | static struct platform_device *zoom_devices[] __initdata = { |
153 | &zoom_smsc911x_device, | ||
154 | &zoom_debugboard_serial_device, | 107 | &zoom_debugboard_serial_device, |
155 | }; | 108 | }; |
156 | 109 | ||
diff --git a/arch/arm/mach-omap2/board-zoom-display.c b/arch/arm/mach-omap2/board-zoom-display.c index 60e8645db59d..c7c6beb1ec24 100644 --- a/arch/arm/mach-omap2/board-zoom-display.c +++ b/arch/arm/mach-omap2/board-zoom-display.c | |||
@@ -21,34 +21,19 @@ | |||
21 | #define LCD_PANEL_RESET_GPIO_PILOT 55 | 21 | #define LCD_PANEL_RESET_GPIO_PILOT 55 |
22 | #define LCD_PANEL_QVGA_GPIO 56 | 22 | #define LCD_PANEL_QVGA_GPIO 56 |
23 | 23 | ||
24 | static struct gpio zoom_lcd_gpios[] __initdata = { | ||
25 | { -EINVAL, GPIOF_OUT_INIT_HIGH, "lcd reset" }, | ||
26 | { LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "lcd qvga" }, | ||
27 | }; | ||
28 | |||
24 | static void zoom_lcd_panel_init(void) | 29 | static void zoom_lcd_panel_init(void) |
25 | { | 30 | { |
26 | int ret; | 31 | zoom_lcd_gpios[0].gpio = (omap_rev() > OMAP3430_REV_ES3_0) ? |
27 | unsigned char lcd_panel_reset_gpio; | ||
28 | |||
29 | lcd_panel_reset_gpio = (omap_rev() > OMAP3430_REV_ES3_0) ? | ||
30 | LCD_PANEL_RESET_GPIO_PROD : | 32 | LCD_PANEL_RESET_GPIO_PROD : |
31 | LCD_PANEL_RESET_GPIO_PILOT; | 33 | LCD_PANEL_RESET_GPIO_PILOT; |
32 | 34 | ||
33 | ret = gpio_request(lcd_panel_reset_gpio, "lcd reset"); | 35 | if (gpio_request_array(zoom_lcd_gpios, ARRAY_SIZE(zoom_lcd_gpios))) |
34 | if (ret) { | 36 | pr_err("%s: Failed to get LCD GPIOs.\n", __func__); |
35 | pr_err("Failed to get LCD reset GPIO (gpio%d).\n", | ||
36 | lcd_panel_reset_gpio); | ||
37 | return; | ||
38 | } | ||
39 | gpio_direction_output(lcd_panel_reset_gpio, 1); | ||
40 | |||
41 | ret = gpio_request(LCD_PANEL_QVGA_GPIO, "lcd qvga"); | ||
42 | if (ret) { | ||
43 | pr_err("Failed to get LCD_PANEL_QVGA_GPIO (gpio%d).\n", | ||
44 | LCD_PANEL_QVGA_GPIO); | ||
45 | goto err0; | ||
46 | } | ||
47 | gpio_direction_output(LCD_PANEL_QVGA_GPIO, 1); | ||
48 | |||
49 | return; | ||
50 | err0: | ||
51 | gpio_free(lcd_panel_reset_gpio); | ||
52 | } | 37 | } |
53 | 38 | ||
54 | static int zoom_panel_enable_lcd(struct omap_dss_device *dssdev) | 39 | static int zoom_panel_enable_lcd(struct omap_dss_device *dssdev) |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 8dee7549fbdf..118c6f53c5eb 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
@@ -31,6 +31,7 @@ | |||
31 | 31 | ||
32 | #include "mux.h" | 32 | #include "mux.h" |
33 | #include "hsmmc.h" | 33 | #include "hsmmc.h" |
34 | #include "common-board-devices.h" | ||
34 | 35 | ||
35 | #define OMAP_ZOOM_WLAN_PMENA_GPIO (101) | 36 | #define OMAP_ZOOM_WLAN_PMENA_GPIO (101) |
36 | #define OMAP_ZOOM_WLAN_IRQ_GPIO (162) | 37 | #define OMAP_ZOOM_WLAN_IRQ_GPIO (162) |
@@ -276,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev, | |||
276 | zoom_vsim_supply.dev = mmc[0].dev; | 277 | zoom_vsim_supply.dev = mmc[0].dev; |
277 | zoom_vmmc2_supply.dev = mmc[1].dev; | 278 | zoom_vmmc2_supply.dev = mmc[1].dev; |
278 | 279 | ||
279 | ret = gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd enable"); | 280 | ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, |
280 | if (ret) { | 281 | "lcd enable"); |
282 | if (ret) | ||
281 | pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n", | 283 | pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n", |
282 | LCD_PANEL_ENABLE_GPIO); | 284 | LCD_PANEL_ENABLE_GPIO); |
283 | return ret; | ||
284 | } | ||
285 | gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); | ||
286 | 285 | ||
287 | return ret; | 286 | return ret; |
288 | } | 287 | } |
@@ -349,15 +348,6 @@ static struct twl4030_platform_data zoom_twldata = { | |||
349 | .vdac = &zoom_vdac, | 348 | .vdac = &zoom_vdac, |
350 | }; | 349 | }; |
351 | 350 | ||
352 | static struct i2c_board_info __initdata zoom_i2c_boardinfo[] = { | ||
353 | { | ||
354 | I2C_BOARD_INFO("twl5030", 0x48), | ||
355 | .flags = I2C_CLIENT_WAKE, | ||
356 | .irq = INT_34XX_SYS_NIRQ, | ||
357 | .platform_data = &zoom_twldata, | ||
358 | }, | ||
359 | }; | ||
360 | |||
361 | static int __init omap_i2c_init(void) | 351 | static int __init omap_i2c_init(void) |
362 | { | 352 | { |
363 | if (machine_is_omap_zoom2()) { | 353 | if (machine_is_omap_zoom2()) { |
@@ -365,19 +355,12 @@ static int __init omap_i2c_init(void) | |||
365 | zoom_audio_data.hs_extmute = 1; | 355 | zoom_audio_data.hs_extmute = 1; |
366 | zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute; | 356 | zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute; |
367 | } | 357 | } |
368 | omap_register_i2c_bus(1, 2400, zoom_i2c_boardinfo, | 358 | omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata); |
369 | ARRAY_SIZE(zoom_i2c_boardinfo)); | ||
370 | omap_register_i2c_bus(2, 400, NULL, 0); | 359 | omap_register_i2c_bus(2, 400, NULL, 0); |
371 | omap_register_i2c_bus(3, 400, NULL, 0); | 360 | omap_register_i2c_bus(3, 400, NULL, 0); |
372 | return 0; | 361 | return 0; |
373 | } | 362 | } |
374 | 363 | ||
375 | static struct omap_musb_board_data musb_board_data = { | ||
376 | .interface_type = MUSB_INTERFACE_ULPI, | ||
377 | .mode = MUSB_OTG, | ||
378 | .power = 100, | ||
379 | }; | ||
380 | |||
381 | static void enable_board_wakeup_source(void) | 364 | static void enable_board_wakeup_source(void) |
382 | { | 365 | { |
383 | /* T2 interrupt line (keypad) */ | 366 | /* T2 interrupt line (keypad) */ |
@@ -392,7 +375,7 @@ void __init zoom_peripherals_init(void) | |||
392 | 375 | ||
393 | omap_i2c_init(); | 376 | omap_i2c_init(); |
394 | platform_device_register(&omap_vwlan_device); | 377 | platform_device_register(&omap_vwlan_device); |
395 | usb_musb_init(&musb_board_data); | 378 | usb_musb_init(NULL); |
396 | enable_board_wakeup_source(); | 379 | enable_board_wakeup_source(); |
397 | omap_serial_init(); | 380 | omap_serial_init(); |
398 | } | 381 | } |
diff --git a/arch/arm/mach-omap2/common-board-devices.c b/arch/arm/mach-omap2/common-board-devices.c new file mode 100644 index 000000000000..e94903b2c65b --- /dev/null +++ b/arch/arm/mach-omap2/common-board-devices.c | |||
@@ -0,0 +1,163 @@ | |||
1 | /* | ||
2 | * common-board-devices.c | ||
3 | * | ||
4 | * Copyright (C) 2011 CompuLab, Ltd. | ||
5 | * Author: Mike Rapoport <mike@compulab.co.il> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * version 2 as published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
19 | * 02110-1301 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/i2c/twl.h> | ||
25 | |||
26 | #include <linux/gpio.h> | ||
27 | #include <linux/spi/spi.h> | ||
28 | #include <linux/spi/ads7846.h> | ||
29 | |||
30 | #include <plat/i2c.h> | ||
31 | #include <plat/mcspi.h> | ||
32 | #include <plat/nand.h> | ||
33 | |||
34 | #include "common-board-devices.h" | ||
35 | |||
36 | static struct i2c_board_info __initdata pmic_i2c_board_info = { | ||
37 | .addr = 0x48, | ||
38 | .flags = I2C_CLIENT_WAKE, | ||
39 | }; | ||
40 | |||
41 | void __init omap_pmic_init(int bus, u32 clkrate, | ||
42 | const char *pmic_type, int pmic_irq, | ||
43 | struct twl4030_platform_data *pmic_data) | ||
44 | { | ||
45 | strncpy(pmic_i2c_board_info.type, pmic_type, | ||
46 | sizeof(pmic_i2c_board_info.type)); | ||
47 | pmic_i2c_board_info.irq = pmic_irq; | ||
48 | pmic_i2c_board_info.platform_data = pmic_data; | ||
49 | |||
50 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); | ||
51 | } | ||
52 | |||
53 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ | ||
54 | defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | ||
55 | static struct omap2_mcspi_device_config ads7846_mcspi_config = { | ||
56 | .turbo_mode = 0, | ||
57 | .single_channel = 1, /* 0: slave, 1: master */ | ||
58 | }; | ||
59 | |||
60 | static struct ads7846_platform_data ads7846_config = { | ||
61 | .x_max = 0x0fff, | ||
62 | .y_max = 0x0fff, | ||
63 | .x_plate_ohms = 180, | ||
64 | .pressure_max = 255, | ||
65 | .debounce_max = 10, | ||
66 | .debounce_tol = 3, | ||
67 | .debounce_rep = 1, | ||
68 | .gpio_pendown = -EINVAL, | ||
69 | .keep_vref_on = 1, | ||
70 | }; | ||
71 | |||
72 | static struct spi_board_info ads7846_spi_board_info __initdata = { | ||
73 | .modalias = "ads7846", | ||
74 | .bus_num = -EINVAL, | ||
75 | .chip_select = 0, | ||
76 | .max_speed_hz = 1500000, | ||
77 | .controller_data = &ads7846_mcspi_config, | ||
78 | .irq = -EINVAL, | ||
79 | .platform_data = &ads7846_config, | ||
80 | }; | ||
81 | |||
82 | void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, | ||
83 | struct ads7846_platform_data *board_pdata) | ||
84 | { | ||
85 | struct spi_board_info *spi_bi = &ads7846_spi_board_info; | ||
86 | int err; | ||
87 | |||
88 | err = gpio_request(gpio_pendown, "TS PenDown"); | ||
89 | if (err) { | ||
90 | pr_err("Could not obtain gpio for TS PenDown: %d\n", err); | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | gpio_direction_input(gpio_pendown); | ||
95 | gpio_export(gpio_pendown, 0); | ||
96 | |||
97 | if (gpio_debounce) | ||
98 | gpio_set_debounce(gpio_pendown, gpio_debounce); | ||
99 | |||
100 | ads7846_config.gpio_pendown = gpio_pendown; | ||
101 | |||
102 | spi_bi->bus_num = bus_num; | ||
103 | spi_bi->irq = OMAP_GPIO_IRQ(gpio_pendown); | ||
104 | |||
105 | if (board_pdata) | ||
106 | spi_bi->platform_data = board_pdata; | ||
107 | |||
108 | spi_register_board_info(&ads7846_spi_board_info, 1); | ||
109 | } | ||
110 | #else | ||
111 | void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, | ||
112 | struct ads7846_platform_data *board_pdata) | ||
113 | { | ||
114 | } | ||
115 | #endif | ||
116 | |||
117 | #if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE) | ||
118 | static struct omap_nand_platform_data nand_data = { | ||
119 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
120 | }; | ||
121 | |||
122 | void __init omap_nand_flash_init(int options, struct mtd_partition *parts, | ||
123 | int nr_parts) | ||
124 | { | ||
125 | u8 cs = 0; | ||
126 | u8 nandcs = GPMC_CS_NUM + 1; | ||
127 | |||
128 | /* find out the chip-select on which NAND exists */ | ||
129 | while (cs < GPMC_CS_NUM) { | ||
130 | u32 ret = 0; | ||
131 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | ||
132 | |||
133 | if ((ret & 0xC00) == 0x800) { | ||
134 | printk(KERN_INFO "Found NAND on CS%d\n", cs); | ||
135 | if (nandcs > GPMC_CS_NUM) | ||
136 | nandcs = cs; | ||
137 | } | ||
138 | cs++; | ||
139 | } | ||
140 | |||
141 | if (nandcs > GPMC_CS_NUM) { | ||
142 | printk(KERN_INFO "NAND: Unable to find configuration " | ||
143 | "in GPMC\n "); | ||
144 | return; | ||
145 | } | ||
146 | |||
147 | if (nandcs < GPMC_CS_NUM) { | ||
148 | nand_data.cs = nandcs; | ||
149 | nand_data.parts = parts; | ||
150 | nand_data.nr_parts = nr_parts; | ||
151 | nand_data.options = options; | ||
152 | |||
153 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); | ||
154 | if (gpmc_nand_init(&nand_data) < 0) | ||
155 | printk(KERN_ERR "Unable to register NAND device\n"); | ||
156 | } | ||
157 | } | ||
158 | #else | ||
159 | void __init omap_nand_flash_init(int options, struct mtd_partition *parts, | ||
160 | int nr_parts) | ||
161 | { | ||
162 | } | ||
163 | #endif | ||
diff --git a/arch/arm/mach-omap2/common-board-devices.h b/arch/arm/mach-omap2/common-board-devices.h new file mode 100644 index 000000000000..eb80b3b0ef47 --- /dev/null +++ b/arch/arm/mach-omap2/common-board-devices.h | |||
@@ -0,0 +1,35 @@ | |||
1 | #ifndef __OMAP_COMMON_BOARD_DEVICES__ | ||
2 | #define __OMAP_COMMON_BOARD_DEVICES__ | ||
3 | |||
4 | struct twl4030_platform_data; | ||
5 | struct mtd_partition; | ||
6 | |||
7 | void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, | ||
8 | struct twl4030_platform_data *pmic_data); | ||
9 | |||
10 | static inline void omap2_pmic_init(const char *pmic_type, | ||
11 | struct twl4030_platform_data *pmic_data) | ||
12 | { | ||
13 | omap_pmic_init(2, 2600, pmic_type, INT_24XX_SYS_NIRQ, pmic_data); | ||
14 | } | ||
15 | |||
16 | static inline void omap3_pmic_init(const char *pmic_type, | ||
17 | struct twl4030_platform_data *pmic_data) | ||
18 | { | ||
19 | omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data); | ||
20 | } | ||
21 | |||
22 | static inline void omap4_pmic_init(const char *pmic_type, | ||
23 | struct twl4030_platform_data *pmic_data) | ||
24 | { | ||
25 | /* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */ | ||
26 | omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data); | ||
27 | } | ||
28 | |||
29 | struct ads7846_platform_data; | ||
30 | |||
31 | void omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, | ||
32 | struct ads7846_platform_data *board_pdata); | ||
33 | void omap_nand_flash_init(int opts, struct mtd_partition *parts, int n_parts); | ||
34 | |||
35 | #endif /* __OMAP_COMMON_BOARD_DEVICES__ */ | ||
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index 1c240eff3918..4bf6e6e8b100 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
@@ -36,36 +36,6 @@ | |||
36 | 36 | ||
37 | #ifdef CONFIG_CPU_IDLE | 37 | #ifdef CONFIG_CPU_IDLE |
38 | 38 | ||
39 | #define OMAP3_MAX_STATES 7 | ||
40 | #define OMAP3_STATE_C1 0 /* C1 - MPU WFI + Core active */ | ||
41 | #define OMAP3_STATE_C2 1 /* C2 - MPU WFI + Core inactive */ | ||
42 | #define OMAP3_STATE_C3 2 /* C3 - MPU CSWR + Core inactive */ | ||
43 | #define OMAP3_STATE_C4 3 /* C4 - MPU OFF + Core iactive */ | ||
44 | #define OMAP3_STATE_C5 4 /* C5 - MPU RET + Core RET */ | ||
45 | #define OMAP3_STATE_C6 5 /* C6 - MPU OFF + Core RET */ | ||
46 | #define OMAP3_STATE_C7 6 /* C7 - MPU OFF + Core OFF */ | ||
47 | |||
48 | #define OMAP3_STATE_MAX OMAP3_STATE_C7 | ||
49 | |||
50 | #define CPUIDLE_FLAG_CHECK_BM 0x10000 /* use omap3_enter_idle_bm() */ | ||
51 | |||
52 | struct omap3_processor_cx { | ||
53 | u8 valid; | ||
54 | u8 type; | ||
55 | u32 sleep_latency; | ||
56 | u32 wakeup_latency; | ||
57 | u32 mpu_state; | ||
58 | u32 core_state; | ||
59 | u32 threshold; | ||
60 | u32 flags; | ||
61 | const char *desc; | ||
62 | }; | ||
63 | |||
64 | struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES]; | ||
65 | struct omap3_processor_cx current_cx_state; | ||
66 | struct powerdomain *mpu_pd, *core_pd, *per_pd; | ||
67 | struct powerdomain *cam_pd; | ||
68 | |||
69 | /* | 39 | /* |
70 | * The latencies/thresholds for various C states have | 40 | * The latencies/thresholds for various C states have |
71 | * to be configured from the respective board files. | 41 | * to be configured from the respective board files. |
@@ -75,27 +45,31 @@ struct powerdomain *cam_pd; | |||
75 | */ | 45 | */ |
76 | static struct cpuidle_params cpuidle_params_table[] = { | 46 | static struct cpuidle_params cpuidle_params_table[] = { |
77 | /* C1 */ | 47 | /* C1 */ |
78 | {1, 2, 2, 5}, | 48 | {2 + 2, 5, 1}, |
79 | /* C2 */ | 49 | /* C2 */ |
80 | {1, 10, 10, 30}, | 50 | {10 + 10, 30, 1}, |
81 | /* C3 */ | 51 | /* C3 */ |
82 | {1, 50, 50, 300}, | 52 | {50 + 50, 300, 1}, |
83 | /* C4 */ | 53 | /* C4 */ |
84 | {1, 1500, 1800, 4000}, | 54 | {1500 + 1800, 4000, 1}, |
85 | /* C5 */ | 55 | /* C5 */ |
86 | {1, 2500, 7500, 12000}, | 56 | {2500 + 7500, 12000, 1}, |
87 | /* C6 */ | 57 | /* C6 */ |
88 | {1, 3000, 8500, 15000}, | 58 | {3000 + 8500, 15000, 1}, |
89 | /* C7 */ | 59 | /* C7 */ |
90 | {1, 10000, 30000, 300000}, | 60 | {10000 + 30000, 300000, 1}, |
91 | }; | 61 | }; |
62 | #define OMAP3_NUM_STATES ARRAY_SIZE(cpuidle_params_table) | ||
92 | 63 | ||
93 | static int omap3_idle_bm_check(void) | 64 | /* Mach specific information to be recorded in the C-state driver_data */ |
94 | { | 65 | struct omap3_idle_statedata { |
95 | if (!omap3_can_sleep()) | 66 | u32 mpu_state; |
96 | return 1; | 67 | u32 core_state; |
97 | return 0; | 68 | u8 valid; |
98 | } | 69 | }; |
70 | struct omap3_idle_statedata omap3_idle_data[OMAP3_NUM_STATES]; | ||
71 | |||
72 | struct powerdomain *mpu_pd, *core_pd, *per_pd, *cam_pd; | ||
99 | 73 | ||
100 | static int _cpuidle_allow_idle(struct powerdomain *pwrdm, | 74 | static int _cpuidle_allow_idle(struct powerdomain *pwrdm, |
101 | struct clockdomain *clkdm) | 75 | struct clockdomain *clkdm) |
@@ -122,12 +96,10 @@ static int _cpuidle_deny_idle(struct powerdomain *pwrdm, | |||
122 | static int omap3_enter_idle(struct cpuidle_device *dev, | 96 | static int omap3_enter_idle(struct cpuidle_device *dev, |
123 | struct cpuidle_state *state) | 97 | struct cpuidle_state *state) |
124 | { | 98 | { |
125 | struct omap3_processor_cx *cx = cpuidle_get_statedata(state); | 99 | struct omap3_idle_statedata *cx = cpuidle_get_statedata(state); |
126 | struct timespec ts_preidle, ts_postidle, ts_idle; | 100 | struct timespec ts_preidle, ts_postidle, ts_idle; |
127 | u32 mpu_state = cx->mpu_state, core_state = cx->core_state; | 101 | u32 mpu_state = cx->mpu_state, core_state = cx->core_state; |
128 | 102 | ||
129 | current_cx_state = *cx; | ||
130 | |||
131 | /* Used to keep track of the total time in idle */ | 103 | /* Used to keep track of the total time in idle */ |
132 | getnstimeofday(&ts_preidle); | 104 | getnstimeofday(&ts_preidle); |
133 | 105 | ||
@@ -140,7 +112,8 @@ static int omap3_enter_idle(struct cpuidle_device *dev, | |||
140 | if (omap_irq_pending() || need_resched()) | 112 | if (omap_irq_pending() || need_resched()) |
141 | goto return_sleep_time; | 113 | goto return_sleep_time; |
142 | 114 | ||
143 | if (cx->type == OMAP3_STATE_C1) { | 115 | /* Deny idle for C1 */ |
116 | if (state == &dev->states[0]) { | ||
144 | pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle); | 117 | pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle); |
145 | pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle); | 118 | pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle); |
146 | } | 119 | } |
@@ -148,7 +121,8 @@ static int omap3_enter_idle(struct cpuidle_device *dev, | |||
148 | /* Execute ARM wfi */ | 121 | /* Execute ARM wfi */ |
149 | omap_sram_idle(); | 122 | omap_sram_idle(); |
150 | 123 | ||
151 | if (cx->type == OMAP3_STATE_C1) { | 124 | /* Re-allow idle for C1 */ |
125 | if (state == &dev->states[0]) { | ||
152 | pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle); | 126 | pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle); |
153 | pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle); | 127 | pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle); |
154 | } | 128 | } |
@@ -164,41 +138,53 @@ return_sleep_time: | |||
164 | } | 138 | } |
165 | 139 | ||
166 | /** | 140 | /** |
167 | * next_valid_state - Find next valid c-state | 141 | * next_valid_state - Find next valid C-state |
168 | * @dev: cpuidle device | 142 | * @dev: cpuidle device |
169 | * @state: Currently selected c-state | 143 | * @state: Currently selected C-state |
170 | * | 144 | * |
171 | * If the current state is valid, it is returned back to the caller. | 145 | * If the current state is valid, it is returned back to the caller. |
172 | * Else, this function searches for a lower c-state which is still | 146 | * Else, this function searches for a lower c-state which is still |
173 | * valid (as defined in omap3_power_states[]). | 147 | * valid. |
148 | * | ||
149 | * A state is valid if the 'valid' field is enabled and | ||
150 | * if it satisfies the enable_off_mode condition. | ||
174 | */ | 151 | */ |
175 | static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev, | 152 | static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev, |
176 | struct cpuidle_state *curr) | 153 | struct cpuidle_state *curr) |
177 | { | 154 | { |
178 | struct cpuidle_state *next = NULL; | 155 | struct cpuidle_state *next = NULL; |
179 | struct omap3_processor_cx *cx; | 156 | struct omap3_idle_statedata *cx = cpuidle_get_statedata(curr); |
157 | u32 mpu_deepest_state = PWRDM_POWER_RET; | ||
158 | u32 core_deepest_state = PWRDM_POWER_RET; | ||
180 | 159 | ||
181 | cx = (struct omap3_processor_cx *)cpuidle_get_statedata(curr); | 160 | if (enable_off_mode) { |
161 | mpu_deepest_state = PWRDM_POWER_OFF; | ||
162 | /* | ||
163 | * Erratum i583: valable for ES rev < Es1.2 on 3630. | ||
164 | * CORE OFF mode is not supported in a stable form, restrict | ||
165 | * instead the CORE state to RET. | ||
166 | */ | ||
167 | if (!IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) | ||
168 | core_deepest_state = PWRDM_POWER_OFF; | ||
169 | } | ||
182 | 170 | ||
183 | /* Check if current state is valid */ | 171 | /* Check if current state is valid */ |
184 | if (cx->valid) { | 172 | if ((cx->valid) && |
173 | (cx->mpu_state >= mpu_deepest_state) && | ||
174 | (cx->core_state >= core_deepest_state)) { | ||
185 | return curr; | 175 | return curr; |
186 | } else { | 176 | } else { |
187 | u8 idx = OMAP3_STATE_MAX; | 177 | int idx = OMAP3_NUM_STATES - 1; |
188 | 178 | ||
189 | /* | 179 | /* Reach the current state starting at highest C-state */ |
190 | * Reach the current state starting at highest C-state | 180 | for (; idx >= 0; idx--) { |
191 | */ | ||
192 | for (; idx >= OMAP3_STATE_C1; idx--) { | ||
193 | if (&dev->states[idx] == curr) { | 181 | if (&dev->states[idx] == curr) { |
194 | next = &dev->states[idx]; | 182 | next = &dev->states[idx]; |
195 | break; | 183 | break; |
196 | } | 184 | } |
197 | } | 185 | } |
198 | 186 | ||
199 | /* | 187 | /* Should never hit this condition */ |
200 | * Should never hit this condition. | ||
201 | */ | ||
202 | WARN_ON(next == NULL); | 188 | WARN_ON(next == NULL); |
203 | 189 | ||
204 | /* | 190 | /* |
@@ -206,17 +192,17 @@ static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev, | |||
206 | * Start search from the next (lower) state. | 192 | * Start search from the next (lower) state. |
207 | */ | 193 | */ |
208 | idx--; | 194 | idx--; |
209 | for (; idx >= OMAP3_STATE_C1; idx--) { | 195 | for (; idx >= 0; idx--) { |
210 | struct omap3_processor_cx *cx; | ||
211 | |||
212 | cx = cpuidle_get_statedata(&dev->states[idx]); | 196 | cx = cpuidle_get_statedata(&dev->states[idx]); |
213 | if (cx->valid) { | 197 | if ((cx->valid) && |
198 | (cx->mpu_state >= mpu_deepest_state) && | ||
199 | (cx->core_state >= core_deepest_state)) { | ||
214 | next = &dev->states[idx]; | 200 | next = &dev->states[idx]; |
215 | break; | 201 | break; |
216 | } | 202 | } |
217 | } | 203 | } |
218 | /* | 204 | /* |
219 | * C1 and C2 are always valid. | 205 | * C1 is always valid. |
220 | * So, no need to check for 'next==NULL' outside this loop. | 206 | * So, no need to check for 'next==NULL' outside this loop. |
221 | */ | 207 | */ |
222 | } | 208 | } |
@@ -229,36 +215,22 @@ static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev, | |||
229 | * @dev: cpuidle device | 215 | * @dev: cpuidle device |
230 | * @state: The target state to be programmed | 216 | * @state: The target state to be programmed |
231 | * | 217 | * |
232 | * Used for C states with CPUIDLE_FLAG_CHECK_BM flag set. This | 218 | * This function checks for any pending activity and then programs |
233 | * function checks for any pending activity and then programs the | 219 | * the device to the specified or a safer state. |
234 | * device to the specified or a safer state. | ||
235 | */ | 220 | */ |
236 | static int omap3_enter_idle_bm(struct cpuidle_device *dev, | 221 | static int omap3_enter_idle_bm(struct cpuidle_device *dev, |
237 | struct cpuidle_state *state) | 222 | struct cpuidle_state *state) |
238 | { | 223 | { |
239 | struct cpuidle_state *new_state = next_valid_state(dev, state); | 224 | struct cpuidle_state *new_state; |
240 | u32 core_next_state, per_next_state = 0, per_saved_state = 0; | 225 | u32 core_next_state, per_next_state = 0, per_saved_state = 0, cam_state; |
241 | u32 cam_state; | 226 | struct omap3_idle_statedata *cx; |
242 | struct omap3_processor_cx *cx; | ||
243 | int ret; | 227 | int ret; |
244 | 228 | ||
245 | if ((state->flags & CPUIDLE_FLAG_CHECK_BM) && omap3_idle_bm_check()) { | 229 | if (!omap3_can_sleep()) { |
246 | BUG_ON(!dev->safe_state); | ||
247 | new_state = dev->safe_state; | 230 | new_state = dev->safe_state; |
248 | goto select_state; | 231 | goto select_state; |
249 | } | 232 | } |
250 | 233 | ||
251 | cx = cpuidle_get_statedata(state); | ||
252 | core_next_state = cx->core_state; | ||
253 | |||
254 | /* | ||
255 | * FIXME: we currently manage device-specific idle states | ||
256 | * for PER and CORE in combination with CPU-specific | ||
257 | * idle states. This is wrong, and device-specific | ||
258 | * idle management needs to be separated out into | ||
259 | * its own code. | ||
260 | */ | ||
261 | |||
262 | /* | 234 | /* |
263 | * Prevent idle completely if CAM is active. | 235 | * Prevent idle completely if CAM is active. |
264 | * CAM does not have wakeup capability in OMAP3. | 236 | * CAM does not have wakeup capability in OMAP3. |
@@ -270,9 +242,19 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, | |||
270 | } | 242 | } |
271 | 243 | ||
272 | /* | 244 | /* |
245 | * FIXME: we currently manage device-specific idle states | ||
246 | * for PER and CORE in combination with CPU-specific | ||
247 | * idle states. This is wrong, and device-specific | ||
248 | * idle management needs to be separated out into | ||
249 | * its own code. | ||
250 | */ | ||
251 | |||
252 | /* | ||
273 | * Prevent PER off if CORE is not in retention or off as this | 253 | * Prevent PER off if CORE is not in retention or off as this |
274 | * would disable PER wakeups completely. | 254 | * would disable PER wakeups completely. |
275 | */ | 255 | */ |
256 | cx = cpuidle_get_statedata(state); | ||
257 | core_next_state = cx->core_state; | ||
276 | per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd); | 258 | per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd); |
277 | if ((per_next_state == PWRDM_POWER_OFF) && | 259 | if ((per_next_state == PWRDM_POWER_OFF) && |
278 | (core_next_state > PWRDM_POWER_RET)) | 260 | (core_next_state > PWRDM_POWER_RET)) |
@@ -282,6 +264,8 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, | |||
282 | if (per_next_state != per_saved_state) | 264 | if (per_next_state != per_saved_state) |
283 | pwrdm_set_next_pwrst(per_pd, per_next_state); | 265 | pwrdm_set_next_pwrst(per_pd, per_next_state); |
284 | 266 | ||
267 | new_state = next_valid_state(dev, state); | ||
268 | |||
285 | select_state: | 269 | select_state: |
286 | dev->last_state = new_state; | 270 | dev->last_state = new_state; |
287 | ret = omap3_enter_idle(dev, new_state); | 271 | ret = omap3_enter_idle(dev, new_state); |
@@ -295,31 +279,6 @@ select_state: | |||
295 | 279 | ||
296 | DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev); | 280 | DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev); |
297 | 281 | ||
298 | /** | ||
299 | * omap3_cpuidle_update_states() - Update the cpuidle states | ||
300 | * @mpu_deepest_state: Enable states up to and including this for mpu domain | ||
301 | * @core_deepest_state: Enable states up to and including this for core domain | ||
302 | * | ||
303 | * This goes through the list of states available and enables and disables the | ||
304 | * validity of C states based on deepest state that can be achieved for the | ||
305 | * variable domain | ||
306 | */ | ||
307 | void omap3_cpuidle_update_states(u32 mpu_deepest_state, u32 core_deepest_state) | ||
308 | { | ||
309 | int i; | ||
310 | |||
311 | for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) { | ||
312 | struct omap3_processor_cx *cx = &omap3_power_states[i]; | ||
313 | |||
314 | if ((cx->mpu_state >= mpu_deepest_state) && | ||
315 | (cx->core_state >= core_deepest_state)) { | ||
316 | cx->valid = 1; | ||
317 | } else { | ||
318 | cx->valid = 0; | ||
319 | } | ||
320 | } | ||
321 | } | ||
322 | |||
323 | void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) | 282 | void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) |
324 | { | 283 | { |
325 | int i; | 284 | int i; |
@@ -327,212 +286,109 @@ void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) | |||
327 | if (!cpuidle_board_params) | 286 | if (!cpuidle_board_params) |
328 | return; | 287 | return; |
329 | 288 | ||
330 | for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) { | 289 | for (i = 0; i < OMAP3_NUM_STATES; i++) { |
331 | cpuidle_params_table[i].valid = | 290 | cpuidle_params_table[i].valid = cpuidle_board_params[i].valid; |
332 | cpuidle_board_params[i].valid; | 291 | cpuidle_params_table[i].exit_latency = |
333 | cpuidle_params_table[i].sleep_latency = | 292 | cpuidle_board_params[i].exit_latency; |
334 | cpuidle_board_params[i].sleep_latency; | 293 | cpuidle_params_table[i].target_residency = |
335 | cpuidle_params_table[i].wake_latency = | 294 | cpuidle_board_params[i].target_residency; |
336 | cpuidle_board_params[i].wake_latency; | ||
337 | cpuidle_params_table[i].threshold = | ||
338 | cpuidle_board_params[i].threshold; | ||
339 | } | 295 | } |
340 | return; | 296 | return; |
341 | } | 297 | } |
342 | 298 | ||
343 | /* omap3_init_power_states - Initialises the OMAP3 specific C states. | ||
344 | * | ||
345 | * Below is the desciption of each C state. | ||
346 | * C1 . MPU WFI + Core active | ||
347 | * C2 . MPU WFI + Core inactive | ||
348 | * C3 . MPU CSWR + Core inactive | ||
349 | * C4 . MPU OFF + Core inactive | ||
350 | * C5 . MPU CSWR + Core CSWR | ||
351 | * C6 . MPU OFF + Core CSWR | ||
352 | * C7 . MPU OFF + Core OFF | ||
353 | */ | ||
354 | void omap_init_power_states(void) | ||
355 | { | ||
356 | /* C1 . MPU WFI + Core active */ | ||
357 | omap3_power_states[OMAP3_STATE_C1].valid = | ||
358 | cpuidle_params_table[OMAP3_STATE_C1].valid; | ||
359 | omap3_power_states[OMAP3_STATE_C1].type = OMAP3_STATE_C1; | ||
360 | omap3_power_states[OMAP3_STATE_C1].sleep_latency = | ||
361 | cpuidle_params_table[OMAP3_STATE_C1].sleep_latency; | ||
362 | omap3_power_states[OMAP3_STATE_C1].wakeup_latency = | ||
363 | cpuidle_params_table[OMAP3_STATE_C1].wake_latency; | ||
364 | omap3_power_states[OMAP3_STATE_C1].threshold = | ||
365 | cpuidle_params_table[OMAP3_STATE_C1].threshold; | ||
366 | omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON; | ||
367 | omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON; | ||
368 | omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID; | ||
369 | omap3_power_states[OMAP3_STATE_C1].desc = "MPU ON + CORE ON"; | ||
370 | |||
371 | /* C2 . MPU WFI + Core inactive */ | ||
372 | omap3_power_states[OMAP3_STATE_C2].valid = | ||
373 | cpuidle_params_table[OMAP3_STATE_C2].valid; | ||
374 | omap3_power_states[OMAP3_STATE_C2].type = OMAP3_STATE_C2; | ||
375 | omap3_power_states[OMAP3_STATE_C2].sleep_latency = | ||
376 | cpuidle_params_table[OMAP3_STATE_C2].sleep_latency; | ||
377 | omap3_power_states[OMAP3_STATE_C2].wakeup_latency = | ||
378 | cpuidle_params_table[OMAP3_STATE_C2].wake_latency; | ||
379 | omap3_power_states[OMAP3_STATE_C2].threshold = | ||
380 | cpuidle_params_table[OMAP3_STATE_C2].threshold; | ||
381 | omap3_power_states[OMAP3_STATE_C2].mpu_state = PWRDM_POWER_ON; | ||
382 | omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON; | ||
383 | omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID | | ||
384 | CPUIDLE_FLAG_CHECK_BM; | ||
385 | omap3_power_states[OMAP3_STATE_C2].desc = "MPU ON + CORE ON"; | ||
386 | |||
387 | /* C3 . MPU CSWR + Core inactive */ | ||
388 | omap3_power_states[OMAP3_STATE_C3].valid = | ||
389 | cpuidle_params_table[OMAP3_STATE_C3].valid; | ||
390 | omap3_power_states[OMAP3_STATE_C3].type = OMAP3_STATE_C3; | ||
391 | omap3_power_states[OMAP3_STATE_C3].sleep_latency = | ||
392 | cpuidle_params_table[OMAP3_STATE_C3].sleep_latency; | ||
393 | omap3_power_states[OMAP3_STATE_C3].wakeup_latency = | ||
394 | cpuidle_params_table[OMAP3_STATE_C3].wake_latency; | ||
395 | omap3_power_states[OMAP3_STATE_C3].threshold = | ||
396 | cpuidle_params_table[OMAP3_STATE_C3].threshold; | ||
397 | omap3_power_states[OMAP3_STATE_C3].mpu_state = PWRDM_POWER_RET; | ||
398 | omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON; | ||
399 | omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID | | ||
400 | CPUIDLE_FLAG_CHECK_BM; | ||
401 | omap3_power_states[OMAP3_STATE_C3].desc = "MPU RET + CORE ON"; | ||
402 | |||
403 | /* C4 . MPU OFF + Core inactive */ | ||
404 | omap3_power_states[OMAP3_STATE_C4].valid = | ||
405 | cpuidle_params_table[OMAP3_STATE_C4].valid; | ||
406 | omap3_power_states[OMAP3_STATE_C4].type = OMAP3_STATE_C4; | ||
407 | omap3_power_states[OMAP3_STATE_C4].sleep_latency = | ||
408 | cpuidle_params_table[OMAP3_STATE_C4].sleep_latency; | ||
409 | omap3_power_states[OMAP3_STATE_C4].wakeup_latency = | ||
410 | cpuidle_params_table[OMAP3_STATE_C4].wake_latency; | ||
411 | omap3_power_states[OMAP3_STATE_C4].threshold = | ||
412 | cpuidle_params_table[OMAP3_STATE_C4].threshold; | ||
413 | omap3_power_states[OMAP3_STATE_C4].mpu_state = PWRDM_POWER_OFF; | ||
414 | omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON; | ||
415 | omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID | | ||
416 | CPUIDLE_FLAG_CHECK_BM; | ||
417 | omap3_power_states[OMAP3_STATE_C4].desc = "MPU OFF + CORE ON"; | ||
418 | |||
419 | /* C5 . MPU CSWR + Core CSWR*/ | ||
420 | omap3_power_states[OMAP3_STATE_C5].valid = | ||
421 | cpuidle_params_table[OMAP3_STATE_C5].valid; | ||
422 | omap3_power_states[OMAP3_STATE_C5].type = OMAP3_STATE_C5; | ||
423 | omap3_power_states[OMAP3_STATE_C5].sleep_latency = | ||
424 | cpuidle_params_table[OMAP3_STATE_C5].sleep_latency; | ||
425 | omap3_power_states[OMAP3_STATE_C5].wakeup_latency = | ||
426 | cpuidle_params_table[OMAP3_STATE_C5].wake_latency; | ||
427 | omap3_power_states[OMAP3_STATE_C5].threshold = | ||
428 | cpuidle_params_table[OMAP3_STATE_C5].threshold; | ||
429 | omap3_power_states[OMAP3_STATE_C5].mpu_state = PWRDM_POWER_RET; | ||
430 | omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET; | ||
431 | omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID | | ||
432 | CPUIDLE_FLAG_CHECK_BM; | ||
433 | omap3_power_states[OMAP3_STATE_C5].desc = "MPU RET + CORE RET"; | ||
434 | |||
435 | /* C6 . MPU OFF + Core CSWR */ | ||
436 | omap3_power_states[OMAP3_STATE_C6].valid = | ||
437 | cpuidle_params_table[OMAP3_STATE_C6].valid; | ||
438 | omap3_power_states[OMAP3_STATE_C6].type = OMAP3_STATE_C6; | ||
439 | omap3_power_states[OMAP3_STATE_C6].sleep_latency = | ||
440 | cpuidle_params_table[OMAP3_STATE_C6].sleep_latency; | ||
441 | omap3_power_states[OMAP3_STATE_C6].wakeup_latency = | ||
442 | cpuidle_params_table[OMAP3_STATE_C6].wake_latency; | ||
443 | omap3_power_states[OMAP3_STATE_C6].threshold = | ||
444 | cpuidle_params_table[OMAP3_STATE_C6].threshold; | ||
445 | omap3_power_states[OMAP3_STATE_C6].mpu_state = PWRDM_POWER_OFF; | ||
446 | omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET; | ||
447 | omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID | | ||
448 | CPUIDLE_FLAG_CHECK_BM; | ||
449 | omap3_power_states[OMAP3_STATE_C6].desc = "MPU OFF + CORE RET"; | ||
450 | |||
451 | /* C7 . MPU OFF + Core OFF */ | ||
452 | omap3_power_states[OMAP3_STATE_C7].valid = | ||
453 | cpuidle_params_table[OMAP3_STATE_C7].valid; | ||
454 | omap3_power_states[OMAP3_STATE_C7].type = OMAP3_STATE_C7; | ||
455 | omap3_power_states[OMAP3_STATE_C7].sleep_latency = | ||
456 | cpuidle_params_table[OMAP3_STATE_C7].sleep_latency; | ||
457 | omap3_power_states[OMAP3_STATE_C7].wakeup_latency = | ||
458 | cpuidle_params_table[OMAP3_STATE_C7].wake_latency; | ||
459 | omap3_power_states[OMAP3_STATE_C7].threshold = | ||
460 | cpuidle_params_table[OMAP3_STATE_C7].threshold; | ||
461 | omap3_power_states[OMAP3_STATE_C7].mpu_state = PWRDM_POWER_OFF; | ||
462 | omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF; | ||
463 | omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID | | ||
464 | CPUIDLE_FLAG_CHECK_BM; | ||
465 | omap3_power_states[OMAP3_STATE_C7].desc = "MPU OFF + CORE OFF"; | ||
466 | |||
467 | /* | ||
468 | * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot | ||
469 | * enable OFF mode in a stable form for previous revisions. | ||
470 | * we disable C7 state as a result. | ||
471 | */ | ||
472 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) { | ||
473 | omap3_power_states[OMAP3_STATE_C7].valid = 0; | ||
474 | cpuidle_params_table[OMAP3_STATE_C7].valid = 0; | ||
475 | pr_warn("%s: core off state C7 disabled due to i583\n", | ||
476 | __func__); | ||
477 | } | ||
478 | } | ||
479 | |||
480 | struct cpuidle_driver omap3_idle_driver = { | 299 | struct cpuidle_driver omap3_idle_driver = { |
481 | .name = "omap3_idle", | 300 | .name = "omap3_idle", |
482 | .owner = THIS_MODULE, | 301 | .owner = THIS_MODULE, |
483 | }; | 302 | }; |
484 | 303 | ||
304 | /* Helper to fill the C-state common data and register the driver_data */ | ||
305 | static inline struct omap3_idle_statedata *_fill_cstate( | ||
306 | struct cpuidle_device *dev, | ||
307 | int idx, const char *descr) | ||
308 | { | ||
309 | struct omap3_idle_statedata *cx = &omap3_idle_data[idx]; | ||
310 | struct cpuidle_state *state = &dev->states[idx]; | ||
311 | |||
312 | state->exit_latency = cpuidle_params_table[idx].exit_latency; | ||
313 | state->target_residency = cpuidle_params_table[idx].target_residency; | ||
314 | state->flags = CPUIDLE_FLAG_TIME_VALID; | ||
315 | state->enter = omap3_enter_idle_bm; | ||
316 | cx->valid = cpuidle_params_table[idx].valid; | ||
317 | sprintf(state->name, "C%d", idx + 1); | ||
318 | strncpy(state->desc, descr, CPUIDLE_DESC_LEN); | ||
319 | cpuidle_set_statedata(state, cx); | ||
320 | |||
321 | return cx; | ||
322 | } | ||
323 | |||
485 | /** | 324 | /** |
486 | * omap3_idle_init - Init routine for OMAP3 idle | 325 | * omap3_idle_init - Init routine for OMAP3 idle |
487 | * | 326 | * |
488 | * Registers the OMAP3 specific cpuidle driver with the cpuidle | 327 | * Registers the OMAP3 specific cpuidle driver to the cpuidle |
489 | * framework with the valid set of states. | 328 | * framework with the valid set of states. |
490 | */ | 329 | */ |
491 | int __init omap3_idle_init(void) | 330 | int __init omap3_idle_init(void) |
492 | { | 331 | { |
493 | int i, count = 0; | ||
494 | struct omap3_processor_cx *cx; | ||
495 | struct cpuidle_state *state; | ||
496 | struct cpuidle_device *dev; | 332 | struct cpuidle_device *dev; |
333 | struct omap3_idle_statedata *cx; | ||
497 | 334 | ||
498 | mpu_pd = pwrdm_lookup("mpu_pwrdm"); | 335 | mpu_pd = pwrdm_lookup("mpu_pwrdm"); |
499 | core_pd = pwrdm_lookup("core_pwrdm"); | 336 | core_pd = pwrdm_lookup("core_pwrdm"); |
500 | per_pd = pwrdm_lookup("per_pwrdm"); | 337 | per_pd = pwrdm_lookup("per_pwrdm"); |
501 | cam_pd = pwrdm_lookup("cam_pwrdm"); | 338 | cam_pd = pwrdm_lookup("cam_pwrdm"); |
502 | 339 | ||
503 | omap_init_power_states(); | ||
504 | cpuidle_register_driver(&omap3_idle_driver); | 340 | cpuidle_register_driver(&omap3_idle_driver); |
505 | |||
506 | dev = &per_cpu(omap3_idle_dev, smp_processor_id()); | 341 | dev = &per_cpu(omap3_idle_dev, smp_processor_id()); |
507 | 342 | ||
508 | for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) { | 343 | /* C1 . MPU WFI + Core active */ |
509 | cx = &omap3_power_states[i]; | 344 | cx = _fill_cstate(dev, 0, "MPU ON + CORE ON"); |
510 | state = &dev->states[count]; | 345 | (&dev->states[0])->enter = omap3_enter_idle; |
511 | 346 | dev->safe_state = &dev->states[0]; | |
512 | if (!cx->valid) | 347 | cx->valid = 1; /* C1 is always valid */ |
513 | continue; | 348 | cx->mpu_state = PWRDM_POWER_ON; |
514 | cpuidle_set_statedata(state, cx); | 349 | cx->core_state = PWRDM_POWER_ON; |
515 | state->exit_latency = cx->sleep_latency + cx->wakeup_latency; | ||
516 | state->target_residency = cx->threshold; | ||
517 | state->flags = cx->flags; | ||
518 | state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ? | ||
519 | omap3_enter_idle_bm : omap3_enter_idle; | ||
520 | if (cx->type == OMAP3_STATE_C1) | ||
521 | dev->safe_state = state; | ||
522 | sprintf(state->name, "C%d", count+1); | ||
523 | strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN); | ||
524 | count++; | ||
525 | } | ||
526 | 350 | ||
527 | if (!count) | 351 | /* C2 . MPU WFI + Core inactive */ |
528 | return -EINVAL; | 352 | cx = _fill_cstate(dev, 1, "MPU ON + CORE ON"); |
529 | dev->state_count = count; | 353 | cx->mpu_state = PWRDM_POWER_ON; |
354 | cx->core_state = PWRDM_POWER_ON; | ||
355 | |||
356 | /* C3 . MPU CSWR + Core inactive */ | ||
357 | cx = _fill_cstate(dev, 2, "MPU RET + CORE ON"); | ||
358 | cx->mpu_state = PWRDM_POWER_RET; | ||
359 | cx->core_state = PWRDM_POWER_ON; | ||
530 | 360 | ||
531 | if (enable_off_mode) | 361 | /* C4 . MPU OFF + Core inactive */ |
532 | omap3_cpuidle_update_states(PWRDM_POWER_OFF, PWRDM_POWER_OFF); | 362 | cx = _fill_cstate(dev, 3, "MPU OFF + CORE ON"); |
533 | else | 363 | cx->mpu_state = PWRDM_POWER_OFF; |
534 | omap3_cpuidle_update_states(PWRDM_POWER_RET, PWRDM_POWER_RET); | 364 | cx->core_state = PWRDM_POWER_ON; |
365 | |||
366 | /* C5 . MPU RET + Core RET */ | ||
367 | cx = _fill_cstate(dev, 4, "MPU RET + CORE RET"); | ||
368 | cx->mpu_state = PWRDM_POWER_RET; | ||
369 | cx->core_state = PWRDM_POWER_RET; | ||
370 | |||
371 | /* C6 . MPU OFF + Core RET */ | ||
372 | cx = _fill_cstate(dev, 5, "MPU OFF + CORE RET"); | ||
373 | cx->mpu_state = PWRDM_POWER_OFF; | ||
374 | cx->core_state = PWRDM_POWER_RET; | ||
375 | |||
376 | /* C7 . MPU OFF + Core OFF */ | ||
377 | cx = _fill_cstate(dev, 6, "MPU OFF + CORE OFF"); | ||
378 | /* | ||
379 | * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot | ||
380 | * enable OFF mode in a stable form for previous revisions. | ||
381 | * We disable C7 state as a result. | ||
382 | */ | ||
383 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) { | ||
384 | cx->valid = 0; | ||
385 | pr_warn("%s: core off state C7 disabled due to i583\n", | ||
386 | __func__); | ||
387 | } | ||
388 | cx->mpu_state = PWRDM_POWER_OFF; | ||
389 | cx->core_state = PWRDM_POWER_OFF; | ||
535 | 390 | ||
391 | dev->state_count = OMAP3_NUM_STATES; | ||
536 | if (cpuidle_register_device(dev)) { | 392 | if (cpuidle_register_device(dev)) { |
537 | printk(KERN_ERR "%s: CPUidle register device failed\n", | 393 | printk(KERN_ERR "%s: CPUidle register device failed\n", |
538 | __func__); | 394 | __func__); |
diff --git a/arch/arm/mach-omap2/gpmc-smc91x.c b/arch/arm/mach-omap2/gpmc-smc91x.c index 877c6f5807b7..ba10c24f3d8d 100644 --- a/arch/arm/mach-omap2/gpmc-smc91x.c +++ b/arch/arm/mach-omap2/gpmc-smc91x.c | |||
@@ -147,25 +147,24 @@ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data) | |||
147 | goto free1; | 147 | goto free1; |
148 | } | 148 | } |
149 | 149 | ||
150 | if (gpio_request(gpmc_cfg->gpio_irq, "SMC91X irq") < 0) | 150 | if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "SMC91X irq") < 0) |
151 | goto free1; | 151 | goto free1; |
152 | 152 | ||
153 | gpio_direction_input(gpmc_cfg->gpio_irq); | ||
154 | gpmc_smc91x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); | 153 | gpmc_smc91x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); |
155 | 154 | ||
156 | if (gpmc_cfg->gpio_pwrdwn) { | 155 | if (gpmc_cfg->gpio_pwrdwn) { |
157 | ret = gpio_request(gpmc_cfg->gpio_pwrdwn, "SMC91X powerdown"); | 156 | ret = gpio_request_one(gpmc_cfg->gpio_pwrdwn, |
157 | GPIOF_OUT_INIT_LOW, "SMC91X powerdown"); | ||
158 | if (ret) | 158 | if (ret) |
159 | goto free2; | 159 | goto free2; |
160 | gpio_direction_output(gpmc_cfg->gpio_pwrdwn, 0); | ||
161 | } | 160 | } |
162 | 161 | ||
163 | if (gpmc_cfg->gpio_reset) { | 162 | if (gpmc_cfg->gpio_reset) { |
164 | ret = gpio_request(gpmc_cfg->gpio_reset, "SMC91X reset"); | 163 | ret = gpio_request_one(gpmc_cfg->gpio_reset, |
164 | GPIOF_OUT_INIT_LOW, "SMC91X reset"); | ||
165 | if (ret) | 165 | if (ret) |
166 | goto free3; | 166 | goto free3; |
167 | 167 | ||
168 | gpio_direction_output(gpmc_cfg->gpio_reset, 0); | ||
169 | gpio_set_value(gpmc_cfg->gpio_reset, 1); | 168 | gpio_set_value(gpmc_cfg->gpio_reset, 1); |
170 | msleep(100); | 169 | msleep(100); |
171 | gpio_set_value(gpmc_cfg->gpio_reset, 0); | 170 | gpio_set_value(gpmc_cfg->gpio_reset, 0); |
diff --git a/arch/arm/mach-omap2/gpmc-smsc911x.c b/arch/arm/mach-omap2/gpmc-smsc911x.c index 703f150dd01d..997033129d26 100644 --- a/arch/arm/mach-omap2/gpmc-smsc911x.c +++ b/arch/arm/mach-omap2/gpmc-smsc911x.c | |||
@@ -10,6 +10,7 @@ | |||
10 | * it under the terms of the GNU General Public License version 2 as | 10 | * it under the terms of the GNU General Public License version 2 as |
11 | * published by the Free Software Foundation. | 11 | * published by the Free Software Foundation. |
12 | */ | 12 | */ |
13 | #define pr_fmt(fmt) "%s: " fmt, __func__ | ||
13 | 14 | ||
14 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
15 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
@@ -30,7 +31,7 @@ static struct resource gpmc_smsc911x_resources[] = { | |||
30 | .flags = IORESOURCE_MEM, | 31 | .flags = IORESOURCE_MEM, |
31 | }, | 32 | }, |
32 | [1] = { | 33 | [1] = { |
33 | .flags = IORESOURCE_IRQ, | 34 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, |
34 | }, | 35 | }, |
35 | }; | 36 | }; |
36 | 37 | ||
@@ -41,16 +42,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = { | |||
41 | .flags = SMSC911X_USE_16BIT, | 42 | .flags = SMSC911X_USE_16BIT, |
42 | }; | 43 | }; |
43 | 44 | ||
44 | static struct platform_device gpmc_smsc911x_device = { | ||
45 | .name = "smsc911x", | ||
46 | .id = -1, | ||
47 | .num_resources = ARRAY_SIZE(gpmc_smsc911x_resources), | ||
48 | .resource = gpmc_smsc911x_resources, | ||
49 | .dev = { | ||
50 | .platform_data = &gpmc_smsc911x_config, | ||
51 | }, | ||
52 | }; | ||
53 | |||
54 | /* | 45 | /* |
55 | * Initialize smsc911x device connected to the GPMC. Note that we | 46 | * Initialize smsc911x device connected to the GPMC. Note that we |
56 | * assume that pin multiplexing is done in the board-*.c file, | 47 | * assume that pin multiplexing is done in the board-*.c file, |
@@ -58,46 +49,49 @@ static struct platform_device gpmc_smsc911x_device = { | |||
58 | */ | 49 | */ |
59 | void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) | 50 | void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) |
60 | { | 51 | { |
52 | struct platform_device *pdev; | ||
61 | unsigned long cs_mem_base; | 53 | unsigned long cs_mem_base; |
62 | int ret; | 54 | int ret; |
63 | 55 | ||
64 | gpmc_cfg = board_data; | 56 | gpmc_cfg = board_data; |
65 | 57 | ||
66 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { | 58 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { |
67 | printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n"); | 59 | pr_err("Failed to request GPMC mem region\n"); |
68 | return; | 60 | return; |
69 | } | 61 | } |
70 | 62 | ||
71 | gpmc_smsc911x_resources[0].start = cs_mem_base + 0x0; | 63 | gpmc_smsc911x_resources[0].start = cs_mem_base + 0x0; |
72 | gpmc_smsc911x_resources[0].end = cs_mem_base + 0xff; | 64 | gpmc_smsc911x_resources[0].end = cs_mem_base + 0xff; |
73 | 65 | ||
74 | if (gpio_request(gpmc_cfg->gpio_irq, "smsc911x irq") < 0) { | 66 | if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "smsc911x irq")) { |
75 | printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n", | 67 | pr_err("Failed to request IRQ GPIO%d\n", gpmc_cfg->gpio_irq); |
76 | gpmc_cfg->gpio_irq); | ||
77 | goto free1; | 68 | goto free1; |
78 | } | 69 | } |
79 | 70 | ||
80 | gpio_direction_input(gpmc_cfg->gpio_irq); | ||
81 | gpmc_smsc911x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); | 71 | gpmc_smsc911x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); |
82 | gpmc_smsc911x_resources[1].flags |= | ||
83 | (gpmc_cfg->flags & IRQF_TRIGGER_MASK); | ||
84 | 72 | ||
85 | if (gpio_is_valid(gpmc_cfg->gpio_reset)) { | 73 | if (gpio_is_valid(gpmc_cfg->gpio_reset)) { |
86 | ret = gpio_request(gpmc_cfg->gpio_reset, "smsc911x reset"); | 74 | ret = gpio_request_one(gpmc_cfg->gpio_reset, |
75 | GPIOF_OUT_INIT_HIGH, "smsc911x reset"); | ||
87 | if (ret) { | 76 | if (ret) { |
88 | printk(KERN_ERR "Failed to request GPIO%d for smsc911x reset\n", | 77 | pr_err("Failed to request reset GPIO%d\n", |
89 | gpmc_cfg->gpio_reset); | 78 | gpmc_cfg->gpio_reset); |
90 | goto free2; | 79 | goto free2; |
91 | } | 80 | } |
92 | 81 | ||
93 | gpio_direction_output(gpmc_cfg->gpio_reset, 1); | ||
94 | gpio_set_value(gpmc_cfg->gpio_reset, 0); | 82 | gpio_set_value(gpmc_cfg->gpio_reset, 0); |
95 | msleep(100); | 83 | msleep(100); |
96 | gpio_set_value(gpmc_cfg->gpio_reset, 1); | 84 | gpio_set_value(gpmc_cfg->gpio_reset, 1); |
97 | } | 85 | } |
98 | 86 | ||
99 | if (platform_device_register(&gpmc_smsc911x_device) < 0) { | 87 | if (gpmc_cfg->flags) |
100 | printk(KERN_ERR "Unable to register smsc911x device\n"); | 88 | gpmc_smsc911x_config.flags = gpmc_cfg->flags; |
89 | |||
90 | pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id, | ||
91 | gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources), | ||
92 | &gpmc_smsc911x_config, sizeof(gpmc_smsc911x_config)); | ||
93 | if (!pdev) { | ||
94 | pr_err("Unable to register platform device\n"); | ||
101 | gpio_free(gpmc_cfg->gpio_reset); | 95 | gpio_free(gpmc_cfg->gpio_reset); |
102 | goto free2; | 96 | goto free2; |
103 | } | 97 | } |
@@ -109,5 +103,5 @@ free2: | |||
109 | free1: | 103 | free1: |
110 | gpmc_cs_free(gpmc_cfg->cs); | 104 | gpmc_cs_free(gpmc_cfg->cs); |
111 | 105 | ||
112 | printk(KERN_ERR "Could not initialize smsc911x\n"); | 106 | pr_err("Could not initialize smsc911x device\n"); |
113 | } | 107 | } |
diff --git a/arch/arm/mach-omap2/omap_l3_noc.c b/arch/arm/mach-omap2/omap_l3_noc.c index 82632c24076f..7b9f1909ddb2 100644 --- a/arch/arm/mach-omap2/omap_l3_noc.c +++ b/arch/arm/mach-omap2/omap_l3_noc.c | |||
@@ -63,10 +63,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) | |||
63 | char *source_name; | 63 | char *source_name; |
64 | 64 | ||
65 | /* Get the Type of interrupt */ | 65 | /* Get the Type of interrupt */ |
66 | if (irq == l3->app_irq) | 66 | inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; |
67 | inttype = L3_APPLICATION_ERROR; | ||
68 | else | ||
69 | inttype = L3_DEBUG_ERROR; | ||
70 | 67 | ||
71 | for (i = 0; i < L3_MODULES; i++) { | 68 | for (i = 0; i < L3_MODULES; i++) { |
72 | /* | 69 | /* |
@@ -84,10 +81,10 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) | |||
84 | 81 | ||
85 | err_src = j; | 82 | err_src = j; |
86 | /* Read the stderrlog_main_source from clk domain */ | 83 | /* Read the stderrlog_main_source from clk domain */ |
87 | std_err_main_addr = base + (*(l3_targ[i] + err_src)); | 84 | std_err_main_addr = base + *(l3_targ[i] + err_src); |
88 | std_err_main = readl(std_err_main_addr); | 85 | std_err_main = readl(std_err_main_addr); |
89 | 86 | ||
90 | switch ((std_err_main & CUSTOM_ERROR)) { | 87 | switch (std_err_main & CUSTOM_ERROR) { |
91 | case STANDARD_ERROR: | 88 | case STANDARD_ERROR: |
92 | source_name = | 89 | source_name = |
93 | l3_targ_stderrlog_main_name[i][err_src]; | 90 | l3_targ_stderrlog_main_name[i][err_src]; |
@@ -132,49 +129,49 @@ static int __init omap4_l3_probe(struct platform_device *pdev) | |||
132 | 129 | ||
133 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); | 130 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); |
134 | if (!l3) | 131 | if (!l3) |
135 | ret = -ENOMEM; | 132 | return -ENOMEM; |
136 | 133 | ||
137 | platform_set_drvdata(pdev, l3); | 134 | platform_set_drvdata(pdev, l3); |
138 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 135 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
139 | if (!res) { | 136 | if (!res) { |
140 | dev_err(&pdev->dev, "couldn't find resource 0\n"); | 137 | dev_err(&pdev->dev, "couldn't find resource 0\n"); |
141 | ret = -ENODEV; | 138 | ret = -ENODEV; |
142 | goto err1; | 139 | goto err0; |
143 | } | 140 | } |
144 | 141 | ||
145 | l3->l3_base[0] = ioremap(res->start, resource_size(res)); | 142 | l3->l3_base[0] = ioremap(res->start, resource_size(res)); |
146 | if (!(l3->l3_base[0])) { | 143 | if (!l3->l3_base[0]) { |
147 | dev_err(&pdev->dev, "ioremap failed\n"); | 144 | dev_err(&pdev->dev, "ioremap failed\n"); |
148 | ret = -ENOMEM; | 145 | ret = -ENOMEM; |
149 | goto err2; | 146 | goto err0; |
150 | } | 147 | } |
151 | 148 | ||
152 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 149 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
153 | if (!res) { | 150 | if (!res) { |
154 | dev_err(&pdev->dev, "couldn't find resource 1\n"); | 151 | dev_err(&pdev->dev, "couldn't find resource 1\n"); |
155 | ret = -ENODEV; | 152 | ret = -ENODEV; |
156 | goto err3; | 153 | goto err1; |
157 | } | 154 | } |
158 | 155 | ||
159 | l3->l3_base[1] = ioremap(res->start, resource_size(res)); | 156 | l3->l3_base[1] = ioremap(res->start, resource_size(res)); |
160 | if (!(l3->l3_base[1])) { | 157 | if (!l3->l3_base[1]) { |
161 | dev_err(&pdev->dev, "ioremap failed\n"); | 158 | dev_err(&pdev->dev, "ioremap failed\n"); |
162 | ret = -ENOMEM; | 159 | ret = -ENOMEM; |
163 | goto err4; | 160 | goto err1; |
164 | } | 161 | } |
165 | 162 | ||
166 | res = platform_get_resource(pdev, IORESOURCE_MEM, 2); | 163 | res = platform_get_resource(pdev, IORESOURCE_MEM, 2); |
167 | if (!res) { | 164 | if (!res) { |
168 | dev_err(&pdev->dev, "couldn't find resource 2\n"); | 165 | dev_err(&pdev->dev, "couldn't find resource 2\n"); |
169 | ret = -ENODEV; | 166 | ret = -ENODEV; |
170 | goto err5; | 167 | goto err2; |
171 | } | 168 | } |
172 | 169 | ||
173 | l3->l3_base[2] = ioremap(res->start, resource_size(res)); | 170 | l3->l3_base[2] = ioremap(res->start, resource_size(res)); |
174 | if (!(l3->l3_base[2])) { | 171 | if (!l3->l3_base[2]) { |
175 | dev_err(&pdev->dev, "ioremap failed\n"); | 172 | dev_err(&pdev->dev, "ioremap failed\n"); |
176 | ret = -ENOMEM; | 173 | ret = -ENOMEM; |
177 | goto err6; | 174 | goto err2; |
178 | } | 175 | } |
179 | 176 | ||
180 | /* | 177 | /* |
@@ -187,7 +184,7 @@ static int __init omap4_l3_probe(struct platform_device *pdev) | |||
187 | if (ret) { | 184 | if (ret) { |
188 | pr_crit("L3: request_irq failed to register for 0x%x\n", | 185 | pr_crit("L3: request_irq failed to register for 0x%x\n", |
189 | OMAP44XX_IRQ_L3_DBG); | 186 | OMAP44XX_IRQ_L3_DBG); |
190 | goto err7; | 187 | goto err3; |
191 | } | 188 | } |
192 | l3->debug_irq = irq; | 189 | l3->debug_irq = irq; |
193 | 190 | ||
@@ -198,24 +195,22 @@ static int __init omap4_l3_probe(struct platform_device *pdev) | |||
198 | if (ret) { | 195 | if (ret) { |
199 | pr_crit("L3: request_irq failed to register for 0x%x\n", | 196 | pr_crit("L3: request_irq failed to register for 0x%x\n", |
200 | OMAP44XX_IRQ_L3_APP); | 197 | OMAP44XX_IRQ_L3_APP); |
201 | goto err8; | 198 | goto err4; |
202 | } | 199 | } |
203 | l3->app_irq = irq; | 200 | l3->app_irq = irq; |
204 | 201 | ||
205 | goto err0; | 202 | return 0; |
206 | err8: | 203 | |
207 | err7: | ||
208 | iounmap(l3->l3_base[2]); | ||
209 | err6: | ||
210 | err5: | ||
211 | iounmap(l3->l3_base[1]); | ||
212 | err4: | 204 | err4: |
205 | free_irq(l3->debug_irq, l3); | ||
213 | err3: | 206 | err3: |
214 | iounmap(l3->l3_base[0]); | 207 | iounmap(l3->l3_base[2]); |
215 | err2: | 208 | err2: |
209 | iounmap(l3->l3_base[1]); | ||
216 | err1: | 210 | err1: |
217 | kfree(l3); | 211 | iounmap(l3->l3_base[0]); |
218 | err0: | 212 | err0: |
213 | kfree(l3); | ||
219 | return ret; | 214 | return ret; |
220 | } | 215 | } |
221 | 216 | ||
diff --git a/arch/arm/mach-omap2/omap_l3_smx.c b/arch/arm/mach-omap2/omap_l3_smx.c index 4321e7938929..873c0e33b512 100644 --- a/arch/arm/mach-omap2/omap_l3_smx.c +++ b/arch/arm/mach-omap2/omap_l3_smx.c | |||
@@ -155,7 +155,7 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, | |||
155 | u8 multi = error & L3_ERROR_LOG_MULTI; | 155 | u8 multi = error & L3_ERROR_LOG_MULTI; |
156 | u32 address = omap3_l3_decode_addr(error_addr); | 156 | u32 address = omap3_l3_decode_addr(error_addr); |
157 | 157 | ||
158 | WARN(true, "%s Error seen by %s %s at address %x\n", | 158 | WARN(true, "%s seen by %s %s at address %x\n", |
159 | omap3_l3_code_string(code), | 159 | omap3_l3_code_string(code), |
160 | omap3_l3_initiator_string(initid), | 160 | omap3_l3_initiator_string(initid), |
161 | multi ? "Multiple Errors" : "", | 161 | multi ? "Multiple Errors" : "", |
@@ -167,21 +167,15 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, | |||
167 | static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | 167 | static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) |
168 | { | 168 | { |
169 | struct omap3_l3 *l3 = _l3; | 169 | struct omap3_l3 *l3 = _l3; |
170 | |||
171 | u64 status, clear; | 170 | u64 status, clear; |
172 | u64 error; | 171 | u64 error; |
173 | u64 error_addr; | 172 | u64 error_addr; |
174 | u64 err_source = 0; | 173 | u64 err_source = 0; |
175 | void __iomem *base; | 174 | void __iomem *base; |
176 | int int_type; | 175 | int int_type; |
177 | |||
178 | irqreturn_t ret = IRQ_NONE; | 176 | irqreturn_t ret = IRQ_NONE; |
179 | 177 | ||
180 | if (irq == l3->app_irq) | 178 | int_type = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; |
181 | int_type = L3_APPLICATION_ERROR; | ||
182 | else | ||
183 | int_type = L3_DEBUG_ERROR; | ||
184 | |||
185 | if (!int_type) { | 179 | if (!int_type) { |
186 | status = omap3_l3_readll(l3->rt, L3_SI_FLAG_STATUS_0); | 180 | status = omap3_l3_readll(l3->rt, L3_SI_FLAG_STATUS_0); |
187 | /* | 181 | /* |
@@ -202,7 +196,6 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | |||
202 | 196 | ||
203 | base = l3->rt + *(omap3_l3_bases[int_type] + err_source); | 197 | base = l3->rt + *(omap3_l3_bases[int_type] + err_source); |
204 | error = omap3_l3_readll(base, L3_ERROR_LOG); | 198 | error = omap3_l3_readll(base, L3_ERROR_LOG); |
205 | |||
206 | if (error) { | 199 | if (error) { |
207 | error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR); | 200 | error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR); |
208 | 201 | ||
@@ -210,9 +203,8 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | |||
210 | } | 203 | } |
211 | 204 | ||
212 | /* Clear the status register */ | 205 | /* Clear the status register */ |
213 | clear = ((L3_AGENT_STATUS_CLEAR_IA << int_type) | | 206 | clear = (L3_AGENT_STATUS_CLEAR_IA << int_type) | |
214 | (L3_AGENT_STATUS_CLEAR_TA)); | 207 | L3_AGENT_STATUS_CLEAR_TA; |
215 | |||
216 | omap3_l3_writell(base, L3_AGENT_STATUS, clear); | 208 | omap3_l3_writell(base, L3_AGENT_STATUS, clear); |
217 | 209 | ||
218 | /* clear the error log register */ | 210 | /* clear the error log register */ |
@@ -228,10 +220,8 @@ static int __init omap3_l3_probe(struct platform_device *pdev) | |||
228 | int ret; | 220 | int ret; |
229 | 221 | ||
230 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); | 222 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); |
231 | if (!l3) { | 223 | if (!l3) |
232 | ret = -ENOMEM; | 224 | return -ENOMEM; |
233 | goto err0; | ||
234 | } | ||
235 | 225 | ||
236 | platform_set_drvdata(pdev, l3); | 226 | platform_set_drvdata(pdev, l3); |
237 | 227 | ||
@@ -239,13 +229,13 @@ static int __init omap3_l3_probe(struct platform_device *pdev) | |||
239 | if (!res) { | 229 | if (!res) { |
240 | dev_err(&pdev->dev, "couldn't find resource\n"); | 230 | dev_err(&pdev->dev, "couldn't find resource\n"); |
241 | ret = -ENODEV; | 231 | ret = -ENODEV; |
242 | goto err1; | 232 | goto err0; |
243 | } | 233 | } |
244 | l3->rt = ioremap(res->start, resource_size(res)); | 234 | l3->rt = ioremap(res->start, resource_size(res)); |
245 | if (!(l3->rt)) { | 235 | if (!l3->rt) { |
246 | dev_err(&pdev->dev, "ioremap failed\n"); | 236 | dev_err(&pdev->dev, "ioremap failed\n"); |
247 | ret = -ENOMEM; | 237 | ret = -ENOMEM; |
248 | goto err2; | 238 | goto err0; |
249 | } | 239 | } |
250 | 240 | ||
251 | l3->debug_irq = platform_get_irq(pdev, 0); | 241 | l3->debug_irq = platform_get_irq(pdev, 0); |
@@ -254,28 +244,26 @@ static int __init omap3_l3_probe(struct platform_device *pdev) | |||
254 | "l3-debug-irq", l3); | 244 | "l3-debug-irq", l3); |
255 | if (ret) { | 245 | if (ret) { |
256 | dev_err(&pdev->dev, "couldn't request debug irq\n"); | 246 | dev_err(&pdev->dev, "couldn't request debug irq\n"); |
257 | goto err3; | 247 | goto err1; |
258 | } | 248 | } |
259 | 249 | ||
260 | l3->app_irq = platform_get_irq(pdev, 1); | 250 | l3->app_irq = platform_get_irq(pdev, 1); |
261 | ret = request_irq(l3->app_irq, omap3_l3_app_irq, | 251 | ret = request_irq(l3->app_irq, omap3_l3_app_irq, |
262 | IRQF_DISABLED | IRQF_TRIGGER_RISING, | 252 | IRQF_DISABLED | IRQF_TRIGGER_RISING, |
263 | "l3-app-irq", l3); | 253 | "l3-app-irq", l3); |
264 | |||
265 | if (ret) { | 254 | if (ret) { |
266 | dev_err(&pdev->dev, "couldn't request app irq\n"); | 255 | dev_err(&pdev->dev, "couldn't request app irq\n"); |
267 | goto err4; | 256 | goto err2; |
268 | } | 257 | } |
269 | 258 | ||
270 | goto err0; | 259 | return 0; |
271 | 260 | ||
272 | err4: | ||
273 | err3: | ||
274 | iounmap(l3->rt); | ||
275 | err2: | 261 | err2: |
262 | free_irq(l3->debug_irq, l3); | ||
276 | err1: | 263 | err1: |
277 | kfree(l3); | 264 | iounmap(l3->rt); |
278 | err0: | 265 | err0: |
266 | kfree(l3); | ||
279 | return ret; | 267 | return ret; |
280 | } | 268 | } |
281 | 269 | ||
diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index 05f6abc96b0d..f47813edd951 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c | |||
@@ -50,13 +50,16 @@ int omap4430_phy_init(struct device *dev) | |||
50 | { | 50 | { |
51 | ctrl_base = ioremap(OMAP443X_SCM_BASE, SZ_1K); | 51 | ctrl_base = ioremap(OMAP443X_SCM_BASE, SZ_1K); |
52 | if (!ctrl_base) { | 52 | if (!ctrl_base) { |
53 | dev_err(dev, "control module ioremap failed\n"); | 53 | pr_err("control module ioremap failed\n"); |
54 | return -ENOMEM; | 54 | return -ENOMEM; |
55 | } | 55 | } |
56 | /* Power down the phy */ | 56 | /* Power down the phy */ |
57 | __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); | 57 | __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); |
58 | phyclk = clk_get(dev, "ocp2scp_usb_phy_ick"); | ||
59 | 58 | ||
59 | if (!dev) | ||
60 | return 0; | ||
61 | |||
62 | phyclk = clk_get(dev, "ocp2scp_usb_phy_ick"); | ||
60 | if (IS_ERR(phyclk)) { | 63 | if (IS_ERR(phyclk)) { |
61 | dev_err(dev, "cannot clk_get ocp2scp_usb_phy_ick\n"); | 64 | dev_err(dev, "cannot clk_get ocp2scp_usb_phy_ick\n"); |
62 | iounmap(ctrl_base); | 65 | iounmap(ctrl_base); |
@@ -228,7 +231,7 @@ void am35x_musb_clear_irq(void) | |||
228 | regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); | 231 | regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); |
229 | } | 232 | } |
230 | 233 | ||
231 | void am35x_musb_set_mode(u8 musb_mode) | 234 | void am35x_set_mode(u8 musb_mode) |
232 | { | 235 | { |
233 | u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); | 236 | u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); |
234 | 237 | ||
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 797bfd12b643..45bcfce77352 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
@@ -36,11 +36,16 @@ static inline int omap4_opp_init(void) | |||
36 | } | 36 | } |
37 | #endif | 37 | #endif |
38 | 38 | ||
39 | /* | ||
40 | * cpuidle mach specific parameters | ||
41 | * | ||
42 | * The board code can override the default C-states definition using | ||
43 | * omap3_pm_init_cpuidle | ||
44 | */ | ||
39 | struct cpuidle_params { | 45 | struct cpuidle_params { |
40 | u8 valid; | 46 | u32 exit_latency; /* exit_latency = sleep + wake-up latencies */ |
41 | u32 sleep_latency; | 47 | u32 target_residency; |
42 | u32 wake_latency; | 48 | u8 valid; /* validates the C-state */ |
43 | u32 threshold; | ||
44 | }; | 49 | }; |
45 | 50 | ||
46 | #if defined(CONFIG_PM) && defined(CONFIG_CPU_IDLE) | 51 | #if defined(CONFIG_PM) && defined(CONFIG_CPU_IDLE) |
@@ -73,10 +78,6 @@ extern u32 sleep_while_idle; | |||
73 | #define sleep_while_idle 0 | 78 | #define sleep_while_idle 0 |
74 | #endif | 79 | #endif |
75 | 80 | ||
76 | #if defined(CONFIG_CPU_IDLE) | ||
77 | extern void omap3_cpuidle_update_states(u32, u32); | ||
78 | #endif | ||
79 | |||
80 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) | 81 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) |
81 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); | 82 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); |
82 | extern int pm_dbg_regset_save(int reg_set); | 83 | extern int pm_dbg_regset_save(int reg_set); |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 0c5e3a46a3ad..c155c9d1c82c 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -779,18 +779,6 @@ void omap3_pm_off_mode_enable(int enable) | |||
779 | else | 779 | else |
780 | state = PWRDM_POWER_RET; | 780 | state = PWRDM_POWER_RET; |
781 | 781 | ||
782 | #ifdef CONFIG_CPU_IDLE | ||
783 | /* | ||
784 | * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot | ||
785 | * enable OFF mode in a stable form for previous revisions, restrict | ||
786 | * instead to RET | ||
787 | */ | ||
788 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) | ||
789 | omap3_cpuidle_update_states(state, PWRDM_POWER_RET); | ||
790 | else | ||
791 | omap3_cpuidle_update_states(state, state); | ||
792 | #endif | ||
793 | |||
794 | list_for_each_entry(pwrst, &pwrst_list, node) { | 782 | list_for_each_entry(pwrst, &pwrst_list, node) { |
795 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583) && | 783 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583) && |
796 | pwrst->pwrdm == core_pwrdm && | 784 | pwrst->pwrdm == core_pwrdm && |
@@ -895,8 +883,6 @@ static int __init omap3_pm_init(void) | |||
895 | 883 | ||
896 | pm_errata_configure(); | 884 | pm_errata_configure(); |
897 | 885 | ||
898 | printk(KERN_ERR "Power Management for TI OMAP3.\n"); | ||
899 | |||
900 | /* XXX prcm_setup_regs needs to be before enabling hw | 886 | /* XXX prcm_setup_regs needs to be before enabling hw |
901 | * supervised mode for powerdomains */ | 887 | * supervised mode for powerdomains */ |
902 | prcm_setup_regs(); | 888 | prcm_setup_regs(); |
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 76cfff2db514..59a870be8390 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c | |||
@@ -105,13 +105,11 @@ static int __init omap4_pm_init(void) | |||
105 | 105 | ||
106 | pr_err("Power Management for TI OMAP4.\n"); | 106 | pr_err("Power Management for TI OMAP4.\n"); |
107 | 107 | ||
108 | #ifdef CONFIG_PM | ||
109 | ret = pwrdm_for_each(pwrdms_setup, NULL); | 108 | ret = pwrdm_for_each(pwrdms_setup, NULL); |
110 | if (ret) { | 109 | if (ret) { |
111 | pr_err("Failed to setup powerdomains\n"); | 110 | pr_err("Failed to setup powerdomains\n"); |
112 | goto err2; | 111 | goto err2; |
113 | } | 112 | } |
114 | #endif | ||
115 | 113 | ||
116 | #ifdef CONFIG_SUSPEND | 114 | #ifdef CONFIG_SUSPEND |
117 | suspend_set_ops(&omap_pm_ops); | 115 | suspend_set_ops(&omap_pm_ops); |
diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index 13e24f913dd4..fb7dc52394a8 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c | |||
@@ -847,6 +847,14 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
847 | goto err_free_devinfo; | 847 | goto err_free_devinfo; |
848 | } | 848 | } |
849 | 849 | ||
850 | mem = request_mem_region(mem->start, resource_size(mem), | ||
851 | dev_name(&pdev->dev)); | ||
852 | if (!mem) { | ||
853 | dev_err(&pdev->dev, "%s: no mem region\n", __func__); | ||
854 | ret = -EBUSY; | ||
855 | goto err_free_devinfo; | ||
856 | } | ||
857 | |||
850 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 858 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
851 | 859 | ||
852 | pm_runtime_enable(&pdev->dev); | 860 | pm_runtime_enable(&pdev->dev); |
@@ -883,7 +891,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
883 | ret = sr_late_init(sr_info); | 891 | ret = sr_late_init(sr_info); |
884 | if (ret) { | 892 | if (ret) { |
885 | pr_warning("%s: Error in SR late init\n", __func__); | 893 | pr_warning("%s: Error in SR late init\n", __func__); |
886 | goto err_release_region; | 894 | return ret; |
887 | } | 895 | } |
888 | } | 896 | } |
889 | 897 | ||
@@ -896,7 +904,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
896 | vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm); | 904 | vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm); |
897 | if (!vdd_dbg_dir) { | 905 | if (!vdd_dbg_dir) { |
898 | ret = -EINVAL; | 906 | ret = -EINVAL; |
899 | goto err_release_region; | 907 | goto err_iounmap; |
900 | } | 908 | } |
901 | 909 | ||
902 | sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); | 910 | sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); |
@@ -904,7 +912,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
904 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n", | 912 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n", |
905 | __func__); | 913 | __func__); |
906 | ret = PTR_ERR(sr_info->dbg_dir); | 914 | ret = PTR_ERR(sr_info->dbg_dir); |
907 | goto err_release_region; | 915 | goto err_iounmap; |
908 | } | 916 | } |
909 | 917 | ||
910 | (void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, | 918 | (void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, |
@@ -921,7 +929,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
921 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory" | 929 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory" |
922 | "for n-values\n", __func__); | 930 | "for n-values\n", __func__); |
923 | ret = PTR_ERR(nvalue_dir); | 931 | ret = PTR_ERR(nvalue_dir); |
924 | goto err_release_region; | 932 | goto err_debugfs; |
925 | } | 933 | } |
926 | 934 | ||
927 | omap_voltage_get_volttable(sr_info->voltdm, &volt_data); | 935 | omap_voltage_get_volttable(sr_info->voltdm, &volt_data); |
@@ -931,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
931 | "entries for n-values\n", | 939 | "entries for n-values\n", |
932 | __func__, sr_info->voltdm->name); | 940 | __func__, sr_info->voltdm->name); |
933 | ret = -ENODATA; | 941 | ret = -ENODATA; |
934 | goto err_release_region; | 942 | goto err_debugfs; |
935 | } | 943 | } |
936 | 944 | ||
937 | for (i = 0; i < sr_info->nvalue_count; i++) { | 945 | for (i = 0; i < sr_info->nvalue_count; i++) { |
@@ -945,6 +953,11 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
945 | 953 | ||
946 | return ret; | 954 | return ret; |
947 | 955 | ||
956 | err_debugfs: | ||
957 | debugfs_remove_recursive(sr_info->dbg_dir); | ||
958 | err_iounmap: | ||
959 | list_del(&sr_info->node); | ||
960 | iounmap(sr_info->base); | ||
948 | err_release_region: | 961 | err_release_region: |
949 | release_mem_region(mem->start, resource_size(mem)); | 962 | release_mem_region(mem->start, resource_size(mem)); |
950 | err_free_devinfo: | 963 | err_free_devinfo: |
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index 35559f77e2de..c7ed540d868d 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c | |||
@@ -108,7 +108,13 @@ static void usb_musb_mux_init(struct omap_musb_board_data *board_data) | |||
108 | } | 108 | } |
109 | } | 109 | } |
110 | 110 | ||
111 | void __init usb_musb_init(struct omap_musb_board_data *board_data) | 111 | static struct omap_musb_board_data musb_default_board_data = { |
112 | .interface_type = MUSB_INTERFACE_ULPI, | ||
113 | .mode = MUSB_OTG, | ||
114 | .power = 100, | ||
115 | }; | ||
116 | |||
117 | void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) | ||
112 | { | 118 | { |
113 | struct omap_hwmod *oh; | 119 | struct omap_hwmod *oh; |
114 | struct omap_device *od; | 120 | struct omap_device *od; |
@@ -116,11 +122,12 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data) | |||
116 | struct device *dev; | 122 | struct device *dev; |
117 | int bus_id = -1; | 123 | int bus_id = -1; |
118 | const char *oh_name, *name; | 124 | const char *oh_name, *name; |
125 | struct omap_musb_board_data *board_data; | ||
119 | 126 | ||
120 | if (cpu_is_omap3517() || cpu_is_omap3505()) { | 127 | if (musb_board_data) |
121 | } else if (cpu_is_omap44xx()) { | 128 | board_data = musb_board_data; |
122 | usb_musb_mux_init(board_data); | 129 | else |
123 | } | 130 | board_data = &musb_default_board_data; |
124 | 131 | ||
125 | /* | 132 | /* |
126 | * REVISIT: This line can be removed once all the platforms using | 133 | * REVISIT: This line can be removed once all the platforms using |
@@ -164,10 +171,15 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data) | |||
164 | dev->dma_mask = &musb_dmamask; | 171 | dev->dma_mask = &musb_dmamask; |
165 | dev->coherent_dma_mask = musb_dmamask; | 172 | dev->coherent_dma_mask = musb_dmamask; |
166 | put_device(dev); | 173 | put_device(dev); |
174 | |||
175 | if (cpu_is_omap44xx()) | ||
176 | omap4430_phy_init(dev); | ||
167 | } | 177 | } |
168 | 178 | ||
169 | #else | 179 | #else |
170 | void __init usb_musb_init(struct omap_musb_board_data *board_data) | 180 | void __init usb_musb_init(struct omap_musb_board_data *board_data) |
171 | { | 181 | { |
182 | if (cpu_is_omap44xx()) | ||
183 | omap4430_phy_init(NULL); | ||
172 | } | 184 | } |
173 | #endif /* CONFIG_USB_MUSB_SOC */ | 185 | #endif /* CONFIG_USB_MUSB_SOC */ |
diff --git a/arch/arm/mach-omap2/usb-tusb6010.c b/arch/arm/mach-omap2/usb-tusb6010.c index 8a3c05f3c1d6..8dd26b765b7d 100644 --- a/arch/arm/mach-omap2/usb-tusb6010.c +++ b/arch/arm/mach-omap2/usb-tusb6010.c | |||
@@ -293,12 +293,11 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data, | |||
293 | ); | 293 | ); |
294 | 294 | ||
295 | /* IRQ */ | 295 | /* IRQ */ |
296 | status = gpio_request(irq, "TUSB6010 irq"); | 296 | status = gpio_request_one(irq, GPIOF_IN, "TUSB6010 irq"); |
297 | if (status < 0) { | 297 | if (status < 0) { |
298 | printk(error, 3, status); | 298 | printk(error, 3, status); |
299 | return status; | 299 | return status; |
300 | } | 300 | } |
301 | gpio_direction_input(irq); | ||
302 | tusb_resources[2].start = irq + IH_GPIO_BASE; | 301 | tusb_resources[2].start = irq + IH_GPIO_BASE; |
303 | 302 | ||
304 | /* set up memory timings ... can speed them up later */ | 303 | /* set up memory timings ... can speed them up later */ |
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index 0c1552d9d995..9ef3789ded4b 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c | |||
@@ -148,7 +148,6 @@ static int vp_volt_debug_get(void *data, u64 *val) | |||
148 | } | 148 | } |
149 | 149 | ||
150 | vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage); | 150 | vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage); |
151 | pr_notice("curr_vsel = %x\n", vsel); | ||
152 | 151 | ||
153 | if (!vdd->pmic_info->vsel_to_uv) { | 152 | if (!vdd->pmic_info->vsel_to_uv) { |
154 | pr_warning("PMIC function to convert vsel to voltage" | 153 | pr_warning("PMIC function to convert vsel to voltage" |
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 2fc9f94cdd29..cd19309fd3b8 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig | |||
@@ -153,7 +153,6 @@ config MACH_XCEP | |||
153 | bool "Iskratel Electronics XCEP" | 153 | bool "Iskratel Electronics XCEP" |
154 | select PXA25x | 154 | select PXA25x |
155 | select MTD | 155 | select MTD |
156 | select MTD_PARTITIONS | ||
157 | select MTD_PHYSMAP | 156 | select MTD_PHYSMAP |
158 | select MTD_CFI_INTELEXT | 157 | select MTD_CFI_INTELEXT |
159 | select MTD_CFI | 158 | select MTD_CFI |
diff --git a/arch/arm/mach-s3c2410/mach-amlm5900.c b/arch/arm/mach-s3c2410/mach-amlm5900.c index 44440cbd7620..dabc141243f3 100644 --- a/arch/arm/mach-s3c2410/mach-amlm5900.c +++ b/arch/arm/mach-s3c2410/mach-amlm5900.c | |||
@@ -58,8 +58,6 @@ | |||
58 | #include <plat/cpu.h> | 58 | #include <plat/cpu.h> |
59 | #include <plat/gpio-cfg.h> | 59 | #include <plat/gpio-cfg.h> |
60 | 60 | ||
61 | #ifdef CONFIG_MTD_PARTITIONS | ||
62 | |||
63 | #include <linux/mtd/mtd.h> | 61 | #include <linux/mtd/mtd.h> |
64 | #include <linux/mtd/partitions.h> | 62 | #include <linux/mtd/partitions.h> |
65 | #include <linux/mtd/map.h> | 63 | #include <linux/mtd/map.h> |
@@ -113,7 +111,6 @@ static struct platform_device amlm5900_device_nor = { | |||
113 | .num_resources = 1, | 111 | .num_resources = 1, |
114 | .resource = &amlm5900_nor_resource, | 112 | .resource = &amlm5900_nor_resource, |
115 | }; | 113 | }; |
116 | #endif | ||
117 | 114 | ||
118 | static struct map_desc amlm5900_iodesc[] __initdata = { | 115 | static struct map_desc amlm5900_iodesc[] __initdata = { |
119 | }; | 116 | }; |
@@ -158,9 +155,7 @@ static struct platform_device *amlm5900_devices[] __initdata = { | |||
158 | &s3c_device_rtc, | 155 | &s3c_device_rtc, |
159 | &s3c_device_usbgadget, | 156 | &s3c_device_usbgadget, |
160 | &s3c_device_sdi, | 157 | &s3c_device_sdi, |
161 | #ifdef CONFIG_MTD_PARTITIONS | ||
162 | &amlm5900_device_nor, | 158 | &amlm5900_device_nor, |
163 | #endif | ||
164 | }; | 159 | }; |
165 | 160 | ||
166 | static void __init amlm5900_map_io(void) | 161 | static void __init amlm5900_map_io(void) |
diff --git a/arch/arm/mach-s3c2410/mach-tct_hammer.c b/arch/arm/mach-s3c2410/mach-tct_hammer.c index a15d0621c22f..43c2b831b9e8 100644 --- a/arch/arm/mach-s3c2410/mach-tct_hammer.c +++ b/arch/arm/mach-s3c2410/mach-tct_hammer.c | |||
@@ -49,8 +49,6 @@ | |||
49 | #include <plat/devs.h> | 49 | #include <plat/devs.h> |
50 | #include <plat/cpu.h> | 50 | #include <plat/cpu.h> |
51 | 51 | ||
52 | #ifdef CONFIG_MTD_PARTITIONS | ||
53 | |||
54 | #include <linux/mtd/mtd.h> | 52 | #include <linux/mtd/mtd.h> |
55 | #include <linux/mtd/partitions.h> | 53 | #include <linux/mtd/partitions.h> |
56 | #include <linux/mtd/map.h> | 54 | #include <linux/mtd/map.h> |
@@ -91,8 +89,6 @@ static struct platform_device tct_hammer_device_nor = { | |||
91 | .resource = &tct_hammer_nor_resource, | 89 | .resource = &tct_hammer_nor_resource, |
92 | }; | 90 | }; |
93 | 91 | ||
94 | #endif | ||
95 | |||
96 | static struct map_desc tct_hammer_iodesc[] __initdata = { | 92 | static struct map_desc tct_hammer_iodesc[] __initdata = { |
97 | }; | 93 | }; |
98 | 94 | ||
@@ -133,9 +129,7 @@ static struct platform_device *tct_hammer_devices[] __initdata = { | |||
133 | &s3c_device_rtc, | 129 | &s3c_device_rtc, |
134 | &s3c_device_usbgadget, | 130 | &s3c_device_usbgadget, |
135 | &s3c_device_sdi, | 131 | &s3c_device_sdi, |
136 | #ifdef CONFIG_MTD_PARTITIONS | ||
137 | &tct_hammer_device_nor, | 132 | &tct_hammer_device_nor, |
138 | #endif | ||
139 | }; | 133 | }; |
140 | 134 | ||
141 | static void __init tct_hammer_map_io(void) | 135 | static void __init tct_hammer_map_io(void) |
diff --git a/arch/arm/mach-s3c64xx/dev-spi.c b/arch/arm/mach-s3c64xx/dev-spi.c index 405e62128917..82db072cb836 100644 --- a/arch/arm/mach-s3c64xx/dev-spi.c +++ b/arch/arm/mach-s3c64xx/dev-spi.c | |||
@@ -16,7 +16,6 @@ | |||
16 | 16 | ||
17 | #include <mach/dma.h> | 17 | #include <mach/dma.h> |
18 | #include <mach/map.h> | 18 | #include <mach/map.h> |
19 | #include <mach/gpio-bank-c.h> | ||
20 | #include <mach/spi-clocks.h> | 19 | #include <mach/spi-clocks.h> |
21 | #include <mach/irqs.h> | 20 | #include <mach/irqs.h> |
22 | 21 | ||
@@ -40,23 +39,15 @@ static char *spi_src_clks[] = { | |||
40 | */ | 39 | */ |
41 | static int s3c64xx_spi_cfg_gpio(struct platform_device *pdev) | 40 | static int s3c64xx_spi_cfg_gpio(struct platform_device *pdev) |
42 | { | 41 | { |
42 | unsigned int base; | ||
43 | |||
43 | switch (pdev->id) { | 44 | switch (pdev->id) { |
44 | case 0: | 45 | case 0: |
45 | s3c_gpio_cfgpin(S3C64XX_GPC(0), S3C64XX_GPC0_SPI_MISO0); | 46 | base = S3C64XX_GPC(0); |
46 | s3c_gpio_cfgpin(S3C64XX_GPC(1), S3C64XX_GPC1_SPI_CLKO); | ||
47 | s3c_gpio_cfgpin(S3C64XX_GPC(2), S3C64XX_GPC2_SPI_MOSIO); | ||
48 | s3c_gpio_setpull(S3C64XX_GPC(0), S3C_GPIO_PULL_UP); | ||
49 | s3c_gpio_setpull(S3C64XX_GPC(1), S3C_GPIO_PULL_UP); | ||
50 | s3c_gpio_setpull(S3C64XX_GPC(2), S3C_GPIO_PULL_UP); | ||
51 | break; | 47 | break; |
52 | 48 | ||
53 | case 1: | 49 | case 1: |
54 | s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C64XX_GPC4_SPI_MISO1); | 50 | base = S3C64XX_GPC(4); |
55 | s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C64XX_GPC5_SPI_CLK1); | ||
56 | s3c_gpio_cfgpin(S3C64XX_GPC(6), S3C64XX_GPC6_SPI_MOSI1); | ||
57 | s3c_gpio_setpull(S3C64XX_GPC(4), S3C_GPIO_PULL_UP); | ||
58 | s3c_gpio_setpull(S3C64XX_GPC(5), S3C_GPIO_PULL_UP); | ||
59 | s3c_gpio_setpull(S3C64XX_GPC(6), S3C_GPIO_PULL_UP); | ||
60 | break; | 51 | break; |
61 | 52 | ||
62 | default: | 53 | default: |
@@ -64,6 +55,9 @@ static int s3c64xx_spi_cfg_gpio(struct platform_device *pdev) | |||
64 | return -EINVAL; | 55 | return -EINVAL; |
65 | } | 56 | } |
66 | 57 | ||
58 | s3c_gpio_cfgall_range(base, 3, | ||
59 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
60 | |||
67 | return 0; | 61 | return 0; |
68 | } | 62 | } |
69 | 63 | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-a.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-a.h deleted file mode 100644 index 34212e1a7e81..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-a.h +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-a.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank A register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPACON (S3C64XX_GPA_BASE + 0x00) | ||
16 | #define S3C64XX_GPADAT (S3C64XX_GPA_BASE + 0x04) | ||
17 | #define S3C64XX_GPAPUD (S3C64XX_GPA_BASE + 0x08) | ||
18 | #define S3C64XX_GPACONSLP (S3C64XX_GPA_BASE + 0x0c) | ||
19 | #define S3C64XX_GPAPUDSLP (S3C64XX_GPA_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPA_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPA_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPA_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPA0_UART_RXD0 (0x02 << 0) | ||
26 | #define S3C64XX_GPA0_EINT_G1_0 (0x07 << 0) | ||
27 | |||
28 | #define S3C64XX_GPA1_UART_TXD0 (0x02 << 4) | ||
29 | #define S3C64XX_GPA1_EINT_G1_1 (0x07 << 4) | ||
30 | |||
31 | #define S3C64XX_GPA2_UART_nCTS0 (0x02 << 8) | ||
32 | #define S3C64XX_GPA2_EINT_G1_2 (0x07 << 8) | ||
33 | |||
34 | #define S3C64XX_GPA3_UART_nRTS0 (0x02 << 12) | ||
35 | #define S3C64XX_GPA3_EINT_G1_3 (0x07 << 12) | ||
36 | |||
37 | #define S3C64XX_GPA4_UART_RXD1 (0x02 << 16) | ||
38 | #define S3C64XX_GPA4_EINT_G1_4 (0x07 << 16) | ||
39 | |||
40 | #define S3C64XX_GPA5_UART_TXD1 (0x02 << 20) | ||
41 | #define S3C64XX_GPA5_EINT_G1_5 (0x07 << 20) | ||
42 | |||
43 | #define S3C64XX_GPA6_UART_nCTS1 (0x02 << 24) | ||
44 | #define S3C64XX_GPA6_EINT_G1_6 (0x07 << 24) | ||
45 | |||
46 | #define S3C64XX_GPA7_UART_nRTS1 (0x02 << 28) | ||
47 | #define S3C64XX_GPA7_EINT_G1_7 (0x07 << 28) | ||
48 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-b.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-b.h deleted file mode 100644 index 7232c037e642..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-b.h +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-b.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank B register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPBCON (S3C64XX_GPB_BASE + 0x00) | ||
16 | #define S3C64XX_GPBDAT (S3C64XX_GPB_BASE + 0x04) | ||
17 | #define S3C64XX_GPBPUD (S3C64XX_GPB_BASE + 0x08) | ||
18 | #define S3C64XX_GPBCONSLP (S3C64XX_GPB_BASE + 0x0c) | ||
19 | #define S3C64XX_GPBPUDSLP (S3C64XX_GPB_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPB_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPB_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPB_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPB0_UART_RXD2 (0x02 << 0) | ||
26 | #define S3C64XX_GPB0_EXTDMA_REQ (0x03 << 0) | ||
27 | #define S3C64XX_GPB0_IrDA_RXD (0x04 << 0) | ||
28 | #define S3C64XX_GPB0_ADDR_CF0 (0x05 << 0) | ||
29 | #define S3C64XX_GPB0_EINT_G1_8 (0x07 << 0) | ||
30 | |||
31 | #define S3C64XX_GPB1_UART_TXD2 (0x02 << 4) | ||
32 | #define S3C64XX_GPB1_EXTDMA_ACK (0x03 << 4) | ||
33 | #define S3C64XX_GPB1_IrDA_TXD (0x04 << 4) | ||
34 | #define S3C64XX_GPB1_ADDR_CF1 (0x05 << 4) | ||
35 | #define S3C64XX_GPB1_EINT_G1_9 (0x07 << 4) | ||
36 | |||
37 | #define S3C64XX_GPB2_UART_RXD3 (0x02 << 8) | ||
38 | #define S3C64XX_GPB2_IrDA_RXD (0x03 << 8) | ||
39 | #define S3C64XX_GPB2_EXTDMA_REQ (0x04 << 8) | ||
40 | #define S3C64XX_GPB2_ADDR_CF2 (0x05 << 8) | ||
41 | #define S3C64XX_GPB2_I2C_SCL1 (0x06 << 8) | ||
42 | #define S3C64XX_GPB2_EINT_G1_10 (0x07 << 8) | ||
43 | |||
44 | #define S3C64XX_GPB3_UART_TXD3 (0x02 << 12) | ||
45 | #define S3C64XX_GPB3_IrDA_TXD (0x03 << 12) | ||
46 | #define S3C64XX_GPB3_EXTDMA_ACK (0x04 << 12) | ||
47 | #define S3C64XX_GPB3_I2C_SDA1 (0x06 << 12) | ||
48 | #define S3C64XX_GPB3_EINT_G1_11 (0x07 << 12) | ||
49 | |||
50 | #define S3C64XX_GPB4_IrDA_SDBW (0x02 << 16) | ||
51 | #define S3C64XX_GPB4_CAM_FIELD (0x03 << 16) | ||
52 | #define S3C64XX_GPB4_CF_DATA_DIR (0x04 << 16) | ||
53 | #define S3C64XX_GPB4_EINT_G1_12 (0x07 << 16) | ||
54 | |||
55 | #define S3C64XX_GPB5_I2C_SCL0 (0x02 << 20) | ||
56 | #define S3C64XX_GPB5_EINT_G1_13 (0x07 << 20) | ||
57 | |||
58 | #define S3C64XX_GPB6_I2C_SDA0 (0x02 << 24) | ||
59 | #define S3C64XX_GPB6_EINT_G1_14 (0x07 << 24) | ||
60 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-c.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-c.h deleted file mode 100644 index db189ab1639a..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-c.h +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-c.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank C register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPCCON (S3C64XX_GPC_BASE + 0x00) | ||
16 | #define S3C64XX_GPCDAT (S3C64XX_GPC_BASE + 0x04) | ||
17 | #define S3C64XX_GPCPUD (S3C64XX_GPC_BASE + 0x08) | ||
18 | #define S3C64XX_GPCCONSLP (S3C64XX_GPC_BASE + 0x0c) | ||
19 | #define S3C64XX_GPCPUDSLP (S3C64XX_GPC_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPC_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPC_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPC_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPC0_SPI_MISO0 (0x02 << 0) | ||
26 | #define S3C64XX_GPC0_EINT_G2_0 (0x07 << 0) | ||
27 | |||
28 | #define S3C64XX_GPC1_SPI_CLKO (0x02 << 4) | ||
29 | #define S3C64XX_GPC1_EINT_G2_1 (0x07 << 4) | ||
30 | |||
31 | #define S3C64XX_GPC2_SPI_MOSIO (0x02 << 8) | ||
32 | #define S3C64XX_GPC2_EINT_G2_2 (0x07 << 8) | ||
33 | |||
34 | #define S3C64XX_GPC3_SPI_nCSO (0x02 << 12) | ||
35 | #define S3C64XX_GPC3_EINT_G2_3 (0x07 << 12) | ||
36 | |||
37 | #define S3C64XX_GPC4_SPI_MISO1 (0x02 << 16) | ||
38 | #define S3C64XX_GPC4_MMC2_CMD (0x03 << 16) | ||
39 | #define S3C64XX_GPC4_I2S_V40_DO0 (0x05 << 16) | ||
40 | #define S3C64XX_GPC4_EINT_G2_4 (0x07 << 16) | ||
41 | |||
42 | #define S3C64XX_GPC5_SPI_CLK1 (0x02 << 20) | ||
43 | #define S3C64XX_GPC5_MMC2_CLK (0x03 << 20) | ||
44 | #define S3C64XX_GPC5_I2S_V40_DO1 (0x05 << 20) | ||
45 | #define S3C64XX_GPC5_EINT_G2_5 (0x07 << 20) | ||
46 | |||
47 | #define S3C64XX_GPC6_SPI_MOSI1 (0x02 << 24) | ||
48 | #define S3C64XX_GPC6_EINT_G2_6 (0x07 << 24) | ||
49 | |||
50 | #define S3C64XX_GPC7_SPI_nCS1 (0x02 << 28) | ||
51 | #define S3C64XX_GPC7_I2S_V40_DO2 (0x05 << 28) | ||
52 | #define S3C64XX_GPC7_EINT_G2_7 (0x07 << 28) | ||
53 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-d.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-d.h deleted file mode 100644 index 1a01cee7aca3..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-d.h +++ /dev/null | |||
@@ -1,49 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-d.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank D register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPDCON (S3C64XX_GPD_BASE + 0x00) | ||
16 | #define S3C64XX_GPDDAT (S3C64XX_GPD_BASE + 0x04) | ||
17 | #define S3C64XX_GPDPUD (S3C64XX_GPD_BASE + 0x08) | ||
18 | #define S3C64XX_GPDCONSLP (S3C64XX_GPD_BASE + 0x0c) | ||
19 | #define S3C64XX_GPDPUDSLP (S3C64XX_GPD_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPD_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPD_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPD_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPD0_PCM0_SCLK (0x02 << 0) | ||
26 | #define S3C64XX_GPD0_I2S0_CLK (0x03 << 0) | ||
27 | #define S3C64XX_GPD0_AC97_BITCLK (0x04 << 0) | ||
28 | #define S3C64XX_GPD0_EINT_G3_0 (0x07 << 0) | ||
29 | |||
30 | #define S3C64XX_GPD1_PCM0_EXTCLK (0x02 << 4) | ||
31 | #define S3C64XX_GPD1_I2S0_CDCLK (0x03 << 4) | ||
32 | #define S3C64XX_GPD1_AC97_nRESET (0x04 << 4) | ||
33 | #define S3C64XX_GPD1_EINT_G3_1 (0x07 << 4) | ||
34 | |||
35 | #define S3C64XX_GPD2_PCM0_FSYNC (0x02 << 8) | ||
36 | #define S3C64XX_GPD2_I2S0_LRCLK (0x03 << 8) | ||
37 | #define S3C64XX_GPD2_AC97_SYNC (0x04 << 8) | ||
38 | #define S3C64XX_GPD2_EINT_G3_2 (0x07 << 8) | ||
39 | |||
40 | #define S3C64XX_GPD3_PCM0_SIN (0x02 << 12) | ||
41 | #define S3C64XX_GPD3_I2S0_DI (0x03 << 12) | ||
42 | #define S3C64XX_GPD3_AC97_SDI (0x04 << 12) | ||
43 | #define S3C64XX_GPD3_EINT_G3_3 (0x07 << 12) | ||
44 | |||
45 | #define S3C64XX_GPD4_PCM0_SOUT (0x02 << 16) | ||
46 | #define S3C64XX_GPD4_I2S0_D0 (0x03 << 16) | ||
47 | #define S3C64XX_GPD4_AC97_SDO (0x04 << 16) | ||
48 | #define S3C64XX_GPD4_EINT_G3_4 (0x07 << 16) | ||
49 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-e.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-e.h deleted file mode 100644 index f057adb627dd..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-e.h +++ /dev/null | |||
@@ -1,44 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-e.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank E register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPECON (S3C64XX_GPE_BASE + 0x00) | ||
16 | #define S3C64XX_GPEDAT (S3C64XX_GPE_BASE + 0x04) | ||
17 | #define S3C64XX_GPEPUD (S3C64XX_GPE_BASE + 0x08) | ||
18 | #define S3C64XX_GPECONSLP (S3C64XX_GPE_BASE + 0x0c) | ||
19 | #define S3C64XX_GPEPUDSLP (S3C64XX_GPE_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPE_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPE_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPE_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPE0_PCM1_SCLK (0x02 << 0) | ||
26 | #define S3C64XX_GPE0_I2S1_CLK (0x03 << 0) | ||
27 | #define S3C64XX_GPE0_AC97_BITCLK (0x04 << 0) | ||
28 | |||
29 | #define S3C64XX_GPE1_PCM1_EXTCLK (0x02 << 4) | ||
30 | #define S3C64XX_GPE1_I2S1_CDCLK (0x03 << 4) | ||
31 | #define S3C64XX_GPE1_AC97_nRESET (0x04 << 4) | ||
32 | |||
33 | #define S3C64XX_GPE2_PCM1_FSYNC (0x02 << 8) | ||
34 | #define S3C64XX_GPE2_I2S1_LRCLK (0x03 << 8) | ||
35 | #define S3C64XX_GPE2_AC97_SYNC (0x04 << 8) | ||
36 | |||
37 | #define S3C64XX_GPE3_PCM1_SIN (0x02 << 12) | ||
38 | #define S3C64XX_GPE3_I2S1_DI (0x03 << 12) | ||
39 | #define S3C64XX_GPE3_AC97_SDI (0x04 << 12) | ||
40 | |||
41 | #define S3C64XX_GPE4_PCM1_SOUT (0x02 << 16) | ||
42 | #define S3C64XX_GPE4_I2S1_D0 (0x03 << 16) | ||
43 | #define S3C64XX_GPE4_AC97_SDO (0x04 << 16) | ||
44 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-f.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-f.h deleted file mode 100644 index 62ab8f5e7835..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-f.h +++ /dev/null | |||
@@ -1,71 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-f.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank F register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPFCON (S3C64XX_GPF_BASE + 0x00) | ||
16 | #define S3C64XX_GPFDAT (S3C64XX_GPF_BASE + 0x04) | ||
17 | #define S3C64XX_GPFPUD (S3C64XX_GPF_BASE + 0x08) | ||
18 | #define S3C64XX_GPFCONSLP (S3C64XX_GPF_BASE + 0x0c) | ||
19 | #define S3C64XX_GPFPUDSLP (S3C64XX_GPF_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPF_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPF_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPF_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPF0_CAMIF_CLK (0x02 << 0) | ||
26 | #define S3C64XX_GPF0_EINT_G4_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPF1_CAMIF_HREF (0x02 << 2) | ||
29 | #define S3C64XX_GPF1_EINT_G4_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPF2_CAMIF_PCLK (0x02 << 4) | ||
32 | #define S3C64XX_GPF2_EINT_G4_2 (0x03 << 4) | ||
33 | |||
34 | #define S3C64XX_GPF3_CAMIF_nRST (0x02 << 6) | ||
35 | #define S3C64XX_GPF3_EINT_G4_3 (0x03 << 6) | ||
36 | |||
37 | #define S3C64XX_GPF4_CAMIF_VSYNC (0x02 << 8) | ||
38 | #define S3C64XX_GPF4_EINT_G4_4 (0x03 << 8) | ||
39 | |||
40 | #define S3C64XX_GPF5_CAMIF_YDATA0 (0x02 << 10) | ||
41 | #define S3C64XX_GPF5_EINT_G4_5 (0x03 << 10) | ||
42 | |||
43 | #define S3C64XX_GPF6_CAMIF_YDATA1 (0x02 << 12) | ||
44 | #define S3C64XX_GPF6_EINT_G4_6 (0x03 << 12) | ||
45 | |||
46 | #define S3C64XX_GPF7_CAMIF_YDATA2 (0x02 << 14) | ||
47 | #define S3C64XX_GPF7_EINT_G4_7 (0x03 << 14) | ||
48 | |||
49 | #define S3C64XX_GPF8_CAMIF_YDATA3 (0x02 << 16) | ||
50 | #define S3C64XX_GPF8_EINT_G4_8 (0x03 << 16) | ||
51 | |||
52 | #define S3C64XX_GPF9_CAMIF_YDATA4 (0x02 << 18) | ||
53 | #define S3C64XX_GPF9_EINT_G4_9 (0x03 << 18) | ||
54 | |||
55 | #define S3C64XX_GPF10_CAMIF_YDATA5 (0x02 << 20) | ||
56 | #define S3C64XX_GPF10_EINT_G4_10 (0x03 << 20) | ||
57 | |||
58 | #define S3C64XX_GPF11_CAMIF_YDATA6 (0x02 << 22) | ||
59 | #define S3C64XX_GPF11_EINT_G4_11 (0x03 << 22) | ||
60 | |||
61 | #define S3C64XX_GPF12_CAMIF_YDATA7 (0x02 << 24) | ||
62 | #define S3C64XX_GPF12_EINT_G4_12 (0x03 << 24) | ||
63 | |||
64 | #define S3C64XX_GPF13_PWM_ECLK (0x02 << 26) | ||
65 | #define S3C64XX_GPF13_EINT_G4_13 (0x03 << 26) | ||
66 | |||
67 | #define S3C64XX_GPF14_PWM_TOUT0 (0x02 << 28) | ||
68 | #define S3C64XX_GPF14_CLKOUT0 (0x03 << 28) | ||
69 | |||
70 | #define S3C64XX_GPF15_PWM_TOUT1 (0x02 << 30) | ||
71 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-g.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-g.h deleted file mode 100644 index b94954af1598..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-g.h +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-g.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank G register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPGCON (S3C64XX_GPG_BASE + 0x00) | ||
16 | #define S3C64XX_GPGDAT (S3C64XX_GPG_BASE + 0x04) | ||
17 | #define S3C64XX_GPGPUD (S3C64XX_GPG_BASE + 0x08) | ||
18 | #define S3C64XX_GPGCONSLP (S3C64XX_GPG_BASE + 0x0c) | ||
19 | #define S3C64XX_GPGPUDSLP (S3C64XX_GPG_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPG_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
22 | #define S3C64XX_GPG_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPG_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
24 | |||
25 | #define S3C64XX_GPG0_MMC0_CLK (0x02 << 0) | ||
26 | #define S3C64XX_GPG0_EINT_G5_0 (0x07 << 0) | ||
27 | |||
28 | #define S3C64XX_GPG1_MMC0_CMD (0x02 << 4) | ||
29 | #define S3C64XX_GPG1_EINT_G5_1 (0x07 << 4) | ||
30 | |||
31 | #define S3C64XX_GPG2_MMC0_DATA0 (0x02 << 8) | ||
32 | #define S3C64XX_GPG2_EINT_G5_2 (0x07 << 8) | ||
33 | |||
34 | #define S3C64XX_GPG3_MMC0_DATA1 (0x02 << 12) | ||
35 | #define S3C64XX_GPG3_EINT_G5_3 (0x07 << 12) | ||
36 | |||
37 | #define S3C64XX_GPG4_MMC0_DATA2 (0x02 << 16) | ||
38 | #define S3C64XX_GPG4_EINT_G5_4 (0x07 << 16) | ||
39 | |||
40 | #define S3C64XX_GPG5_MMC0_DATA3 (0x02 << 20) | ||
41 | #define S3C64XX_GPG5_EINT_G5_5 (0x07 << 20) | ||
42 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-h.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-h.h deleted file mode 100644 index 5d75aaad865e..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-h.h +++ /dev/null | |||
@@ -1,74 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-h.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank H register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPHCON0 (S3C64XX_GPH_BASE + 0x00) | ||
16 | #define S3C64XX_GPHCON1 (S3C64XX_GPH_BASE + 0x04) | ||
17 | #define S3C64XX_GPHDAT (S3C64XX_GPH_BASE + 0x08) | ||
18 | #define S3C64XX_GPHPUD (S3C64XX_GPH_BASE + 0x0c) | ||
19 | #define S3C64XX_GPHCONSLP (S3C64XX_GPH_BASE + 0x10) | ||
20 | #define S3C64XX_GPHPUDSLP (S3C64XX_GPH_BASE + 0x14) | ||
21 | |||
22 | #define S3C64XX_GPH_CONMASK(__gpio) (0xf << ((__gpio) * 4)) | ||
23 | #define S3C64XX_GPH_INPUT(__gpio) (0x0 << ((__gpio) * 4)) | ||
24 | #define S3C64XX_GPH_OUTPUT(__gpio) (0x1 << ((__gpio) * 4)) | ||
25 | |||
26 | #define S3C64XX_GPH0_MMC1_CLK (0x02 << 0) | ||
27 | #define S3C64XX_GPH0_KP_COL0 (0x04 << 0) | ||
28 | #define S3C64XX_GPH0_EINT_G6_0 (0x07 << 0) | ||
29 | |||
30 | #define S3C64XX_GPH1_MMC1_CMD (0x02 << 4) | ||
31 | #define S3C64XX_GPH1_KP_COL1 (0x04 << 4) | ||
32 | #define S3C64XX_GPH1_EINT_G6_1 (0x07 << 4) | ||
33 | |||
34 | #define S3C64XX_GPH2_MMC1_DATA0 (0x02 << 8) | ||
35 | #define S3C64XX_GPH2_KP_COL2 (0x04 << 8) | ||
36 | #define S3C64XX_GPH2_EINT_G6_2 (0x07 << 8) | ||
37 | |||
38 | #define S3C64XX_GPH3_MMC1_DATA1 (0x02 << 12) | ||
39 | #define S3C64XX_GPH3_KP_COL3 (0x04 << 12) | ||
40 | #define S3C64XX_GPH3_EINT_G6_3 (0x07 << 12) | ||
41 | |||
42 | #define S3C64XX_GPH4_MMC1_DATA2 (0x02 << 16) | ||
43 | #define S3C64XX_GPH4_KP_COL4 (0x04 << 16) | ||
44 | #define S3C64XX_GPH4_EINT_G6_4 (0x07 << 16) | ||
45 | |||
46 | #define S3C64XX_GPH5_MMC1_DATA3 (0x02 << 20) | ||
47 | #define S3C64XX_GPH5_KP_COL5 (0x04 << 20) | ||
48 | #define S3C64XX_GPH5_EINT_G6_5 (0x07 << 20) | ||
49 | |||
50 | #define S3C64XX_GPH6_MMC1_DATA4 (0x02 << 24) | ||
51 | #define S3C64XX_GPH6_MMC2_DATA0 (0x03 << 24) | ||
52 | #define S3C64XX_GPH6_KP_COL6 (0x04 << 24) | ||
53 | #define S3C64XX_GPH6_I2S_V40_BCLK (0x05 << 24) | ||
54 | #define S3C64XX_GPH6_ADDR_CF0 (0x06 << 24) | ||
55 | #define S3C64XX_GPH6_EINT_G6_6 (0x07 << 24) | ||
56 | |||
57 | #define S3C64XX_GPH7_MMC1_DATA5 (0x02 << 28) | ||
58 | #define S3C64XX_GPH7_MMC2_DATA1 (0x03 << 28) | ||
59 | #define S3C64XX_GPH7_KP_COL7 (0x04 << 28) | ||
60 | #define S3C64XX_GPH7_I2S_V40_CDCLK (0x05 << 28) | ||
61 | #define S3C64XX_GPH7_ADDR_CF1 (0x06 << 28) | ||
62 | #define S3C64XX_GPH7_EINT_G6_7 (0x07 << 28) | ||
63 | |||
64 | #define S3C64XX_GPH8_MMC1_DATA6 (0x02 << 0) | ||
65 | #define S3C64XX_GPH8_MMC2_DATA2 (0x03 << 0) | ||
66 | #define S3C64XX_GPH8_I2S_V40_LRCLK (0x05 << 0) | ||
67 | #define S3C64XX_GPH8_ADDR_CF2 (0x06 << 0) | ||
68 | #define S3C64XX_GPH8_EINT_G6_8 (0x07 << 0) | ||
69 | |||
70 | #define S3C64XX_GPH9_OUTPUT (0x01 << 4) | ||
71 | #define S3C64XX_GPH9_MMC1_DATA7 (0x02 << 4) | ||
72 | #define S3C64XX_GPH9_MMC2_DATA3 (0x03 << 4) | ||
73 | #define S3C64XX_GPH9_I2S_V40_DI (0x05 << 4) | ||
74 | #define S3C64XX_GPH9_EINT_G6_9 (0x07 << 4) | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-i.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-i.h deleted file mode 100644 index 4ceaa6098bc7..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-i.h +++ /dev/null | |||
@@ -1,40 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-i.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank I register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPICON (S3C64XX_GPI_BASE + 0x00) | ||
16 | #define S3C64XX_GPIDAT (S3C64XX_GPI_BASE + 0x04) | ||
17 | #define S3C64XX_GPIPUD (S3C64XX_GPI_BASE + 0x08) | ||
18 | #define S3C64XX_GPICONSLP (S3C64XX_GPI_BASE + 0x0c) | ||
19 | #define S3C64XX_GPIPUDSLP (S3C64XX_GPI_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPI_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPI_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPI_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPI0_VD0 (0x02 << 0) | ||
26 | #define S3C64XX_GPI1_VD1 (0x02 << 2) | ||
27 | #define S3C64XX_GPI2_VD2 (0x02 << 4) | ||
28 | #define S3C64XX_GPI3_VD3 (0x02 << 6) | ||
29 | #define S3C64XX_GPI4_VD4 (0x02 << 8) | ||
30 | #define S3C64XX_GPI5_VD5 (0x02 << 10) | ||
31 | #define S3C64XX_GPI6_VD6 (0x02 << 12) | ||
32 | #define S3C64XX_GPI7_VD7 (0x02 << 14) | ||
33 | #define S3C64XX_GPI8_VD8 (0x02 << 16) | ||
34 | #define S3C64XX_GPI9_VD9 (0x02 << 18) | ||
35 | #define S3C64XX_GPI10_VD10 (0x02 << 20) | ||
36 | #define S3C64XX_GPI11_VD11 (0x02 << 22) | ||
37 | #define S3C64XX_GPI12_VD12 (0x02 << 24) | ||
38 | #define S3C64XX_GPI13_VD13 (0x02 << 26) | ||
39 | #define S3C64XX_GPI14_VD14 (0x02 << 28) | ||
40 | #define S3C64XX_GPI15_VD15 (0x02 << 30) | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-j.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-j.h deleted file mode 100644 index 6f25cd079a40..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-j.h +++ /dev/null | |||
@@ -1,36 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-j.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank J register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPJCON (S3C64XX_GPJ_BASE + 0x00) | ||
16 | #define S3C64XX_GPJDAT (S3C64XX_GPJ_BASE + 0x04) | ||
17 | #define S3C64XX_GPJPUD (S3C64XX_GPJ_BASE + 0x08) | ||
18 | #define S3C64XX_GPJCONSLP (S3C64XX_GPJ_BASE + 0x0c) | ||
19 | #define S3C64XX_GPJPUDSLP (S3C64XX_GPJ_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPJ_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPJ_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPJ_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPJ0_VD16 (0x02 << 0) | ||
26 | #define S3C64XX_GPJ1_VD17 (0x02 << 2) | ||
27 | #define S3C64XX_GPJ2_VD18 (0x02 << 4) | ||
28 | #define S3C64XX_GPJ3_VD19 (0x02 << 6) | ||
29 | #define S3C64XX_GPJ4_VD20 (0x02 << 8) | ||
30 | #define S3C64XX_GPJ5_VD21 (0x02 << 10) | ||
31 | #define S3C64XX_GPJ6_VD22 (0x02 << 12) | ||
32 | #define S3C64XX_GPJ7_VD23 (0x02 << 14) | ||
33 | #define S3C64XX_GPJ8_LCD_HSYNC (0x02 << 16) | ||
34 | #define S3C64XX_GPJ9_LCD_VSYNC (0x02 << 18) | ||
35 | #define S3C64XX_GPJ10_LCD_VDEN (0x02 << 20) | ||
36 | #define S3C64XX_GPJ11_LCD_VCLK (0x02 << 22) | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-n.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-n.h deleted file mode 100644 index d0aeda1cd9de..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-n.h +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-n.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank N register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPNCON (S3C64XX_GPN_BASE + 0x00) | ||
16 | #define S3C64XX_GPNDAT (S3C64XX_GPN_BASE + 0x04) | ||
17 | #define S3C64XX_GPNPUD (S3C64XX_GPN_BASE + 0x08) | ||
18 | |||
19 | #define S3C64XX_GPN_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
20 | #define S3C64XX_GPN_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
21 | #define S3C64XX_GPN_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
22 | |||
23 | #define S3C64XX_GPN0_EINT0 (0x02 << 0) | ||
24 | #define S3C64XX_GPN0_KP_ROW0 (0x03 << 0) | ||
25 | |||
26 | #define S3C64XX_GPN1_EINT1 (0x02 << 2) | ||
27 | #define S3C64XX_GPN1_KP_ROW1 (0x03 << 2) | ||
28 | |||
29 | #define S3C64XX_GPN2_EINT2 (0x02 << 4) | ||
30 | #define S3C64XX_GPN2_KP_ROW2 (0x03 << 4) | ||
31 | |||
32 | #define S3C64XX_GPN3_EINT3 (0x02 << 6) | ||
33 | #define S3C64XX_GPN3_KP_ROW3 (0x03 << 6) | ||
34 | |||
35 | #define S3C64XX_GPN4_EINT4 (0x02 << 8) | ||
36 | #define S3C64XX_GPN4_KP_ROW4 (0x03 << 8) | ||
37 | |||
38 | #define S3C64XX_GPN5_EINT5 (0x02 << 10) | ||
39 | #define S3C64XX_GPN5_KP_ROW5 (0x03 << 10) | ||
40 | |||
41 | #define S3C64XX_GPN6_EINT6 (0x02 << 12) | ||
42 | #define S3C64XX_GPN6_KP_ROW6 (0x03 << 12) | ||
43 | |||
44 | #define S3C64XX_GPN7_EINT7 (0x02 << 14) | ||
45 | #define S3C64XX_GPN7_KP_ROW7 (0x03 << 14) | ||
46 | |||
47 | #define S3C64XX_GPN8_EINT8 (0x02 << 16) | ||
48 | #define S3C64XX_GPN9_EINT9 (0x02 << 18) | ||
49 | #define S3C64XX_GPN10_EINT10 (0x02 << 20) | ||
50 | #define S3C64XX_GPN11_EINT11 (0x02 << 22) | ||
51 | #define S3C64XX_GPN12_EINT12 (0x02 << 24) | ||
52 | #define S3C64XX_GPN13_EINT13 (0x02 << 26) | ||
53 | #define S3C64XX_GPN14_EINT14 (0x02 << 28) | ||
54 | #define S3C64XX_GPN15_EINT15 (0x02 << 30) | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-o.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-o.h deleted file mode 100644 index 21868fa102d0..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-o.h +++ /dev/null | |||
@@ -1,70 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-o.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank O register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPOCON (S3C64XX_GPO_BASE + 0x00) | ||
16 | #define S3C64XX_GPODAT (S3C64XX_GPO_BASE + 0x04) | ||
17 | #define S3C64XX_GPOPUD (S3C64XX_GPO_BASE + 0x08) | ||
18 | #define S3C64XX_GPOCONSLP (S3C64XX_GPO_BASE + 0x0c) | ||
19 | #define S3C64XX_GPOPUDSLP (S3C64XX_GPO_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPO_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPO_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPO_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPO0_MEM0_nCS2 (0x02 << 0) | ||
26 | #define S3C64XX_GPO0_EINT_G7_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPO1_MEM0_nCS3 (0x02 << 2) | ||
29 | #define S3C64XX_GPO1_EINT_G7_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPO2_MEM0_nCS4 (0x02 << 4) | ||
32 | #define S3C64XX_GPO2_EINT_G7_2 (0x03 << 4) | ||
33 | |||
34 | #define S3C64XX_GPO3_MEM0_nCS5 (0x02 << 6) | ||
35 | #define S3C64XX_GPO3_EINT_G7_3 (0x03 << 6) | ||
36 | |||
37 | #define S3C64XX_GPO4_EINT_G7_4 (0x03 << 8) | ||
38 | |||
39 | #define S3C64XX_GPO5_EINT_G7_5 (0x03 << 10) | ||
40 | |||
41 | #define S3C64XX_GPO6_MEM0_ADDR6 (0x02 << 12) | ||
42 | #define S3C64XX_GPO6_EINT_G7_6 (0x03 << 12) | ||
43 | |||
44 | #define S3C64XX_GPO7_MEM0_ADDR7 (0x02 << 14) | ||
45 | #define S3C64XX_GPO7_EINT_G7_7 (0x03 << 14) | ||
46 | |||
47 | #define S3C64XX_GPO8_MEM0_ADDR8 (0x02 << 16) | ||
48 | #define S3C64XX_GPO8_EINT_G7_8 (0x03 << 16) | ||
49 | |||
50 | #define S3C64XX_GPO9_MEM0_ADDR9 (0x02 << 18) | ||
51 | #define S3C64XX_GPO9_EINT_G7_9 (0x03 << 18) | ||
52 | |||
53 | #define S3C64XX_GPO10_MEM0_ADDR10 (0x02 << 20) | ||
54 | #define S3C64XX_GPO10_EINT_G7_10 (0x03 << 20) | ||
55 | |||
56 | #define S3C64XX_GPO11_MEM0_ADDR11 (0x02 << 22) | ||
57 | #define S3C64XX_GPO11_EINT_G7_11 (0x03 << 22) | ||
58 | |||
59 | #define S3C64XX_GPO12_MEM0_ADDR12 (0x02 << 24) | ||
60 | #define S3C64XX_GPO12_EINT_G7_12 (0x03 << 24) | ||
61 | |||
62 | #define S3C64XX_GPO13_MEM0_ADDR13 (0x02 << 26) | ||
63 | #define S3C64XX_GPO13_EINT_G7_13 (0x03 << 26) | ||
64 | |||
65 | #define S3C64XX_GPO14_MEM0_ADDR14 (0x02 << 28) | ||
66 | #define S3C64XX_GPO14_EINT_G7_14 (0x03 << 28) | ||
67 | |||
68 | #define S3C64XX_GPO15_MEM0_ADDR15 (0x02 << 30) | ||
69 | #define S3C64XX_GPO15_EINT_G7_15 (0x03 << 30) | ||
70 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-p.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-p.h deleted file mode 100644 index 46bcfb63b8de..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-p.h +++ /dev/null | |||
@@ -1,69 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-p.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank P register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPPCON (S3C64XX_GPP_BASE + 0x00) | ||
16 | #define S3C64XX_GPPDAT (S3C64XX_GPP_BASE + 0x04) | ||
17 | #define S3C64XX_GPPPUD (S3C64XX_GPP_BASE + 0x08) | ||
18 | #define S3C64XX_GPPCONSLP (S3C64XX_GPP_BASE + 0x0c) | ||
19 | #define S3C64XX_GPPPUDSLP (S3C64XX_GPP_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPP_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPP_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPP_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPP0_MEM0_ADDRV (0x02 << 0) | ||
26 | #define S3C64XX_GPP0_EINT_G8_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPP1_MEM0_SMCLK (0x02 << 2) | ||
29 | #define S3C64XX_GPP1_EINT_G8_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPP2_MEM0_nWAIT (0x02 << 4) | ||
32 | #define S3C64XX_GPP2_EINT_G8_2 (0x03 << 4) | ||
33 | |||
34 | #define S3C64XX_GPP3_MEM0_RDY0_ALE (0x02 << 6) | ||
35 | #define S3C64XX_GPP3_EINT_G8_3 (0x03 << 6) | ||
36 | |||
37 | #define S3C64XX_GPP4_MEM0_RDY1_CLE (0x02 << 8) | ||
38 | #define S3C64XX_GPP4_EINT_G8_4 (0x03 << 8) | ||
39 | |||
40 | #define S3C64XX_GPP5_MEM0_INTsm0_FWE (0x02 << 10) | ||
41 | #define S3C64XX_GPP5_EINT_G8_5 (0x03 << 10) | ||
42 | |||
43 | #define S3C64XX_GPP6_MEM0_(null) (0x02 << 12) | ||
44 | #define S3C64XX_GPP6_EINT_G8_6 (0x03 << 12) | ||
45 | |||
46 | #define S3C64XX_GPP7_MEM0_INTsm1_FRE (0x02 << 14) | ||
47 | #define S3C64XX_GPP7_EINT_G8_7 (0x03 << 14) | ||
48 | |||
49 | #define S3C64XX_GPP8_MEM0_RPn_RnB (0x02 << 16) | ||
50 | #define S3C64XX_GPP8_EINT_G8_8 (0x03 << 16) | ||
51 | |||
52 | #define S3C64XX_GPP9_MEM0_ATA_RESET (0x02 << 18) | ||
53 | #define S3C64XX_GPP9_EINT_G8_9 (0x03 << 18) | ||
54 | |||
55 | #define S3C64XX_GPP10_MEM0_ATA_INPACK (0x02 << 20) | ||
56 | #define S3C64XX_GPP10_EINT_G8_10 (0x03 << 20) | ||
57 | |||
58 | #define S3C64XX_GPP11_MEM0_ATA_REG (0x02 << 22) | ||
59 | #define S3C64XX_GPP11_EINT_G8_11 (0x03 << 22) | ||
60 | |||
61 | #define S3C64XX_GPP12_MEM0_ATA_WE (0x02 << 24) | ||
62 | #define S3C64XX_GPP12_EINT_G8_12 (0x03 << 24) | ||
63 | |||
64 | #define S3C64XX_GPP13_MEM0_ATA_OE (0x02 << 26) | ||
65 | #define S3C64XX_GPP13_EINT_G8_13 (0x03 << 26) | ||
66 | |||
67 | #define S3C64XX_GPP14_MEM0_ATA_CD (0x02 << 28) | ||
68 | #define S3C64XX_GPP14_EINT_G8_14 (0x03 << 28) | ||
69 | |||
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-q.h b/arch/arm/mach-s3c64xx/include/mach/gpio-bank-q.h deleted file mode 100644 index 1712223487b0..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/gpio-bank-q.h +++ /dev/null | |||
@@ -1,46 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/include/mach/gpio-bank-q.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * GPIO Bank Q register and configuration definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #define S3C64XX_GPQCON (S3C64XX_GPQ_BASE + 0x00) | ||
16 | #define S3C64XX_GPQDAT (S3C64XX_GPQ_BASE + 0x04) | ||
17 | #define S3C64XX_GPQPUD (S3C64XX_GPQ_BASE + 0x08) | ||
18 | #define S3C64XX_GPQCONSLP (S3C64XX_GPQ_BASE + 0x0c) | ||
19 | #define S3C64XX_GPQPUDSLP (S3C64XX_GPQ_BASE + 0x10) | ||
20 | |||
21 | #define S3C64XX_GPQ_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
22 | #define S3C64XX_GPQ_INPUT(__gpio) (0x0 << ((__gpio) * 2)) | ||
23 | #define S3C64XX_GPQ_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
24 | |||
25 | #define S3C64XX_GPQ0_MEM0_ADDR18_RAS (0x02 << 0) | ||
26 | #define S3C64XX_GPQ0_EINT_G9_0 (0x03 << 0) | ||
27 | |||
28 | #define S3C64XX_GPQ1_MEM0_ADDR19_CAS (0x02 << 2) | ||
29 | #define S3C64XX_GPQ1_EINT_G9_1 (0x03 << 2) | ||
30 | |||
31 | #define S3C64XX_GPQ2_EINT_G9_2 (0x03 << 4) | ||
32 | |||
33 | #define S3C64XX_GPQ3_EINT_G9_3 (0x03 << 6) | ||
34 | |||
35 | #define S3C64XX_GPQ4_EINT_G9_4 (0x03 << 8) | ||
36 | |||
37 | #define S3C64XX_GPQ5_EINT_G9_5 (0x03 << 10) | ||
38 | |||
39 | #define S3C64XX_GPQ6_EINT_G9_6 (0x03 << 12) | ||
40 | |||
41 | #define S3C64XX_GPQ7_MEM0_ADDR17_WENDMC (0x02 << 14) | ||
42 | #define S3C64XX_GPQ7_EINT_G9_7 (0x03 << 14) | ||
43 | |||
44 | #define S3C64XX_GPQ8_MEM0_ADDR16_APDMC (0x02 << 16) | ||
45 | #define S3C64XX_GPQ8_EINT_G9_8 (0x03 << 16) | ||
46 | |||
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index 686a4f270b12..2c0353a80906 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -50,7 +50,6 @@ | |||
50 | #include <mach/hardware.h> | 50 | #include <mach/hardware.h> |
51 | #include <mach/regs-fb.h> | 51 | #include <mach/regs-fb.h> |
52 | #include <mach/map.h> | 52 | #include <mach/map.h> |
53 | #include <mach/gpio-bank-f.h> | ||
54 | 53 | ||
55 | #include <asm/irq.h> | 54 | #include <asm/irq.h> |
56 | #include <asm/mach-types.h> | 55 | #include <asm/mach-types.h> |
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c index 79412f735a8d..bc1c470b7de6 100644 --- a/arch/arm/mach-s3c64xx/pm.c +++ b/arch/arm/mach-s3c64xx/pm.c | |||
@@ -30,26 +30,18 @@ | |||
30 | #include <mach/regs-gpio-memport.h> | 30 | #include <mach/regs-gpio-memport.h> |
31 | 31 | ||
32 | #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK | 32 | #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK |
33 | #include <mach/gpio-bank-n.h> | ||
34 | |||
35 | void s3c_pm_debug_smdkled(u32 set, u32 clear) | 33 | void s3c_pm_debug_smdkled(u32 set, u32 clear) |
36 | { | 34 | { |
37 | unsigned long flags; | 35 | unsigned long flags; |
38 | u32 reg; | 36 | int i; |
39 | 37 | ||
40 | local_irq_save(flags); | 38 | local_irq_save(flags); |
41 | reg = __raw_readl(S3C64XX_GPNCON); | 39 | for (i = 0; i < 4; i++) { |
42 | reg &= ~(S3C64XX_GPN_CONMASK(12) | S3C64XX_GPN_CONMASK(13) | | 40 | if (clear & (1 << i)) |
43 | S3C64XX_GPN_CONMASK(14) | S3C64XX_GPN_CONMASK(15)); | 41 | gpio_set_value(S3C64XX_GPN(12 + i), 0); |
44 | reg |= S3C64XX_GPN_OUTPUT(12) | S3C64XX_GPN_OUTPUT(13) | | 42 | if (set & (1 << i)) |
45 | S3C64XX_GPN_OUTPUT(14) | S3C64XX_GPN_OUTPUT(15); | 43 | gpio_set_value(S3C64XX_GPN(12 + i), 1); |
46 | __raw_writel(reg, S3C64XX_GPNCON); | 44 | } |
47 | |||
48 | reg = __raw_readl(S3C64XX_GPNDAT); | ||
49 | reg &= ~(clear << 12); | ||
50 | reg |= set << 12; | ||
51 | __raw_writel(reg, S3C64XX_GPNDAT); | ||
52 | |||
53 | local_irq_restore(flags); | 45 | local_irq_restore(flags); |
54 | } | 46 | } |
55 | #endif | 47 | #endif |
@@ -187,6 +179,18 @@ static int s3c64xx_pm_init(void) | |||
187 | pm_cpu_prep = s3c64xx_pm_prepare; | 179 | pm_cpu_prep = s3c64xx_pm_prepare; |
188 | pm_cpu_sleep = s3c64xx_cpu_suspend; | 180 | pm_cpu_sleep = s3c64xx_cpu_suspend; |
189 | pm_uart_udivslot = 1; | 181 | pm_uart_udivslot = 1; |
182 | |||
183 | #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK | ||
184 | gpio_request(S3C64XX_GPN(12), "DEBUG_LED0"); | ||
185 | gpio_request(S3C64XX_GPN(13), "DEBUG_LED1"); | ||
186 | gpio_request(S3C64XX_GPN(14), "DEBUG_LED2"); | ||
187 | gpio_request(S3C64XX_GPN(15), "DEBUG_LED3"); | ||
188 | gpio_direction_output(S3C64XX_GPN(12), 0); | ||
189 | gpio_direction_output(S3C64XX_GPN(13), 0); | ||
190 | gpio_direction_output(S3C64XX_GPN(14), 0); | ||
191 | gpio_direction_output(S3C64XX_GPN(15), 0); | ||
192 | #endif | ||
193 | |||
190 | return 0; | 194 | return 0; |
191 | } | 195 | } |
192 | 196 | ||
diff --git a/arch/arm/mach-s3c64xx/setup-i2c0.c b/arch/arm/mach-s3c64xx/setup-i2c0.c index 406192a43c6e..241af94a9e70 100644 --- a/arch/arm/mach-s3c64xx/setup-i2c0.c +++ b/arch/arm/mach-s3c64xx/setup-i2c0.c | |||
@@ -18,14 +18,11 @@ | |||
18 | 18 | ||
19 | struct platform_device; /* don't need the contents */ | 19 | struct platform_device; /* don't need the contents */ |
20 | 20 | ||
21 | #include <mach/gpio-bank-b.h> | ||
22 | #include <plat/iic.h> | 21 | #include <plat/iic.h> |
23 | #include <plat/gpio-cfg.h> | 22 | #include <plat/gpio-cfg.h> |
24 | 23 | ||
25 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) |
26 | { | 25 | { |
27 | s3c_gpio_cfgpin(S3C64XX_GPB(5), S3C64XX_GPB5_I2C_SCL0); | 26 | s3c_gpio_cfgall_range(S3C64XX_GPB(5), 2, |
28 | s3c_gpio_cfgpin(S3C64XX_GPB(6), S3C64XX_GPB6_I2C_SDA0); | 27 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
29 | s3c_gpio_setpull(S3C64XX_GPB(5), S3C_GPIO_PULL_UP); | ||
30 | s3c_gpio_setpull(S3C64XX_GPB(6), S3C_GPIO_PULL_UP); | ||
31 | } | 28 | } |
diff --git a/arch/arm/mach-s3c64xx/setup-i2c1.c b/arch/arm/mach-s3c64xx/setup-i2c1.c index 1ee62c97cd7f..3d13a961986d 100644 --- a/arch/arm/mach-s3c64xx/setup-i2c1.c +++ b/arch/arm/mach-s3c64xx/setup-i2c1.c | |||
@@ -18,14 +18,11 @@ | |||
18 | 18 | ||
19 | struct platform_device; /* don't need the contents */ | 19 | struct platform_device; /* don't need the contents */ |
20 | 20 | ||
21 | #include <mach/gpio-bank-b.h> | ||
22 | #include <plat/iic.h> | 21 | #include <plat/iic.h> |
23 | #include <plat/gpio-cfg.h> | 22 | #include <plat/gpio-cfg.h> |
24 | 23 | ||
25 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) |
26 | { | 25 | { |
27 | s3c_gpio_cfgpin(S3C64XX_GPB(2), S3C64XX_GPB2_I2C_SCL1); | 26 | s3c_gpio_cfgall_range(S3C64XX_GPB(2), 2, |
28 | s3c_gpio_cfgpin(S3C64XX_GPB(3), S3C64XX_GPB3_I2C_SDA1); | 27 | S3C_GPIO_SFN(6), S3C_GPIO_PULL_UP); |
29 | s3c_gpio_setpull(S3C64XX_GPB(2), S3C_GPIO_PULL_UP); | ||
30 | s3c_gpio_setpull(S3C64XX_GPB(3), S3C_GPIO_PULL_UP); | ||
31 | } | 28 | } |
diff --git a/arch/arm/mach-s3c64xx/sleep.S b/arch/arm/mach-s3c64xx/sleep.S index afe5a762f46e..1f87732b2320 100644 --- a/arch/arm/mach-s3c64xx/sleep.S +++ b/arch/arm/mach-s3c64xx/sleep.S | |||
@@ -20,7 +20,6 @@ | |||
20 | #define S3C64XX_VA_GPIO (0x0) | 20 | #define S3C64XX_VA_GPIO (0x0) |
21 | 21 | ||
22 | #include <mach/regs-gpio.h> | 22 | #include <mach/regs-gpio.h> |
23 | #include <mach/gpio-bank-n.h> | ||
24 | 23 | ||
25 | #define LL_UART (S3C_PA_UART + (0x400 * CONFIG_S3C_LOWLEVEL_UART_PORT)) | 24 | #define LL_UART (S3C_PA_UART + (0x400 * CONFIG_S3C_LOWLEVEL_UART_PORT)) |
26 | 25 | ||
@@ -68,6 +67,13 @@ ENTRY(s3c_cpu_resume) | |||
68 | ldr r2, =LL_UART /* for debug */ | 67 | ldr r2, =LL_UART /* for debug */ |
69 | 68 | ||
70 | #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK | 69 | #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK |
70 | |||
71 | #define S3C64XX_GPNCON (S3C64XX_GPN_BASE + 0x00) | ||
72 | #define S3C64XX_GPNDAT (S3C64XX_GPN_BASE + 0x04) | ||
73 | |||
74 | #define S3C64XX_GPN_CONMASK(__gpio) (0x3 << ((__gpio) * 2)) | ||
75 | #define S3C64XX_GPN_OUTPUT(__gpio) (0x1 << ((__gpio) * 2)) | ||
76 | |||
71 | /* Initialise the GPIO state if we are debugging via the SMDK LEDs, | 77 | /* Initialise the GPIO state if we are debugging via the SMDK LEDs, |
72 | * as the uboot version supplied resets these to inputs during the | 78 | * as the uboot version supplied resets these to inputs during the |
73 | * resume checks. | 79 | * resume checks. |
diff --git a/arch/arm/mach-s5p6442/Kconfig b/arch/arm/mach-s5p6442/Kconfig deleted file mode 100644 index 33569e4007c4..000000000000 --- a/arch/arm/mach-s5p6442/Kconfig +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | # arch/arm/mach-s5p6442/Kconfig | ||
2 | # | ||
3 | # Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | # http://www.samsung.com/ | ||
5 | # | ||
6 | # Licensed under GPLv2 | ||
7 | |||
8 | # Configuration options for the S5P6442 | ||
9 | |||
10 | if ARCH_S5P6442 | ||
11 | |||
12 | config CPU_S5P6442 | ||
13 | bool | ||
14 | select S3C_PL330_DMA | ||
15 | help | ||
16 | Enable S5P6442 CPU support | ||
17 | |||
18 | config MACH_SMDK6442 | ||
19 | bool "SMDK6442" | ||
20 | select CPU_S5P6442 | ||
21 | select S3C_DEV_WDT | ||
22 | help | ||
23 | Machine support for Samsung SMDK6442 | ||
24 | |||
25 | endif | ||
diff --git a/arch/arm/mach-s5p6442/Makefile b/arch/arm/mach-s5p6442/Makefile deleted file mode 100644 index 90a3d8373416..000000000000 --- a/arch/arm/mach-s5p6442/Makefile +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | # arch/arm/mach-s5p6442/Makefile | ||
2 | # | ||
3 | # Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | # http://www.samsung.com/ | ||
5 | # | ||
6 | # Licensed under GPLv2 | ||
7 | |||
8 | obj-y := | ||
9 | obj-m := | ||
10 | obj-n := | ||
11 | obj- := | ||
12 | |||
13 | # Core support for S5P6442 system | ||
14 | |||
15 | obj-$(CONFIG_CPU_S5P6442) += cpu.o init.o clock.o dma.o | ||
16 | obj-$(CONFIG_CPU_S5P6442) += setup-i2c0.o | ||
17 | |||
18 | # machine support | ||
19 | |||
20 | obj-$(CONFIG_MACH_SMDK6442) += mach-smdk6442.o | ||
21 | |||
22 | # device support | ||
23 | obj-y += dev-audio.o | ||
24 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o | ||
diff --git a/arch/arm/mach-s5p6442/Makefile.boot b/arch/arm/mach-s5p6442/Makefile.boot deleted file mode 100644 index ff90aa13bd67..000000000000 --- a/arch/arm/mach-s5p6442/Makefile.boot +++ /dev/null | |||
@@ -1,2 +0,0 @@ | |||
1 | zreladdr-y := 0x20008000 | ||
2 | params_phys-y := 0x20000100 | ||
diff --git a/arch/arm/mach-s5p6442/clock.c b/arch/arm/mach-s5p6442/clock.c deleted file mode 100644 index fbbc7bede685..000000000000 --- a/arch/arm/mach-s5p6442/clock.c +++ /dev/null | |||
@@ -1,420 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/clock.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - Clock support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/init.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/list.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/clk.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <mach/map.h> | ||
22 | |||
23 | #include <plat/cpu-freq.h> | ||
24 | #include <mach/regs-clock.h> | ||
25 | #include <plat/clock.h> | ||
26 | #include <plat/cpu.h> | ||
27 | #include <plat/pll.h> | ||
28 | #include <plat/s5p-clock.h> | ||
29 | #include <plat/clock-clksrc.h> | ||
30 | #include <plat/s5p6442.h> | ||
31 | |||
32 | static struct clksrc_clk clk_mout_apll = { | ||
33 | .clk = { | ||
34 | .name = "mout_apll", | ||
35 | .id = -1, | ||
36 | }, | ||
37 | .sources = &clk_src_apll, | ||
38 | .reg_src = { .reg = S5P_CLK_SRC0, .shift = 0, .size = 1 }, | ||
39 | }; | ||
40 | |||
41 | static struct clksrc_clk clk_mout_mpll = { | ||
42 | .clk = { | ||
43 | .name = "mout_mpll", | ||
44 | .id = -1, | ||
45 | }, | ||
46 | .sources = &clk_src_mpll, | ||
47 | .reg_src = { .reg = S5P_CLK_SRC0, .shift = 4, .size = 1 }, | ||
48 | }; | ||
49 | |||
50 | static struct clksrc_clk clk_mout_epll = { | ||
51 | .clk = { | ||
52 | .name = "mout_epll", | ||
53 | .id = -1, | ||
54 | }, | ||
55 | .sources = &clk_src_epll, | ||
56 | .reg_src = { .reg = S5P_CLK_SRC0, .shift = 8, .size = 1 }, | ||
57 | }; | ||
58 | |||
59 | /* Possible clock sources for ARM Mux */ | ||
60 | static struct clk *clk_src_arm_list[] = { | ||
61 | [1] = &clk_mout_apll.clk, | ||
62 | [2] = &clk_mout_mpll.clk, | ||
63 | }; | ||
64 | |||
65 | static struct clksrc_sources clk_src_arm = { | ||
66 | .sources = clk_src_arm_list, | ||
67 | .nr_sources = ARRAY_SIZE(clk_src_arm_list), | ||
68 | }; | ||
69 | |||
70 | static struct clksrc_clk clk_mout_arm = { | ||
71 | .clk = { | ||
72 | .name = "mout_arm", | ||
73 | .id = -1, | ||
74 | }, | ||
75 | .sources = &clk_src_arm, | ||
76 | .reg_src = { .reg = S5P_CLK_MUX_STAT0, .shift = 16, .size = 3 }, | ||
77 | }; | ||
78 | |||
79 | static struct clk clk_dout_a2m = { | ||
80 | .name = "dout_a2m", | ||
81 | .id = -1, | ||
82 | .parent = &clk_mout_apll.clk, | ||
83 | }; | ||
84 | |||
85 | /* Possible clock sources for D0 Mux */ | ||
86 | static struct clk *clk_src_d0_list[] = { | ||
87 | [1] = &clk_mout_mpll.clk, | ||
88 | [2] = &clk_dout_a2m, | ||
89 | }; | ||
90 | |||
91 | static struct clksrc_sources clk_src_d0 = { | ||
92 | .sources = clk_src_d0_list, | ||
93 | .nr_sources = ARRAY_SIZE(clk_src_d0_list), | ||
94 | }; | ||
95 | |||
96 | static struct clksrc_clk clk_mout_d0 = { | ||
97 | .clk = { | ||
98 | .name = "mout_d0", | ||
99 | .id = -1, | ||
100 | }, | ||
101 | .sources = &clk_src_d0, | ||
102 | .reg_src = { .reg = S5P_CLK_MUX_STAT0, .shift = 20, .size = 3 }, | ||
103 | }; | ||
104 | |||
105 | static struct clk clk_dout_apll = { | ||
106 | .name = "dout_apll", | ||
107 | .id = -1, | ||
108 | .parent = &clk_mout_arm.clk, | ||
109 | }; | ||
110 | |||
111 | /* Possible clock sources for D0SYNC Mux */ | ||
112 | static struct clk *clk_src_d0sync_list[] = { | ||
113 | [1] = &clk_mout_d0.clk, | ||
114 | [2] = &clk_dout_apll, | ||
115 | }; | ||
116 | |||
117 | static struct clksrc_sources clk_src_d0sync = { | ||
118 | .sources = clk_src_d0sync_list, | ||
119 | .nr_sources = ARRAY_SIZE(clk_src_d0sync_list), | ||
120 | }; | ||
121 | |||
122 | static struct clksrc_clk clk_mout_d0sync = { | ||
123 | .clk = { | ||
124 | .name = "mout_d0sync", | ||
125 | .id = -1, | ||
126 | }, | ||
127 | .sources = &clk_src_d0sync, | ||
128 | .reg_src = { .reg = S5P_CLK_MUX_STAT1, .shift = 28, .size = 3 }, | ||
129 | }; | ||
130 | |||
131 | /* Possible clock sources for D1 Mux */ | ||
132 | static struct clk *clk_src_d1_list[] = { | ||
133 | [1] = &clk_mout_mpll.clk, | ||
134 | [2] = &clk_dout_a2m, | ||
135 | }; | ||
136 | |||
137 | static struct clksrc_sources clk_src_d1 = { | ||
138 | .sources = clk_src_d1_list, | ||
139 | .nr_sources = ARRAY_SIZE(clk_src_d1_list), | ||
140 | }; | ||
141 | |||
142 | static struct clksrc_clk clk_mout_d1 = { | ||
143 | .clk = { | ||
144 | .name = "mout_d1", | ||
145 | .id = -1, | ||
146 | }, | ||
147 | .sources = &clk_src_d1, | ||
148 | .reg_src = { .reg = S5P_CLK_MUX_STAT0, .shift = 24, .size = 3 }, | ||
149 | }; | ||
150 | |||
151 | /* Possible clock sources for D1SYNC Mux */ | ||
152 | static struct clk *clk_src_d1sync_list[] = { | ||
153 | [1] = &clk_mout_d1.clk, | ||
154 | [2] = &clk_dout_apll, | ||
155 | }; | ||
156 | |||
157 | static struct clksrc_sources clk_src_d1sync = { | ||
158 | .sources = clk_src_d1sync_list, | ||
159 | .nr_sources = ARRAY_SIZE(clk_src_d1sync_list), | ||
160 | }; | ||
161 | |||
162 | static struct clksrc_clk clk_mout_d1sync = { | ||
163 | .clk = { | ||
164 | .name = "mout_d1sync", | ||
165 | .id = -1, | ||
166 | }, | ||
167 | .sources = &clk_src_d1sync, | ||
168 | .reg_src = { .reg = S5P_CLK_MUX_STAT1, .shift = 24, .size = 3 }, | ||
169 | }; | ||
170 | |||
171 | static struct clk clk_hclkd0 = { | ||
172 | .name = "hclkd0", | ||
173 | .id = -1, | ||
174 | .parent = &clk_mout_d0sync.clk, | ||
175 | }; | ||
176 | |||
177 | static struct clk clk_hclkd1 = { | ||
178 | .name = "hclkd1", | ||
179 | .id = -1, | ||
180 | .parent = &clk_mout_d1sync.clk, | ||
181 | }; | ||
182 | |||
183 | static struct clk clk_pclkd0 = { | ||
184 | .name = "pclkd0", | ||
185 | .id = -1, | ||
186 | .parent = &clk_hclkd0, | ||
187 | }; | ||
188 | |||
189 | static struct clk clk_pclkd1 = { | ||
190 | .name = "pclkd1", | ||
191 | .id = -1, | ||
192 | .parent = &clk_hclkd1, | ||
193 | }; | ||
194 | |||
195 | int s5p6442_clk_ip0_ctrl(struct clk *clk, int enable) | ||
196 | { | ||
197 | return s5p_gatectrl(S5P_CLKGATE_IP0, clk, enable); | ||
198 | } | ||
199 | |||
200 | int s5p6442_clk_ip3_ctrl(struct clk *clk, int enable) | ||
201 | { | ||
202 | return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable); | ||
203 | } | ||
204 | |||
205 | static struct clksrc_clk clksrcs[] = { | ||
206 | { | ||
207 | .clk = { | ||
208 | .name = "dout_a2m", | ||
209 | .id = -1, | ||
210 | .parent = &clk_mout_apll.clk, | ||
211 | }, | ||
212 | .sources = &clk_src_apll, | ||
213 | .reg_src = { .reg = S5P_CLK_SRC0, .shift = 0, .size = 1 }, | ||
214 | .reg_div = { .reg = S5P_CLK_DIV0, .shift = 4, .size = 3 }, | ||
215 | }, { | ||
216 | .clk = { | ||
217 | .name = "dout_apll", | ||
218 | .id = -1, | ||
219 | .parent = &clk_mout_arm.clk, | ||
220 | }, | ||
221 | .sources = &clk_src_arm, | ||
222 | .reg_src = { .reg = S5P_CLK_MUX_STAT0, .shift = 16, .size = 3 }, | ||
223 | .reg_div = { .reg = S5P_CLK_DIV0, .shift = 0, .size = 3 }, | ||
224 | }, { | ||
225 | .clk = { | ||
226 | .name = "hclkd1", | ||
227 | .id = -1, | ||
228 | .parent = &clk_mout_d1sync.clk, | ||
229 | }, | ||
230 | .sources = &clk_src_d1sync, | ||
231 | .reg_src = { .reg = S5P_CLK_MUX_STAT1, .shift = 24, .size = 3 }, | ||
232 | .reg_div = { .reg = S5P_CLK_DIV0, .shift = 24, .size = 4 }, | ||
233 | }, { | ||
234 | .clk = { | ||
235 | .name = "hclkd0", | ||
236 | .id = -1, | ||
237 | .parent = &clk_mout_d0sync.clk, | ||
238 | }, | ||
239 | .sources = &clk_src_d0sync, | ||
240 | .reg_src = { .reg = S5P_CLK_MUX_STAT1, .shift = 28, .size = 3 }, | ||
241 | .reg_div = { .reg = S5P_CLK_DIV0, .shift = 16, .size = 4 }, | ||
242 | }, { | ||
243 | .clk = { | ||
244 | .name = "pclkd0", | ||
245 | .id = -1, | ||
246 | .parent = &clk_hclkd0, | ||
247 | }, | ||
248 | .sources = &clk_src_d0sync, | ||
249 | .reg_src = { .reg = S5P_CLK_MUX_STAT1, .shift = 28, .size = 3 }, | ||
250 | .reg_div = { .reg = S5P_CLK_DIV0, .shift = 20, .size = 3 }, | ||
251 | }, { | ||
252 | .clk = { | ||
253 | .name = "pclkd1", | ||
254 | .id = -1, | ||
255 | .parent = &clk_hclkd1, | ||
256 | }, | ||
257 | .sources = &clk_src_d1sync, | ||
258 | .reg_src = { .reg = S5P_CLK_MUX_STAT1, .shift = 24, .size = 3 }, | ||
259 | .reg_div = { .reg = S5P_CLK_DIV0, .shift = 28, .size = 3 }, | ||
260 | } | ||
261 | }; | ||
262 | |||
263 | /* Clock initialisation code */ | ||
264 | static struct clksrc_clk *init_parents[] = { | ||
265 | &clk_mout_apll, | ||
266 | &clk_mout_mpll, | ||
267 | &clk_mout_epll, | ||
268 | &clk_mout_arm, | ||
269 | &clk_mout_d0, | ||
270 | &clk_mout_d0sync, | ||
271 | &clk_mout_d1, | ||
272 | &clk_mout_d1sync, | ||
273 | }; | ||
274 | |||
275 | void __init_or_cpufreq s5p6442_setup_clocks(void) | ||
276 | { | ||
277 | struct clk *pclkd0_clk; | ||
278 | struct clk *pclkd1_clk; | ||
279 | |||
280 | unsigned long xtal; | ||
281 | unsigned long arm; | ||
282 | unsigned long hclkd0 = 0; | ||
283 | unsigned long hclkd1 = 0; | ||
284 | unsigned long pclkd0 = 0; | ||
285 | unsigned long pclkd1 = 0; | ||
286 | |||
287 | unsigned long apll; | ||
288 | unsigned long mpll; | ||
289 | unsigned long epll; | ||
290 | unsigned int ptr; | ||
291 | |||
292 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); | ||
293 | |||
294 | xtal = clk_get_rate(&clk_xtal); | ||
295 | |||
296 | printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal); | ||
297 | |||
298 | apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508); | ||
299 | mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON), pll_4502); | ||
300 | epll = s5p_get_pll45xx(xtal, __raw_readl(S5P_EPLL_CON), pll_4500); | ||
301 | |||
302 | printk(KERN_INFO "S5P6442: PLL settings, A=%ld, M=%ld, E=%ld", | ||
303 | apll, mpll, epll); | ||
304 | |||
305 | clk_fout_apll.rate = apll; | ||
306 | clk_fout_mpll.rate = mpll; | ||
307 | clk_fout_epll.rate = epll; | ||
308 | |||
309 | for (ptr = 0; ptr < ARRAY_SIZE(init_parents); ptr++) | ||
310 | s3c_set_clksrc(init_parents[ptr], true); | ||
311 | |||
312 | for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) | ||
313 | s3c_set_clksrc(&clksrcs[ptr], true); | ||
314 | |||
315 | arm = clk_get_rate(&clk_dout_apll); | ||
316 | hclkd0 = clk_get_rate(&clk_hclkd0); | ||
317 | hclkd1 = clk_get_rate(&clk_hclkd1); | ||
318 | |||
319 | pclkd0_clk = clk_get(NULL, "pclkd0"); | ||
320 | BUG_ON(IS_ERR(pclkd0_clk)); | ||
321 | |||
322 | pclkd0 = clk_get_rate(pclkd0_clk); | ||
323 | clk_put(pclkd0_clk); | ||
324 | |||
325 | pclkd1_clk = clk_get(NULL, "pclkd1"); | ||
326 | BUG_ON(IS_ERR(pclkd1_clk)); | ||
327 | |||
328 | pclkd1 = clk_get_rate(pclkd1_clk); | ||
329 | clk_put(pclkd1_clk); | ||
330 | |||
331 | printk(KERN_INFO "S5P6442: HCLKD0=%ld, HCLKD1=%ld, PCLKD0=%ld, PCLKD1=%ld\n", | ||
332 | hclkd0, hclkd1, pclkd0, pclkd1); | ||
333 | |||
334 | /* For backward compatibility */ | ||
335 | clk_f.rate = arm; | ||
336 | clk_h.rate = hclkd1; | ||
337 | clk_p.rate = pclkd1; | ||
338 | |||
339 | clk_pclkd0.rate = pclkd0; | ||
340 | clk_pclkd1.rate = pclkd1; | ||
341 | } | ||
342 | |||
343 | static struct clk init_clocks_off[] = { | ||
344 | { | ||
345 | .name = "pdma", | ||
346 | .id = -1, | ||
347 | .parent = &clk_pclkd1, | ||
348 | .enable = s5p6442_clk_ip0_ctrl, | ||
349 | .ctrlbit = (1 << 3), | ||
350 | }, | ||
351 | }; | ||
352 | |||
353 | static struct clk init_clocks[] = { | ||
354 | { | ||
355 | .name = "systimer", | ||
356 | .id = -1, | ||
357 | .parent = &clk_pclkd1, | ||
358 | .enable = s5p6442_clk_ip3_ctrl, | ||
359 | .ctrlbit = (1<<16), | ||
360 | }, { | ||
361 | .name = "uart", | ||
362 | .id = 0, | ||
363 | .parent = &clk_pclkd1, | ||
364 | .enable = s5p6442_clk_ip3_ctrl, | ||
365 | .ctrlbit = (1<<17), | ||
366 | }, { | ||
367 | .name = "uart", | ||
368 | .id = 1, | ||
369 | .parent = &clk_pclkd1, | ||
370 | .enable = s5p6442_clk_ip3_ctrl, | ||
371 | .ctrlbit = (1<<18), | ||
372 | }, { | ||
373 | .name = "uart", | ||
374 | .id = 2, | ||
375 | .parent = &clk_pclkd1, | ||
376 | .enable = s5p6442_clk_ip3_ctrl, | ||
377 | .ctrlbit = (1<<19), | ||
378 | }, { | ||
379 | .name = "watchdog", | ||
380 | .id = -1, | ||
381 | .parent = &clk_pclkd1, | ||
382 | .enable = s5p6442_clk_ip3_ctrl, | ||
383 | .ctrlbit = (1 << 22), | ||
384 | }, { | ||
385 | .name = "timers", | ||
386 | .id = -1, | ||
387 | .parent = &clk_pclkd1, | ||
388 | .enable = s5p6442_clk_ip3_ctrl, | ||
389 | .ctrlbit = (1<<23), | ||
390 | }, | ||
391 | }; | ||
392 | |||
393 | static struct clk *clks[] __initdata = { | ||
394 | &clk_ext, | ||
395 | &clk_epll, | ||
396 | &clk_mout_apll.clk, | ||
397 | &clk_mout_mpll.clk, | ||
398 | &clk_mout_epll.clk, | ||
399 | &clk_mout_d0.clk, | ||
400 | &clk_mout_d0sync.clk, | ||
401 | &clk_mout_d1.clk, | ||
402 | &clk_mout_d1sync.clk, | ||
403 | &clk_hclkd0, | ||
404 | &clk_pclkd0, | ||
405 | &clk_hclkd1, | ||
406 | &clk_pclkd1, | ||
407 | }; | ||
408 | |||
409 | void __init s5p6442_register_clocks(void) | ||
410 | { | ||
411 | s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); | ||
412 | |||
413 | s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); | ||
414 | s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); | ||
415 | |||
416 | s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); | ||
417 | s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); | ||
418 | |||
419 | s3c_pwmclk_init(); | ||
420 | } | ||
diff --git a/arch/arm/mach-s5p6442/cpu.c b/arch/arm/mach-s5p6442/cpu.c deleted file mode 100644 index 842af86bda6d..000000000000 --- a/arch/arm/mach-s5p6442/cpu.c +++ /dev/null | |||
@@ -1,143 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/cpu.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/types.h> | ||
13 | #include <linux/interrupt.h> | ||
14 | #include <linux/list.h> | ||
15 | #include <linux/timer.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/clk.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/sysdev.h> | ||
20 | #include <linux/serial_core.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/sched.h> | ||
23 | |||
24 | #include <asm/mach/arch.h> | ||
25 | #include <asm/mach/map.h> | ||
26 | #include <asm/mach/irq.h> | ||
27 | |||
28 | #include <asm/proc-fns.h> | ||
29 | |||
30 | #include <mach/hardware.h> | ||
31 | #include <mach/map.h> | ||
32 | #include <asm/irq.h> | ||
33 | |||
34 | #include <plat/regs-serial.h> | ||
35 | #include <mach/regs-clock.h> | ||
36 | |||
37 | #include <plat/cpu.h> | ||
38 | #include <plat/devs.h> | ||
39 | #include <plat/clock.h> | ||
40 | #include <plat/s5p6442.h> | ||
41 | |||
42 | /* Initial IO mappings */ | ||
43 | |||
44 | static struct map_desc s5p6442_iodesc[] __initdata = { | ||
45 | { | ||
46 | .virtual = (unsigned long)S5P_VA_SYSTIMER, | ||
47 | .pfn = __phys_to_pfn(S5P6442_PA_SYSTIMER), | ||
48 | .length = SZ_16K, | ||
49 | .type = MT_DEVICE, | ||
50 | }, { | ||
51 | .virtual = (unsigned long)S5P_VA_GPIO, | ||
52 | .pfn = __phys_to_pfn(S5P6442_PA_GPIO), | ||
53 | .length = SZ_4K, | ||
54 | .type = MT_DEVICE, | ||
55 | }, { | ||
56 | .virtual = (unsigned long)VA_VIC0, | ||
57 | .pfn = __phys_to_pfn(S5P6442_PA_VIC0), | ||
58 | .length = SZ_16K, | ||
59 | .type = MT_DEVICE, | ||
60 | }, { | ||
61 | .virtual = (unsigned long)VA_VIC1, | ||
62 | .pfn = __phys_to_pfn(S5P6442_PA_VIC1), | ||
63 | .length = SZ_16K, | ||
64 | .type = MT_DEVICE, | ||
65 | }, { | ||
66 | .virtual = (unsigned long)VA_VIC2, | ||
67 | .pfn = __phys_to_pfn(S5P6442_PA_VIC2), | ||
68 | .length = SZ_16K, | ||
69 | .type = MT_DEVICE, | ||
70 | }, { | ||
71 | .virtual = (unsigned long)S3C_VA_UART, | ||
72 | .pfn = __phys_to_pfn(S3C_PA_UART), | ||
73 | .length = SZ_512K, | ||
74 | .type = MT_DEVICE, | ||
75 | } | ||
76 | }; | ||
77 | |||
78 | static void s5p6442_idle(void) | ||
79 | { | ||
80 | if (!need_resched()) | ||
81 | cpu_do_idle(); | ||
82 | |||
83 | local_irq_enable(); | ||
84 | } | ||
85 | |||
86 | /* | ||
87 | * s5p6442_map_io | ||
88 | * | ||
89 | * register the standard cpu IO areas | ||
90 | */ | ||
91 | |||
92 | void __init s5p6442_map_io(void) | ||
93 | { | ||
94 | iotable_init(s5p6442_iodesc, ARRAY_SIZE(s5p6442_iodesc)); | ||
95 | } | ||
96 | |||
97 | void __init s5p6442_init_clocks(int xtal) | ||
98 | { | ||
99 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
100 | |||
101 | s3c24xx_register_baseclocks(xtal); | ||
102 | s5p_register_clocks(xtal); | ||
103 | s5p6442_register_clocks(); | ||
104 | s5p6442_setup_clocks(); | ||
105 | } | ||
106 | |||
107 | void __init s5p6442_init_irq(void) | ||
108 | { | ||
109 | /* S5P6442 supports 3 VIC */ | ||
110 | u32 vic[3]; | ||
111 | |||
112 | /* VIC0, VIC1, and VIC2: some interrupt reserved */ | ||
113 | vic[0] = 0x7fefffff; | ||
114 | vic[1] = 0X7f389c81; | ||
115 | vic[2] = 0X1bbbcfff; | ||
116 | |||
117 | s5p_init_irq(vic, ARRAY_SIZE(vic)); | ||
118 | } | ||
119 | |||
120 | struct sysdev_class s5p6442_sysclass = { | ||
121 | .name = "s5p6442-core", | ||
122 | }; | ||
123 | |||
124 | static struct sys_device s5p6442_sysdev = { | ||
125 | .cls = &s5p6442_sysclass, | ||
126 | }; | ||
127 | |||
128 | static int __init s5p6442_core_init(void) | ||
129 | { | ||
130 | return sysdev_class_register(&s5p6442_sysclass); | ||
131 | } | ||
132 | |||
133 | core_initcall(s5p6442_core_init); | ||
134 | |||
135 | int __init s5p6442_init(void) | ||
136 | { | ||
137 | printk(KERN_INFO "S5P6442: Initializing architecture\n"); | ||
138 | |||
139 | /* set idle function */ | ||
140 | pm_idle = s5p6442_idle; | ||
141 | |||
142 | return sysdev_register(&s5p6442_sysdev); | ||
143 | } | ||
diff --git a/arch/arm/mach-s5p6442/dev-audio.c b/arch/arm/mach-s5p6442/dev-audio.c deleted file mode 100644 index 8719dc41fe32..000000000000 --- a/arch/arm/mach-s5p6442/dev-audio.c +++ /dev/null | |||
@@ -1,217 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/dev-audio.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co. Ltd | ||
4 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/platform_device.h> | ||
12 | #include <linux/dma-mapping.h> | ||
13 | #include <linux/gpio.h> | ||
14 | |||
15 | #include <plat/gpio-cfg.h> | ||
16 | #include <plat/audio.h> | ||
17 | |||
18 | #include <mach/map.h> | ||
19 | #include <mach/dma.h> | ||
20 | #include <mach/irqs.h> | ||
21 | |||
22 | static int s5p6442_cfg_i2s(struct platform_device *pdev) | ||
23 | { | ||
24 | unsigned int base; | ||
25 | |||
26 | /* configure GPIO for i2s port */ | ||
27 | switch (pdev->id) { | ||
28 | case 1: | ||
29 | base = S5P6442_GPC1(0); | ||
30 | break; | ||
31 | |||
32 | case 0: | ||
33 | base = S5P6442_GPC0(0); | ||
34 | break; | ||
35 | |||
36 | default: | ||
37 | printk(KERN_ERR "Invalid Device %d\n", pdev->id); | ||
38 | return -EINVAL; | ||
39 | } | ||
40 | |||
41 | s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(2)); | ||
42 | return 0; | ||
43 | } | ||
44 | |||
45 | static const char *rclksrc_v35[] = { | ||
46 | [0] = "busclk", | ||
47 | [1] = "i2sclk", | ||
48 | }; | ||
49 | |||
50 | static struct s3c_audio_pdata i2sv35_pdata = { | ||
51 | .cfg_gpio = s5p6442_cfg_i2s, | ||
52 | .type = { | ||
53 | .i2s = { | ||
54 | .quirks = QUIRK_SEC_DAI | QUIRK_NEED_RSTCLR, | ||
55 | .src_clk = rclksrc_v35, | ||
56 | }, | ||
57 | }, | ||
58 | }; | ||
59 | |||
60 | static struct resource s5p6442_iis0_resource[] = { | ||
61 | [0] = { | ||
62 | .start = S5P6442_PA_I2S0, | ||
63 | .end = S5P6442_PA_I2S0 + 0x100 - 1, | ||
64 | .flags = IORESOURCE_MEM, | ||
65 | }, | ||
66 | [1] = { | ||
67 | .start = DMACH_I2S0_TX, | ||
68 | .end = DMACH_I2S0_TX, | ||
69 | .flags = IORESOURCE_DMA, | ||
70 | }, | ||
71 | [2] = { | ||
72 | .start = DMACH_I2S0_RX, | ||
73 | .end = DMACH_I2S0_RX, | ||
74 | .flags = IORESOURCE_DMA, | ||
75 | }, | ||
76 | [3] = { | ||
77 | .start = DMACH_I2S0S_TX, | ||
78 | .end = DMACH_I2S0S_TX, | ||
79 | .flags = IORESOURCE_DMA, | ||
80 | }, | ||
81 | }; | ||
82 | |||
83 | struct platform_device s5p6442_device_iis0 = { | ||
84 | .name = "samsung-i2s", | ||
85 | .id = 0, | ||
86 | .num_resources = ARRAY_SIZE(s5p6442_iis0_resource), | ||
87 | .resource = s5p6442_iis0_resource, | ||
88 | .dev = { | ||
89 | .platform_data = &i2sv35_pdata, | ||
90 | }, | ||
91 | }; | ||
92 | |||
93 | static const char *rclksrc_v3[] = { | ||
94 | [0] = "iis", | ||
95 | [1] = "sclk_audio", | ||
96 | }; | ||
97 | |||
98 | static struct s3c_audio_pdata i2sv3_pdata = { | ||
99 | .cfg_gpio = s5p6442_cfg_i2s, | ||
100 | .type = { | ||
101 | .i2s = { | ||
102 | .src_clk = rclksrc_v3, | ||
103 | }, | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | static struct resource s5p6442_iis1_resource[] = { | ||
108 | [0] = { | ||
109 | .start = S5P6442_PA_I2S1, | ||
110 | .end = S5P6442_PA_I2S1 + 0x100 - 1, | ||
111 | .flags = IORESOURCE_MEM, | ||
112 | }, | ||
113 | [1] = { | ||
114 | .start = DMACH_I2S1_TX, | ||
115 | .end = DMACH_I2S1_TX, | ||
116 | .flags = IORESOURCE_DMA, | ||
117 | }, | ||
118 | [2] = { | ||
119 | .start = DMACH_I2S1_RX, | ||
120 | .end = DMACH_I2S1_RX, | ||
121 | .flags = IORESOURCE_DMA, | ||
122 | }, | ||
123 | }; | ||
124 | |||
125 | struct platform_device s5p6442_device_iis1 = { | ||
126 | .name = "samsung-i2s", | ||
127 | .id = 1, | ||
128 | .num_resources = ARRAY_SIZE(s5p6442_iis1_resource), | ||
129 | .resource = s5p6442_iis1_resource, | ||
130 | .dev = { | ||
131 | .platform_data = &i2sv3_pdata, | ||
132 | }, | ||
133 | }; | ||
134 | |||
135 | /* PCM Controller platform_devices */ | ||
136 | |||
137 | static int s5p6442_pcm_cfg_gpio(struct platform_device *pdev) | ||
138 | { | ||
139 | unsigned int base; | ||
140 | |||
141 | switch (pdev->id) { | ||
142 | case 0: | ||
143 | base = S5P6442_GPC0(0); | ||
144 | break; | ||
145 | |||
146 | case 1: | ||
147 | base = S5P6442_GPC1(0); | ||
148 | break; | ||
149 | |||
150 | default: | ||
151 | printk(KERN_DEBUG "Invalid PCM Controller number!"); | ||
152 | return -EINVAL; | ||
153 | } | ||
154 | |||
155 | s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(3)); | ||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static struct s3c_audio_pdata s3c_pcm_pdata = { | ||
160 | .cfg_gpio = s5p6442_pcm_cfg_gpio, | ||
161 | }; | ||
162 | |||
163 | static struct resource s5p6442_pcm0_resource[] = { | ||
164 | [0] = { | ||
165 | .start = S5P6442_PA_PCM0, | ||
166 | .end = S5P6442_PA_PCM0 + 0x100 - 1, | ||
167 | .flags = IORESOURCE_MEM, | ||
168 | }, | ||
169 | [1] = { | ||
170 | .start = DMACH_PCM0_TX, | ||
171 | .end = DMACH_PCM0_TX, | ||
172 | .flags = IORESOURCE_DMA, | ||
173 | }, | ||
174 | [2] = { | ||
175 | .start = DMACH_PCM0_RX, | ||
176 | .end = DMACH_PCM0_RX, | ||
177 | .flags = IORESOURCE_DMA, | ||
178 | }, | ||
179 | }; | ||
180 | |||
181 | struct platform_device s5p6442_device_pcm0 = { | ||
182 | .name = "samsung-pcm", | ||
183 | .id = 0, | ||
184 | .num_resources = ARRAY_SIZE(s5p6442_pcm0_resource), | ||
185 | .resource = s5p6442_pcm0_resource, | ||
186 | .dev = { | ||
187 | .platform_data = &s3c_pcm_pdata, | ||
188 | }, | ||
189 | }; | ||
190 | |||
191 | static struct resource s5p6442_pcm1_resource[] = { | ||
192 | [0] = { | ||
193 | .start = S5P6442_PA_PCM1, | ||
194 | .end = S5P6442_PA_PCM1 + 0x100 - 1, | ||
195 | .flags = IORESOURCE_MEM, | ||
196 | }, | ||
197 | [1] = { | ||
198 | .start = DMACH_PCM1_TX, | ||
199 | .end = DMACH_PCM1_TX, | ||
200 | .flags = IORESOURCE_DMA, | ||
201 | }, | ||
202 | [2] = { | ||
203 | .start = DMACH_PCM1_RX, | ||
204 | .end = DMACH_PCM1_RX, | ||
205 | .flags = IORESOURCE_DMA, | ||
206 | }, | ||
207 | }; | ||
208 | |||
209 | struct platform_device s5p6442_device_pcm1 = { | ||
210 | .name = "samsung-pcm", | ||
211 | .id = 1, | ||
212 | .num_resources = ARRAY_SIZE(s5p6442_pcm1_resource), | ||
213 | .resource = s5p6442_pcm1_resource, | ||
214 | .dev = { | ||
215 | .platform_data = &s3c_pcm_pdata, | ||
216 | }, | ||
217 | }; | ||
diff --git a/arch/arm/mach-s5p6442/dev-spi.c b/arch/arm/mach-s5p6442/dev-spi.c deleted file mode 100644 index cce8c2470709..000000000000 --- a/arch/arm/mach-s5p6442/dev-spi.c +++ /dev/null | |||
@@ -1,121 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/dev-spi.c | ||
2 | * | ||
3 | * Copyright (C) 2010 Samsung Electronics Co. Ltd. | ||
4 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/platform_device.h> | ||
12 | #include <linux/dma-mapping.h> | ||
13 | #include <linux/gpio.h> | ||
14 | |||
15 | #include <mach/dma.h> | ||
16 | #include <mach/map.h> | ||
17 | #include <mach/irqs.h> | ||
18 | #include <mach/spi-clocks.h> | ||
19 | |||
20 | #include <plat/s3c64xx-spi.h> | ||
21 | #include <plat/gpio-cfg.h> | ||
22 | |||
23 | static char *spi_src_clks[] = { | ||
24 | [S5P6442_SPI_SRCCLK_PCLK] = "pclk", | ||
25 | [S5P6442_SPI_SRCCLK_SCLK] = "spi_epll", | ||
26 | }; | ||
27 | |||
28 | /* SPI Controller platform_devices */ | ||
29 | |||
30 | /* Since we emulate multi-cs capability, we do not touch the CS. | ||
31 | * The emulated CS is toggled by board specific mechanism, as it can | ||
32 | * be either some immediate GPIO or some signal out of some other | ||
33 | * chip in between ... or some yet another way. | ||
34 | * We simply do not assume anything about CS. | ||
35 | */ | ||
36 | static int s5p6442_spi_cfg_gpio(struct platform_device *pdev) | ||
37 | { | ||
38 | switch (pdev->id) { | ||
39 | case 0: | ||
40 | s3c_gpio_cfgpin(S5P6442_GPB(0), S3C_GPIO_SFN(2)); | ||
41 | s3c_gpio_setpull(S5P6442_GPB(0), S3C_GPIO_PULL_UP); | ||
42 | s3c_gpio_cfgall_range(S5P6442_GPB(2), 2, | ||
43 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
44 | break; | ||
45 | |||
46 | default: | ||
47 | dev_err(&pdev->dev, "Invalid SPI Controller number!"); | ||
48 | return -EINVAL; | ||
49 | } | ||
50 | |||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | static struct resource s5p6442_spi0_resource[] = { | ||
55 | [0] = { | ||
56 | .start = S5P6442_PA_SPI, | ||
57 | .end = S5P6442_PA_SPI + 0x100 - 1, | ||
58 | .flags = IORESOURCE_MEM, | ||
59 | }, | ||
60 | [1] = { | ||
61 | .start = DMACH_SPI0_TX, | ||
62 | .end = DMACH_SPI0_TX, | ||
63 | .flags = IORESOURCE_DMA, | ||
64 | }, | ||
65 | [2] = { | ||
66 | .start = DMACH_SPI0_RX, | ||
67 | .end = DMACH_SPI0_RX, | ||
68 | .flags = IORESOURCE_DMA, | ||
69 | }, | ||
70 | [3] = { | ||
71 | .start = IRQ_SPI0, | ||
72 | .end = IRQ_SPI0, | ||
73 | .flags = IORESOURCE_IRQ, | ||
74 | }, | ||
75 | }; | ||
76 | |||
77 | static struct s3c64xx_spi_info s5p6442_spi0_pdata = { | ||
78 | .cfg_gpio = s5p6442_spi_cfg_gpio, | ||
79 | .fifo_lvl_mask = 0x1ff, | ||
80 | .rx_lvl_offset = 15, | ||
81 | }; | ||
82 | |||
83 | static u64 spi_dmamask = DMA_BIT_MASK(32); | ||
84 | |||
85 | struct platform_device s5p6442_device_spi = { | ||
86 | .name = "s3c64xx-spi", | ||
87 | .id = 0, | ||
88 | .num_resources = ARRAY_SIZE(s5p6442_spi0_resource), | ||
89 | .resource = s5p6442_spi0_resource, | ||
90 | .dev = { | ||
91 | .dma_mask = &spi_dmamask, | ||
92 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
93 | .platform_data = &s5p6442_spi0_pdata, | ||
94 | }, | ||
95 | }; | ||
96 | |||
97 | void __init s5p6442_spi_set_info(int cntrlr, int src_clk_nr, int num_cs) | ||
98 | { | ||
99 | struct s3c64xx_spi_info *pd; | ||
100 | |||
101 | /* Reject invalid configuration */ | ||
102 | if (!num_cs || src_clk_nr < 0 | ||
103 | || src_clk_nr > S5P6442_SPI_SRCCLK_SCLK) { | ||
104 | printk(KERN_ERR "%s: Invalid SPI configuration\n", __func__); | ||
105 | return; | ||
106 | } | ||
107 | |||
108 | switch (cntrlr) { | ||
109 | case 0: | ||
110 | pd = &s5p6442_spi0_pdata; | ||
111 | break; | ||
112 | default: | ||
113 | printk(KERN_ERR "%s: Invalid SPI controller(%d)\n", | ||
114 | __func__, cntrlr); | ||
115 | return; | ||
116 | } | ||
117 | |||
118 | pd->num_cs = num_cs; | ||
119 | pd->src_clk_nr = src_clk_nr; | ||
120 | pd->src_clk_name = spi_src_clks[src_clk_nr]; | ||
121 | } | ||
diff --git a/arch/arm/mach-s5p6442/dma.c b/arch/arm/mach-s5p6442/dma.c deleted file mode 100644 index 7dfb13654f8a..000000000000 --- a/arch/arm/mach-s5p6442/dma.c +++ /dev/null | |||
@@ -1,105 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010 Samsung Electronics Co. Ltd. | ||
3 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
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 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | ||
19 | |||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/dma-mapping.h> | ||
22 | |||
23 | #include <plat/devs.h> | ||
24 | #include <plat/irqs.h> | ||
25 | |||
26 | #include <mach/map.h> | ||
27 | #include <mach/irqs.h> | ||
28 | |||
29 | #include <plat/s3c-pl330-pdata.h> | ||
30 | |||
31 | static u64 dma_dmamask = DMA_BIT_MASK(32); | ||
32 | |||
33 | static struct resource s5p6442_pdma_resource[] = { | ||
34 | [0] = { | ||
35 | .start = S5P6442_PA_PDMA, | ||
36 | .end = S5P6442_PA_PDMA + SZ_4K, | ||
37 | .flags = IORESOURCE_MEM, | ||
38 | }, | ||
39 | [1] = { | ||
40 | .start = IRQ_PDMA, | ||
41 | .end = IRQ_PDMA, | ||
42 | .flags = IORESOURCE_IRQ, | ||
43 | }, | ||
44 | }; | ||
45 | |||
46 | static struct s3c_pl330_platdata s5p6442_pdma_pdata = { | ||
47 | .peri = { | ||
48 | [0] = DMACH_UART0_RX, | ||
49 | [1] = DMACH_UART0_TX, | ||
50 | [2] = DMACH_UART1_RX, | ||
51 | [3] = DMACH_UART1_TX, | ||
52 | [4] = DMACH_UART2_RX, | ||
53 | [5] = DMACH_UART2_TX, | ||
54 | [6] = DMACH_MAX, | ||
55 | [7] = DMACH_MAX, | ||
56 | [8] = DMACH_MAX, | ||
57 | [9] = DMACH_I2S0_RX, | ||
58 | [10] = DMACH_I2S0_TX, | ||
59 | [11] = DMACH_I2S0S_TX, | ||
60 | [12] = DMACH_I2S1_RX, | ||
61 | [13] = DMACH_I2S1_TX, | ||
62 | [14] = DMACH_MAX, | ||
63 | [15] = DMACH_MAX, | ||
64 | [16] = DMACH_SPI0_RX, | ||
65 | [17] = DMACH_SPI0_TX, | ||
66 | [18] = DMACH_MAX, | ||
67 | [19] = DMACH_MAX, | ||
68 | [20] = DMACH_PCM0_RX, | ||
69 | [21] = DMACH_PCM0_TX, | ||
70 | [22] = DMACH_PCM1_RX, | ||
71 | [23] = DMACH_PCM1_TX, | ||
72 | [24] = DMACH_MAX, | ||
73 | [25] = DMACH_MAX, | ||
74 | [26] = DMACH_MAX, | ||
75 | [27] = DMACH_MSM_REQ0, | ||
76 | [28] = DMACH_MSM_REQ1, | ||
77 | [29] = DMACH_MSM_REQ2, | ||
78 | [30] = DMACH_MSM_REQ3, | ||
79 | [31] = DMACH_MAX, | ||
80 | }, | ||
81 | }; | ||
82 | |||
83 | static struct platform_device s5p6442_device_pdma = { | ||
84 | .name = "s3c-pl330", | ||
85 | .id = -1, | ||
86 | .num_resources = ARRAY_SIZE(s5p6442_pdma_resource), | ||
87 | .resource = s5p6442_pdma_resource, | ||
88 | .dev = { | ||
89 | .dma_mask = &dma_dmamask, | ||
90 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
91 | .platform_data = &s5p6442_pdma_pdata, | ||
92 | }, | ||
93 | }; | ||
94 | |||
95 | static struct platform_device *s5p6442_dmacs[] __initdata = { | ||
96 | &s5p6442_device_pdma, | ||
97 | }; | ||
98 | |||
99 | static int __init s5p6442_dma_init(void) | ||
100 | { | ||
101 | platform_add_devices(s5p6442_dmacs, ARRAY_SIZE(s5p6442_dmacs)); | ||
102 | |||
103 | return 0; | ||
104 | } | ||
105 | arch_initcall(s5p6442_dma_init); | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/debug-macro.S b/arch/arm/mach-s5p6442/include/mach/debug-macro.S deleted file mode 100644 index e2213205d780..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/debug-macro.S +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/debug-macro.S | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * Based on arch/arm/mach-s3c6400/include/mach/debug-macro.S | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | /* pull in the relevant register and map files. */ | ||
14 | |||
15 | #include <mach/map.h> | ||
16 | #include <plat/regs-serial.h> | ||
17 | |||
18 | .macro addruart, rp, rv | ||
19 | ldr \rp, = S3C_PA_UART | ||
20 | ldr \rv, = S3C_VA_UART | ||
21 | #if CONFIG_DEBUG_S3C_UART != 0 | ||
22 | add \rp, \rp, #(0x400 * CONFIG_DEBUG_S3C_UART) | ||
23 | add \rv, \rv, #(0x400 * CONFIG_DEBUG_S3C_UART) | ||
24 | #endif | ||
25 | .endm | ||
26 | |||
27 | #define fifo_full fifo_full_s5pv210 | ||
28 | #define fifo_level fifo_level_s5pv210 | ||
29 | |||
30 | /* include the reset of the code which will do the work, we're only | ||
31 | * compiling for a single cpu processor type so the default of s3c2440 | ||
32 | * will be fine with us. | ||
33 | */ | ||
34 | |||
35 | #include <plat/debug-macro.S> | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/dma.h b/arch/arm/mach-s5p6442/include/mach/dma.h deleted file mode 100644 index 81209eb1409b..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/dma.h +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010 Samsung Electronics Co. Ltd. | ||
3 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
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 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | ||
19 | |||
20 | #ifndef __MACH_DMA_H | ||
21 | #define __MACH_DMA_H | ||
22 | |||
23 | /* This platform uses the common S3C DMA API driver for PL330 */ | ||
24 | #include <plat/s3c-dma-pl330.h> | ||
25 | |||
26 | #endif /* __MACH_DMA_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/entry-macro.S b/arch/arm/mach-s5p6442/include/mach/entry-macro.S deleted file mode 100644 index 6d574edbf1ae..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/entry-macro.S +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/entry-macro.S | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * Low-level IRQ helper macros for the Samsung S5P6442 | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <asm/hardware/vic.h> | ||
14 | #include <mach/map.h> | ||
15 | #include <plat/irqs.h> | ||
16 | |||
17 | .macro disable_fiq | ||
18 | .endm | ||
19 | |||
20 | .macro get_irqnr_preamble, base, tmp | ||
21 | ldr \base, =VA_VIC0 | ||
22 | .endm | ||
23 | |||
24 | .macro arch_ret_to_user, tmp1, tmp2 | ||
25 | .endm | ||
26 | |||
27 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
28 | |||
29 | @ check the vic0 | ||
30 | mov \irqnr, # S5P_IRQ_OFFSET + 31 | ||
31 | ldr \irqstat, [ \base, # VIC_IRQ_STATUS ] | ||
32 | teq \irqstat, #0 | ||
33 | |||
34 | @ otherwise try vic1 | ||
35 | addeq \tmp, \base, #(VA_VIC1 - VA_VIC0) | ||
36 | addeq \irqnr, \irqnr, #32 | ||
37 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
38 | teqeq \irqstat, #0 | ||
39 | |||
40 | @ otherwise try vic2 | ||
41 | addeq \tmp, \base, #(VA_VIC2 - VA_VIC0) | ||
42 | addeq \irqnr, \irqnr, #32 | ||
43 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
44 | teqeq \irqstat, #0 | ||
45 | |||
46 | clzne \irqstat, \irqstat | ||
47 | subne \irqnr, \irqnr, \irqstat | ||
48 | .endm | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/gpio.h b/arch/arm/mach-s5p6442/include/mach/gpio.h deleted file mode 100644 index b8715df2fdab..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/gpio.h +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/gpio.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - GPIO lib support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_GPIO_H | ||
14 | #define __ASM_ARCH_GPIO_H __FILE__ | ||
15 | |||
16 | #define gpio_get_value __gpio_get_value | ||
17 | #define gpio_set_value __gpio_set_value | ||
18 | #define gpio_cansleep __gpio_cansleep | ||
19 | #define gpio_to_irq __gpio_to_irq | ||
20 | |||
21 | /* GPIO bank sizes */ | ||
22 | #define S5P6442_GPIO_A0_NR (8) | ||
23 | #define S5P6442_GPIO_A1_NR (2) | ||
24 | #define S5P6442_GPIO_B_NR (4) | ||
25 | #define S5P6442_GPIO_C0_NR (5) | ||
26 | #define S5P6442_GPIO_C1_NR (5) | ||
27 | #define S5P6442_GPIO_D0_NR (2) | ||
28 | #define S5P6442_GPIO_D1_NR (6) | ||
29 | #define S5P6442_GPIO_E0_NR (8) | ||
30 | #define S5P6442_GPIO_E1_NR (5) | ||
31 | #define S5P6442_GPIO_F0_NR (8) | ||
32 | #define S5P6442_GPIO_F1_NR (8) | ||
33 | #define S5P6442_GPIO_F2_NR (8) | ||
34 | #define S5P6442_GPIO_F3_NR (6) | ||
35 | #define S5P6442_GPIO_G0_NR (7) | ||
36 | #define S5P6442_GPIO_G1_NR (7) | ||
37 | #define S5P6442_GPIO_G2_NR (7) | ||
38 | #define S5P6442_GPIO_H0_NR (8) | ||
39 | #define S5P6442_GPIO_H1_NR (8) | ||
40 | #define S5P6442_GPIO_H2_NR (8) | ||
41 | #define S5P6442_GPIO_H3_NR (8) | ||
42 | #define S5P6442_GPIO_J0_NR (8) | ||
43 | #define S5P6442_GPIO_J1_NR (6) | ||
44 | #define S5P6442_GPIO_J2_NR (8) | ||
45 | #define S5P6442_GPIO_J3_NR (8) | ||
46 | #define S5P6442_GPIO_J4_NR (5) | ||
47 | |||
48 | /* GPIO bank numbers */ | ||
49 | |||
50 | /* CONFIG_S3C_GPIO_SPACE allows the user to select extra | ||
51 | * space for debugging purposes so that any accidental | ||
52 | * change from one gpio bank to another can be caught. | ||
53 | */ | ||
54 | |||
55 | #define S5P6442_GPIO_NEXT(__gpio) \ | ||
56 | ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1) | ||
57 | |||
58 | enum s5p_gpio_number { | ||
59 | S5P6442_GPIO_A0_START = 0, | ||
60 | S5P6442_GPIO_A1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_A0), | ||
61 | S5P6442_GPIO_B_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_A1), | ||
62 | S5P6442_GPIO_C0_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_B), | ||
63 | S5P6442_GPIO_C1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_C0), | ||
64 | S5P6442_GPIO_D0_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_C1), | ||
65 | S5P6442_GPIO_D1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_D0), | ||
66 | S5P6442_GPIO_E0_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_D1), | ||
67 | S5P6442_GPIO_E1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_E0), | ||
68 | S5P6442_GPIO_F0_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_E1), | ||
69 | S5P6442_GPIO_F1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_F0), | ||
70 | S5P6442_GPIO_F2_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_F1), | ||
71 | S5P6442_GPIO_F3_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_F2), | ||
72 | S5P6442_GPIO_G0_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_F3), | ||
73 | S5P6442_GPIO_G1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_G0), | ||
74 | S5P6442_GPIO_G2_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_G1), | ||
75 | S5P6442_GPIO_H0_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_G2), | ||
76 | S5P6442_GPIO_H1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_H0), | ||
77 | S5P6442_GPIO_H2_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_H1), | ||
78 | S5P6442_GPIO_H3_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_H2), | ||
79 | S5P6442_GPIO_J0_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_H3), | ||
80 | S5P6442_GPIO_J1_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_J0), | ||
81 | S5P6442_GPIO_J2_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_J1), | ||
82 | S5P6442_GPIO_J3_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_J2), | ||
83 | S5P6442_GPIO_J4_START = S5P6442_GPIO_NEXT(S5P6442_GPIO_J3), | ||
84 | }; | ||
85 | |||
86 | /* S5P6442 GPIO number definitions. */ | ||
87 | #define S5P6442_GPA0(_nr) (S5P6442_GPIO_A0_START + (_nr)) | ||
88 | #define S5P6442_GPA1(_nr) (S5P6442_GPIO_A1_START + (_nr)) | ||
89 | #define S5P6442_GPB(_nr) (S5P6442_GPIO_B_START + (_nr)) | ||
90 | #define S5P6442_GPC0(_nr) (S5P6442_GPIO_C0_START + (_nr)) | ||
91 | #define S5P6442_GPC1(_nr) (S5P6442_GPIO_C1_START + (_nr)) | ||
92 | #define S5P6442_GPD0(_nr) (S5P6442_GPIO_D0_START + (_nr)) | ||
93 | #define S5P6442_GPD1(_nr) (S5P6442_GPIO_D1_START + (_nr)) | ||
94 | #define S5P6442_GPE0(_nr) (S5P6442_GPIO_E0_START + (_nr)) | ||
95 | #define S5P6442_GPE1(_nr) (S5P6442_GPIO_E1_START + (_nr)) | ||
96 | #define S5P6442_GPF0(_nr) (S5P6442_GPIO_F0_START + (_nr)) | ||
97 | #define S5P6442_GPF1(_nr) (S5P6442_GPIO_F1_START + (_nr)) | ||
98 | #define S5P6442_GPF2(_nr) (S5P6442_GPIO_F2_START + (_nr)) | ||
99 | #define S5P6442_GPF3(_nr) (S5P6442_GPIO_F3_START + (_nr)) | ||
100 | #define S5P6442_GPG0(_nr) (S5P6442_GPIO_G0_START + (_nr)) | ||
101 | #define S5P6442_GPG1(_nr) (S5P6442_GPIO_G1_START + (_nr)) | ||
102 | #define S5P6442_GPG2(_nr) (S5P6442_GPIO_G2_START + (_nr)) | ||
103 | #define S5P6442_GPH0(_nr) (S5P6442_GPIO_H0_START + (_nr)) | ||
104 | #define S5P6442_GPH1(_nr) (S5P6442_GPIO_H1_START + (_nr)) | ||
105 | #define S5P6442_GPH2(_nr) (S5P6442_GPIO_H2_START + (_nr)) | ||
106 | #define S5P6442_GPH3(_nr) (S5P6442_GPIO_H3_START + (_nr)) | ||
107 | #define S5P6442_GPJ0(_nr) (S5P6442_GPIO_J0_START + (_nr)) | ||
108 | #define S5P6442_GPJ1(_nr) (S5P6442_GPIO_J1_START + (_nr)) | ||
109 | #define S5P6442_GPJ2(_nr) (S5P6442_GPIO_J2_START + (_nr)) | ||
110 | #define S5P6442_GPJ3(_nr) (S5P6442_GPIO_J3_START + (_nr)) | ||
111 | #define S5P6442_GPJ4(_nr) (S5P6442_GPIO_J4_START + (_nr)) | ||
112 | |||
113 | /* the end of the S5P6442 specific gpios */ | ||
114 | #define S5P6442_GPIO_END (S5P6442_GPJ4(S5P6442_GPIO_J4_NR) + 1) | ||
115 | #define S3C_GPIO_END S5P6442_GPIO_END | ||
116 | |||
117 | /* define the number of gpios we need to the one after the GPJ4() range */ | ||
118 | #define ARCH_NR_GPIOS (S5P6442_GPJ4(S5P6442_GPIO_J4_NR) + \ | ||
119 | CONFIG_SAMSUNG_GPIO_EXTRA + 1) | ||
120 | |||
121 | #include <asm-generic/gpio.h> | ||
122 | |||
123 | #endif /* __ASM_ARCH_GPIO_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/hardware.h b/arch/arm/mach-s5p6442/include/mach/hardware.h deleted file mode 100644 index 8cd7b67b49d4..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/hardware.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/hardware.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - Hardware support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_HARDWARE_H | ||
14 | #define __ASM_ARCH_HARDWARE_H __FILE__ | ||
15 | |||
16 | /* currently nothing here, placeholder */ | ||
17 | |||
18 | #endif /* __ASM_ARCH_HARDWARE_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/io.h b/arch/arm/mach-s5p6442/include/mach/io.h deleted file mode 100644 index 5d2195ad0b67..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/io.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* arch/arm/mach-s5p6442/include/mach/io.h | ||
2 | * | ||
3 | * Copyright 2008-2010 Ben Dooks <ben-linux@fluff.org> | ||
4 | * | ||
5 | * Default IO routines for S5P6442 | ||
6 | */ | ||
7 | |||
8 | #ifndef __ASM_ARM_ARCH_IO_H | ||
9 | #define __ASM_ARM_ARCH_IO_H | ||
10 | |||
11 | /* No current ISA/PCI bus support. */ | ||
12 | #define __io(a) __typesafe_io(a) | ||
13 | #define __mem_pci(a) (a) | ||
14 | |||
15 | #define IO_SPACE_LIMIT (0xFFFFFFFF) | ||
16 | |||
17 | #endif | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/irqs.h b/arch/arm/mach-s5p6442/include/mach/irqs.h deleted file mode 100644 index 3fbc6c3ad2da..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/irqs.h +++ /dev/null | |||
@@ -1,87 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/irqs.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - IRQ definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_IRQS_H | ||
14 | #define __ASM_ARCH_IRQS_H __FILE__ | ||
15 | |||
16 | #include <plat/irqs.h> | ||
17 | |||
18 | /* VIC0 */ | ||
19 | #define IRQ_EINT16_31 S5P_IRQ_VIC0(16) | ||
20 | #define IRQ_BATF S5P_IRQ_VIC0(17) | ||
21 | #define IRQ_MDMA S5P_IRQ_VIC0(18) | ||
22 | #define IRQ_PDMA S5P_IRQ_VIC0(19) | ||
23 | #define IRQ_TIMER0_VIC S5P_IRQ_VIC0(21) | ||
24 | #define IRQ_TIMER1_VIC S5P_IRQ_VIC0(22) | ||
25 | #define IRQ_TIMER2_VIC S5P_IRQ_VIC0(23) | ||
26 | #define IRQ_TIMER3_VIC S5P_IRQ_VIC0(24) | ||
27 | #define IRQ_TIMER4_VIC S5P_IRQ_VIC0(25) | ||
28 | #define IRQ_SYSTIMER S5P_IRQ_VIC0(26) | ||
29 | #define IRQ_WDT S5P_IRQ_VIC0(27) | ||
30 | #define IRQ_RTC_ALARM S5P_IRQ_VIC0(28) | ||
31 | #define IRQ_RTC_TIC S5P_IRQ_VIC0(29) | ||
32 | #define IRQ_GPIOINT S5P_IRQ_VIC0(30) | ||
33 | |||
34 | /* VIC1 */ | ||
35 | #define IRQ_PMU S5P_IRQ_VIC1(0) | ||
36 | #define IRQ_ONENAND S5P_IRQ_VIC1(7) | ||
37 | #define IRQ_UART0 S5P_IRQ_VIC1(10) | ||
38 | #define IRQ_UART1 S5P_IRQ_VIC1(11) | ||
39 | #define IRQ_UART2 S5P_IRQ_VIC1(12) | ||
40 | #define IRQ_SPI0 S5P_IRQ_VIC1(15) | ||
41 | #define IRQ_IIC S5P_IRQ_VIC1(19) | ||
42 | #define IRQ_IIC1 S5P_IRQ_VIC1(20) | ||
43 | #define IRQ_IIC2 S5P_IRQ_VIC1(21) | ||
44 | #define IRQ_OTG S5P_IRQ_VIC1(24) | ||
45 | #define IRQ_MSM S5P_IRQ_VIC1(25) | ||
46 | #define IRQ_HSMMC0 S5P_IRQ_VIC1(26) | ||
47 | #define IRQ_HSMMC1 S5P_IRQ_VIC1(27) | ||
48 | #define IRQ_HSMMC2 S5P_IRQ_VIC1(28) | ||
49 | #define IRQ_COMMRX S5P_IRQ_VIC1(29) | ||
50 | #define IRQ_COMMTX S5P_IRQ_VIC1(30) | ||
51 | |||
52 | /* VIC2 */ | ||
53 | #define IRQ_LCD0 S5P_IRQ_VIC2(0) | ||
54 | #define IRQ_LCD1 S5P_IRQ_VIC2(1) | ||
55 | #define IRQ_LCD2 S5P_IRQ_VIC2(2) | ||
56 | #define IRQ_LCD3 S5P_IRQ_VIC2(3) | ||
57 | #define IRQ_ROTATOR S5P_IRQ_VIC2(4) | ||
58 | #define IRQ_FIMC0 S5P_IRQ_VIC2(5) | ||
59 | #define IRQ_FIMC1 S5P_IRQ_VIC2(6) | ||
60 | #define IRQ_FIMC2 S5P_IRQ_VIC2(7) | ||
61 | #define IRQ_JPEG S5P_IRQ_VIC2(8) | ||
62 | #define IRQ_3D S5P_IRQ_VIC2(10) | ||
63 | #define IRQ_Mixer S5P_IRQ_VIC2(11) | ||
64 | #define IRQ_MFC S5P_IRQ_VIC2(14) | ||
65 | #define IRQ_TVENC S5P_IRQ_VIC2(15) | ||
66 | #define IRQ_I2S0 S5P_IRQ_VIC2(16) | ||
67 | #define IRQ_I2S1 S5P_IRQ_VIC2(17) | ||
68 | #define IRQ_RP S5P_IRQ_VIC2(19) | ||
69 | #define IRQ_PCM0 S5P_IRQ_VIC2(20) | ||
70 | #define IRQ_PCM1 S5P_IRQ_VIC2(21) | ||
71 | #define IRQ_ADC S5P_IRQ_VIC2(23) | ||
72 | #define IRQ_PENDN S5P_IRQ_VIC2(24) | ||
73 | #define IRQ_KEYPAD S5P_IRQ_VIC2(25) | ||
74 | #define IRQ_SSS_INT S5P_IRQ_VIC2(27) | ||
75 | #define IRQ_SSS_HASH S5P_IRQ_VIC2(28) | ||
76 | #define IRQ_VIC_END S5P_IRQ_VIC2(31) | ||
77 | |||
78 | #define S5P_IRQ_EINT_BASE (IRQ_VIC_END + 1) | ||
79 | |||
80 | #define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) | ||
81 | #define S5P_EINT_BASE2 (S5P_IRQ_EINT_BASE) | ||
82 | |||
83 | /* Set the default NR_IRQS */ | ||
84 | |||
85 | #define NR_IRQS (IRQ_EINT(31) + 1) | ||
86 | |||
87 | #endif /* __ASM_ARCH_IRQS_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/map.h b/arch/arm/mach-s5p6442/include/mach/map.h deleted file mode 100644 index 058dab4482a1..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/map.h +++ /dev/null | |||
@@ -1,76 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/map.h | ||
2 | * | ||
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - Memory map definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_MAP_H | ||
14 | #define __ASM_ARCH_MAP_H __FILE__ | ||
15 | |||
16 | #include <plat/map-base.h> | ||
17 | #include <plat/map-s5p.h> | ||
18 | |||
19 | #define S5P6442_PA_SDRAM 0x20000000 | ||
20 | |||
21 | #define S5P6442_PA_I2S0 0xC0B00000 | ||
22 | #define S5P6442_PA_I2S1 0xF2200000 | ||
23 | |||
24 | #define S5P6442_PA_CHIPID 0xE0000000 | ||
25 | |||
26 | #define S5P6442_PA_SYSCON 0xE0100000 | ||
27 | |||
28 | #define S5P6442_PA_GPIO 0xE0200000 | ||
29 | |||
30 | #define S5P6442_PA_VIC0 0xE4000000 | ||
31 | #define S5P6442_PA_VIC1 0xE4100000 | ||
32 | #define S5P6442_PA_VIC2 0xE4200000 | ||
33 | |||
34 | #define S5P6442_PA_SROMC 0xE7000000 | ||
35 | |||
36 | #define S5P6442_PA_MDMA 0xE8000000 | ||
37 | #define S5P6442_PA_PDMA 0xE9000000 | ||
38 | |||
39 | #define S5P6442_PA_TIMER 0xEA000000 | ||
40 | |||
41 | #define S5P6442_PA_SYSTIMER 0xEA100000 | ||
42 | |||
43 | #define S5P6442_PA_WATCHDOG 0xEA200000 | ||
44 | |||
45 | #define S5P6442_PA_UART 0xEC000000 | ||
46 | |||
47 | #define S5P6442_PA_IIC0 0xEC100000 | ||
48 | |||
49 | #define S5P6442_PA_SPI 0xEC300000 | ||
50 | |||
51 | #define S5P6442_PA_PCM0 0xF2400000 | ||
52 | #define S5P6442_PA_PCM1 0xF2500000 | ||
53 | |||
54 | /* Compatibiltiy Defines */ | ||
55 | |||
56 | #define S3C_PA_IIC S5P6442_PA_IIC0 | ||
57 | #define S3C_PA_WDT S5P6442_PA_WATCHDOG | ||
58 | |||
59 | #define S5P_PA_CHIPID S5P6442_PA_CHIPID | ||
60 | #define S5P_PA_SDRAM S5P6442_PA_SDRAM | ||
61 | #define S5P_PA_SROMC S5P6442_PA_SROMC | ||
62 | #define S5P_PA_SYSCON S5P6442_PA_SYSCON | ||
63 | #define S5P_PA_TIMER S5P6442_PA_TIMER | ||
64 | |||
65 | /* UART */ | ||
66 | |||
67 | #define S3C_PA_UART S5P6442_PA_UART | ||
68 | |||
69 | #define S5P_PA_UART(x) (S3C_PA_UART + ((x) * S3C_UART_OFFSET)) | ||
70 | #define S5P_PA_UART0 S5P_PA_UART(0) | ||
71 | #define S5P_PA_UART1 S5P_PA_UART(1) | ||
72 | #define S5P_PA_UART2 S5P_PA_UART(2) | ||
73 | |||
74 | #define S5P_SZ_UART SZ_256 | ||
75 | |||
76 | #endif /* __ASM_ARCH_MAP_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/memory.h b/arch/arm/mach-s5p6442/include/mach/memory.h deleted file mode 100644 index cfe259dded33..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/memory.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/memory.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - Memory definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | ||
14 | #define __ASM_ARCH_MEMORY_H | ||
15 | |||
16 | #define PLAT_PHYS_OFFSET UL(0x20000000) | ||
17 | #define CONSISTENT_DMA_SIZE SZ_8M | ||
18 | |||
19 | #endif /* __ASM_ARCH_MEMORY_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/pwm-clock.h b/arch/arm/mach-s5p6442/include/mach/pwm-clock.h deleted file mode 100644 index 2724b37def31..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/pwm-clock.h +++ /dev/null | |||
@@ -1,70 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/pwm-clock.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * Copyright 2008 Openmoko, Inc. | ||
7 | * Copyright 2008 Simtec Electronics | ||
8 | * Ben Dooks <ben@simtec.co.uk> | ||
9 | * http://armlinux.simtec.co.uk/ | ||
10 | * | ||
11 | * Based on arch/arm/mach-s3c64xx/include/mach/pwm-clock.h | ||
12 | * | ||
13 | * S5P6442 - pwm clock and timer support | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License version 2 as | ||
17 | * published by the Free Software Foundation. | ||
18 | */ | ||
19 | |||
20 | #ifndef __ASM_ARCH_PWMCLK_H | ||
21 | #define __ASM_ARCH_PWMCLK_H __FILE__ | ||
22 | |||
23 | /** | ||
24 | * pwm_cfg_src_is_tclk() - return whether the given mux config is a tclk | ||
25 | * @tcfg: The timer TCFG1 register bits shifted down to 0. | ||
26 | * | ||
27 | * Return true if the given configuration from TCFG1 is a TCLK instead | ||
28 | * any of the TDIV clocks. | ||
29 | */ | ||
30 | static inline int pwm_cfg_src_is_tclk(unsigned long tcfg) | ||
31 | { | ||
32 | return tcfg == S3C64XX_TCFG1_MUX_TCLK; | ||
33 | } | ||
34 | |||
35 | /** | ||
36 | * tcfg_to_divisor() - convert tcfg1 setting to a divisor | ||
37 | * @tcfg1: The tcfg1 setting, shifted down. | ||
38 | * | ||
39 | * Get the divisor value for the given tcfg1 setting. We assume the | ||
40 | * caller has already checked to see if this is not a TCLK source. | ||
41 | */ | ||
42 | static inline unsigned long tcfg_to_divisor(unsigned long tcfg1) | ||
43 | { | ||
44 | return 1 << tcfg1; | ||
45 | } | ||
46 | |||
47 | /** | ||
48 | * pwm_tdiv_has_div1() - does the tdiv setting have a /1 | ||
49 | * | ||
50 | * Return true if we have a /1 in the tdiv setting. | ||
51 | */ | ||
52 | static inline unsigned int pwm_tdiv_has_div1(void) | ||
53 | { | ||
54 | return 1; | ||
55 | } | ||
56 | |||
57 | /** | ||
58 | * pwm_tdiv_div_bits() - calculate TCFG1 divisor value. | ||
59 | * @div: The divisor to calculate the bit information for. | ||
60 | * | ||
61 | * Turn a divisor into the necessary bit field for TCFG1. | ||
62 | */ | ||
63 | static inline unsigned long pwm_tdiv_div_bits(unsigned int div) | ||
64 | { | ||
65 | return ilog2(div); | ||
66 | } | ||
67 | |||
68 | #define S3C_TCFG1_MUX_TCLK S3C64XX_TCFG1_MUX_TCLK | ||
69 | |||
70 | #endif /* __ASM_ARCH_PWMCLK_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/regs-clock.h b/arch/arm/mach-s5p6442/include/mach/regs-clock.h deleted file mode 100644 index 00828a336991..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/regs-clock.h +++ /dev/null | |||
@@ -1,104 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/regs-clock.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - Clock register definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_CLOCK_H | ||
14 | #define __ASM_ARCH_REGS_CLOCK_H __FILE__ | ||
15 | |||
16 | #include <mach/map.h> | ||
17 | |||
18 | #define S5P_CLKREG(x) (S3C_VA_SYS + (x)) | ||
19 | |||
20 | #define S5P_APLL_LOCK S5P_CLKREG(0x00) | ||
21 | #define S5P_MPLL_LOCK S5P_CLKREG(0x08) | ||
22 | #define S5P_EPLL_LOCK S5P_CLKREG(0x10) | ||
23 | #define S5P_VPLL_LOCK S5P_CLKREG(0x20) | ||
24 | |||
25 | #define S5P_APLL_CON S5P_CLKREG(0x100) | ||
26 | #define S5P_MPLL_CON S5P_CLKREG(0x108) | ||
27 | #define S5P_EPLL_CON S5P_CLKREG(0x110) | ||
28 | #define S5P_VPLL_CON S5P_CLKREG(0x120) | ||
29 | |||
30 | #define S5P_CLK_SRC0 S5P_CLKREG(0x200) | ||
31 | #define S5P_CLK_SRC1 S5P_CLKREG(0x204) | ||
32 | #define S5P_CLK_SRC2 S5P_CLKREG(0x208) | ||
33 | #define S5P_CLK_SRC3 S5P_CLKREG(0x20C) | ||
34 | #define S5P_CLK_SRC4 S5P_CLKREG(0x210) | ||
35 | #define S5P_CLK_SRC5 S5P_CLKREG(0x214) | ||
36 | #define S5P_CLK_SRC6 S5P_CLKREG(0x218) | ||
37 | |||
38 | #define S5P_CLK_SRC_MASK0 S5P_CLKREG(0x280) | ||
39 | #define S5P_CLK_SRC_MASK1 S5P_CLKREG(0x284) | ||
40 | |||
41 | #define S5P_CLK_DIV0 S5P_CLKREG(0x300) | ||
42 | #define S5P_CLK_DIV1 S5P_CLKREG(0x304) | ||
43 | #define S5P_CLK_DIV2 S5P_CLKREG(0x308) | ||
44 | #define S5P_CLK_DIV3 S5P_CLKREG(0x30C) | ||
45 | #define S5P_CLK_DIV4 S5P_CLKREG(0x310) | ||
46 | #define S5P_CLK_DIV5 S5P_CLKREG(0x314) | ||
47 | #define S5P_CLK_DIV6 S5P_CLKREG(0x318) | ||
48 | |||
49 | #define S5P_CLKGATE_IP0 S5P_CLKREG(0x460) | ||
50 | #define S5P_CLKGATE_IP3 S5P_CLKREG(0x46C) | ||
51 | |||
52 | /* CLK_OUT */ | ||
53 | #define S5P_CLK_OUT_SHIFT (12) | ||
54 | #define S5P_CLK_OUT_MASK (0x1F << S5P_CLK_OUT_SHIFT) | ||
55 | #define S5P_CLK_OUT S5P_CLKREG(0x500) | ||
56 | |||
57 | #define S5P_CLK_DIV_STAT0 S5P_CLKREG(0x1000) | ||
58 | #define S5P_CLK_DIV_STAT1 S5P_CLKREG(0x1004) | ||
59 | |||
60 | #define S5P_CLK_MUX_STAT0 S5P_CLKREG(0x1100) | ||
61 | #define S5P_CLK_MUX_STAT1 S5P_CLKREG(0x1104) | ||
62 | |||
63 | #define S5P_MDNIE_SEL S5P_CLKREG(0x7008) | ||
64 | |||
65 | /* Register Bit definition */ | ||
66 | #define S5P_EPLL_EN (1<<31) | ||
67 | #define S5P_EPLL_MASK 0xffffffff | ||
68 | #define S5P_EPLLVAL(_m, _p, _s) ((_m) << 16 | ((_p) << 8) | ((_s))) | ||
69 | |||
70 | /* CLKDIV0 */ | ||
71 | #define S5P_CLKDIV0_APLL_SHIFT (0) | ||
72 | #define S5P_CLKDIV0_APLL_MASK (0x7 << S5P_CLKDIV0_APLL_SHIFT) | ||
73 | #define S5P_CLKDIV0_A2M_SHIFT (4) | ||
74 | #define S5P_CLKDIV0_A2M_MASK (0x7 << S5P_CLKDIV0_A2M_SHIFT) | ||
75 | #define S5P_CLKDIV0_D0CLK_SHIFT (16) | ||
76 | #define S5P_CLKDIV0_D0CLK_MASK (0xF << S5P_CLKDIV0_D0CLK_SHIFT) | ||
77 | #define S5P_CLKDIV0_P0CLK_SHIFT (20) | ||
78 | #define S5P_CLKDIV0_P0CLK_MASK (0x7 << S5P_CLKDIV0_P0CLK_SHIFT) | ||
79 | #define S5P_CLKDIV0_D1CLK_SHIFT (24) | ||
80 | #define S5P_CLKDIV0_D1CLK_MASK (0xF << S5P_CLKDIV0_D1CLK_SHIFT) | ||
81 | #define S5P_CLKDIV0_P1CLK_SHIFT (28) | ||
82 | #define S5P_CLKDIV0_P1CLK_MASK (0x7 << S5P_CLKDIV0_P1CLK_SHIFT) | ||
83 | |||
84 | /* Clock MUX status Registers */ | ||
85 | #define S5P_CLK_MUX_STAT0_APLL_SHIFT (0) | ||
86 | #define S5P_CLK_MUX_STAT0_APLL_MASK (0x7 << S5P_CLK_MUX_STAT0_APLL_SHIFT) | ||
87 | #define S5P_CLK_MUX_STAT0_MPLL_SHIFT (4) | ||
88 | #define S5P_CLK_MUX_STAT0_MPLL_MASK (0x7 << S5P_CLK_MUX_STAT0_MPLL_SHIFT) | ||
89 | #define S5P_CLK_MUX_STAT0_EPLL_SHIFT (8) | ||
90 | #define S5P_CLK_MUX_STAT0_EPLL_MASK (0x7 << S5P_CLK_MUX_STAT0_EPLL_SHIFT) | ||
91 | #define S5P_CLK_MUX_STAT0_VPLL_SHIFT (12) | ||
92 | #define S5P_CLK_MUX_STAT0_VPLL_MASK (0x7 << S5P_CLK_MUX_STAT0_VPLL_SHIFT) | ||
93 | #define S5P_CLK_MUX_STAT0_MUXARM_SHIFT (16) | ||
94 | #define S5P_CLK_MUX_STAT0_MUXARM_MASK (0x7 << S5P_CLK_MUX_STAT0_MUXARM_SHIFT) | ||
95 | #define S5P_CLK_MUX_STAT0_MUXD0_SHIFT (20) | ||
96 | #define S5P_CLK_MUX_STAT0_MUXD0_MASK (0x7 << S5P_CLK_MUX_STAT0_MUXD0_SHIFT) | ||
97 | #define S5P_CLK_MUX_STAT0_MUXD1_SHIFT (24) | ||
98 | #define S5P_CLK_MUX_STAT0_MUXD1_MASK (0x7 << S5P_CLK_MUX_STAT0_MUXD1_SHIFT) | ||
99 | #define S5P_CLK_MUX_STAT1_D1SYNC_SHIFT (24) | ||
100 | #define S5P_CLK_MUX_STAT1_D1SYNC_MASK (0x7 << S5P_CLK_MUX_STAT1_D1SYNC_SHIFT) | ||
101 | #define S5P_CLK_MUX_STAT1_D0SYNC_SHIFT (28) | ||
102 | #define S5P_CLK_MUX_STAT1_D0SYNC_MASK (0x7 << S5P_CLK_MUX_STAT1_D0SYNC_SHIFT) | ||
103 | |||
104 | #endif /* __ASM_ARCH_REGS_CLOCK_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/regs-irq.h b/arch/arm/mach-s5p6442/include/mach/regs-irq.h deleted file mode 100644 index 73782b52a83b..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/regs-irq.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/regs-irq.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - IRQ register definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_IRQ_H | ||
14 | #define __ASM_ARCH_REGS_IRQ_H __FILE__ | ||
15 | |||
16 | #include <asm/hardware/vic.h> | ||
17 | #include <mach/map.h> | ||
18 | |||
19 | #endif /* __ASM_ARCH_REGS_IRQ_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/spi-clocks.h b/arch/arm/mach-s5p6442/include/mach/spi-clocks.h deleted file mode 100644 index 7fd88205a97c..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/spi-clocks.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/spi-clocks.h | ||
2 | * | ||
3 | * Copyright (C) 2010 Samsung Electronics Co. Ltd. | ||
4 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #ifndef __S5P6442_PLAT_SPI_CLKS_H | ||
12 | #define __S5P6442_PLAT_SPI_CLKS_H __FILE__ | ||
13 | |||
14 | #define S5P6442_SPI_SRCCLK_PCLK 0 | ||
15 | #define S5P6442_SPI_SRCCLK_SCLK 1 | ||
16 | |||
17 | #endif /* __S5P6442_PLAT_SPI_CLKS_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/system.h b/arch/arm/mach-s5p6442/include/mach/system.h deleted file mode 100644 index c30c1cc1b97e..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/system.h +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/system.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - system support header | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_SYSTEM_H | ||
14 | #define __ASM_ARCH_SYSTEM_H __FILE__ | ||
15 | |||
16 | #include <plat/system-reset.h> | ||
17 | |||
18 | static void arch_idle(void) | ||
19 | { | ||
20 | /* nothing here yet */ | ||
21 | } | ||
22 | |||
23 | #endif /* __ASM_ARCH_SYSTEM_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/tick.h b/arch/arm/mach-s5p6442/include/mach/tick.h deleted file mode 100644 index e1d4cabf8297..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/tick.h +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/tick.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * Based on arch/arm/mach-s3c6400/include/mach/tick.h | ||
7 | * | ||
8 | * S5P6442 - Timer tick support definitions | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_TICK_H | ||
16 | #define __ASM_ARCH_TICK_H __FILE__ | ||
17 | |||
18 | static inline u32 s3c24xx_ostimer_pending(void) | ||
19 | { | ||
20 | u32 pend = __raw_readl(VA_VIC0 + VIC_RAW_STATUS); | ||
21 | return pend & (1 << (IRQ_TIMER4_VIC - S5P_IRQ_VIC0(0))); | ||
22 | } | ||
23 | |||
24 | #define TICK_MAX (0xffffffff) | ||
25 | |||
26 | #endif /* __ASM_ARCH_TICK_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/timex.h b/arch/arm/mach-s5p6442/include/mach/timex.h deleted file mode 100644 index ff8f2fcadeb7..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/timex.h +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | /* arch/arm/mach-s5p6442/include/mach/timex.h | ||
2 | * | ||
3 | * Copyright (c) 2003-2010 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * | ||
6 | * S5P6442 - time parameters | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_TIMEX_H | ||
14 | #define __ASM_ARCH_TIMEX_H | ||
15 | |||
16 | /* CLOCK_TICK_RATE needs to be evaluatable by the cpp, so making it | ||
17 | * a variable is useless. It seems as long as we make our timers an | ||
18 | * exact multiple of HZ, any value that makes a 1->1 correspondence | ||
19 | * for the time conversion functions to/from jiffies is acceptable. | ||
20 | */ | ||
21 | |||
22 | #define CLOCK_TICK_RATE 12000000 | ||
23 | |||
24 | #endif /* __ASM_ARCH_TIMEX_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/uncompress.h b/arch/arm/mach-s5p6442/include/mach/uncompress.h deleted file mode 100644 index 5ac7cbeeb987..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/uncompress.h +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/uncompress.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P6442 - uncompress code | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_UNCOMPRESS_H | ||
14 | #define __ASM_ARCH_UNCOMPRESS_H | ||
15 | |||
16 | #include <mach/map.h> | ||
17 | #include <plat/uncompress.h> | ||
18 | |||
19 | static void arch_detect_cpu(void) | ||
20 | { | ||
21 | /* we do not need to do any cpu detection here at the moment. */ | ||
22 | } | ||
23 | |||
24 | #endif /* __ASM_ARCH_UNCOMPRESS_H */ | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/vmalloc.h b/arch/arm/mach-s5p6442/include/mach/vmalloc.h deleted file mode 100644 index 4aa55e55ac47..000000000000 --- a/arch/arm/mach-s5p6442/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* arch/arm/mach-s5p6442/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * S5P6442 vmalloc definition | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_ARCH_VMALLOC_H | ||
13 | #define __ASM_ARCH_VMALLOC_H | ||
14 | |||
15 | #define VMALLOC_END 0xF6000000UL | ||
16 | |||
17 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5p6442/init.c b/arch/arm/mach-s5p6442/init.c deleted file mode 100644 index 1874bdb71e1d..000000000000 --- a/arch/arm/mach-s5p6442/init.c +++ /dev/null | |||
@@ -1,44 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/s5p6442-init.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/types.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/serial_core.h> | ||
15 | |||
16 | #include <plat/cpu.h> | ||
17 | #include <plat/devs.h> | ||
18 | #include <plat/s5p6442.h> | ||
19 | #include <plat/regs-serial.h> | ||
20 | |||
21 | static struct s3c24xx_uart_clksrc s5p6442_serial_clocks[] = { | ||
22 | [0] = { | ||
23 | .name = "pclk", | ||
24 | .divisor = 1, | ||
25 | .min_baud = 0, | ||
26 | .max_baud = 0, | ||
27 | }, | ||
28 | }; | ||
29 | |||
30 | /* uart registration process */ | ||
31 | void __init s5p6442_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
32 | { | ||
33 | struct s3c2410_uartcfg *tcfg = cfg; | ||
34 | u32 ucnt; | ||
35 | |||
36 | for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { | ||
37 | if (!tcfg->clocks) { | ||
38 | tcfg->clocks = s5p6442_serial_clocks; | ||
39 | tcfg->clocks_size = ARRAY_SIZE(s5p6442_serial_clocks); | ||
40 | } | ||
41 | } | ||
42 | |||
43 | s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); | ||
44 | } | ||
diff --git a/arch/arm/mach-s5p6442/mach-smdk6442.c b/arch/arm/mach-s5p6442/mach-smdk6442.c deleted file mode 100644 index eaf6b9c489ff..000000000000 --- a/arch/arm/mach-s5p6442/mach-smdk6442.c +++ /dev/null | |||
@@ -1,102 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/mach-smdk6442.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/types.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/serial_core.h> | ||
15 | #include <linux/i2c.h> | ||
16 | |||
17 | #include <asm/mach/arch.h> | ||
18 | #include <asm/mach/map.h> | ||
19 | #include <asm/setup.h> | ||
20 | #include <asm/mach-types.h> | ||
21 | |||
22 | #include <mach/map.h> | ||
23 | #include <mach/regs-clock.h> | ||
24 | |||
25 | #include <plat/regs-serial.h> | ||
26 | #include <plat/s5p6442.h> | ||
27 | #include <plat/devs.h> | ||
28 | #include <plat/cpu.h> | ||
29 | #include <plat/iic.h> | ||
30 | |||
31 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | ||
32 | #define SMDK6442_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | ||
33 | S3C2410_UCON_RXILEVEL | \ | ||
34 | S3C2410_UCON_TXIRQMODE | \ | ||
35 | S3C2410_UCON_RXIRQMODE | \ | ||
36 | S3C2410_UCON_RXFIFO_TOI | \ | ||
37 | S3C2443_UCON_RXERR_IRQEN) | ||
38 | |||
39 | #define SMDK6442_ULCON_DEFAULT S3C2410_LCON_CS8 | ||
40 | |||
41 | #define SMDK6442_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \ | ||
42 | S5PV210_UFCON_TXTRIG4 | \ | ||
43 | S5PV210_UFCON_RXTRIG4) | ||
44 | |||
45 | static struct s3c2410_uartcfg smdk6442_uartcfgs[] __initdata = { | ||
46 | [0] = { | ||
47 | .hwport = 0, | ||
48 | .flags = 0, | ||
49 | .ucon = SMDK6442_UCON_DEFAULT, | ||
50 | .ulcon = SMDK6442_ULCON_DEFAULT, | ||
51 | .ufcon = SMDK6442_UFCON_DEFAULT, | ||
52 | }, | ||
53 | [1] = { | ||
54 | .hwport = 1, | ||
55 | .flags = 0, | ||
56 | .ucon = SMDK6442_UCON_DEFAULT, | ||
57 | .ulcon = SMDK6442_ULCON_DEFAULT, | ||
58 | .ufcon = SMDK6442_UFCON_DEFAULT, | ||
59 | }, | ||
60 | [2] = { | ||
61 | .hwport = 2, | ||
62 | .flags = 0, | ||
63 | .ucon = SMDK6442_UCON_DEFAULT, | ||
64 | .ulcon = SMDK6442_ULCON_DEFAULT, | ||
65 | .ufcon = SMDK6442_UFCON_DEFAULT, | ||
66 | }, | ||
67 | }; | ||
68 | |||
69 | static struct platform_device *smdk6442_devices[] __initdata = { | ||
70 | &s3c_device_i2c0, | ||
71 | &samsung_asoc_dma, | ||
72 | &s5p6442_device_iis0, | ||
73 | &s3c_device_wdt, | ||
74 | }; | ||
75 | |||
76 | static struct i2c_board_info smdk6442_i2c_devs0[] __initdata = { | ||
77 | { I2C_BOARD_INFO("wm8580", 0x1b), }, | ||
78 | }; | ||
79 | |||
80 | static void __init smdk6442_map_io(void) | ||
81 | { | ||
82 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | ||
83 | s3c24xx_init_clocks(12000000); | ||
84 | s3c24xx_init_uarts(smdk6442_uartcfgs, ARRAY_SIZE(smdk6442_uartcfgs)); | ||
85 | } | ||
86 | |||
87 | static void __init smdk6442_machine_init(void) | ||
88 | { | ||
89 | s3c_i2c0_set_platdata(NULL); | ||
90 | i2c_register_board_info(0, smdk6442_i2c_devs0, | ||
91 | ARRAY_SIZE(smdk6442_i2c_devs0)); | ||
92 | platform_add_devices(smdk6442_devices, ARRAY_SIZE(smdk6442_devices)); | ||
93 | } | ||
94 | |||
95 | MACHINE_START(SMDK6442, "SMDK6442") | ||
96 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ | ||
97 | .boot_params = S5P_PA_SDRAM + 0x100, | ||
98 | .init_irq = s5p6442_init_irq, | ||
99 | .map_io = smdk6442_map_io, | ||
100 | .init_machine = smdk6442_machine_init, | ||
101 | .timer = &s3c24xx_timer, | ||
102 | MACHINE_END | ||
diff --git a/arch/arm/mach-s5p6442/setup-i2c0.c b/arch/arm/mach-s5p6442/setup-i2c0.c deleted file mode 100644 index aad85656b0cc..000000000000 --- a/arch/arm/mach-s5p6442/setup-i2c0.c +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/setup-i2c0.c | ||
2 | * | ||
3 | * Copyright (c) 2009 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * I2C0 GPIO configuration. | ||
7 | * | ||
8 | * Based on plat-s3c64xx/setup-i2c0.c | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/gpio.h> | ||
18 | |||
19 | struct platform_device; /* don't need the contents */ | ||
20 | |||
21 | #include <plat/gpio-cfg.h> | ||
22 | #include <plat/iic.h> | ||
23 | |||
24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | ||
25 | { | ||
26 | s3c_gpio_cfgall_range(S5P6442_GPD1(0), 2, | ||
27 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
28 | } | ||
diff --git a/arch/arm/mach-s5pc100/Makefile b/arch/arm/mach-s5pc100/Makefile index eecab57d2e5d..a5e6e608b498 100644 --- a/arch/arm/mach-s5pc100/Makefile +++ b/arch/arm/mach-s5pc100/Makefile | |||
@@ -11,7 +11,7 @@ obj- := | |||
11 | 11 | ||
12 | # Core support for S5PC100 system | 12 | # Core support for S5PC100 system |
13 | 13 | ||
14 | obj-$(CONFIG_CPU_S5PC100) += cpu.o init.o clock.o gpiolib.o | 14 | obj-$(CONFIG_CPU_S5PC100) += cpu.o init.o clock.o |
15 | obj-$(CONFIG_CPU_S5PC100) += setup-i2c0.o | 15 | obj-$(CONFIG_CPU_S5PC100) += setup-i2c0.o |
16 | obj-$(CONFIG_CPU_S5PC100) += dma.o | 16 | obj-$(CONFIG_CPU_S5PC100) += dma.o |
17 | 17 | ||
diff --git a/arch/arm/mach-s5pc100/gpiolib.c b/arch/arm/mach-s5pc100/gpiolib.c deleted file mode 100644 index 2842394b28b5..000000000000 --- a/arch/arm/mach-s5pc100/gpiolib.c +++ /dev/null | |||
@@ -1,355 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5pc100/gpiolib.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Copyright 2009 Samsung Electronics Co | ||
7 | * Kyungmin Park <kyungmin.park@samsung.com> | ||
8 | * | ||
9 | * S5PC100 - GPIOlib support | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License version 2 as | ||
13 | * published by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/irq.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/gpio.h> | ||
20 | |||
21 | #include <mach/map.h> | ||
22 | #include <mach/regs-gpio.h> | ||
23 | |||
24 | #include <plat/gpio-core.h> | ||
25 | #include <plat/gpio-cfg.h> | ||
26 | #include <plat/gpio-cfg-helpers.h> | ||
27 | |||
28 | /* S5PC100 GPIO bank summary: | ||
29 | * | ||
30 | * Bank GPIOs Style INT Type | ||
31 | * A0 8 4Bit GPIO_INT0 | ||
32 | * A1 5 4Bit GPIO_INT1 | ||
33 | * B 8 4Bit GPIO_INT2 | ||
34 | * C 5 4Bit GPIO_INT3 | ||
35 | * D 7 4Bit GPIO_INT4 | ||
36 | * E0 8 4Bit GPIO_INT5 | ||
37 | * E1 6 4Bit GPIO_INT6 | ||
38 | * F0 8 4Bit GPIO_INT7 | ||
39 | * F1 8 4Bit GPIO_INT8 | ||
40 | * F2 8 4Bit GPIO_INT9 | ||
41 | * F3 4 4Bit GPIO_INT10 | ||
42 | * G0 8 4Bit GPIO_INT11 | ||
43 | * G1 3 4Bit GPIO_INT12 | ||
44 | * G2 7 4Bit GPIO_INT13 | ||
45 | * G3 7 4Bit GPIO_INT14 | ||
46 | * H0 8 4Bit WKUP_INT | ||
47 | * H1 8 4Bit WKUP_INT | ||
48 | * H2 8 4Bit WKUP_INT | ||
49 | * H3 8 4Bit WKUP_INT | ||
50 | * I 8 4Bit GPIO_INT15 | ||
51 | * J0 8 4Bit GPIO_INT16 | ||
52 | * J1 5 4Bit GPIO_INT17 | ||
53 | * J2 8 4Bit GPIO_INT18 | ||
54 | * J3 8 4Bit GPIO_INT19 | ||
55 | * J4 4 4Bit GPIO_INT20 | ||
56 | * K0 8 4Bit None | ||
57 | * K1 6 4Bit None | ||
58 | * K2 8 4Bit None | ||
59 | * K3 8 4Bit None | ||
60 | * L0 8 4Bit None | ||
61 | * L1 8 4Bit None | ||
62 | * L2 8 4Bit None | ||
63 | * L3 8 4Bit None | ||
64 | */ | ||
65 | |||
66 | static struct s3c_gpio_cfg gpio_cfg = { | ||
67 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
68 | .set_pull = s3c_gpio_setpull_updown, | ||
69 | .get_pull = s3c_gpio_getpull_updown, | ||
70 | }; | ||
71 | |||
72 | static struct s3c_gpio_cfg gpio_cfg_eint = { | ||
73 | .cfg_eint = 0xf, | ||
74 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
75 | .set_pull = s3c_gpio_setpull_updown, | ||
76 | .get_pull = s3c_gpio_getpull_updown, | ||
77 | }; | ||
78 | |||
79 | static struct s3c_gpio_cfg gpio_cfg_noint = { | ||
80 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
81 | .set_pull = s3c_gpio_setpull_updown, | ||
82 | .get_pull = s3c_gpio_getpull_updown, | ||
83 | }; | ||
84 | |||
85 | /* | ||
86 | * GPIO bank's base address given the index of the bank in the | ||
87 | * list of all gpio banks. | ||
88 | */ | ||
89 | #define S5PC100_BANK_BASE(bank_nr) (S5P_VA_GPIO + ((bank_nr) * 0x20)) | ||
90 | |||
91 | /* | ||
92 | * Following are the gpio banks in S5PC100. | ||
93 | * | ||
94 | * The 'config' member when left to NULL, is initialized to the default | ||
95 | * structure gpio_cfg in the init function below. | ||
96 | * | ||
97 | * The 'base' member is also initialized in the init function below. | ||
98 | * Note: The initialization of 'base' member of s3c_gpio_chip structure | ||
99 | * uses the above macro and depends on the banks being listed in order here. | ||
100 | */ | ||
101 | static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | ||
102 | { | ||
103 | .chip = { | ||
104 | .base = S5PC100_GPA0(0), | ||
105 | .ngpio = S5PC100_GPIO_A0_NR, | ||
106 | .label = "GPA0", | ||
107 | }, | ||
108 | }, { | ||
109 | .chip = { | ||
110 | .base = S5PC100_GPA1(0), | ||
111 | .ngpio = S5PC100_GPIO_A1_NR, | ||
112 | .label = "GPA1", | ||
113 | }, | ||
114 | }, { | ||
115 | .chip = { | ||
116 | .base = S5PC100_GPB(0), | ||
117 | .ngpio = S5PC100_GPIO_B_NR, | ||
118 | .label = "GPB", | ||
119 | }, | ||
120 | }, { | ||
121 | .chip = { | ||
122 | .base = S5PC100_GPC(0), | ||
123 | .ngpio = S5PC100_GPIO_C_NR, | ||
124 | .label = "GPC", | ||
125 | }, | ||
126 | }, { | ||
127 | .chip = { | ||
128 | .base = S5PC100_GPD(0), | ||
129 | .ngpio = S5PC100_GPIO_D_NR, | ||
130 | .label = "GPD", | ||
131 | }, | ||
132 | }, { | ||
133 | .chip = { | ||
134 | .base = S5PC100_GPE0(0), | ||
135 | .ngpio = S5PC100_GPIO_E0_NR, | ||
136 | .label = "GPE0", | ||
137 | }, | ||
138 | }, { | ||
139 | .chip = { | ||
140 | .base = S5PC100_GPE1(0), | ||
141 | .ngpio = S5PC100_GPIO_E1_NR, | ||
142 | .label = "GPE1", | ||
143 | }, | ||
144 | }, { | ||
145 | .chip = { | ||
146 | .base = S5PC100_GPF0(0), | ||
147 | .ngpio = S5PC100_GPIO_F0_NR, | ||
148 | .label = "GPF0", | ||
149 | }, | ||
150 | }, { | ||
151 | .chip = { | ||
152 | .base = S5PC100_GPF1(0), | ||
153 | .ngpio = S5PC100_GPIO_F1_NR, | ||
154 | .label = "GPF1", | ||
155 | }, | ||
156 | }, { | ||
157 | .chip = { | ||
158 | .base = S5PC100_GPF2(0), | ||
159 | .ngpio = S5PC100_GPIO_F2_NR, | ||
160 | .label = "GPF2", | ||
161 | }, | ||
162 | }, { | ||
163 | .chip = { | ||
164 | .base = S5PC100_GPF3(0), | ||
165 | .ngpio = S5PC100_GPIO_F3_NR, | ||
166 | .label = "GPF3", | ||
167 | }, | ||
168 | }, { | ||
169 | .chip = { | ||
170 | .base = S5PC100_GPG0(0), | ||
171 | .ngpio = S5PC100_GPIO_G0_NR, | ||
172 | .label = "GPG0", | ||
173 | }, | ||
174 | }, { | ||
175 | .chip = { | ||
176 | .base = S5PC100_GPG1(0), | ||
177 | .ngpio = S5PC100_GPIO_G1_NR, | ||
178 | .label = "GPG1", | ||
179 | }, | ||
180 | }, { | ||
181 | .chip = { | ||
182 | .base = S5PC100_GPG2(0), | ||
183 | .ngpio = S5PC100_GPIO_G2_NR, | ||
184 | .label = "GPG2", | ||
185 | }, | ||
186 | }, { | ||
187 | .chip = { | ||
188 | .base = S5PC100_GPG3(0), | ||
189 | .ngpio = S5PC100_GPIO_G3_NR, | ||
190 | .label = "GPG3", | ||
191 | }, | ||
192 | }, { | ||
193 | .chip = { | ||
194 | .base = S5PC100_GPI(0), | ||
195 | .ngpio = S5PC100_GPIO_I_NR, | ||
196 | .label = "GPI", | ||
197 | }, | ||
198 | }, { | ||
199 | .chip = { | ||
200 | .base = S5PC100_GPJ0(0), | ||
201 | .ngpio = S5PC100_GPIO_J0_NR, | ||
202 | .label = "GPJ0", | ||
203 | }, | ||
204 | }, { | ||
205 | .chip = { | ||
206 | .base = S5PC100_GPJ1(0), | ||
207 | .ngpio = S5PC100_GPIO_J1_NR, | ||
208 | .label = "GPJ1", | ||
209 | }, | ||
210 | }, { | ||
211 | .chip = { | ||
212 | .base = S5PC100_GPJ2(0), | ||
213 | .ngpio = S5PC100_GPIO_J2_NR, | ||
214 | .label = "GPJ2", | ||
215 | }, | ||
216 | }, { | ||
217 | .chip = { | ||
218 | .base = S5PC100_GPJ3(0), | ||
219 | .ngpio = S5PC100_GPIO_J3_NR, | ||
220 | .label = "GPJ3", | ||
221 | }, | ||
222 | }, { | ||
223 | .chip = { | ||
224 | .base = S5PC100_GPJ4(0), | ||
225 | .ngpio = S5PC100_GPIO_J4_NR, | ||
226 | .label = "GPJ4", | ||
227 | }, | ||
228 | }, { | ||
229 | .config = &gpio_cfg_noint, | ||
230 | .chip = { | ||
231 | .base = S5PC100_GPK0(0), | ||
232 | .ngpio = S5PC100_GPIO_K0_NR, | ||
233 | .label = "GPK0", | ||
234 | }, | ||
235 | }, { | ||
236 | .config = &gpio_cfg_noint, | ||
237 | .chip = { | ||
238 | .base = S5PC100_GPK1(0), | ||
239 | .ngpio = S5PC100_GPIO_K1_NR, | ||
240 | .label = "GPK1", | ||
241 | }, | ||
242 | }, { | ||
243 | .config = &gpio_cfg_noint, | ||
244 | .chip = { | ||
245 | .base = S5PC100_GPK2(0), | ||
246 | .ngpio = S5PC100_GPIO_K2_NR, | ||
247 | .label = "GPK2", | ||
248 | }, | ||
249 | }, { | ||
250 | .config = &gpio_cfg_noint, | ||
251 | .chip = { | ||
252 | .base = S5PC100_GPK3(0), | ||
253 | .ngpio = S5PC100_GPIO_K3_NR, | ||
254 | .label = "GPK3", | ||
255 | }, | ||
256 | }, { | ||
257 | .config = &gpio_cfg_noint, | ||
258 | .chip = { | ||
259 | .base = S5PC100_GPL0(0), | ||
260 | .ngpio = S5PC100_GPIO_L0_NR, | ||
261 | .label = "GPL0", | ||
262 | }, | ||
263 | }, { | ||
264 | .config = &gpio_cfg_noint, | ||
265 | .chip = { | ||
266 | .base = S5PC100_GPL1(0), | ||
267 | .ngpio = S5PC100_GPIO_L1_NR, | ||
268 | .label = "GPL1", | ||
269 | }, | ||
270 | }, { | ||
271 | .config = &gpio_cfg_noint, | ||
272 | .chip = { | ||
273 | .base = S5PC100_GPL2(0), | ||
274 | .ngpio = S5PC100_GPIO_L2_NR, | ||
275 | .label = "GPL2", | ||
276 | }, | ||
277 | }, { | ||
278 | .config = &gpio_cfg_noint, | ||
279 | .chip = { | ||
280 | .base = S5PC100_GPL3(0), | ||
281 | .ngpio = S5PC100_GPIO_L3_NR, | ||
282 | .label = "GPL3", | ||
283 | }, | ||
284 | }, { | ||
285 | .config = &gpio_cfg_noint, | ||
286 | .chip = { | ||
287 | .base = S5PC100_GPL4(0), | ||
288 | .ngpio = S5PC100_GPIO_L4_NR, | ||
289 | .label = "GPL4", | ||
290 | }, | ||
291 | }, { | ||
292 | .base = (S5P_VA_GPIO + 0xC00), | ||
293 | .config = &gpio_cfg_eint, | ||
294 | .irq_base = IRQ_EINT(0), | ||
295 | .chip = { | ||
296 | .base = S5PC100_GPH0(0), | ||
297 | .ngpio = S5PC100_GPIO_H0_NR, | ||
298 | .label = "GPH0", | ||
299 | .to_irq = samsung_gpiolib_to_irq, | ||
300 | }, | ||
301 | }, { | ||
302 | .base = (S5P_VA_GPIO + 0xC20), | ||
303 | .config = &gpio_cfg_eint, | ||
304 | .irq_base = IRQ_EINT(8), | ||
305 | .chip = { | ||
306 | .base = S5PC100_GPH1(0), | ||
307 | .ngpio = S5PC100_GPIO_H1_NR, | ||
308 | .label = "GPH1", | ||
309 | .to_irq = samsung_gpiolib_to_irq, | ||
310 | }, | ||
311 | }, { | ||
312 | .base = (S5P_VA_GPIO + 0xC40), | ||
313 | .config = &gpio_cfg_eint, | ||
314 | .irq_base = IRQ_EINT(16), | ||
315 | .chip = { | ||
316 | .base = S5PC100_GPH2(0), | ||
317 | .ngpio = S5PC100_GPIO_H2_NR, | ||
318 | .label = "GPH2", | ||
319 | .to_irq = samsung_gpiolib_to_irq, | ||
320 | }, | ||
321 | }, { | ||
322 | .base = (S5P_VA_GPIO + 0xC60), | ||
323 | .config = &gpio_cfg_eint, | ||
324 | .irq_base = IRQ_EINT(24), | ||
325 | .chip = { | ||
326 | .base = S5PC100_GPH3(0), | ||
327 | .ngpio = S5PC100_GPIO_H3_NR, | ||
328 | .label = "GPH3", | ||
329 | .to_irq = samsung_gpiolib_to_irq, | ||
330 | }, | ||
331 | }, | ||
332 | }; | ||
333 | |||
334 | static __init int s5pc100_gpiolib_init(void) | ||
335 | { | ||
336 | struct s3c_gpio_chip *chip = s5pc100_gpio_chips; | ||
337 | int nr_chips = ARRAY_SIZE(s5pc100_gpio_chips); | ||
338 | int gpioint_group = 0; | ||
339 | int i; | ||
340 | |||
341 | for (i = 0; i < nr_chips; i++, chip++) { | ||
342 | if (chip->config == NULL) { | ||
343 | chip->config = &gpio_cfg; | ||
344 | chip->group = gpioint_group++; | ||
345 | } | ||
346 | if (chip->base == NULL) | ||
347 | chip->base = S5PC100_BANK_BASE(i); | ||
348 | } | ||
349 | |||
350 | samsung_gpiolib_add_4bit_chips(s5pc100_gpio_chips, nr_chips); | ||
351 | s5p_register_gpioint_bank(IRQ_GPIOINT, 0, S5P_GPIOINT_GROUP_MAXNR); | ||
352 | |||
353 | return 0; | ||
354 | } | ||
355 | core_initcall(s5pc100_gpiolib_init); | ||
diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile index 11f17907b4e8..50907aca006c 100644 --- a/arch/arm/mach-s5pv210/Makefile +++ b/arch/arm/mach-s5pv210/Makefile | |||
@@ -12,7 +12,7 @@ obj- := | |||
12 | 12 | ||
13 | # Core support for S5PV210 system | 13 | # Core support for S5PV210 system |
14 | 14 | ||
15 | obj-$(CONFIG_CPU_S5PV210) += cpu.o init.o clock.o dma.o gpiolib.o | 15 | obj-$(CONFIG_CPU_S5PV210) += cpu.o init.o clock.o dma.o |
16 | obj-$(CONFIG_CPU_S5PV210) += setup-i2c0.o | 16 | obj-$(CONFIG_CPU_S5PV210) += setup-i2c0.o |
17 | obj-$(CONFIG_S5PV210_PM) += pm.o sleep.o | 17 | obj-$(CONFIG_S5PV210_PM) += pm.o sleep.o |
18 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o | 18 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o |
diff --git a/arch/arm/mach-s5pv210/gpiolib.c b/arch/arm/mach-s5pv210/gpiolib.c deleted file mode 100644 index 1ba20a703e05..000000000000 --- a/arch/arm/mach-s5pv210/gpiolib.c +++ /dev/null | |||
@@ -1,288 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5pv210/gpiolib.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5PV210 - GPIOlib support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/gpio.h> | ||
17 | #include <plat/gpio-core.h> | ||
18 | #include <plat/gpio-cfg.h> | ||
19 | #include <plat/gpio-cfg-helpers.h> | ||
20 | #include <mach/map.h> | ||
21 | |||
22 | static struct s3c_gpio_cfg gpio_cfg = { | ||
23 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
24 | .set_pull = s3c_gpio_setpull_updown, | ||
25 | .get_pull = s3c_gpio_getpull_updown, | ||
26 | }; | ||
27 | |||
28 | static struct s3c_gpio_cfg gpio_cfg_noint = { | ||
29 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
30 | .set_pull = s3c_gpio_setpull_updown, | ||
31 | .get_pull = s3c_gpio_getpull_updown, | ||
32 | }; | ||
33 | |||
34 | /* GPIO bank's base address given the index of the bank in the | ||
35 | * list of all gpio banks. | ||
36 | */ | ||
37 | #define S5PV210_BANK_BASE(bank_nr) (S5P_VA_GPIO + ((bank_nr) * 0x20)) | ||
38 | |||
39 | /* | ||
40 | * Following are the gpio banks in v210. | ||
41 | * | ||
42 | * The 'config' member when left to NULL, is initialized to the default | ||
43 | * structure gpio_cfg in the init function below. | ||
44 | * | ||
45 | * The 'base' member is also initialized in the init function below. | ||
46 | * Note: The initialization of 'base' member of s3c_gpio_chip structure | ||
47 | * uses the above macro and depends on the banks being listed in order here. | ||
48 | */ | ||
49 | static struct s3c_gpio_chip s5pv210_gpio_4bit[] = { | ||
50 | { | ||
51 | .chip = { | ||
52 | .base = S5PV210_GPA0(0), | ||
53 | .ngpio = S5PV210_GPIO_A0_NR, | ||
54 | .label = "GPA0", | ||
55 | }, | ||
56 | }, { | ||
57 | .chip = { | ||
58 | .base = S5PV210_GPA1(0), | ||
59 | .ngpio = S5PV210_GPIO_A1_NR, | ||
60 | .label = "GPA1", | ||
61 | }, | ||
62 | }, { | ||
63 | .chip = { | ||
64 | .base = S5PV210_GPB(0), | ||
65 | .ngpio = S5PV210_GPIO_B_NR, | ||
66 | .label = "GPB", | ||
67 | }, | ||
68 | }, { | ||
69 | .chip = { | ||
70 | .base = S5PV210_GPC0(0), | ||
71 | .ngpio = S5PV210_GPIO_C0_NR, | ||
72 | .label = "GPC0", | ||
73 | }, | ||
74 | }, { | ||
75 | .chip = { | ||
76 | .base = S5PV210_GPC1(0), | ||
77 | .ngpio = S5PV210_GPIO_C1_NR, | ||
78 | .label = "GPC1", | ||
79 | }, | ||
80 | }, { | ||
81 | .chip = { | ||
82 | .base = S5PV210_GPD0(0), | ||
83 | .ngpio = S5PV210_GPIO_D0_NR, | ||
84 | .label = "GPD0", | ||
85 | }, | ||
86 | }, { | ||
87 | .chip = { | ||
88 | .base = S5PV210_GPD1(0), | ||
89 | .ngpio = S5PV210_GPIO_D1_NR, | ||
90 | .label = "GPD1", | ||
91 | }, | ||
92 | }, { | ||
93 | .chip = { | ||
94 | .base = S5PV210_GPE0(0), | ||
95 | .ngpio = S5PV210_GPIO_E0_NR, | ||
96 | .label = "GPE0", | ||
97 | }, | ||
98 | }, { | ||
99 | .chip = { | ||
100 | .base = S5PV210_GPE1(0), | ||
101 | .ngpio = S5PV210_GPIO_E1_NR, | ||
102 | .label = "GPE1", | ||
103 | }, | ||
104 | }, { | ||
105 | .chip = { | ||
106 | .base = S5PV210_GPF0(0), | ||
107 | .ngpio = S5PV210_GPIO_F0_NR, | ||
108 | .label = "GPF0", | ||
109 | }, | ||
110 | }, { | ||
111 | .chip = { | ||
112 | .base = S5PV210_GPF1(0), | ||
113 | .ngpio = S5PV210_GPIO_F1_NR, | ||
114 | .label = "GPF1", | ||
115 | }, | ||
116 | }, { | ||
117 | .chip = { | ||
118 | .base = S5PV210_GPF2(0), | ||
119 | .ngpio = S5PV210_GPIO_F2_NR, | ||
120 | .label = "GPF2", | ||
121 | }, | ||
122 | }, { | ||
123 | .chip = { | ||
124 | .base = S5PV210_GPF3(0), | ||
125 | .ngpio = S5PV210_GPIO_F3_NR, | ||
126 | .label = "GPF3", | ||
127 | }, | ||
128 | }, { | ||
129 | .chip = { | ||
130 | .base = S5PV210_GPG0(0), | ||
131 | .ngpio = S5PV210_GPIO_G0_NR, | ||
132 | .label = "GPG0", | ||
133 | }, | ||
134 | }, { | ||
135 | .chip = { | ||
136 | .base = S5PV210_GPG1(0), | ||
137 | .ngpio = S5PV210_GPIO_G1_NR, | ||
138 | .label = "GPG1", | ||
139 | }, | ||
140 | }, { | ||
141 | .chip = { | ||
142 | .base = S5PV210_GPG2(0), | ||
143 | .ngpio = S5PV210_GPIO_G2_NR, | ||
144 | .label = "GPG2", | ||
145 | }, | ||
146 | }, { | ||
147 | .chip = { | ||
148 | .base = S5PV210_GPG3(0), | ||
149 | .ngpio = S5PV210_GPIO_G3_NR, | ||
150 | .label = "GPG3", | ||
151 | }, | ||
152 | }, { | ||
153 | .config = &gpio_cfg_noint, | ||
154 | .chip = { | ||
155 | .base = S5PV210_GPI(0), | ||
156 | .ngpio = S5PV210_GPIO_I_NR, | ||
157 | .label = "GPI", | ||
158 | }, | ||
159 | }, { | ||
160 | .chip = { | ||
161 | .base = S5PV210_GPJ0(0), | ||
162 | .ngpio = S5PV210_GPIO_J0_NR, | ||
163 | .label = "GPJ0", | ||
164 | }, | ||
165 | }, { | ||
166 | .chip = { | ||
167 | .base = S5PV210_GPJ1(0), | ||
168 | .ngpio = S5PV210_GPIO_J1_NR, | ||
169 | .label = "GPJ1", | ||
170 | }, | ||
171 | }, { | ||
172 | .chip = { | ||
173 | .base = S5PV210_GPJ2(0), | ||
174 | .ngpio = S5PV210_GPIO_J2_NR, | ||
175 | .label = "GPJ2", | ||
176 | }, | ||
177 | }, { | ||
178 | .chip = { | ||
179 | .base = S5PV210_GPJ3(0), | ||
180 | .ngpio = S5PV210_GPIO_J3_NR, | ||
181 | .label = "GPJ3", | ||
182 | }, | ||
183 | }, { | ||
184 | .chip = { | ||
185 | .base = S5PV210_GPJ4(0), | ||
186 | .ngpio = S5PV210_GPIO_J4_NR, | ||
187 | .label = "GPJ4", | ||
188 | }, | ||
189 | }, { | ||
190 | .config = &gpio_cfg_noint, | ||
191 | .chip = { | ||
192 | .base = S5PV210_MP01(0), | ||
193 | .ngpio = S5PV210_GPIO_MP01_NR, | ||
194 | .label = "MP01", | ||
195 | }, | ||
196 | }, { | ||
197 | .config = &gpio_cfg_noint, | ||
198 | .chip = { | ||
199 | .base = S5PV210_MP02(0), | ||
200 | .ngpio = S5PV210_GPIO_MP02_NR, | ||
201 | .label = "MP02", | ||
202 | }, | ||
203 | }, { | ||
204 | .config = &gpio_cfg_noint, | ||
205 | .chip = { | ||
206 | .base = S5PV210_MP03(0), | ||
207 | .ngpio = S5PV210_GPIO_MP03_NR, | ||
208 | .label = "MP03", | ||
209 | }, | ||
210 | }, { | ||
211 | .config = &gpio_cfg_noint, | ||
212 | .chip = { | ||
213 | .base = S5PV210_MP04(0), | ||
214 | .ngpio = S5PV210_GPIO_MP04_NR, | ||
215 | .label = "MP04", | ||
216 | }, | ||
217 | }, { | ||
218 | .config = &gpio_cfg_noint, | ||
219 | .chip = { | ||
220 | .base = S5PV210_MP05(0), | ||
221 | .ngpio = S5PV210_GPIO_MP05_NR, | ||
222 | .label = "MP05", | ||
223 | }, | ||
224 | }, { | ||
225 | .base = (S5P_VA_GPIO + 0xC00), | ||
226 | .config = &gpio_cfg_noint, | ||
227 | .irq_base = IRQ_EINT(0), | ||
228 | .chip = { | ||
229 | .base = S5PV210_GPH0(0), | ||
230 | .ngpio = S5PV210_GPIO_H0_NR, | ||
231 | .label = "GPH0", | ||
232 | .to_irq = samsung_gpiolib_to_irq, | ||
233 | }, | ||
234 | }, { | ||
235 | .base = (S5P_VA_GPIO + 0xC20), | ||
236 | .config = &gpio_cfg_noint, | ||
237 | .irq_base = IRQ_EINT(8), | ||
238 | .chip = { | ||
239 | .base = S5PV210_GPH1(0), | ||
240 | .ngpio = S5PV210_GPIO_H1_NR, | ||
241 | .label = "GPH1", | ||
242 | .to_irq = samsung_gpiolib_to_irq, | ||
243 | }, | ||
244 | }, { | ||
245 | .base = (S5P_VA_GPIO + 0xC40), | ||
246 | .config = &gpio_cfg_noint, | ||
247 | .irq_base = IRQ_EINT(16), | ||
248 | .chip = { | ||
249 | .base = S5PV210_GPH2(0), | ||
250 | .ngpio = S5PV210_GPIO_H2_NR, | ||
251 | .label = "GPH2", | ||
252 | .to_irq = samsung_gpiolib_to_irq, | ||
253 | }, | ||
254 | }, { | ||
255 | .base = (S5P_VA_GPIO + 0xC60), | ||
256 | .config = &gpio_cfg_noint, | ||
257 | .irq_base = IRQ_EINT(24), | ||
258 | .chip = { | ||
259 | .base = S5PV210_GPH3(0), | ||
260 | .ngpio = S5PV210_GPIO_H3_NR, | ||
261 | .label = "GPH3", | ||
262 | .to_irq = samsung_gpiolib_to_irq, | ||
263 | }, | ||
264 | }, | ||
265 | }; | ||
266 | |||
267 | static __init int s5pv210_gpiolib_init(void) | ||
268 | { | ||
269 | struct s3c_gpio_chip *chip = s5pv210_gpio_4bit; | ||
270 | int nr_chips = ARRAY_SIZE(s5pv210_gpio_4bit); | ||
271 | int gpioint_group = 0; | ||
272 | int i = 0; | ||
273 | |||
274 | for (i = 0; i < nr_chips; i++, chip++) { | ||
275 | if (chip->config == NULL) { | ||
276 | chip->config = &gpio_cfg; | ||
277 | chip->group = gpioint_group++; | ||
278 | } | ||
279 | if (chip->base == NULL) | ||
280 | chip->base = S5PV210_BANK_BASE(i); | ||
281 | } | ||
282 | |||
283 | samsung_gpiolib_add_4bit_chips(s5pv210_gpio_4bit, nr_chips); | ||
284 | s5p_register_gpioint_bank(IRQ_GPIOINT, 0, S5P_GPIOINT_GROUP_MAXNR); | ||
285 | |||
286 | return 0; | ||
287 | } | ||
288 | core_initcall(s5pv210_gpiolib_init); | ||
diff --git a/arch/arm/mach-u300/Makefile b/arch/arm/mach-u300/Makefile index fab46fe9a71f..8fd354aaf0a7 100644 --- a/arch/arm/mach-u300/Makefile +++ b/arch/arm/mach-u300/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the linux kernel, U300 machine. | 2 | # Makefile for the linux kernel, U300 machine. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := core.o clock.o timer.o gpio.o padmux.o | 5 | obj-y := core.o clock.o timer.o padmux.o |
6 | obj-m := | 6 | obj-m := |
7 | obj-n := | 7 | obj-n := |
8 | obj- := | 8 | obj- := |
diff --git a/arch/arm/mach-u300/gpio.c b/arch/arm/mach-u300/gpio.c deleted file mode 100644 index d92790140fe5..000000000000 --- a/arch/arm/mach-u300/gpio.c +++ /dev/null | |||
@@ -1,700 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * arch/arm/mach-u300/gpio.c | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2007-2009 ST-Ericsson AB | ||
7 | * License terms: GNU General Public License (GPL) version 2 | ||
8 | * U300 GPIO module. | ||
9 | * This can driver either of the two basic GPIO cores | ||
10 | * available in the U300 platforms: | ||
11 | * COH 901 335 - Used in DB3150 (U300 1.0) and DB3200 (U330 1.0) | ||
12 | * COH 901 571/3 - Used in DB3210 (U365 2.0) and DB3350 (U335 1.0) | ||
13 | * Notice that you also have inline macros in <asm-arch/gpio.h> | ||
14 | * Author: Linus Walleij <linus.walleij@stericsson.com> | ||
15 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> | ||
16 | * | ||
17 | */ | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/errno.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/clk.h> | ||
24 | #include <linux/err.h> | ||
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/gpio.h> | ||
27 | |||
28 | /* Reference to GPIO block clock */ | ||
29 | static struct clk *clk; | ||
30 | |||
31 | /* Memory resource */ | ||
32 | static struct resource *memres; | ||
33 | static void __iomem *virtbase; | ||
34 | static struct device *gpiodev; | ||
35 | |||
36 | struct u300_gpio_port { | ||
37 | const char *name; | ||
38 | int irq; | ||
39 | int number; | ||
40 | }; | ||
41 | |||
42 | |||
43 | static struct u300_gpio_port gpio_ports[] = { | ||
44 | { | ||
45 | .name = "gpio0", | ||
46 | .number = 0, | ||
47 | }, | ||
48 | { | ||
49 | .name = "gpio1", | ||
50 | .number = 1, | ||
51 | }, | ||
52 | { | ||
53 | .name = "gpio2", | ||
54 | .number = 2, | ||
55 | }, | ||
56 | #ifdef U300_COH901571_3 | ||
57 | { | ||
58 | .name = "gpio3", | ||
59 | .number = 3, | ||
60 | }, | ||
61 | { | ||
62 | .name = "gpio4", | ||
63 | .number = 4, | ||
64 | }, | ||
65 | #ifdef CONFIG_MACH_U300_BS335 | ||
66 | { | ||
67 | .name = "gpio5", | ||
68 | .number = 5, | ||
69 | }, | ||
70 | { | ||
71 | .name = "gpio6", | ||
72 | .number = 6, | ||
73 | }, | ||
74 | #endif | ||
75 | #endif | ||
76 | |||
77 | }; | ||
78 | |||
79 | |||
80 | #ifdef U300_COH901571_3 | ||
81 | |||
82 | /* Default input value */ | ||
83 | #define DEFAULT_OUTPUT_LOW 0 | ||
84 | #define DEFAULT_OUTPUT_HIGH 1 | ||
85 | |||
86 | /* GPIO Pull-Up status */ | ||
87 | #define DISABLE_PULL_UP 0 | ||
88 | #define ENABLE_PULL_UP 1 | ||
89 | |||
90 | #define GPIO_NOT_USED 0 | ||
91 | #define GPIO_IN 1 | ||
92 | #define GPIO_OUT 2 | ||
93 | |||
94 | struct u300_gpio_configuration_data { | ||
95 | unsigned char pin_usage; | ||
96 | unsigned char default_output_value; | ||
97 | unsigned char pull_up; | ||
98 | }; | ||
99 | |||
100 | /* Initial configuration */ | ||
101 | const struct u300_gpio_configuration_data | ||
102 | u300_gpio_config[U300_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { | ||
103 | #ifdef CONFIG_MACH_U300_BS335 | ||
104 | /* Port 0, pins 0-7 */ | ||
105 | { | ||
106 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
107 | {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP}, | ||
108 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
109 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
110 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
111 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
112 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
113 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
114 | }, | ||
115 | /* Port 1, pins 0-7 */ | ||
116 | { | ||
117 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
118 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
119 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
120 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
121 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
122 | {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP}, | ||
123 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
124 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
125 | }, | ||
126 | /* Port 2, pins 0-7 */ | ||
127 | { | ||
128 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
129 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
130 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
131 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
132 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
133 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
134 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
135 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} | ||
136 | }, | ||
137 | /* Port 3, pins 0-7 */ | ||
138 | { | ||
139 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
140 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
141 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
142 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
143 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
144 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
145 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
146 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
147 | }, | ||
148 | /* Port 4, pins 0-7 */ | ||
149 | { | ||
150 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
151 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
152 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
153 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
154 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
155 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
156 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
157 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
158 | }, | ||
159 | /* Port 5, pins 0-7 */ | ||
160 | { | ||
161 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
162 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
163 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
164 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
165 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
166 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
167 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
168 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
169 | }, | ||
170 | /* Port 6, pind 0-7 */ | ||
171 | { | ||
172 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
173 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
174 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
175 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
176 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
177 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
178 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
179 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
180 | } | ||
181 | #endif | ||
182 | |||
183 | #ifdef CONFIG_MACH_U300_BS365 | ||
184 | /* Port 0, pins 0-7 */ | ||
185 | { | ||
186 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
187 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
188 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
189 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
190 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
191 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
192 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
193 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
194 | }, | ||
195 | /* Port 1, pins 0-7 */ | ||
196 | { | ||
197 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
198 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
199 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
200 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
201 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
202 | {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP}, | ||
203 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
204 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} | ||
205 | }, | ||
206 | /* Port 2, pins 0-7 */ | ||
207 | { | ||
208 | {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
209 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
210 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
211 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, | ||
212 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
213 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
214 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
215 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} | ||
216 | }, | ||
217 | /* Port 3, pins 0-7 */ | ||
218 | { | ||
219 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
220 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
221 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
222 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
223 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
224 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
225 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
226 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} | ||
227 | }, | ||
228 | /* Port 4, pins 0-7 */ | ||
229 | { | ||
230 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
231 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
232 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
233 | {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
234 | /* These 4 pins doesn't exist on DB3210 */ | ||
235 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
236 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
237 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, | ||
238 | {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} | ||
239 | } | ||
240 | #endif | ||
241 | }; | ||
242 | #endif | ||
243 | |||
244 | |||
245 | /* No users == we can power down GPIO */ | ||
246 | static int gpio_users; | ||
247 | |||
248 | struct gpio_struct { | ||
249 | int (*callback)(void *); | ||
250 | void *data; | ||
251 | int users; | ||
252 | }; | ||
253 | |||
254 | static struct gpio_struct gpio_pin[U300_GPIO_MAX]; | ||
255 | |||
256 | /* | ||
257 | * Let drivers register callback in order to get notified when there is | ||
258 | * an interrupt on the gpio pin | ||
259 | */ | ||
260 | int gpio_register_callback(unsigned gpio, int (*func)(void *arg), void *data) | ||
261 | { | ||
262 | if (gpio_pin[gpio].callback) | ||
263 | dev_warn(gpiodev, "%s: WARNING: callback already " | ||
264 | "registered for gpio pin#%d\n", __func__, gpio); | ||
265 | gpio_pin[gpio].callback = func; | ||
266 | gpio_pin[gpio].data = data; | ||
267 | |||
268 | return 0; | ||
269 | } | ||
270 | EXPORT_SYMBOL(gpio_register_callback); | ||
271 | |||
272 | int gpio_unregister_callback(unsigned gpio) | ||
273 | { | ||
274 | if (!gpio_pin[gpio].callback) | ||
275 | dev_warn(gpiodev, "%s: WARNING: callback already " | ||
276 | "unregistered for gpio pin#%d\n", __func__, gpio); | ||
277 | gpio_pin[gpio].callback = NULL; | ||
278 | gpio_pin[gpio].data = NULL; | ||
279 | |||
280 | return 0; | ||
281 | } | ||
282 | EXPORT_SYMBOL(gpio_unregister_callback); | ||
283 | |||
284 | /* Non-zero means valid */ | ||
285 | int gpio_is_valid(int number) | ||
286 | { | ||
287 | if (number >= 0 && | ||
288 | number < (U300_GPIO_NUM_PORTS * U300_GPIO_PINS_PER_PORT)) | ||
289 | return 1; | ||
290 | return 0; | ||
291 | } | ||
292 | EXPORT_SYMBOL(gpio_is_valid); | ||
293 | |||
294 | int gpio_request(unsigned gpio, const char *label) | ||
295 | { | ||
296 | if (gpio_pin[gpio].users) | ||
297 | return -EINVAL; | ||
298 | else | ||
299 | gpio_pin[gpio].users++; | ||
300 | |||
301 | gpio_users++; | ||
302 | |||
303 | return 0; | ||
304 | } | ||
305 | EXPORT_SYMBOL(gpio_request); | ||
306 | |||
307 | void gpio_free(unsigned gpio) | ||
308 | { | ||
309 | gpio_users--; | ||
310 | gpio_pin[gpio].users--; | ||
311 | if (unlikely(gpio_pin[gpio].users < 0)) { | ||
312 | dev_warn(gpiodev, "warning: gpio#%d release mismatch\n", | ||
313 | gpio); | ||
314 | gpio_pin[gpio].users = 0; | ||
315 | } | ||
316 | |||
317 | return; | ||
318 | } | ||
319 | EXPORT_SYMBOL(gpio_free); | ||
320 | |||
321 | /* This returns zero or nonzero */ | ||
322 | int gpio_get_value(unsigned gpio) | ||
323 | { | ||
324 | return readl(virtbase + U300_GPIO_PXPDIR + | ||
325 | PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) & (1 << (gpio & 0x07)); | ||
326 | } | ||
327 | EXPORT_SYMBOL(gpio_get_value); | ||
328 | |||
329 | /* | ||
330 | * We hope that the compiler will optimize away the unused branch | ||
331 | * in case "value" is a constant | ||
332 | */ | ||
333 | void gpio_set_value(unsigned gpio, int value) | ||
334 | { | ||
335 | u32 val; | ||
336 | unsigned long flags; | ||
337 | |||
338 | local_irq_save(flags); | ||
339 | if (value) { | ||
340 | /* set */ | ||
341 | val = readl(virtbase + U300_GPIO_PXPDOR + | ||
342 | PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) | ||
343 | & (1 << (gpio & 0x07)); | ||
344 | writel(val | (1 << (gpio & 0x07)), virtbase + | ||
345 | U300_GPIO_PXPDOR + | ||
346 | PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); | ||
347 | } else { | ||
348 | /* clear */ | ||
349 | val = readl(virtbase + U300_GPIO_PXPDOR + | ||
350 | PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) | ||
351 | & (1 << (gpio & 0x07)); | ||
352 | writel(val & ~(1 << (gpio & 0x07)), virtbase + | ||
353 | U300_GPIO_PXPDOR + | ||
354 | PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); | ||
355 | } | ||
356 | local_irq_restore(flags); | ||
357 | } | ||
358 | EXPORT_SYMBOL(gpio_set_value); | ||
359 | |||
360 | int gpio_direction_input(unsigned gpio) | ||
361 | { | ||
362 | unsigned long flags; | ||
363 | u32 val; | ||
364 | |||
365 | if (gpio > U300_GPIO_MAX) | ||
366 | return -EINVAL; | ||
367 | |||
368 | local_irq_save(flags); | ||
369 | val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * | ||
370 | U300_GPIO_PORTX_SPACING); | ||
371 | /* Mask out this pin*/ | ||
372 | val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1)); | ||
373 | /* This is not needed since it sets the bits to zero.*/ | ||
374 | /* val |= (U300_GPIO_PXPCR_PIN_MODE_INPUT << (gpio*2)); */ | ||
375 | writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * | ||
376 | U300_GPIO_PORTX_SPACING); | ||
377 | local_irq_restore(flags); | ||
378 | return 0; | ||
379 | } | ||
380 | EXPORT_SYMBOL(gpio_direction_input); | ||
381 | |||
382 | int gpio_direction_output(unsigned gpio, int value) | ||
383 | { | ||
384 | unsigned long flags; | ||
385 | u32 val; | ||
386 | |||
387 | if (gpio > U300_GPIO_MAX) | ||
388 | return -EINVAL; | ||
389 | |||
390 | local_irq_save(flags); | ||
391 | val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * | ||
392 | U300_GPIO_PORTX_SPACING); | ||
393 | /* Mask out this pin */ | ||
394 | val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1)); | ||
395 | /* | ||
396 | * FIXME: configure for push/pull, open drain or open source per pin | ||
397 | * in setup. The current driver will only support push/pull. | ||
398 | */ | ||
399 | val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL | ||
400 | << ((gpio & 0x07) << 1)); | ||
401 | writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * | ||
402 | U300_GPIO_PORTX_SPACING); | ||
403 | gpio_set_value(gpio, value); | ||
404 | local_irq_restore(flags); | ||
405 | return 0; | ||
406 | } | ||
407 | EXPORT_SYMBOL(gpio_direction_output); | ||
408 | |||
409 | /* | ||
410 | * Enable an IRQ, edge is rising edge (!= 0) or falling edge (==0). | ||
411 | */ | ||
412 | void enable_irq_on_gpio_pin(unsigned gpio, int edge) | ||
413 | { | ||
414 | u32 val; | ||
415 | unsigned long flags; | ||
416 | local_irq_save(flags); | ||
417 | |||
418 | val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * | ||
419 | U300_GPIO_PORTX_SPACING); | ||
420 | val |= (1 << (gpio & 0x07)); | ||
421 | writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * | ||
422 | U300_GPIO_PORTX_SPACING); | ||
423 | val = readl(virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) * | ||
424 | U300_GPIO_PORTX_SPACING); | ||
425 | if (edge) | ||
426 | val |= (1 << (gpio & 0x07)); | ||
427 | else | ||
428 | val &= ~(1 << (gpio & 0x07)); | ||
429 | writel(val, virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) * | ||
430 | U300_GPIO_PORTX_SPACING); | ||
431 | local_irq_restore(flags); | ||
432 | } | ||
433 | EXPORT_SYMBOL(enable_irq_on_gpio_pin); | ||
434 | |||
435 | void disable_irq_on_gpio_pin(unsigned gpio) | ||
436 | { | ||
437 | u32 val; | ||
438 | unsigned long flags; | ||
439 | |||
440 | local_irq_save(flags); | ||
441 | val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * | ||
442 | U300_GPIO_PORTX_SPACING); | ||
443 | val &= ~(1 << (gpio & 0x07)); | ||
444 | writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * | ||
445 | U300_GPIO_PORTX_SPACING); | ||
446 | local_irq_restore(flags); | ||
447 | } | ||
448 | EXPORT_SYMBOL(disable_irq_on_gpio_pin); | ||
449 | |||
450 | /* Enable (value == 0) or disable (value == 1) internal pullup */ | ||
451 | void gpio_pullup(unsigned gpio, int value) | ||
452 | { | ||
453 | u32 val; | ||
454 | unsigned long flags; | ||
455 | |||
456 | local_irq_save(flags); | ||
457 | if (value) { | ||
458 | val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) * | ||
459 | U300_GPIO_PORTX_SPACING); | ||
460 | writel(val | (1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER + | ||
461 | PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); | ||
462 | } else { | ||
463 | val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) * | ||
464 | U300_GPIO_PORTX_SPACING); | ||
465 | writel(val & ~(1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER + | ||
466 | PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); | ||
467 | } | ||
468 | local_irq_restore(flags); | ||
469 | } | ||
470 | EXPORT_SYMBOL(gpio_pullup); | ||
471 | |||
472 | static irqreturn_t gpio_irq_handler(int irq, void *dev_id) | ||
473 | { | ||
474 | struct u300_gpio_port *port = dev_id; | ||
475 | u32 val; | ||
476 | int pin; | ||
477 | |||
478 | /* Read event register */ | ||
479 | val = readl(virtbase + U300_GPIO_PXIEV + port->number * | ||
480 | U300_GPIO_PORTX_SPACING); | ||
481 | /* Mask with enable register */ | ||
482 | val &= readl(virtbase + U300_GPIO_PXIEV + port->number * | ||
483 | U300_GPIO_PORTX_SPACING); | ||
484 | /* Mask relevant bits */ | ||
485 | val &= U300_GPIO_PXIEV_ALL_IRQ_EVENT_MASK; | ||
486 | /* ACK IRQ (clear event) */ | ||
487 | writel(val, virtbase + U300_GPIO_PXIEV + port->number * | ||
488 | U300_GPIO_PORTX_SPACING); | ||
489 | /* Print message */ | ||
490 | while (val != 0) { | ||
491 | unsigned gpio; | ||
492 | |||
493 | pin = __ffs(val); | ||
494 | /* mask off this pin */ | ||
495 | val &= ~(1 << pin); | ||
496 | gpio = (port->number << 3) + pin; | ||
497 | |||
498 | if (gpio_pin[gpio].callback) | ||
499 | (void)gpio_pin[gpio].callback(gpio_pin[gpio].data); | ||
500 | else | ||
501 | dev_dbg(gpiodev, "stray GPIO IRQ on line %d\n", | ||
502 | gpio); | ||
503 | } | ||
504 | return IRQ_HANDLED; | ||
505 | } | ||
506 | |||
507 | static void gpio_set_initial_values(void) | ||
508 | { | ||
509 | #ifdef U300_COH901571_3 | ||
510 | int i, j; | ||
511 | unsigned long flags; | ||
512 | u32 val; | ||
513 | |||
514 | /* Write default values to all pins */ | ||
515 | for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { | ||
516 | val = 0; | ||
517 | for (j = 0; j < 8; j++) | ||
518 | val |= (u32) (u300_gpio_config[i][j].default_output_value != DEFAULT_OUTPUT_LOW) << j; | ||
519 | local_irq_save(flags); | ||
520 | writel(val, virtbase + U300_GPIO_PXPDOR + i * U300_GPIO_PORTX_SPACING); | ||
521 | local_irq_restore(flags); | ||
522 | } | ||
523 | |||
524 | /* | ||
525 | * Put all pins that are set to either 'GPIO_OUT' or 'GPIO_NOT_USED' | ||
526 | * to output and 'GPIO_IN' to input for each port. And initialize | ||
527 | * default value on outputs. | ||
528 | */ | ||
529 | for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { | ||
530 | for (j = 0; j < U300_GPIO_PINS_PER_PORT; j++) { | ||
531 | local_irq_save(flags); | ||
532 | val = readl(virtbase + U300_GPIO_PXPCR + | ||
533 | i * U300_GPIO_PORTX_SPACING); | ||
534 | /* Mask out this pin */ | ||
535 | val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << (j << 1)); | ||
536 | |||
537 | if (u300_gpio_config[i][j].pin_usage != GPIO_IN) | ||
538 | val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL << (j << 1)); | ||
539 | writel(val, virtbase + U300_GPIO_PXPCR + | ||
540 | i * U300_GPIO_PORTX_SPACING); | ||
541 | local_irq_restore(flags); | ||
542 | } | ||
543 | } | ||
544 | |||
545 | /* Enable or disable the internal pull-ups in the GPIO ASIC block */ | ||
546 | for (i = 0; i < U300_GPIO_MAX; i++) { | ||
547 | val = 0; | ||
548 | for (j = 0; j < 8; j++) | ||
549 | val |= (u32)((u300_gpio_config[i][j].pull_up == DISABLE_PULL_UP) << j); | ||
550 | local_irq_save(flags); | ||
551 | writel(val, virtbase + U300_GPIO_PXPER + i * U300_GPIO_PORTX_SPACING); | ||
552 | local_irq_restore(flags); | ||
553 | } | ||
554 | #endif | ||
555 | } | ||
556 | |||
557 | static int __init gpio_probe(struct platform_device *pdev) | ||
558 | { | ||
559 | u32 val; | ||
560 | int err = 0; | ||
561 | int i; | ||
562 | int num_irqs; | ||
563 | |||
564 | gpiodev = &pdev->dev; | ||
565 | memset(gpio_pin, 0, sizeof(gpio_pin)); | ||
566 | |||
567 | /* Get GPIO clock */ | ||
568 | clk = clk_get(&pdev->dev, NULL); | ||
569 | if (IS_ERR(clk)) { | ||
570 | err = PTR_ERR(clk); | ||
571 | dev_err(gpiodev, "could not get GPIO clock\n"); | ||
572 | goto err_no_clk; | ||
573 | } | ||
574 | err = clk_enable(clk); | ||
575 | if (err) { | ||
576 | dev_err(gpiodev, "could not enable GPIO clock\n"); | ||
577 | goto err_no_clk_enable; | ||
578 | } | ||
579 | |||
580 | memres = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
581 | if (!memres) | ||
582 | goto err_no_resource; | ||
583 | |||
584 | if (request_mem_region(memres->start, memres->end - memres->start, "GPIO Controller") | ||
585 | == NULL) { | ||
586 | err = -ENODEV; | ||
587 | goto err_no_ioregion; | ||
588 | } | ||
589 | |||
590 | virtbase = ioremap(memres->start, resource_size(memres)); | ||
591 | if (!virtbase) { | ||
592 | err = -ENOMEM; | ||
593 | goto err_no_ioremap; | ||
594 | } | ||
595 | dev_info(gpiodev, "remapped 0x%08x to %p\n", | ||
596 | memres->start, virtbase); | ||
597 | |||
598 | #ifdef U300_COH901335 | ||
599 | dev_info(gpiodev, "initializing GPIO Controller COH 901 335\n"); | ||
600 | /* Turn on the GPIO block */ | ||
601 | writel(U300_GPIO_CR_BLOCK_CLOCK_ENABLE, virtbase + U300_GPIO_CR); | ||
602 | #endif | ||
603 | |||
604 | #ifdef U300_COH901571_3 | ||
605 | dev_info(gpiodev, "initializing GPIO Controller COH 901 571/3\n"); | ||
606 | val = readl(virtbase + U300_GPIO_CR); | ||
607 | dev_info(gpiodev, "COH901571/3 block version: %d, " \ | ||
608 | "number of cores: %d\n", | ||
609 | ((val & 0x0000FE00) >> 9), | ||
610 | ((val & 0x000001FC) >> 2)); | ||
611 | writel(U300_GPIO_CR_BLOCK_CLKRQ_ENABLE, virtbase + U300_GPIO_CR); | ||
612 | #endif | ||
613 | |||
614 | gpio_set_initial_values(); | ||
615 | |||
616 | for (num_irqs = 0 ; num_irqs < U300_GPIO_NUM_PORTS; num_irqs++) { | ||
617 | |||
618 | gpio_ports[num_irqs].irq = | ||
619 | platform_get_irq_byname(pdev, | ||
620 | gpio_ports[num_irqs].name); | ||
621 | |||
622 | err = request_irq(gpio_ports[num_irqs].irq, | ||
623 | gpio_irq_handler, IRQF_DISABLED, | ||
624 | gpio_ports[num_irqs].name, | ||
625 | &gpio_ports[num_irqs]); | ||
626 | if (err) { | ||
627 | dev_err(gpiodev, "cannot allocate IRQ for %s!\n", | ||
628 | gpio_ports[num_irqs].name); | ||
629 | goto err_no_irq; | ||
630 | } | ||
631 | /* Turns off PortX_irq_force */ | ||
632 | writel(0x0, virtbase + U300_GPIO_PXIFR + | ||
633 | num_irqs * U300_GPIO_PORTX_SPACING); | ||
634 | } | ||
635 | |||
636 | return 0; | ||
637 | |||
638 | err_no_irq: | ||
639 | for (i = 0; i < num_irqs; i++) | ||
640 | free_irq(gpio_ports[i].irq, &gpio_ports[i]); | ||
641 | iounmap(virtbase); | ||
642 | err_no_ioremap: | ||
643 | release_mem_region(memres->start, memres->end - memres->start); | ||
644 | err_no_ioregion: | ||
645 | err_no_resource: | ||
646 | clk_disable(clk); | ||
647 | err_no_clk_enable: | ||
648 | clk_put(clk); | ||
649 | err_no_clk: | ||
650 | dev_info(gpiodev, "module ERROR:%d\n", err); | ||
651 | return err; | ||
652 | } | ||
653 | |||
654 | static int __exit gpio_remove(struct platform_device *pdev) | ||
655 | { | ||
656 | int i; | ||
657 | |||
658 | /* Turn off the GPIO block */ | ||
659 | writel(0x00000000U, virtbase + U300_GPIO_CR); | ||
660 | for (i = 0 ; i < U300_GPIO_NUM_PORTS; i++) | ||
661 | free_irq(gpio_ports[i].irq, &gpio_ports[i]); | ||
662 | iounmap(virtbase); | ||
663 | release_mem_region(memres->start, memres->end - memres->start); | ||
664 | clk_disable(clk); | ||
665 | clk_put(clk); | ||
666 | return 0; | ||
667 | } | ||
668 | |||
669 | static struct platform_driver gpio_driver = { | ||
670 | .driver = { | ||
671 | .name = "u300-gpio", | ||
672 | }, | ||
673 | .remove = __exit_p(gpio_remove), | ||
674 | }; | ||
675 | |||
676 | |||
677 | static int __init u300_gpio_init(void) | ||
678 | { | ||
679 | return platform_driver_probe(&gpio_driver, gpio_probe); | ||
680 | } | ||
681 | |||
682 | static void __exit u300_gpio_exit(void) | ||
683 | { | ||
684 | platform_driver_unregister(&gpio_driver); | ||
685 | } | ||
686 | |||
687 | arch_initcall(u300_gpio_init); | ||
688 | module_exit(u300_gpio_exit); | ||
689 | |||
690 | MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>"); | ||
691 | |||
692 | #ifdef U300_COH901571_3 | ||
693 | MODULE_DESCRIPTION("ST-Ericsson AB COH 901 571/3 GPIO driver"); | ||
694 | #endif | ||
695 | |||
696 | #ifdef U300_COH901335 | ||
697 | MODULE_DESCRIPTION("ST-Ericsson AB COH 901 335 GPIO driver"); | ||
698 | #endif | ||
699 | |||
700 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 54429d015954..f8b9392ee347 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
@@ -5,7 +5,6 @@ config UX500_SOC_COMMON | |||
5 | default y | 5 | default y |
6 | select ARM_GIC | 6 | select ARM_GIC |
7 | select HAS_MTU | 7 | select HAS_MTU |
8 | select NOMADIK_GPIO | ||
9 | select ARM_ERRATA_753970 | 8 | select ARM_ERRATA_753970 |
10 | 9 | ||
11 | menu "Ux500 SoC" | 10 | menu "Ux500 SoC" |
diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index bf0b02414e5b..7c6cb4fa47a9 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c | |||
@@ -99,8 +99,11 @@ static void sdi0_configure(void) | |||
99 | gpio_direction_output(sdi0_vsel, 0); | 99 | gpio_direction_output(sdi0_vsel, 0); |
100 | gpio_direction_output(sdi0_en, 1); | 100 | gpio_direction_output(sdi0_en, 1); |
101 | 101 | ||
102 | /* Add the device */ | 102 | /* Add the device, force v2 to subrevision 1 */ |
103 | db8500_add_sdi0(&mop500_sdi0_data); | 103 | if (cpu_is_u8500v2()) |
104 | db8500_add_sdi0(&mop500_sdi0_data, 0x10480180); | ||
105 | else | ||
106 | db8500_add_sdi0(&mop500_sdi0_data, 0); | ||
104 | } | 107 | } |
105 | 108 | ||
106 | void mop500_sdi_tc35892_init(void) | 109 | void mop500_sdi_tc35892_init(void) |
@@ -188,13 +191,18 @@ static struct mmci_platform_data mop500_sdi4_data = { | |||
188 | 191 | ||
189 | void __init mop500_sdi_init(void) | 192 | void __init mop500_sdi_init(void) |
190 | { | 193 | { |
194 | u32 periphid = 0; | ||
195 | |||
196 | /* v2 has a new version of this block that need to be forced */ | ||
197 | if (cpu_is_u8500v2()) | ||
198 | periphid = 0x10480180; | ||
191 | /* PoP:ed eMMC on top of DB8500 v1.0 has problems with high speed */ | 199 | /* PoP:ed eMMC on top of DB8500 v1.0 has problems with high speed */ |
192 | if (!cpu_is_u8500v10()) | 200 | if (!cpu_is_u8500v10()) |
193 | mop500_sdi2_data.capabilities |= MMC_CAP_MMC_HIGHSPEED; | 201 | mop500_sdi2_data.capabilities |= MMC_CAP_MMC_HIGHSPEED; |
194 | db8500_add_sdi2(&mop500_sdi2_data); | 202 | db8500_add_sdi2(&mop500_sdi2_data, periphid); |
195 | 203 | ||
196 | /* On-board eMMC */ | 204 | /* On-board eMMC */ |
197 | db8500_add_sdi4(&mop500_sdi4_data); | 205 | db8500_add_sdi4(&mop500_sdi4_data, periphid); |
198 | 206 | ||
199 | if (machine_is_hrefv60()) { | 207 | if (machine_is_hrefv60()) { |
200 | mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO; | 208 | mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO; |
diff --git a/arch/arm/mach-ux500/devices-common.h b/arch/arm/mach-ux500/devices-common.h index c719b5a1d913..7825705033bf 100644 --- a/arch/arm/mach-ux500/devices-common.h +++ b/arch/arm/mach-ux500/devices-common.h | |||
@@ -28,18 +28,20 @@ dbx500_add_msp_spi(const char *name, resource_size_t base, int irq, | |||
28 | 28 | ||
29 | static inline struct amba_device * | 29 | static inline struct amba_device * |
30 | dbx500_add_spi(const char *name, resource_size_t base, int irq, | 30 | dbx500_add_spi(const char *name, resource_size_t base, int irq, |
31 | struct spi_master_cntlr *pdata) | 31 | struct spi_master_cntlr *pdata, |
32 | u32 periphid) | ||
32 | { | 33 | { |
33 | return dbx500_add_amba_device(name, base, irq, pdata, 0); | 34 | return dbx500_add_amba_device(name, base, irq, pdata, periphid); |
34 | } | 35 | } |
35 | 36 | ||
36 | struct mmci_platform_data; | 37 | struct mmci_platform_data; |
37 | 38 | ||
38 | static inline struct amba_device * | 39 | static inline struct amba_device * |
39 | dbx500_add_sdi(const char *name, resource_size_t base, int irq, | 40 | dbx500_add_sdi(const char *name, resource_size_t base, int irq, |
40 | struct mmci_platform_data *pdata) | 41 | struct mmci_platform_data *pdata, |
42 | u32 periphid) | ||
41 | { | 43 | { |
42 | return dbx500_add_amba_device(name, base, irq, pdata, 0); | 44 | return dbx500_add_amba_device(name, base, irq, pdata, periphid); |
43 | } | 45 | } |
44 | 46 | ||
45 | struct amba_pl011_data; | 47 | struct amba_pl011_data; |
diff --git a/arch/arm/mach-ux500/devices-db5500.h b/arch/arm/mach-ux500/devices-db5500.h index 94627f7783b0..0c4bccd02b90 100644 --- a/arch/arm/mach-ux500/devices-db5500.h +++ b/arch/arm/mach-ux500/devices-db5500.h | |||
@@ -38,24 +38,34 @@ | |||
38 | ux500_add_usb(U5500_USBOTG_BASE, IRQ_DB5500_USBOTG, rx_cfg, tx_cfg) | 38 | ux500_add_usb(U5500_USBOTG_BASE, IRQ_DB5500_USBOTG, rx_cfg, tx_cfg) |
39 | 39 | ||
40 | #define db5500_add_sdi0(pdata) \ | 40 | #define db5500_add_sdi0(pdata) \ |
41 | dbx500_add_sdi("sdi0", U5500_SDI0_BASE, IRQ_DB5500_SDMMC0, pdata) | 41 | dbx500_add_sdi("sdi0", U5500_SDI0_BASE, IRQ_DB5500_SDMMC0, pdata, \ |
42 | 0x10480180) | ||
42 | #define db5500_add_sdi1(pdata) \ | 43 | #define db5500_add_sdi1(pdata) \ |
43 | dbx500_add_sdi("sdi1", U5500_SDI1_BASE, IRQ_DB5500_SDMMC1, pdata) | 44 | dbx500_add_sdi("sdi1", U5500_SDI1_BASE, IRQ_DB5500_SDMMC1, pdata, \ |
45 | 0x10480180) | ||
44 | #define db5500_add_sdi2(pdata) \ | 46 | #define db5500_add_sdi2(pdata) \ |
45 | dbx500_add_sdi("sdi2", U5500_SDI2_BASE, IRQ_DB5500_SDMMC2, pdata) | 47 | dbx500_add_sdi("sdi2", U5500_SDI2_BASE, IRQ_DB5500_SDMMC2, pdata \ |
48 | 0x10480180) | ||
46 | #define db5500_add_sdi3(pdata) \ | 49 | #define db5500_add_sdi3(pdata) \ |
47 | dbx500_add_sdi("sdi3", U5500_SDI3_BASE, IRQ_DB5500_SDMMC3, pdata) | 50 | dbx500_add_sdi("sdi3", U5500_SDI3_BASE, IRQ_DB5500_SDMMC3, pdata \ |
51 | 0x10480180) | ||
48 | #define db5500_add_sdi4(pdata) \ | 52 | #define db5500_add_sdi4(pdata) \ |
49 | dbx500_add_sdi("sdi4", U5500_SDI4_BASE, IRQ_DB5500_SDMMC4, pdata) | 53 | dbx500_add_sdi("sdi4", U5500_SDI4_BASE, IRQ_DB5500_SDMMC4, pdata \ |
54 | 0x10480180) | ||
50 | 55 | ||
56 | /* This one has a bad peripheral ID in the U5500 silicon */ | ||
51 | #define db5500_add_spi0(pdata) \ | 57 | #define db5500_add_spi0(pdata) \ |
52 | dbx500_add_spi("spi0", U5500_SPI0_BASE, IRQ_DB5500_SPI0, pdata) | 58 | dbx500_add_spi("spi0", U5500_SPI0_BASE, IRQ_DB5500_SPI0, pdata, \ |
59 | 0x10080023) | ||
53 | #define db5500_add_spi1(pdata) \ | 60 | #define db5500_add_spi1(pdata) \ |
54 | dbx500_add_spi("spi1", U5500_SPI1_BASE, IRQ_DB5500_SPI1, pdata) | 61 | dbx500_add_spi("spi1", U5500_SPI1_BASE, IRQ_DB5500_SPI1, pdata, \ |
62 | 0x10080023) | ||
55 | #define db5500_add_spi2(pdata) \ | 63 | #define db5500_add_spi2(pdata) \ |
56 | dbx500_add_spi("spi2", U5500_SPI2_BASE, IRQ_DB5500_SPI2, pdata) | 64 | dbx500_add_spi("spi2", U5500_SPI2_BASE, IRQ_DB5500_SPI2, pdata \ |
65 | 0x10080023) | ||
57 | #define db5500_add_spi3(pdata) \ | 66 | #define db5500_add_spi3(pdata) \ |
58 | dbx500_add_spi("spi3", U5500_SPI3_BASE, IRQ_DB5500_SPI3, pdata) | 67 | dbx500_add_spi("spi3", U5500_SPI3_BASE, IRQ_DB5500_SPI3, pdata \ |
68 | 0x10080023) | ||
59 | 69 | ||
60 | #define db5500_add_uart0(plat) \ | 70 | #define db5500_add_uart0(plat) \ |
61 | dbx500_add_uart("uart0", U5500_UART0_BASE, IRQ_DB5500_UART0, plat) | 71 | dbx500_add_uart("uart0", U5500_UART0_BASE, IRQ_DB5500_UART0, plat) |
diff --git a/arch/arm/mach-ux500/devices-db8500.h b/arch/arm/mach-ux500/devices-db8500.h index 9cc6f8f5d3e6..cbd4a9ae8109 100644 --- a/arch/arm/mach-ux500/devices-db8500.h +++ b/arch/arm/mach-ux500/devices-db8500.h | |||
@@ -25,7 +25,7 @@ static inline struct amba_device * | |||
25 | db8500_add_ssp(const char *name, resource_size_t base, int irq, | 25 | db8500_add_ssp(const char *name, resource_size_t base, int irq, |
26 | struct pl022_ssp_controller *pdata) | 26 | struct pl022_ssp_controller *pdata) |
27 | { | 27 | { |
28 | return dbx500_add_amba_device(name, base, irq, pdata, SSP_PER_ID); | 28 | return dbx500_add_amba_device(name, base, irq, pdata, 0); |
29 | } | 29 | } |
30 | 30 | ||
31 | 31 | ||
@@ -64,18 +64,18 @@ db8500_add_ssp(const char *name, resource_size_t base, int irq, | |||
64 | #define db8500_add_usb(rx_cfg, tx_cfg) \ | 64 | #define db8500_add_usb(rx_cfg, tx_cfg) \ |
65 | ux500_add_usb(U8500_USBOTG_BASE, IRQ_DB8500_USBOTG, rx_cfg, tx_cfg) | 65 | ux500_add_usb(U8500_USBOTG_BASE, IRQ_DB8500_USBOTG, rx_cfg, tx_cfg) |
66 | 66 | ||
67 | #define db8500_add_sdi0(pdata) \ | 67 | #define db8500_add_sdi0(pdata, pid) \ |
68 | dbx500_add_sdi("sdi0", U8500_SDI0_BASE, IRQ_DB8500_SDMMC0, pdata) | 68 | dbx500_add_sdi("sdi0", U8500_SDI0_BASE, IRQ_DB8500_SDMMC0, pdata, pid) |
69 | #define db8500_add_sdi1(pdata) \ | 69 | #define db8500_add_sdi1(pdata, pid) \ |
70 | dbx500_add_sdi("sdi1", U8500_SDI1_BASE, IRQ_DB8500_SDMMC1, pdata) | 70 | dbx500_add_sdi("sdi1", U8500_SDI1_BASE, IRQ_DB8500_SDMMC1, pdata, pid) |
71 | #define db8500_add_sdi2(pdata) \ | 71 | #define db8500_add_sdi2(pdata, pid) \ |
72 | dbx500_add_sdi("sdi2", U8500_SDI2_BASE, IRQ_DB8500_SDMMC2, pdata) | 72 | dbx500_add_sdi("sdi2", U8500_SDI2_BASE, IRQ_DB8500_SDMMC2, pdata, pid) |
73 | #define db8500_add_sdi3(pdata) \ | 73 | #define db8500_add_sdi3(pdata, pid) \ |
74 | dbx500_add_sdi("sdi3", U8500_SDI3_BASE, IRQ_DB8500_SDMMC3, pdata) | 74 | dbx500_add_sdi("sdi3", U8500_SDI3_BASE, IRQ_DB8500_SDMMC3, pdata, pid) |
75 | #define db8500_add_sdi4(pdata) \ | 75 | #define db8500_add_sdi4(pdata, pid) \ |
76 | dbx500_add_sdi("sdi4", U8500_SDI4_BASE, IRQ_DB8500_SDMMC4, pdata) | 76 | dbx500_add_sdi("sdi4", U8500_SDI4_BASE, IRQ_DB8500_SDMMC4, pdata, pid) |
77 | #define db8500_add_sdi5(pdata) \ | 77 | #define db8500_add_sdi5(pdata, pid) \ |
78 | dbx500_add_sdi("sdi5", U8500_SDI5_BASE, IRQ_DB8500_SDMMC5, pdata) | 78 | dbx500_add_sdi("sdi5", U8500_SDI5_BASE, IRQ_DB8500_SDMMC5, pdata, pid) |
79 | 79 | ||
80 | #define db8500_add_ssp0(pdata) \ | 80 | #define db8500_add_ssp0(pdata) \ |
81 | db8500_add_ssp("ssp0", U8500_SSP0_BASE, IRQ_DB8500_SSP0, pdata) | 81 | db8500_add_ssp("ssp0", U8500_SSP0_BASE, IRQ_DB8500_SSP0, pdata) |
@@ -83,13 +83,13 @@ db8500_add_ssp(const char *name, resource_size_t base, int irq, | |||
83 | db8500_add_ssp("ssp1", U8500_SSP1_BASE, IRQ_DB8500_SSP1, pdata) | 83 | db8500_add_ssp("ssp1", U8500_SSP1_BASE, IRQ_DB8500_SSP1, pdata) |
84 | 84 | ||
85 | #define db8500_add_spi0(pdata) \ | 85 | #define db8500_add_spi0(pdata) \ |
86 | dbx500_add_spi("spi0", U8500_SPI0_BASE, IRQ_DB8500_SPI0, pdata) | 86 | dbx500_add_spi("spi0", U8500_SPI0_BASE, IRQ_DB8500_SPI0, pdata, 0) |
87 | #define db8500_add_spi1(pdata) \ | 87 | #define db8500_add_spi1(pdata) \ |
88 | dbx500_add_spi("spi1", U8500_SPI1_BASE, IRQ_DB8500_SPI1, pdata) | 88 | dbx500_add_spi("spi1", U8500_SPI1_BASE, IRQ_DB8500_SPI1, pdata, 0) |
89 | #define db8500_add_spi2(pdata) \ | 89 | #define db8500_add_spi2(pdata) \ |
90 | dbx500_add_spi("spi2", U8500_SPI2_BASE, IRQ_DB8500_SPI2, pdata) | 90 | dbx500_add_spi("spi2", U8500_SPI2_BASE, IRQ_DB8500_SPI2, pdata, 0) |
91 | #define db8500_add_spi3(pdata) \ | 91 | #define db8500_add_spi3(pdata) \ |
92 | dbx500_add_spi("spi3", U8500_SPI3_BASE, IRQ_DB8500_SPI3, pdata) | 92 | dbx500_add_spi("spi3", U8500_SPI3_BASE, IRQ_DB8500_SPI3, pdata, 0) |
93 | 93 | ||
94 | #define db8500_add_uart0(pdata) \ | 94 | #define db8500_add_uart0(pdata) \ |
95 | dbx500_add_uart("uart0", U8500_UART0_BASE, IRQ_DB8500_UART0, pdata) | 95 | dbx500_add_uart("uart0", U8500_UART0_BASE, IRQ_DB8500_UART0, pdata) |
diff --git a/arch/arm/mach-ux500/include/mach/hardware.h b/arch/arm/mach-ux500/include/mach/hardware.h index 2c6f71049f2e..470ac52663d6 100644 --- a/arch/arm/mach-ux500/include/mach/hardware.h +++ b/arch/arm/mach-ux500/include/mach/hardware.h | |||
@@ -29,9 +29,6 @@ | |||
29 | #include <mach/db8500-regs.h> | 29 | #include <mach/db8500-regs.h> |
30 | #include <mach/db5500-regs.h> | 30 | #include <mach/db5500-regs.h> |
31 | 31 | ||
32 | /* ST-Ericsson modified pl022 id */ | ||
33 | #define SSP_PER_ID 0x01080022 | ||
34 | |||
35 | #ifndef __ASSEMBLY__ | 32 | #ifndef __ASSEMBLY__ |
36 | 33 | ||
37 | #include <mach/id.h> | 34 | #include <mach/id.h> |
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S index c96fa1b3f49f..73b4a8b66a57 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S | |||
@@ -176,6 +176,7 @@ ENDPROC(v6_coherent_kern_range) | |||
176 | */ | 176 | */ |
177 | ENTRY(v6_flush_kern_dcache_area) | 177 | ENTRY(v6_flush_kern_dcache_area) |
178 | add r1, r0, r1 | 178 | add r1, r0, r1 |
179 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | ||
179 | 1: | 180 | 1: |
180 | #ifdef HARVARD_CACHE | 181 | #ifdef HARVARD_CACHE |
181 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line | 182 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index dc18d81ef8ce..d32f02b61866 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
@@ -221,6 +221,8 @@ ENDPROC(v7_coherent_user_range) | |||
221 | ENTRY(v7_flush_kern_dcache_area) | 221 | ENTRY(v7_flush_kern_dcache_area) |
222 | dcache_line_size r2, r3 | 222 | dcache_line_size r2, r3 |
223 | add r1, r0, r1 | 223 | add r1, r0, r1 |
224 | sub r3, r2, #1 | ||
225 | bic r0, r0, r3 | ||
224 | 1: | 226 | 1: |
225 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line | 227 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line |
226 | add r0, r0, r2 | 228 | add r0, r0, r2 |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index b0ee9ba3cfab..8bfae964b133 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
@@ -24,9 +24,7 @@ DEFINE_PER_CPU(struct mm_struct *, current_mm); | |||
24 | 24 | ||
25 | /* | 25 | /* |
26 | * We fork()ed a process, and we need a new context for the child | 26 | * We fork()ed a process, and we need a new context for the child |
27 | * to run in. We reserve version 0 for initial tasks so we will | 27 | * to run in. |
28 | * always allocate an ASID. The ASID 0 is reserved for the TTBR | ||
29 | * register changing sequence. | ||
30 | */ | 28 | */ |
31 | void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) | 29 | void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) |
32 | { | 30 | { |
@@ -36,8 +34,11 @@ void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) | |||
36 | 34 | ||
37 | static void flush_context(void) | 35 | static void flush_context(void) |
38 | { | 36 | { |
39 | /* set the reserved ASID before flushing the TLB */ | 37 | u32 ttb; |
40 | asm("mcr p15, 0, %0, c13, c0, 1\n" : : "r" (0)); | 38 | /* Copy TTBR1 into TTBR0 */ |
39 | asm volatile("mrc p15, 0, %0, c2, c0, 1\n" | ||
40 | "mcr p15, 0, %0, c2, c0, 0" | ||
41 | : "=r" (ttb)); | ||
41 | isb(); | 42 | isb(); |
42 | local_flush_tlb_all(); | 43 | local_flush_tlb_all(); |
43 | if (icache_is_vivt_asid_tagged()) { | 44 | if (icache_is_vivt_asid_tagged()) { |
@@ -93,7 +94,7 @@ static void reset_context(void *info) | |||
93 | return; | 94 | return; |
94 | 95 | ||
95 | smp_rmb(); | 96 | smp_rmb(); |
96 | asid = cpu_last_asid + cpu + 1; | 97 | asid = cpu_last_asid + cpu; |
97 | 98 | ||
98 | flush_context(); | 99 | flush_context(); |
99 | set_mm_context(mm, asid); | 100 | set_mm_context(mm, asid); |
@@ -143,13 +144,13 @@ void __new_context(struct mm_struct *mm) | |||
143 | * to start a new version and flush the TLB. | 144 | * to start a new version and flush the TLB. |
144 | */ | 145 | */ |
145 | if (unlikely((asid & ~ASID_MASK) == 0)) { | 146 | if (unlikely((asid & ~ASID_MASK) == 0)) { |
146 | asid = cpu_last_asid + smp_processor_id() + 1; | 147 | asid = cpu_last_asid + smp_processor_id(); |
147 | flush_context(); | 148 | flush_context(); |
148 | #ifdef CONFIG_SMP | 149 | #ifdef CONFIG_SMP |
149 | smp_wmb(); | 150 | smp_wmb(); |
150 | smp_call_function(reset_context, NULL, 1); | 151 | smp_call_function(reset_context, NULL, 1); |
151 | #endif | 152 | #endif |
152 | cpu_last_asid += NR_CPUS; | 153 | cpu_last_asid += NR_CPUS - 1; |
153 | } | 154 | } |
154 | 155 | ||
155 | set_mm_context(mm, asid); | 156 | set_mm_context(mm, asid); |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 3f17ea146f0e..2c2cce9cd8c8 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -15,12 +15,14 @@ | |||
15 | #include <linux/mman.h> | 15 | #include <linux/mman.h> |
16 | #include <linux/nodemask.h> | 16 | #include <linux/nodemask.h> |
17 | #include <linux/initrd.h> | 17 | #include <linux/initrd.h> |
18 | #include <linux/of_fdt.h> | ||
18 | #include <linux/highmem.h> | 19 | #include <linux/highmem.h> |
19 | #include <linux/gfp.h> | 20 | #include <linux/gfp.h> |
20 | #include <linux/memblock.h> | 21 | #include <linux/memblock.h> |
21 | #include <linux/sort.h> | 22 | #include <linux/sort.h> |
22 | 23 | ||
23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
25 | #include <asm/prom.h> | ||
24 | #include <asm/sections.h> | 26 | #include <asm/sections.h> |
25 | #include <asm/setup.h> | 27 | #include <asm/setup.h> |
26 | #include <asm/sizes.h> | 28 | #include <asm/sizes.h> |
@@ -71,6 +73,14 @@ static int __init parse_tag_initrd2(const struct tag *tag) | |||
71 | 73 | ||
72 | __tagtable(ATAG_INITRD2, parse_tag_initrd2); | 74 | __tagtable(ATAG_INITRD2, parse_tag_initrd2); |
73 | 75 | ||
76 | #ifdef CONFIG_OF_FLATTREE | ||
77 | void __init early_init_dt_setup_initrd_arch(unsigned long start, unsigned long end) | ||
78 | { | ||
79 | phys_initrd_start = start; | ||
80 | phys_initrd_size = end - start; | ||
81 | } | ||
82 | #endif /* CONFIG_OF_FLATTREE */ | ||
83 | |||
74 | /* | 84 | /* |
75 | * This keeps memory configuration data used by a couple memory | 85 | * This keeps memory configuration data used by a couple memory |
76 | * initialization functions, as well as show_mem() for the skipping | 86 | * initialization functions, as well as show_mem() for the skipping |
@@ -273,13 +283,15 @@ static void __init arm_bootmem_free(unsigned long min, unsigned long max_low, | |||
273 | free_area_init_node(0, zone_size, min, zhole_size); | 283 | free_area_init_node(0, zone_size, min, zhole_size); |
274 | } | 284 | } |
275 | 285 | ||
276 | #ifndef CONFIG_SPARSEMEM | 286 | #ifdef CONFIG_HAVE_ARCH_PFN_VALID |
277 | int pfn_valid(unsigned long pfn) | 287 | int pfn_valid(unsigned long pfn) |
278 | { | 288 | { |
279 | return memblock_is_memory(pfn << PAGE_SHIFT); | 289 | return memblock_is_memory(pfn << PAGE_SHIFT); |
280 | } | 290 | } |
281 | EXPORT_SYMBOL(pfn_valid); | 291 | EXPORT_SYMBOL(pfn_valid); |
292 | #endif | ||
282 | 293 | ||
294 | #ifndef CONFIG_SPARSEMEM | ||
283 | static void arm_memory_present(void) | 295 | static void arm_memory_present(void) |
284 | { | 296 | { |
285 | } | 297 | } |
@@ -334,6 +346,7 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) | |||
334 | #endif | 346 | #endif |
335 | 347 | ||
336 | arm_mm_memblock_reserve(); | 348 | arm_mm_memblock_reserve(); |
349 | arm_dt_memblock_reserve(); | ||
337 | 350 | ||
338 | /* reserve any platform specific memblock areas */ | 351 | /* reserve any platform specific memblock areas */ |
339 | if (mdesc->reserve) | 352 | if (mdesc->reserve) |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index d2384106af9c..5b3d7d543659 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
@@ -5,14 +5,9 @@ extern pmd_t *top_pmd; | |||
5 | 5 | ||
6 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) | 6 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) |
7 | 7 | ||
8 | static inline pmd_t *pmd_off(pgd_t *pgd, unsigned long virt) | ||
9 | { | ||
10 | return pmd_offset(pud_offset(pgd, virt), virt); | ||
11 | } | ||
12 | |||
13 | static inline pmd_t *pmd_off_k(unsigned long virt) | 8 | static inline pmd_t *pmd_off_k(unsigned long virt) |
14 | { | 9 | { |
15 | return pmd_off(pgd_offset_k(virt), virt); | 10 | return pmd_offset(pud_offset(pgd_offset_k(virt), virt), virt); |
16 | } | 11 | } |
17 | 12 | ||
18 | struct mem_type { | 13 | struct mem_type { |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 08a92368d9d3..9d9e736c2b4f 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -763,15 +763,12 @@ static void __init sanity_check_meminfo(void) | |||
763 | { | 763 | { |
764 | int i, j, highmem = 0; | 764 | int i, j, highmem = 0; |
765 | 765 | ||
766 | lowmem_limit = __pa(vmalloc_min - 1) + 1; | ||
767 | memblock_set_current_limit(lowmem_limit); | ||
768 | |||
769 | for (i = 0, j = 0; i < meminfo.nr_banks; i++) { | 766 | for (i = 0, j = 0; i < meminfo.nr_banks; i++) { |
770 | struct membank *bank = &meminfo.bank[j]; | 767 | struct membank *bank = &meminfo.bank[j]; |
771 | *bank = meminfo.bank[i]; | 768 | *bank = meminfo.bank[i]; |
772 | 769 | ||
773 | #ifdef CONFIG_HIGHMEM | 770 | #ifdef CONFIG_HIGHMEM |
774 | if (__va(bank->start) > vmalloc_min || | 771 | if (__va(bank->start) >= vmalloc_min || |
775 | __va(bank->start) < (void *)PAGE_OFFSET) | 772 | __va(bank->start) < (void *)PAGE_OFFSET) |
776 | highmem = 1; | 773 | highmem = 1; |
777 | 774 | ||
@@ -829,6 +826,9 @@ static void __init sanity_check_meminfo(void) | |||
829 | bank->size = newsize; | 826 | bank->size = newsize; |
830 | } | 827 | } |
831 | #endif | 828 | #endif |
829 | if (!bank->highmem && bank->start + bank->size > lowmem_limit) | ||
830 | lowmem_limit = bank->start + bank->size; | ||
831 | |||
832 | j++; | 832 | j++; |
833 | } | 833 | } |
834 | #ifdef CONFIG_HIGHMEM | 834 | #ifdef CONFIG_HIGHMEM |
@@ -852,6 +852,7 @@ static void __init sanity_check_meminfo(void) | |||
852 | } | 852 | } |
853 | #endif | 853 | #endif |
854 | meminfo.nr_banks = j; | 854 | meminfo.nr_banks = j; |
855 | memblock_set_current_limit(lowmem_limit); | ||
855 | } | 856 | } |
856 | 857 | ||
857 | static inline void prepare_page_table(void) | 858 | static inline void prepare_page_table(void) |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index ab17cc0d3fa7..1d2b8451bf25 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -213,7 +213,9 @@ __v6_setup: | |||
213 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register | 213 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register |
214 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) | 214 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) |
215 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) | 215 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) |
216 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 | 216 | ALT_SMP(orr r8, r8, #TTB_FLAGS_SMP) |
217 | ALT_UP(orr r8, r8, #TTB_FLAGS_UP) | ||
218 | mcr p15, 0, r8, c2, c0, 1 @ load TTB1 | ||
217 | #endif /* CONFIG_MMU */ | 219 | #endif /* CONFIG_MMU */ |
218 | adr r5, v6_crval | 220 | adr r5, v6_crval |
219 | ldmia r5, {r5, r6} | 221 | ldmia r5, {r5, r6} |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index babfba09c89f..b3b566ec83d3 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -108,18 +108,16 @@ ENTRY(cpu_v7_switch_mm) | |||
108 | #ifdef CONFIG_ARM_ERRATA_430973 | 108 | #ifdef CONFIG_ARM_ERRATA_430973 |
109 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | 109 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB |
110 | #endif | 110 | #endif |
111 | #ifdef CONFIG_ARM_ERRATA_754322 | 111 | mrc p15, 0, r2, c2, c0, 1 @ load TTB 1 |
112 | dsb | 112 | mcr p15, 0, r2, c2, c0, 0 @ into TTB 0 |
113 | #endif | ||
114 | mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID | ||
115 | isb | ||
116 | 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | ||
117 | isb | 113 | isb |
118 | #ifdef CONFIG_ARM_ERRATA_754322 | 114 | #ifdef CONFIG_ARM_ERRATA_754322 |
119 | dsb | 115 | dsb |
120 | #endif | 116 | #endif |
121 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | 117 | mcr p15, 0, r1, c13, c0, 1 @ set context ID |
122 | isb | 118 | isb |
119 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | ||
120 | isb | ||
123 | #endif | 121 | #endif |
124 | mov pc, lr | 122 | mov pc, lr |
125 | ENDPROC(cpu_v7_switch_mm) | 123 | ENDPROC(cpu_v7_switch_mm) |
@@ -368,7 +366,9 @@ __v7_setup: | |||
368 | mcr p15, 0, r10, c2, c0, 2 @ TTB control register | 366 | mcr p15, 0, r10, c2, c0, 2 @ TTB control register |
369 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) | 367 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) |
370 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) | 368 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) |
371 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 | 369 | ALT_SMP(orr r8, r8, #TTB_FLAGS_SMP) |
370 | ALT_UP(orr r8, r8, #TTB_FLAGS_UP) | ||
371 | mcr p15, 0, r8, c2, c0, 1 @ load TTB1 | ||
372 | ldr r5, =PRRR @ PRRR | 372 | ldr r5, =PRRR @ PRRR |
373 | ldr r6, =NMRR @ NMRR | 373 | ldr r6, =NMRR @ NMRR |
374 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR | 374 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR |
diff --git a/arch/arm/plat-nomadik/Kconfig b/arch/arm/plat-nomadik/Kconfig index 18296ee68802..ce659015535e 100644 --- a/arch/arm/plat-nomadik/Kconfig +++ b/arch/arm/plat-nomadik/Kconfig | |||
@@ -21,9 +21,4 @@ config HAS_MTU | |||
21 | to multiple interrupt generating programmable | 21 | to multiple interrupt generating programmable |
22 | 32-bit free running decrementing counters. | 22 | 32-bit free running decrementing counters. |
23 | 23 | ||
24 | config NOMADIK_GPIO | ||
25 | bool | ||
26 | help | ||
27 | Support for the Nomadik GPIO controller. | ||
28 | |||
29 | endif | 24 | endif |
diff --git a/arch/arm/plat-nomadik/Makefile b/arch/arm/plat-nomadik/Makefile index c33547361bd7..37c7cdd0f8f0 100644 --- a/arch/arm/plat-nomadik/Makefile +++ b/arch/arm/plat-nomadik/Makefile | |||
@@ -3,4 +3,3 @@ | |||
3 | # Licensed under GPLv2 | 3 | # Licensed under GPLv2 |
4 | 4 | ||
5 | obj-$(CONFIG_HAS_MTU) += timer.o | 5 | obj-$(CONFIG_HAS_MTU) += timer.o |
6 | obj-$(CONFIG_NOMADIK_GPIO) += gpio.o | ||
diff --git a/arch/arm/plat-nomadik/gpio.c b/arch/arm/plat-nomadik/gpio.c deleted file mode 100644 index 307b8131aa8c..000000000000 --- a/arch/arm/plat-nomadik/gpio.c +++ /dev/null | |||
@@ -1,1020 +0,0 @@ | |||
1 | /* | ||
2 | * Generic GPIO driver for logic cells found in the Nomadik SoC | ||
3 | * | ||
4 | * Copyright (C) 2008,2009 STMicroelectronics | ||
5 | * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it> | ||
6 | * Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/device.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/clk.h> | ||
19 | #include <linux/err.h> | ||
20 | #include <linux/gpio.h> | ||
21 | #include <linux/spinlock.h> | ||
22 | #include <linux/interrupt.h> | ||
23 | #include <linux/irq.h> | ||
24 | #include <linux/slab.h> | ||
25 | |||
26 | #include <asm/mach/irq.h> | ||
27 | |||
28 | #include <plat/pincfg.h> | ||
29 | #include <mach/hardware.h> | ||
30 | #include <mach/gpio.h> | ||
31 | |||
32 | /* | ||
33 | * The GPIO module in the Nomadik family of Systems-on-Chip is an | ||
34 | * AMBA device, managing 32 pins and alternate functions. The logic block | ||
35 | * is currently used in the Nomadik and ux500. | ||
36 | * | ||
37 | * Symbols in this file are called "nmk_gpio" for "nomadik gpio" | ||
38 | */ | ||
39 | |||
40 | #define NMK_GPIO_PER_CHIP 32 | ||
41 | |||
42 | struct nmk_gpio_chip { | ||
43 | struct gpio_chip chip; | ||
44 | void __iomem *addr; | ||
45 | struct clk *clk; | ||
46 | unsigned int bank; | ||
47 | unsigned int parent_irq; | ||
48 | int secondary_parent_irq; | ||
49 | u32 (*get_secondary_status)(unsigned int bank); | ||
50 | void (*set_ioforce)(bool enable); | ||
51 | spinlock_t lock; | ||
52 | /* Keep track of configured edges */ | ||
53 | u32 edge_rising; | ||
54 | u32 edge_falling; | ||
55 | u32 real_wake; | ||
56 | u32 rwimsc; | ||
57 | u32 fwimsc; | ||
58 | u32 slpm; | ||
59 | u32 enabled; | ||
60 | }; | ||
61 | |||
62 | static struct nmk_gpio_chip * | ||
63 | nmk_gpio_chips[DIV_ROUND_UP(ARCH_NR_GPIOS, NMK_GPIO_PER_CHIP)]; | ||
64 | |||
65 | static DEFINE_SPINLOCK(nmk_gpio_slpm_lock); | ||
66 | |||
67 | #define NUM_BANKS ARRAY_SIZE(nmk_gpio_chips) | ||
68 | |||
69 | static void __nmk_gpio_set_mode(struct nmk_gpio_chip *nmk_chip, | ||
70 | unsigned offset, int gpio_mode) | ||
71 | { | ||
72 | u32 bit = 1 << offset; | ||
73 | u32 afunc, bfunc; | ||
74 | |||
75 | afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & ~bit; | ||
76 | bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & ~bit; | ||
77 | if (gpio_mode & NMK_GPIO_ALT_A) | ||
78 | afunc |= bit; | ||
79 | if (gpio_mode & NMK_GPIO_ALT_B) | ||
80 | bfunc |= bit; | ||
81 | writel(afunc, nmk_chip->addr + NMK_GPIO_AFSLA); | ||
82 | writel(bfunc, nmk_chip->addr + NMK_GPIO_AFSLB); | ||
83 | } | ||
84 | |||
85 | static void __nmk_gpio_set_slpm(struct nmk_gpio_chip *nmk_chip, | ||
86 | unsigned offset, enum nmk_gpio_slpm mode) | ||
87 | { | ||
88 | u32 bit = 1 << offset; | ||
89 | u32 slpm; | ||
90 | |||
91 | slpm = readl(nmk_chip->addr + NMK_GPIO_SLPC); | ||
92 | if (mode == NMK_GPIO_SLPM_NOCHANGE) | ||
93 | slpm |= bit; | ||
94 | else | ||
95 | slpm &= ~bit; | ||
96 | writel(slpm, nmk_chip->addr + NMK_GPIO_SLPC); | ||
97 | } | ||
98 | |||
99 | static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip, | ||
100 | unsigned offset, enum nmk_gpio_pull pull) | ||
101 | { | ||
102 | u32 bit = 1 << offset; | ||
103 | u32 pdis; | ||
104 | |||
105 | pdis = readl(nmk_chip->addr + NMK_GPIO_PDIS); | ||
106 | if (pull == NMK_GPIO_PULL_NONE) | ||
107 | pdis |= bit; | ||
108 | else | ||
109 | pdis &= ~bit; | ||
110 | writel(pdis, nmk_chip->addr + NMK_GPIO_PDIS); | ||
111 | |||
112 | if (pull == NMK_GPIO_PULL_UP) | ||
113 | writel(bit, nmk_chip->addr + NMK_GPIO_DATS); | ||
114 | else if (pull == NMK_GPIO_PULL_DOWN) | ||
115 | writel(bit, nmk_chip->addr + NMK_GPIO_DATC); | ||
116 | } | ||
117 | |||
118 | static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip, | ||
119 | unsigned offset) | ||
120 | { | ||
121 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC); | ||
122 | } | ||
123 | |||
124 | static void __nmk_gpio_set_output(struct nmk_gpio_chip *nmk_chip, | ||
125 | unsigned offset, int val) | ||
126 | { | ||
127 | if (val) | ||
128 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATS); | ||
129 | else | ||
130 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATC); | ||
131 | } | ||
132 | |||
133 | static void __nmk_gpio_make_output(struct nmk_gpio_chip *nmk_chip, | ||
134 | unsigned offset, int val) | ||
135 | { | ||
136 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRS); | ||
137 | __nmk_gpio_set_output(nmk_chip, offset, val); | ||
138 | } | ||
139 | |||
140 | static void __nmk_gpio_set_mode_safe(struct nmk_gpio_chip *nmk_chip, | ||
141 | unsigned offset, int gpio_mode, | ||
142 | bool glitch) | ||
143 | { | ||
144 | u32 rwimsc = readl(nmk_chip->addr + NMK_GPIO_RWIMSC); | ||
145 | u32 fwimsc = readl(nmk_chip->addr + NMK_GPIO_FWIMSC); | ||
146 | |||
147 | if (glitch && nmk_chip->set_ioforce) { | ||
148 | u32 bit = BIT(offset); | ||
149 | |||
150 | /* Prevent spurious wakeups */ | ||
151 | writel(rwimsc & ~bit, nmk_chip->addr + NMK_GPIO_RWIMSC); | ||
152 | writel(fwimsc & ~bit, nmk_chip->addr + NMK_GPIO_FWIMSC); | ||
153 | |||
154 | nmk_chip->set_ioforce(true); | ||
155 | } | ||
156 | |||
157 | __nmk_gpio_set_mode(nmk_chip, offset, gpio_mode); | ||
158 | |||
159 | if (glitch && nmk_chip->set_ioforce) { | ||
160 | nmk_chip->set_ioforce(false); | ||
161 | |||
162 | writel(rwimsc, nmk_chip->addr + NMK_GPIO_RWIMSC); | ||
163 | writel(fwimsc, nmk_chip->addr + NMK_GPIO_FWIMSC); | ||
164 | } | ||
165 | } | ||
166 | |||
167 | static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset, | ||
168 | pin_cfg_t cfg, bool sleep, unsigned int *slpmregs) | ||
169 | { | ||
170 | static const char *afnames[] = { | ||
171 | [NMK_GPIO_ALT_GPIO] = "GPIO", | ||
172 | [NMK_GPIO_ALT_A] = "A", | ||
173 | [NMK_GPIO_ALT_B] = "B", | ||
174 | [NMK_GPIO_ALT_C] = "C" | ||
175 | }; | ||
176 | static const char *pullnames[] = { | ||
177 | [NMK_GPIO_PULL_NONE] = "none", | ||
178 | [NMK_GPIO_PULL_UP] = "up", | ||
179 | [NMK_GPIO_PULL_DOWN] = "down", | ||
180 | [3] /* illegal */ = "??" | ||
181 | }; | ||
182 | static const char *slpmnames[] = { | ||
183 | [NMK_GPIO_SLPM_INPUT] = "input/wakeup", | ||
184 | [NMK_GPIO_SLPM_NOCHANGE] = "no-change/no-wakeup", | ||
185 | }; | ||
186 | |||
187 | int pin = PIN_NUM(cfg); | ||
188 | int pull = PIN_PULL(cfg); | ||
189 | int af = PIN_ALT(cfg); | ||
190 | int slpm = PIN_SLPM(cfg); | ||
191 | int output = PIN_DIR(cfg); | ||
192 | int val = PIN_VAL(cfg); | ||
193 | bool glitch = af == NMK_GPIO_ALT_C; | ||
194 | |||
195 | dev_dbg(nmk_chip->chip.dev, "pin %d [%#lx]: af %s, pull %s, slpm %s (%s%s)\n", | ||
196 | pin, cfg, afnames[af], pullnames[pull], slpmnames[slpm], | ||
197 | output ? "output " : "input", | ||
198 | output ? (val ? "high" : "low") : ""); | ||
199 | |||
200 | if (sleep) { | ||
201 | int slpm_pull = PIN_SLPM_PULL(cfg); | ||
202 | int slpm_output = PIN_SLPM_DIR(cfg); | ||
203 | int slpm_val = PIN_SLPM_VAL(cfg); | ||
204 | |||
205 | af = NMK_GPIO_ALT_GPIO; | ||
206 | |||
207 | /* | ||
208 | * The SLPM_* values are normal values + 1 to allow zero to | ||
209 | * mean "same as normal". | ||
210 | */ | ||
211 | if (slpm_pull) | ||
212 | pull = slpm_pull - 1; | ||
213 | if (slpm_output) | ||
214 | output = slpm_output - 1; | ||
215 | if (slpm_val) | ||
216 | val = slpm_val - 1; | ||
217 | |||
218 | dev_dbg(nmk_chip->chip.dev, "pin %d: sleep pull %s, dir %s, val %s\n", | ||
219 | pin, | ||
220 | slpm_pull ? pullnames[pull] : "same", | ||
221 | slpm_output ? (output ? "output" : "input") : "same", | ||
222 | slpm_val ? (val ? "high" : "low") : "same"); | ||
223 | } | ||
224 | |||
225 | if (output) | ||
226 | __nmk_gpio_make_output(nmk_chip, offset, val); | ||
227 | else { | ||
228 | __nmk_gpio_make_input(nmk_chip, offset); | ||
229 | __nmk_gpio_set_pull(nmk_chip, offset, pull); | ||
230 | } | ||
231 | |||
232 | /* | ||
233 | * If we've backed up the SLPM registers (glitch workaround), modify | ||
234 | * the backups since they will be restored. | ||
235 | */ | ||
236 | if (slpmregs) { | ||
237 | if (slpm == NMK_GPIO_SLPM_NOCHANGE) | ||
238 | slpmregs[nmk_chip->bank] |= BIT(offset); | ||
239 | else | ||
240 | slpmregs[nmk_chip->bank] &= ~BIT(offset); | ||
241 | } else | ||
242 | __nmk_gpio_set_slpm(nmk_chip, offset, slpm); | ||
243 | |||
244 | __nmk_gpio_set_mode_safe(nmk_chip, offset, af, glitch); | ||
245 | } | ||
246 | |||
247 | /* | ||
248 | * Safe sequence used to switch IOs between GPIO and Alternate-C mode: | ||
249 | * - Save SLPM registers | ||
250 | * - Set SLPM=0 for the IOs you want to switch and others to 1 | ||
251 | * - Configure the GPIO registers for the IOs that are being switched | ||
252 | * - Set IOFORCE=1 | ||
253 | * - Modify the AFLSA/B registers for the IOs that are being switched | ||
254 | * - Set IOFORCE=0 | ||
255 | * - Restore SLPM registers | ||
256 | * - Any spurious wake up event during switch sequence to be ignored and | ||
257 | * cleared | ||
258 | */ | ||
259 | static void nmk_gpio_glitch_slpm_init(unsigned int *slpm) | ||
260 | { | ||
261 | int i; | ||
262 | |||
263 | for (i = 0; i < NUM_BANKS; i++) { | ||
264 | struct nmk_gpio_chip *chip = nmk_gpio_chips[i]; | ||
265 | unsigned int temp = slpm[i]; | ||
266 | |||
267 | if (!chip) | ||
268 | break; | ||
269 | |||
270 | slpm[i] = readl(chip->addr + NMK_GPIO_SLPC); | ||
271 | writel(temp, chip->addr + NMK_GPIO_SLPC); | ||
272 | } | ||
273 | } | ||
274 | |||
275 | static void nmk_gpio_glitch_slpm_restore(unsigned int *slpm) | ||
276 | { | ||
277 | int i; | ||
278 | |||
279 | for (i = 0; i < NUM_BANKS; i++) { | ||
280 | struct nmk_gpio_chip *chip = nmk_gpio_chips[i]; | ||
281 | |||
282 | if (!chip) | ||
283 | break; | ||
284 | |||
285 | writel(slpm[i], chip->addr + NMK_GPIO_SLPC); | ||
286 | } | ||
287 | } | ||
288 | |||
289 | static int __nmk_config_pins(pin_cfg_t *cfgs, int num, bool sleep) | ||
290 | { | ||
291 | static unsigned int slpm[NUM_BANKS]; | ||
292 | unsigned long flags; | ||
293 | bool glitch = false; | ||
294 | int ret = 0; | ||
295 | int i; | ||
296 | |||
297 | for (i = 0; i < num; i++) { | ||
298 | if (PIN_ALT(cfgs[i]) == NMK_GPIO_ALT_C) { | ||
299 | glitch = true; | ||
300 | break; | ||
301 | } | ||
302 | } | ||
303 | |||
304 | spin_lock_irqsave(&nmk_gpio_slpm_lock, flags); | ||
305 | |||
306 | if (glitch) { | ||
307 | memset(slpm, 0xff, sizeof(slpm)); | ||
308 | |||
309 | for (i = 0; i < num; i++) { | ||
310 | int pin = PIN_NUM(cfgs[i]); | ||
311 | int offset = pin % NMK_GPIO_PER_CHIP; | ||
312 | |||
313 | if (PIN_ALT(cfgs[i]) == NMK_GPIO_ALT_C) | ||
314 | slpm[pin / NMK_GPIO_PER_CHIP] &= ~BIT(offset); | ||
315 | } | ||
316 | |||
317 | nmk_gpio_glitch_slpm_init(slpm); | ||
318 | } | ||
319 | |||
320 | for (i = 0; i < num; i++) { | ||
321 | struct nmk_gpio_chip *nmk_chip; | ||
322 | int pin = PIN_NUM(cfgs[i]); | ||
323 | |||
324 | nmk_chip = irq_get_chip_data(NOMADIK_GPIO_TO_IRQ(pin)); | ||
325 | if (!nmk_chip) { | ||
326 | ret = -EINVAL; | ||
327 | break; | ||
328 | } | ||
329 | |||
330 | spin_lock(&nmk_chip->lock); | ||
331 | __nmk_config_pin(nmk_chip, pin - nmk_chip->chip.base, | ||
332 | cfgs[i], sleep, glitch ? slpm : NULL); | ||
333 | spin_unlock(&nmk_chip->lock); | ||
334 | } | ||
335 | |||
336 | if (glitch) | ||
337 | nmk_gpio_glitch_slpm_restore(slpm); | ||
338 | |||
339 | spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags); | ||
340 | |||
341 | return ret; | ||
342 | } | ||
343 | |||
344 | /** | ||
345 | * nmk_config_pin - configure a pin's mux attributes | ||
346 | * @cfg: pin confguration | ||
347 | * | ||
348 | * Configures a pin's mode (alternate function or GPIO), its pull up status, | ||
349 | * and its sleep mode based on the specified configuration. The @cfg is | ||
350 | * usually one of the SoC specific macros defined in mach/<soc>-pins.h. These | ||
351 | * are constructed using, and can be further enhanced with, the macros in | ||
352 | * plat/pincfg.h. | ||
353 | * | ||
354 | * If a pin's mode is set to GPIO, it is configured as an input to avoid | ||
355 | * side-effects. The gpio can be manipulated later using standard GPIO API | ||
356 | * calls. | ||
357 | */ | ||
358 | int nmk_config_pin(pin_cfg_t cfg, bool sleep) | ||
359 | { | ||
360 | return __nmk_config_pins(&cfg, 1, sleep); | ||
361 | } | ||
362 | EXPORT_SYMBOL(nmk_config_pin); | ||
363 | |||
364 | /** | ||
365 | * nmk_config_pins - configure several pins at once | ||
366 | * @cfgs: array of pin configurations | ||
367 | * @num: number of elments in the array | ||
368 | * | ||
369 | * Configures several pins using nmk_config_pin(). Refer to that function for | ||
370 | * further information. | ||
371 | */ | ||
372 | int nmk_config_pins(pin_cfg_t *cfgs, int num) | ||
373 | { | ||
374 | return __nmk_config_pins(cfgs, num, false); | ||
375 | } | ||
376 | EXPORT_SYMBOL(nmk_config_pins); | ||
377 | |||
378 | int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num) | ||
379 | { | ||
380 | return __nmk_config_pins(cfgs, num, true); | ||
381 | } | ||
382 | EXPORT_SYMBOL(nmk_config_pins_sleep); | ||
383 | |||
384 | /** | ||
385 | * nmk_gpio_set_slpm() - configure the sleep mode of a pin | ||
386 | * @gpio: pin number | ||
387 | * @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE, | ||
388 | * | ||
389 | * Sets the sleep mode of a pin. If @mode is NMK_GPIO_SLPM_INPUT, the pin is | ||
390 | * changed to an input (with pullup/down enabled) in sleep and deep sleep. If | ||
391 | * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was | ||
392 | * configured even when in sleep and deep sleep. | ||
393 | * | ||
394 | * On DB8500v2 onwards, this setting loses the previous meaning and instead | ||
395 | * indicates if wakeup detection is enabled on the pin. Note that | ||
396 | * enable_irq_wake() will automatically enable wakeup detection. | ||
397 | */ | ||
398 | int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode) | ||
399 | { | ||
400 | struct nmk_gpio_chip *nmk_chip; | ||
401 | unsigned long flags; | ||
402 | |||
403 | nmk_chip = irq_get_chip_data(NOMADIK_GPIO_TO_IRQ(gpio)); | ||
404 | if (!nmk_chip) | ||
405 | return -EINVAL; | ||
406 | |||
407 | spin_lock_irqsave(&nmk_gpio_slpm_lock, flags); | ||
408 | spin_lock(&nmk_chip->lock); | ||
409 | |||
410 | __nmk_gpio_set_slpm(nmk_chip, gpio - nmk_chip->chip.base, mode); | ||
411 | |||
412 | spin_unlock(&nmk_chip->lock); | ||
413 | spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags); | ||
414 | |||
415 | return 0; | ||
416 | } | ||
417 | |||
418 | /** | ||
419 | * nmk_gpio_set_pull() - enable/disable pull up/down on a gpio | ||
420 | * @gpio: pin number | ||
421 | * @pull: one of NMK_GPIO_PULL_DOWN, NMK_GPIO_PULL_UP, and NMK_GPIO_PULL_NONE | ||
422 | * | ||
423 | * Enables/disables pull up/down on a specified pin. This only takes effect if | ||
424 | * the pin is configured as an input (either explicitly or by the alternate | ||
425 | * function). | ||
426 | * | ||
427 | * NOTE: If enabling the pull up/down, the caller must ensure that the GPIO is | ||
428 | * configured as an input. Otherwise, due to the way the controller registers | ||
429 | * work, this function will change the value output on the pin. | ||
430 | */ | ||
431 | int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull) | ||
432 | { | ||
433 | struct nmk_gpio_chip *nmk_chip; | ||
434 | unsigned long flags; | ||
435 | |||
436 | nmk_chip = irq_get_chip_data(NOMADIK_GPIO_TO_IRQ(gpio)); | ||
437 | if (!nmk_chip) | ||
438 | return -EINVAL; | ||
439 | |||
440 | spin_lock_irqsave(&nmk_chip->lock, flags); | ||
441 | __nmk_gpio_set_pull(nmk_chip, gpio - nmk_chip->chip.base, pull); | ||
442 | spin_unlock_irqrestore(&nmk_chip->lock, flags); | ||
443 | |||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | /* Mode functions */ | ||
448 | /** | ||
449 | * nmk_gpio_set_mode() - set the mux mode of a gpio pin | ||
450 | * @gpio: pin number | ||
451 | * @gpio_mode: one of NMK_GPIO_ALT_GPIO, NMK_GPIO_ALT_A, | ||
452 | * NMK_GPIO_ALT_B, and NMK_GPIO_ALT_C | ||
453 | * | ||
454 | * Sets the mode of the specified pin to one of the alternate functions or | ||
455 | * plain GPIO. | ||
456 | */ | ||
457 | int nmk_gpio_set_mode(int gpio, int gpio_mode) | ||
458 | { | ||
459 | struct nmk_gpio_chip *nmk_chip; | ||
460 | unsigned long flags; | ||
461 | |||
462 | nmk_chip = irq_get_chip_data(NOMADIK_GPIO_TO_IRQ(gpio)); | ||
463 | if (!nmk_chip) | ||
464 | return -EINVAL; | ||
465 | |||
466 | spin_lock_irqsave(&nmk_chip->lock, flags); | ||
467 | __nmk_gpio_set_mode(nmk_chip, gpio - nmk_chip->chip.base, gpio_mode); | ||
468 | spin_unlock_irqrestore(&nmk_chip->lock, flags); | ||
469 | |||
470 | return 0; | ||
471 | } | ||
472 | EXPORT_SYMBOL(nmk_gpio_set_mode); | ||
473 | |||
474 | int nmk_gpio_get_mode(int gpio) | ||
475 | { | ||
476 | struct nmk_gpio_chip *nmk_chip; | ||
477 | u32 afunc, bfunc, bit; | ||
478 | |||
479 | nmk_chip = irq_get_chip_data(NOMADIK_GPIO_TO_IRQ(gpio)); | ||
480 | if (!nmk_chip) | ||
481 | return -EINVAL; | ||
482 | |||
483 | bit = 1 << (gpio - nmk_chip->chip.base); | ||
484 | |||
485 | afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & bit; | ||
486 | bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & bit; | ||
487 | |||
488 | return (afunc ? NMK_GPIO_ALT_A : 0) | (bfunc ? NMK_GPIO_ALT_B : 0); | ||
489 | } | ||
490 | EXPORT_SYMBOL(nmk_gpio_get_mode); | ||
491 | |||
492 | |||
493 | /* IRQ functions */ | ||
494 | static inline int nmk_gpio_get_bitmask(int gpio) | ||
495 | { | ||
496 | return 1 << (gpio % 32); | ||
497 | } | ||
498 | |||
499 | static void nmk_gpio_irq_ack(struct irq_data *d) | ||
500 | { | ||
501 | int gpio; | ||
502 | struct nmk_gpio_chip *nmk_chip; | ||
503 | |||
504 | gpio = NOMADIK_IRQ_TO_GPIO(d->irq); | ||
505 | nmk_chip = irq_data_get_irq_chip_data(d); | ||
506 | if (!nmk_chip) | ||
507 | return; | ||
508 | writel(nmk_gpio_get_bitmask(gpio), nmk_chip->addr + NMK_GPIO_IC); | ||
509 | } | ||
510 | |||
511 | enum nmk_gpio_irq_type { | ||
512 | NORMAL, | ||
513 | WAKE, | ||
514 | }; | ||
515 | |||
516 | static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip, | ||
517 | int gpio, enum nmk_gpio_irq_type which, | ||
518 | bool enable) | ||
519 | { | ||
520 | u32 rimsc = which == WAKE ? NMK_GPIO_RWIMSC : NMK_GPIO_RIMSC; | ||
521 | u32 fimsc = which == WAKE ? NMK_GPIO_FWIMSC : NMK_GPIO_FIMSC; | ||
522 | u32 bitmask = nmk_gpio_get_bitmask(gpio); | ||
523 | u32 reg; | ||
524 | |||
525 | /* we must individually set/clear the two edges */ | ||
526 | if (nmk_chip->edge_rising & bitmask) { | ||
527 | reg = readl(nmk_chip->addr + rimsc); | ||
528 | if (enable) | ||
529 | reg |= bitmask; | ||
530 | else | ||
531 | reg &= ~bitmask; | ||
532 | writel(reg, nmk_chip->addr + rimsc); | ||
533 | } | ||
534 | if (nmk_chip->edge_falling & bitmask) { | ||
535 | reg = readl(nmk_chip->addr + fimsc); | ||
536 | if (enable) | ||
537 | reg |= bitmask; | ||
538 | else | ||
539 | reg &= ~bitmask; | ||
540 | writel(reg, nmk_chip->addr + fimsc); | ||
541 | } | ||
542 | } | ||
543 | |||
544 | static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip, | ||
545 | int gpio, bool on) | ||
546 | { | ||
547 | __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on); | ||
548 | } | ||
549 | |||
550 | static int nmk_gpio_irq_maskunmask(struct irq_data *d, bool enable) | ||
551 | { | ||
552 | int gpio; | ||
553 | struct nmk_gpio_chip *nmk_chip; | ||
554 | unsigned long flags; | ||
555 | u32 bitmask; | ||
556 | |||
557 | gpio = NOMADIK_IRQ_TO_GPIO(d->irq); | ||
558 | nmk_chip = irq_data_get_irq_chip_data(d); | ||
559 | bitmask = nmk_gpio_get_bitmask(gpio); | ||
560 | if (!nmk_chip) | ||
561 | return -EINVAL; | ||
562 | |||
563 | if (enable) | ||
564 | nmk_chip->enabled |= bitmask; | ||
565 | else | ||
566 | nmk_chip->enabled &= ~bitmask; | ||
567 | |||
568 | spin_lock_irqsave(&nmk_gpio_slpm_lock, flags); | ||
569 | spin_lock(&nmk_chip->lock); | ||
570 | |||
571 | __nmk_gpio_irq_modify(nmk_chip, gpio, NORMAL, enable); | ||
572 | |||
573 | if (!(nmk_chip->real_wake & bitmask)) | ||
574 | __nmk_gpio_set_wake(nmk_chip, gpio, enable); | ||
575 | |||
576 | spin_unlock(&nmk_chip->lock); | ||
577 | spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags); | ||
578 | |||
579 | return 0; | ||
580 | } | ||
581 | |||
582 | static void nmk_gpio_irq_mask(struct irq_data *d) | ||
583 | { | ||
584 | nmk_gpio_irq_maskunmask(d, false); | ||
585 | } | ||
586 | |||
587 | static void nmk_gpio_irq_unmask(struct irq_data *d) | ||
588 | { | ||
589 | nmk_gpio_irq_maskunmask(d, true); | ||
590 | } | ||
591 | |||
592 | static int nmk_gpio_irq_set_wake(struct irq_data *d, unsigned int on) | ||
593 | { | ||
594 | struct nmk_gpio_chip *nmk_chip; | ||
595 | unsigned long flags; | ||
596 | u32 bitmask; | ||
597 | int gpio; | ||
598 | |||
599 | gpio = NOMADIK_IRQ_TO_GPIO(d->irq); | ||
600 | nmk_chip = irq_data_get_irq_chip_data(d); | ||
601 | if (!nmk_chip) | ||
602 | return -EINVAL; | ||
603 | bitmask = nmk_gpio_get_bitmask(gpio); | ||
604 | |||
605 | spin_lock_irqsave(&nmk_gpio_slpm_lock, flags); | ||
606 | spin_lock(&nmk_chip->lock); | ||
607 | |||
608 | if (!(nmk_chip->enabled & bitmask)) | ||
609 | __nmk_gpio_set_wake(nmk_chip, gpio, on); | ||
610 | |||
611 | if (on) | ||
612 | nmk_chip->real_wake |= bitmask; | ||
613 | else | ||
614 | nmk_chip->real_wake &= ~bitmask; | ||
615 | |||
616 | spin_unlock(&nmk_chip->lock); | ||
617 | spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags); | ||
618 | |||
619 | return 0; | ||
620 | } | ||
621 | |||
622 | static int nmk_gpio_irq_set_type(struct irq_data *d, unsigned int type) | ||
623 | { | ||
624 | bool enabled, wake = irqd_is_wakeup_set(d); | ||
625 | int gpio; | ||
626 | struct nmk_gpio_chip *nmk_chip; | ||
627 | unsigned long flags; | ||
628 | u32 bitmask; | ||
629 | |||
630 | gpio = NOMADIK_IRQ_TO_GPIO(d->irq); | ||
631 | nmk_chip = irq_data_get_irq_chip_data(d); | ||
632 | bitmask = nmk_gpio_get_bitmask(gpio); | ||
633 | if (!nmk_chip) | ||
634 | return -EINVAL; | ||
635 | |||
636 | if (type & IRQ_TYPE_LEVEL_HIGH) | ||
637 | return -EINVAL; | ||
638 | if (type & IRQ_TYPE_LEVEL_LOW) | ||
639 | return -EINVAL; | ||
640 | |||
641 | enabled = nmk_chip->enabled & bitmask; | ||
642 | |||
643 | spin_lock_irqsave(&nmk_chip->lock, flags); | ||
644 | |||
645 | if (enabled) | ||
646 | __nmk_gpio_irq_modify(nmk_chip, gpio, NORMAL, false); | ||
647 | |||
648 | if (enabled || wake) | ||
649 | __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, false); | ||
650 | |||
651 | nmk_chip->edge_rising &= ~bitmask; | ||
652 | if (type & IRQ_TYPE_EDGE_RISING) | ||
653 | nmk_chip->edge_rising |= bitmask; | ||
654 | |||
655 | nmk_chip->edge_falling &= ~bitmask; | ||
656 | if (type & IRQ_TYPE_EDGE_FALLING) | ||
657 | nmk_chip->edge_falling |= bitmask; | ||
658 | |||
659 | if (enabled) | ||
660 | __nmk_gpio_irq_modify(nmk_chip, gpio, NORMAL, true); | ||
661 | |||
662 | if (enabled || wake) | ||
663 | __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, true); | ||
664 | |||
665 | spin_unlock_irqrestore(&nmk_chip->lock, flags); | ||
666 | |||
667 | return 0; | ||
668 | } | ||
669 | |||
670 | static struct irq_chip nmk_gpio_irq_chip = { | ||
671 | .name = "Nomadik-GPIO", | ||
672 | .irq_ack = nmk_gpio_irq_ack, | ||
673 | .irq_mask = nmk_gpio_irq_mask, | ||
674 | .irq_unmask = nmk_gpio_irq_unmask, | ||
675 | .irq_set_type = nmk_gpio_irq_set_type, | ||
676 | .irq_set_wake = nmk_gpio_irq_set_wake, | ||
677 | }; | ||
678 | |||
679 | static void __nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc, | ||
680 | u32 status) | ||
681 | { | ||
682 | struct nmk_gpio_chip *nmk_chip; | ||
683 | struct irq_chip *host_chip = irq_get_chip(irq); | ||
684 | unsigned int first_irq; | ||
685 | |||
686 | chained_irq_enter(host_chip, desc); | ||
687 | |||
688 | nmk_chip = irq_get_handler_data(irq); | ||
689 | first_irq = NOMADIK_GPIO_TO_IRQ(nmk_chip->chip.base); | ||
690 | while (status) { | ||
691 | int bit = __ffs(status); | ||
692 | |||
693 | generic_handle_irq(first_irq + bit); | ||
694 | status &= ~BIT(bit); | ||
695 | } | ||
696 | |||
697 | chained_irq_exit(host_chip, desc); | ||
698 | } | ||
699 | |||
700 | static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | ||
701 | { | ||
702 | struct nmk_gpio_chip *nmk_chip = irq_get_handler_data(irq); | ||
703 | u32 status = readl(nmk_chip->addr + NMK_GPIO_IS); | ||
704 | |||
705 | __nmk_gpio_irq_handler(irq, desc, status); | ||
706 | } | ||
707 | |||
708 | static void nmk_gpio_secondary_irq_handler(unsigned int irq, | ||
709 | struct irq_desc *desc) | ||
710 | { | ||
711 | struct nmk_gpio_chip *nmk_chip = irq_get_handler_data(irq); | ||
712 | u32 status = nmk_chip->get_secondary_status(nmk_chip->bank); | ||
713 | |||
714 | __nmk_gpio_irq_handler(irq, desc, status); | ||
715 | } | ||
716 | |||
717 | static int nmk_gpio_init_irq(struct nmk_gpio_chip *nmk_chip) | ||
718 | { | ||
719 | unsigned int first_irq; | ||
720 | int i; | ||
721 | |||
722 | first_irq = NOMADIK_GPIO_TO_IRQ(nmk_chip->chip.base); | ||
723 | for (i = first_irq; i < first_irq + nmk_chip->chip.ngpio; i++) { | ||
724 | irq_set_chip_and_handler(i, &nmk_gpio_irq_chip, | ||
725 | handle_edge_irq); | ||
726 | set_irq_flags(i, IRQF_VALID); | ||
727 | irq_set_chip_data(i, nmk_chip); | ||
728 | irq_set_irq_type(i, IRQ_TYPE_EDGE_FALLING); | ||
729 | } | ||
730 | |||
731 | irq_set_chained_handler(nmk_chip->parent_irq, nmk_gpio_irq_handler); | ||
732 | irq_set_handler_data(nmk_chip->parent_irq, nmk_chip); | ||
733 | |||
734 | if (nmk_chip->secondary_parent_irq >= 0) { | ||
735 | irq_set_chained_handler(nmk_chip->secondary_parent_irq, | ||
736 | nmk_gpio_secondary_irq_handler); | ||
737 | irq_set_handler_data(nmk_chip->secondary_parent_irq, nmk_chip); | ||
738 | } | ||
739 | |||
740 | return 0; | ||
741 | } | ||
742 | |||
743 | /* I/O Functions */ | ||
744 | static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset) | ||
745 | { | ||
746 | struct nmk_gpio_chip *nmk_chip = | ||
747 | container_of(chip, struct nmk_gpio_chip, chip); | ||
748 | |||
749 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC); | ||
750 | return 0; | ||
751 | } | ||
752 | |||
753 | static int nmk_gpio_get_input(struct gpio_chip *chip, unsigned offset) | ||
754 | { | ||
755 | struct nmk_gpio_chip *nmk_chip = | ||
756 | container_of(chip, struct nmk_gpio_chip, chip); | ||
757 | u32 bit = 1 << offset; | ||
758 | |||
759 | return (readl(nmk_chip->addr + NMK_GPIO_DAT) & bit) != 0; | ||
760 | } | ||
761 | |||
762 | static void nmk_gpio_set_output(struct gpio_chip *chip, unsigned offset, | ||
763 | int val) | ||
764 | { | ||
765 | struct nmk_gpio_chip *nmk_chip = | ||
766 | container_of(chip, struct nmk_gpio_chip, chip); | ||
767 | |||
768 | __nmk_gpio_set_output(nmk_chip, offset, val); | ||
769 | } | ||
770 | |||
771 | static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset, | ||
772 | int val) | ||
773 | { | ||
774 | struct nmk_gpio_chip *nmk_chip = | ||
775 | container_of(chip, struct nmk_gpio_chip, chip); | ||
776 | |||
777 | __nmk_gpio_make_output(nmk_chip, offset, val); | ||
778 | |||
779 | return 0; | ||
780 | } | ||
781 | |||
782 | static int nmk_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | ||
783 | { | ||
784 | struct nmk_gpio_chip *nmk_chip = | ||
785 | container_of(chip, struct nmk_gpio_chip, chip); | ||
786 | |||
787 | return NOMADIK_GPIO_TO_IRQ(nmk_chip->chip.base) + offset; | ||
788 | } | ||
789 | |||
790 | #ifdef CONFIG_DEBUG_FS | ||
791 | |||
792 | #include <linux/seq_file.h> | ||
793 | |||
794 | static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) | ||
795 | { | ||
796 | int mode; | ||
797 | unsigned i; | ||
798 | unsigned gpio = chip->base; | ||
799 | int is_out; | ||
800 | struct nmk_gpio_chip *nmk_chip = | ||
801 | container_of(chip, struct nmk_gpio_chip, chip); | ||
802 | const char *modes[] = { | ||
803 | [NMK_GPIO_ALT_GPIO] = "gpio", | ||
804 | [NMK_GPIO_ALT_A] = "altA", | ||
805 | [NMK_GPIO_ALT_B] = "altB", | ||
806 | [NMK_GPIO_ALT_C] = "altC", | ||
807 | }; | ||
808 | |||
809 | for (i = 0; i < chip->ngpio; i++, gpio++) { | ||
810 | const char *label = gpiochip_is_requested(chip, i); | ||
811 | bool pull; | ||
812 | u32 bit = 1 << i; | ||
813 | |||
814 | if (!label) | ||
815 | continue; | ||
816 | |||
817 | is_out = readl(nmk_chip->addr + NMK_GPIO_DIR) & bit; | ||
818 | pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit); | ||
819 | mode = nmk_gpio_get_mode(gpio); | ||
820 | seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s", | ||
821 | gpio, label, | ||
822 | is_out ? "out" : "in ", | ||
823 | chip->get | ||
824 | ? (chip->get(chip, i) ? "hi" : "lo") | ||
825 | : "? ", | ||
826 | (mode < 0) ? "unknown" : modes[mode], | ||
827 | pull ? "pull" : "none"); | ||
828 | seq_printf(s, "\n"); | ||
829 | } | ||
830 | } | ||
831 | |||
832 | #else | ||
833 | #define nmk_gpio_dbg_show NULL | ||
834 | #endif | ||
835 | |||
836 | /* This structure is replicated for each GPIO block allocated at probe time */ | ||
837 | static struct gpio_chip nmk_gpio_template = { | ||
838 | .direction_input = nmk_gpio_make_input, | ||
839 | .get = nmk_gpio_get_input, | ||
840 | .direction_output = nmk_gpio_make_output, | ||
841 | .set = nmk_gpio_set_output, | ||
842 | .to_irq = nmk_gpio_to_irq, | ||
843 | .dbg_show = nmk_gpio_dbg_show, | ||
844 | .can_sleep = 0, | ||
845 | }; | ||
846 | |||
847 | /* | ||
848 | * Called from the suspend/resume path to only keep the real wakeup interrupts | ||
849 | * (those that have had set_irq_wake() called on them) as wakeup interrupts, | ||
850 | * and not the rest of the interrupts which we needed to have as wakeups for | ||
851 | * cpuidle. | ||
852 | * | ||
853 | * PM ops are not used since this needs to be done at the end, after all the | ||
854 | * other drivers are done with their suspend callbacks. | ||
855 | */ | ||
856 | void nmk_gpio_wakeups_suspend(void) | ||
857 | { | ||
858 | int i; | ||
859 | |||
860 | for (i = 0; i < NUM_BANKS; i++) { | ||
861 | struct nmk_gpio_chip *chip = nmk_gpio_chips[i]; | ||
862 | |||
863 | if (!chip) | ||
864 | break; | ||
865 | |||
866 | chip->rwimsc = readl(chip->addr + NMK_GPIO_RWIMSC); | ||
867 | chip->fwimsc = readl(chip->addr + NMK_GPIO_FWIMSC); | ||
868 | |||
869 | writel(chip->rwimsc & chip->real_wake, | ||
870 | chip->addr + NMK_GPIO_RWIMSC); | ||
871 | writel(chip->fwimsc & chip->real_wake, | ||
872 | chip->addr + NMK_GPIO_FWIMSC); | ||
873 | |||
874 | if (cpu_is_u8500v2()) { | ||
875 | chip->slpm = readl(chip->addr + NMK_GPIO_SLPC); | ||
876 | |||
877 | /* 0 -> wakeup enable */ | ||
878 | writel(~chip->real_wake, chip->addr + NMK_GPIO_SLPC); | ||
879 | } | ||
880 | } | ||
881 | } | ||
882 | |||
883 | void nmk_gpio_wakeups_resume(void) | ||
884 | { | ||
885 | int i; | ||
886 | |||
887 | for (i = 0; i < NUM_BANKS; i++) { | ||
888 | struct nmk_gpio_chip *chip = nmk_gpio_chips[i]; | ||
889 | |||
890 | if (!chip) | ||
891 | break; | ||
892 | |||
893 | writel(chip->rwimsc, chip->addr + NMK_GPIO_RWIMSC); | ||
894 | writel(chip->fwimsc, chip->addr + NMK_GPIO_FWIMSC); | ||
895 | |||
896 | if (cpu_is_u8500v2()) | ||
897 | writel(chip->slpm, chip->addr + NMK_GPIO_SLPC); | ||
898 | } | ||
899 | } | ||
900 | |||
901 | static int __devinit nmk_gpio_probe(struct platform_device *dev) | ||
902 | { | ||
903 | struct nmk_gpio_platform_data *pdata = dev->dev.platform_data; | ||
904 | struct nmk_gpio_chip *nmk_chip; | ||
905 | struct gpio_chip *chip; | ||
906 | struct resource *res; | ||
907 | struct clk *clk; | ||
908 | int secondary_irq; | ||
909 | int irq; | ||
910 | int ret; | ||
911 | |||
912 | if (!pdata) | ||
913 | return -ENODEV; | ||
914 | |||
915 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
916 | if (!res) { | ||
917 | ret = -ENOENT; | ||
918 | goto out; | ||
919 | } | ||
920 | |||
921 | irq = platform_get_irq(dev, 0); | ||
922 | if (irq < 0) { | ||
923 | ret = irq; | ||
924 | goto out; | ||
925 | } | ||
926 | |||
927 | secondary_irq = platform_get_irq(dev, 1); | ||
928 | if (secondary_irq >= 0 && !pdata->get_secondary_status) { | ||
929 | ret = -EINVAL; | ||
930 | goto out; | ||
931 | } | ||
932 | |||
933 | if (request_mem_region(res->start, resource_size(res), | ||
934 | dev_name(&dev->dev)) == NULL) { | ||
935 | ret = -EBUSY; | ||
936 | goto out; | ||
937 | } | ||
938 | |||
939 | clk = clk_get(&dev->dev, NULL); | ||
940 | if (IS_ERR(clk)) { | ||
941 | ret = PTR_ERR(clk); | ||
942 | goto out_release; | ||
943 | } | ||
944 | |||
945 | clk_enable(clk); | ||
946 | |||
947 | nmk_chip = kzalloc(sizeof(*nmk_chip), GFP_KERNEL); | ||
948 | if (!nmk_chip) { | ||
949 | ret = -ENOMEM; | ||
950 | goto out_clk; | ||
951 | } | ||
952 | /* | ||
953 | * The virt address in nmk_chip->addr is in the nomadik register space, | ||
954 | * so we can simply convert the resource address, without remapping | ||
955 | */ | ||
956 | nmk_chip->bank = dev->id; | ||
957 | nmk_chip->clk = clk; | ||
958 | nmk_chip->addr = io_p2v(res->start); | ||
959 | nmk_chip->chip = nmk_gpio_template; | ||
960 | nmk_chip->parent_irq = irq; | ||
961 | nmk_chip->secondary_parent_irq = secondary_irq; | ||
962 | nmk_chip->get_secondary_status = pdata->get_secondary_status; | ||
963 | nmk_chip->set_ioforce = pdata->set_ioforce; | ||
964 | spin_lock_init(&nmk_chip->lock); | ||
965 | |||
966 | chip = &nmk_chip->chip; | ||
967 | chip->base = pdata->first_gpio; | ||
968 | chip->ngpio = pdata->num_gpio; | ||
969 | chip->label = pdata->name ?: dev_name(&dev->dev); | ||
970 | chip->dev = &dev->dev; | ||
971 | chip->owner = THIS_MODULE; | ||
972 | |||
973 | ret = gpiochip_add(&nmk_chip->chip); | ||
974 | if (ret) | ||
975 | goto out_free; | ||
976 | |||
977 | BUG_ON(nmk_chip->bank >= ARRAY_SIZE(nmk_gpio_chips)); | ||
978 | |||
979 | nmk_gpio_chips[nmk_chip->bank] = nmk_chip; | ||
980 | platform_set_drvdata(dev, nmk_chip); | ||
981 | |||
982 | nmk_gpio_init_irq(nmk_chip); | ||
983 | |||
984 | dev_info(&dev->dev, "Bits %i-%i at address %p\n", | ||
985 | nmk_chip->chip.base, nmk_chip->chip.base+31, nmk_chip->addr); | ||
986 | return 0; | ||
987 | |||
988 | out_free: | ||
989 | kfree(nmk_chip); | ||
990 | out_clk: | ||
991 | clk_disable(clk); | ||
992 | clk_put(clk); | ||
993 | out_release: | ||
994 | release_mem_region(res->start, resource_size(res)); | ||
995 | out: | ||
996 | dev_err(&dev->dev, "Failure %i for GPIO %i-%i\n", ret, | ||
997 | pdata->first_gpio, pdata->first_gpio+31); | ||
998 | return ret; | ||
999 | } | ||
1000 | |||
1001 | static struct platform_driver nmk_gpio_driver = { | ||
1002 | .driver = { | ||
1003 | .owner = THIS_MODULE, | ||
1004 | .name = "gpio", | ||
1005 | }, | ||
1006 | .probe = nmk_gpio_probe, | ||
1007 | }; | ||
1008 | |||
1009 | static int __init nmk_gpio_init(void) | ||
1010 | { | ||
1011 | return platform_driver_register(&nmk_gpio_driver); | ||
1012 | } | ||
1013 | |||
1014 | core_initcall(nmk_gpio_init); | ||
1015 | |||
1016 | MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini"); | ||
1017 | MODULE_DESCRIPTION("Nomadik GPIO Driver"); | ||
1018 | MODULE_LICENSE("GPL"); | ||
1019 | |||
1020 | |||
diff --git a/arch/arm/plat-nomadik/include/plat/gpio.h b/arch/arm/plat-nomadik/include/plat/gpio.h index 1b9f6f0843d1..ea19a5b2f227 100644 --- a/arch/arm/plat-nomadik/include/plat/gpio.h +++ b/arch/arm/plat-nomadik/include/plat/gpio.h | |||
@@ -78,6 +78,8 @@ extern int nmk_gpio_get_mode(int gpio); | |||
78 | extern void nmk_gpio_wakeups_suspend(void); | 78 | extern void nmk_gpio_wakeups_suspend(void); |
79 | extern void nmk_gpio_wakeups_resume(void); | 79 | extern void nmk_gpio_wakeups_resume(void); |
80 | 80 | ||
81 | extern void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up); | ||
82 | |||
81 | /* | 83 | /* |
82 | * Platform data to register a block: only the initial gpio/irq number. | 84 | * Platform data to register a block: only the initial gpio/irq number. |
83 | */ | 85 | */ |
diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index a4a12859fdd5..f0233e6abcdf 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := common.o sram.o clock.o devices.o dma.o mux.o gpio.o \ | 6 | obj-y := common.o sram.o clock.o devices.o dma.o mux.o \ |
7 | usb.o fb.o io.o counter_32k.o | 7 | usb.o fb.o io.o counter_32k.o |
8 | obj-m := | 8 | obj-m := |
9 | obj-n := | 9 | obj-n := |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c deleted file mode 100644 index efb869390199..000000000000 --- a/arch/arm/plat-omap/gpio.c +++ /dev/null | |||
@@ -1,2112 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/plat-omap/gpio.c | ||
3 | * | ||
4 | * Support functions for OMAP GPIO | ||
5 | * | ||
6 | * Copyright (C) 2003-2005 Nokia Corporation | ||
7 | * Written by Juha Yrjölä <juha.yrjola@nokia.com> | ||
8 | * | ||
9 | * Copyright (C) 2009 Texas Instruments | ||
10 | * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #include <linux/init.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/syscore_ops.h> | ||
21 | #include <linux/err.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/slab.h> | ||
25 | #include <linux/pm_runtime.h> | ||
26 | |||
27 | #include <mach/hardware.h> | ||
28 | #include <asm/irq.h> | ||
29 | #include <mach/irqs.h> | ||
30 | #include <mach/gpio.h> | ||
31 | #include <asm/mach/irq.h> | ||
32 | |||
33 | /* | ||
34 | * OMAP1510 GPIO registers | ||
35 | */ | ||
36 | #define OMAP1510_GPIO_DATA_INPUT 0x00 | ||
37 | #define OMAP1510_GPIO_DATA_OUTPUT 0x04 | ||
38 | #define OMAP1510_GPIO_DIR_CONTROL 0x08 | ||
39 | #define OMAP1510_GPIO_INT_CONTROL 0x0c | ||
40 | #define OMAP1510_GPIO_INT_MASK 0x10 | ||
41 | #define OMAP1510_GPIO_INT_STATUS 0x14 | ||
42 | #define OMAP1510_GPIO_PIN_CONTROL 0x18 | ||
43 | |||
44 | #define OMAP1510_IH_GPIO_BASE 64 | ||
45 | |||
46 | /* | ||
47 | * OMAP1610 specific GPIO registers | ||
48 | */ | ||
49 | #define OMAP1610_GPIO_REVISION 0x0000 | ||
50 | #define OMAP1610_GPIO_SYSCONFIG 0x0010 | ||
51 | #define OMAP1610_GPIO_SYSSTATUS 0x0014 | ||
52 | #define OMAP1610_GPIO_IRQSTATUS1 0x0018 | ||
53 | #define OMAP1610_GPIO_IRQENABLE1 0x001c | ||
54 | #define OMAP1610_GPIO_WAKEUPENABLE 0x0028 | ||
55 | #define OMAP1610_GPIO_DATAIN 0x002c | ||
56 | #define OMAP1610_GPIO_DATAOUT 0x0030 | ||
57 | #define OMAP1610_GPIO_DIRECTION 0x0034 | ||
58 | #define OMAP1610_GPIO_EDGE_CTRL1 0x0038 | ||
59 | #define OMAP1610_GPIO_EDGE_CTRL2 0x003c | ||
60 | #define OMAP1610_GPIO_CLEAR_IRQENABLE1 0x009c | ||
61 | #define OMAP1610_GPIO_CLEAR_WAKEUPENA 0x00a8 | ||
62 | #define OMAP1610_GPIO_CLEAR_DATAOUT 0x00b0 | ||
63 | #define OMAP1610_GPIO_SET_IRQENABLE1 0x00dc | ||
64 | #define OMAP1610_GPIO_SET_WAKEUPENA 0x00e8 | ||
65 | #define OMAP1610_GPIO_SET_DATAOUT 0x00f0 | ||
66 | |||
67 | /* | ||
68 | * OMAP7XX specific GPIO registers | ||
69 | */ | ||
70 | #define OMAP7XX_GPIO_DATA_INPUT 0x00 | ||
71 | #define OMAP7XX_GPIO_DATA_OUTPUT 0x04 | ||
72 | #define OMAP7XX_GPIO_DIR_CONTROL 0x08 | ||
73 | #define OMAP7XX_GPIO_INT_CONTROL 0x0c | ||
74 | #define OMAP7XX_GPIO_INT_MASK 0x10 | ||
75 | #define OMAP7XX_GPIO_INT_STATUS 0x14 | ||
76 | |||
77 | /* | ||
78 | * omap2+ specific GPIO registers | ||
79 | */ | ||
80 | #define OMAP24XX_GPIO_REVISION 0x0000 | ||
81 | #define OMAP24XX_GPIO_IRQSTATUS1 0x0018 | ||
82 | #define OMAP24XX_GPIO_IRQSTATUS2 0x0028 | ||
83 | #define OMAP24XX_GPIO_IRQENABLE2 0x002c | ||
84 | #define OMAP24XX_GPIO_IRQENABLE1 0x001c | ||
85 | #define OMAP24XX_GPIO_WAKE_EN 0x0020 | ||
86 | #define OMAP24XX_GPIO_CTRL 0x0030 | ||
87 | #define OMAP24XX_GPIO_OE 0x0034 | ||
88 | #define OMAP24XX_GPIO_DATAIN 0x0038 | ||
89 | #define OMAP24XX_GPIO_DATAOUT 0x003c | ||
90 | #define OMAP24XX_GPIO_LEVELDETECT0 0x0040 | ||
91 | #define OMAP24XX_GPIO_LEVELDETECT1 0x0044 | ||
92 | #define OMAP24XX_GPIO_RISINGDETECT 0x0048 | ||
93 | #define OMAP24XX_GPIO_FALLINGDETECT 0x004c | ||
94 | #define OMAP24XX_GPIO_DEBOUNCE_EN 0x0050 | ||
95 | #define OMAP24XX_GPIO_DEBOUNCE_VAL 0x0054 | ||
96 | #define OMAP24XX_GPIO_CLEARIRQENABLE1 0x0060 | ||
97 | #define OMAP24XX_GPIO_SETIRQENABLE1 0x0064 | ||
98 | #define OMAP24XX_GPIO_CLEARWKUENA 0x0080 | ||
99 | #define OMAP24XX_GPIO_SETWKUENA 0x0084 | ||
100 | #define OMAP24XX_GPIO_CLEARDATAOUT 0x0090 | ||
101 | #define OMAP24XX_GPIO_SETDATAOUT 0x0094 | ||
102 | |||
103 | #define OMAP4_GPIO_REVISION 0x0000 | ||
104 | #define OMAP4_GPIO_EOI 0x0020 | ||
105 | #define OMAP4_GPIO_IRQSTATUSRAW0 0x0024 | ||
106 | #define OMAP4_GPIO_IRQSTATUSRAW1 0x0028 | ||
107 | #define OMAP4_GPIO_IRQSTATUS0 0x002c | ||
108 | #define OMAP4_GPIO_IRQSTATUS1 0x0030 | ||
109 | #define OMAP4_GPIO_IRQSTATUSSET0 0x0034 | ||
110 | #define OMAP4_GPIO_IRQSTATUSSET1 0x0038 | ||
111 | #define OMAP4_GPIO_IRQSTATUSCLR0 0x003c | ||
112 | #define OMAP4_GPIO_IRQSTATUSCLR1 0x0040 | ||
113 | #define OMAP4_GPIO_IRQWAKEN0 0x0044 | ||
114 | #define OMAP4_GPIO_IRQWAKEN1 0x0048 | ||
115 | #define OMAP4_GPIO_IRQENABLE1 0x011c | ||
116 | #define OMAP4_GPIO_WAKE_EN 0x0120 | ||
117 | #define OMAP4_GPIO_IRQSTATUS2 0x0128 | ||
118 | #define OMAP4_GPIO_IRQENABLE2 0x012c | ||
119 | #define OMAP4_GPIO_CTRL 0x0130 | ||
120 | #define OMAP4_GPIO_OE 0x0134 | ||
121 | #define OMAP4_GPIO_DATAIN 0x0138 | ||
122 | #define OMAP4_GPIO_DATAOUT 0x013c | ||
123 | #define OMAP4_GPIO_LEVELDETECT0 0x0140 | ||
124 | #define OMAP4_GPIO_LEVELDETECT1 0x0144 | ||
125 | #define OMAP4_GPIO_RISINGDETECT 0x0148 | ||
126 | #define OMAP4_GPIO_FALLINGDETECT 0x014c | ||
127 | #define OMAP4_GPIO_DEBOUNCENABLE 0x0150 | ||
128 | #define OMAP4_GPIO_DEBOUNCINGTIME 0x0154 | ||
129 | #define OMAP4_GPIO_CLEARIRQENABLE1 0x0160 | ||
130 | #define OMAP4_GPIO_SETIRQENABLE1 0x0164 | ||
131 | #define OMAP4_GPIO_CLEARWKUENA 0x0180 | ||
132 | #define OMAP4_GPIO_SETWKUENA 0x0184 | ||
133 | #define OMAP4_GPIO_CLEARDATAOUT 0x0190 | ||
134 | #define OMAP4_GPIO_SETDATAOUT 0x0194 | ||
135 | |||
136 | struct gpio_bank { | ||
137 | unsigned long pbase; | ||
138 | void __iomem *base; | ||
139 | u16 irq; | ||
140 | u16 virtual_irq_start; | ||
141 | int method; | ||
142 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) | ||
143 | u32 suspend_wakeup; | ||
144 | u32 saved_wakeup; | ||
145 | #endif | ||
146 | u32 non_wakeup_gpios; | ||
147 | u32 enabled_non_wakeup_gpios; | ||
148 | |||
149 | u32 saved_datain; | ||
150 | u32 saved_fallingdetect; | ||
151 | u32 saved_risingdetect; | ||
152 | u32 level_mask; | ||
153 | u32 toggle_mask; | ||
154 | spinlock_t lock; | ||
155 | struct gpio_chip chip; | ||
156 | struct clk *dbck; | ||
157 | u32 mod_usage; | ||
158 | u32 dbck_enable_mask; | ||
159 | struct device *dev; | ||
160 | bool dbck_flag; | ||
161 | int stride; | ||
162 | }; | ||
163 | |||
164 | #ifdef CONFIG_ARCH_OMAP3 | ||
165 | struct omap3_gpio_regs { | ||
166 | u32 irqenable1; | ||
167 | u32 irqenable2; | ||
168 | u32 wake_en; | ||
169 | u32 ctrl; | ||
170 | u32 oe; | ||
171 | u32 leveldetect0; | ||
172 | u32 leveldetect1; | ||
173 | u32 risingdetect; | ||
174 | u32 fallingdetect; | ||
175 | u32 dataout; | ||
176 | }; | ||
177 | |||
178 | static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS]; | ||
179 | #endif | ||
180 | |||
181 | /* | ||
182 | * TODO: Cleanup gpio_bank usage as it is having information | ||
183 | * related to all instances of the device | ||
184 | */ | ||
185 | static struct gpio_bank *gpio_bank; | ||
186 | |||
187 | static int bank_width; | ||
188 | |||
189 | /* TODO: Analyze removing gpio_bank_count usage from driver code */ | ||
190 | int gpio_bank_count; | ||
191 | |||
192 | static inline struct gpio_bank *get_gpio_bank(int gpio) | ||
193 | { | ||
194 | if (cpu_is_omap15xx()) { | ||
195 | if (OMAP_GPIO_IS_MPUIO(gpio)) | ||
196 | return &gpio_bank[0]; | ||
197 | return &gpio_bank[1]; | ||
198 | } | ||
199 | if (cpu_is_omap16xx()) { | ||
200 | if (OMAP_GPIO_IS_MPUIO(gpio)) | ||
201 | return &gpio_bank[0]; | ||
202 | return &gpio_bank[1 + (gpio >> 4)]; | ||
203 | } | ||
204 | if (cpu_is_omap7xx()) { | ||
205 | if (OMAP_GPIO_IS_MPUIO(gpio)) | ||
206 | return &gpio_bank[0]; | ||
207 | return &gpio_bank[1 + (gpio >> 5)]; | ||
208 | } | ||
209 | if (cpu_is_omap24xx()) | ||
210 | return &gpio_bank[gpio >> 5]; | ||
211 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) | ||
212 | return &gpio_bank[gpio >> 5]; | ||
213 | BUG(); | ||
214 | return NULL; | ||
215 | } | ||
216 | |||
217 | static inline int get_gpio_index(int gpio) | ||
218 | { | ||
219 | if (cpu_is_omap7xx()) | ||
220 | return gpio & 0x1f; | ||
221 | if (cpu_is_omap24xx()) | ||
222 | return gpio & 0x1f; | ||
223 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) | ||
224 | return gpio & 0x1f; | ||
225 | return gpio & 0x0f; | ||
226 | } | ||
227 | |||
228 | static inline int gpio_valid(int gpio) | ||
229 | { | ||
230 | if (gpio < 0) | ||
231 | return -1; | ||
232 | if (cpu_class_is_omap1() && OMAP_GPIO_IS_MPUIO(gpio)) { | ||
233 | if (gpio >= OMAP_MAX_GPIO_LINES + 16) | ||
234 | return -1; | ||
235 | return 0; | ||
236 | } | ||
237 | if (cpu_is_omap15xx() && gpio < 16) | ||
238 | return 0; | ||
239 | if ((cpu_is_omap16xx()) && gpio < 64) | ||
240 | return 0; | ||
241 | if (cpu_is_omap7xx() && gpio < 192) | ||
242 | return 0; | ||
243 | if (cpu_is_omap2420() && gpio < 128) | ||
244 | return 0; | ||
245 | if (cpu_is_omap2430() && gpio < 160) | ||
246 | return 0; | ||
247 | if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && gpio < 192) | ||
248 | return 0; | ||
249 | return -1; | ||
250 | } | ||
251 | |||
252 | static int check_gpio(int gpio) | ||
253 | { | ||
254 | if (unlikely(gpio_valid(gpio) < 0)) { | ||
255 | printk(KERN_ERR "omap-gpio: invalid GPIO %d\n", gpio); | ||
256 | dump_stack(); | ||
257 | return -1; | ||
258 | } | ||
259 | return 0; | ||
260 | } | ||
261 | |||
262 | static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) | ||
263 | { | ||
264 | void __iomem *reg = bank->base; | ||
265 | u32 l; | ||
266 | |||
267 | switch (bank->method) { | ||
268 | #ifdef CONFIG_ARCH_OMAP1 | ||
269 | case METHOD_MPUIO: | ||
270 | reg += OMAP_MPUIO_IO_CNTL / bank->stride; | ||
271 | break; | ||
272 | #endif | ||
273 | #ifdef CONFIG_ARCH_OMAP15XX | ||
274 | case METHOD_GPIO_1510: | ||
275 | reg += OMAP1510_GPIO_DIR_CONTROL; | ||
276 | break; | ||
277 | #endif | ||
278 | #ifdef CONFIG_ARCH_OMAP16XX | ||
279 | case METHOD_GPIO_1610: | ||
280 | reg += OMAP1610_GPIO_DIRECTION; | ||
281 | break; | ||
282 | #endif | ||
283 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
284 | case METHOD_GPIO_7XX: | ||
285 | reg += OMAP7XX_GPIO_DIR_CONTROL; | ||
286 | break; | ||
287 | #endif | ||
288 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
289 | case METHOD_GPIO_24XX: | ||
290 | reg += OMAP24XX_GPIO_OE; | ||
291 | break; | ||
292 | #endif | ||
293 | #if defined(CONFIG_ARCH_OMAP4) | ||
294 | case METHOD_GPIO_44XX: | ||
295 | reg += OMAP4_GPIO_OE; | ||
296 | break; | ||
297 | #endif | ||
298 | default: | ||
299 | WARN_ON(1); | ||
300 | return; | ||
301 | } | ||
302 | l = __raw_readl(reg); | ||
303 | if (is_input) | ||
304 | l |= 1 << gpio; | ||
305 | else | ||
306 | l &= ~(1 << gpio); | ||
307 | __raw_writel(l, reg); | ||
308 | } | ||
309 | |||
310 | static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | ||
311 | { | ||
312 | void __iomem *reg = bank->base; | ||
313 | u32 l = 0; | ||
314 | |||
315 | switch (bank->method) { | ||
316 | #ifdef CONFIG_ARCH_OMAP1 | ||
317 | case METHOD_MPUIO: | ||
318 | reg += OMAP_MPUIO_OUTPUT / bank->stride; | ||
319 | l = __raw_readl(reg); | ||
320 | if (enable) | ||
321 | l |= 1 << gpio; | ||
322 | else | ||
323 | l &= ~(1 << gpio); | ||
324 | break; | ||
325 | #endif | ||
326 | #ifdef CONFIG_ARCH_OMAP15XX | ||
327 | case METHOD_GPIO_1510: | ||
328 | reg += OMAP1510_GPIO_DATA_OUTPUT; | ||
329 | l = __raw_readl(reg); | ||
330 | if (enable) | ||
331 | l |= 1 << gpio; | ||
332 | else | ||
333 | l &= ~(1 << gpio); | ||
334 | break; | ||
335 | #endif | ||
336 | #ifdef CONFIG_ARCH_OMAP16XX | ||
337 | case METHOD_GPIO_1610: | ||
338 | if (enable) | ||
339 | reg += OMAP1610_GPIO_SET_DATAOUT; | ||
340 | else | ||
341 | reg += OMAP1610_GPIO_CLEAR_DATAOUT; | ||
342 | l = 1 << gpio; | ||
343 | break; | ||
344 | #endif | ||
345 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
346 | case METHOD_GPIO_7XX: | ||
347 | reg += OMAP7XX_GPIO_DATA_OUTPUT; | ||
348 | l = __raw_readl(reg); | ||
349 | if (enable) | ||
350 | l |= 1 << gpio; | ||
351 | else | ||
352 | l &= ~(1 << gpio); | ||
353 | break; | ||
354 | #endif | ||
355 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
356 | case METHOD_GPIO_24XX: | ||
357 | if (enable) | ||
358 | reg += OMAP24XX_GPIO_SETDATAOUT; | ||
359 | else | ||
360 | reg += OMAP24XX_GPIO_CLEARDATAOUT; | ||
361 | l = 1 << gpio; | ||
362 | break; | ||
363 | #endif | ||
364 | #ifdef CONFIG_ARCH_OMAP4 | ||
365 | case METHOD_GPIO_44XX: | ||
366 | if (enable) | ||
367 | reg += OMAP4_GPIO_SETDATAOUT; | ||
368 | else | ||
369 | reg += OMAP4_GPIO_CLEARDATAOUT; | ||
370 | l = 1 << gpio; | ||
371 | break; | ||
372 | #endif | ||
373 | default: | ||
374 | WARN_ON(1); | ||
375 | return; | ||
376 | } | ||
377 | __raw_writel(l, reg); | ||
378 | } | ||
379 | |||
380 | static int _get_gpio_datain(struct gpio_bank *bank, int gpio) | ||
381 | { | ||
382 | void __iomem *reg; | ||
383 | |||
384 | if (check_gpio(gpio) < 0) | ||
385 | return -EINVAL; | ||
386 | reg = bank->base; | ||
387 | switch (bank->method) { | ||
388 | #ifdef CONFIG_ARCH_OMAP1 | ||
389 | case METHOD_MPUIO: | ||
390 | reg += OMAP_MPUIO_INPUT_LATCH / bank->stride; | ||
391 | break; | ||
392 | #endif | ||
393 | #ifdef CONFIG_ARCH_OMAP15XX | ||
394 | case METHOD_GPIO_1510: | ||
395 | reg += OMAP1510_GPIO_DATA_INPUT; | ||
396 | break; | ||
397 | #endif | ||
398 | #ifdef CONFIG_ARCH_OMAP16XX | ||
399 | case METHOD_GPIO_1610: | ||
400 | reg += OMAP1610_GPIO_DATAIN; | ||
401 | break; | ||
402 | #endif | ||
403 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
404 | case METHOD_GPIO_7XX: | ||
405 | reg += OMAP7XX_GPIO_DATA_INPUT; | ||
406 | break; | ||
407 | #endif | ||
408 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
409 | case METHOD_GPIO_24XX: | ||
410 | reg += OMAP24XX_GPIO_DATAIN; | ||
411 | break; | ||
412 | #endif | ||
413 | #ifdef CONFIG_ARCH_OMAP4 | ||
414 | case METHOD_GPIO_44XX: | ||
415 | reg += OMAP4_GPIO_DATAIN; | ||
416 | break; | ||
417 | #endif | ||
418 | default: | ||
419 | return -EINVAL; | ||
420 | } | ||
421 | return (__raw_readl(reg) | ||
422 | & (1 << get_gpio_index(gpio))) != 0; | ||
423 | } | ||
424 | |||
425 | static int _get_gpio_dataout(struct gpio_bank *bank, int gpio) | ||
426 | { | ||
427 | void __iomem *reg; | ||
428 | |||
429 | if (check_gpio(gpio) < 0) | ||
430 | return -EINVAL; | ||
431 | reg = bank->base; | ||
432 | |||
433 | switch (bank->method) { | ||
434 | #ifdef CONFIG_ARCH_OMAP1 | ||
435 | case METHOD_MPUIO: | ||
436 | reg += OMAP_MPUIO_OUTPUT / bank->stride; | ||
437 | break; | ||
438 | #endif | ||
439 | #ifdef CONFIG_ARCH_OMAP15XX | ||
440 | case METHOD_GPIO_1510: | ||
441 | reg += OMAP1510_GPIO_DATA_OUTPUT; | ||
442 | break; | ||
443 | #endif | ||
444 | #ifdef CONFIG_ARCH_OMAP16XX | ||
445 | case METHOD_GPIO_1610: | ||
446 | reg += OMAP1610_GPIO_DATAOUT; | ||
447 | break; | ||
448 | #endif | ||
449 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
450 | case METHOD_GPIO_7XX: | ||
451 | reg += OMAP7XX_GPIO_DATA_OUTPUT; | ||
452 | break; | ||
453 | #endif | ||
454 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
455 | case METHOD_GPIO_24XX: | ||
456 | reg += OMAP24XX_GPIO_DATAOUT; | ||
457 | break; | ||
458 | #endif | ||
459 | #ifdef CONFIG_ARCH_OMAP4 | ||
460 | case METHOD_GPIO_44XX: | ||
461 | reg += OMAP4_GPIO_DATAOUT; | ||
462 | break; | ||
463 | #endif | ||
464 | default: | ||
465 | return -EINVAL; | ||
466 | } | ||
467 | |||
468 | return (__raw_readl(reg) & (1 << get_gpio_index(gpio))) != 0; | ||
469 | } | ||
470 | |||
471 | #define MOD_REG_BIT(reg, bit_mask, set) \ | ||
472 | do { \ | ||
473 | int l = __raw_readl(base + reg); \ | ||
474 | if (set) l |= bit_mask; \ | ||
475 | else l &= ~bit_mask; \ | ||
476 | __raw_writel(l, base + reg); \ | ||
477 | } while(0) | ||
478 | |||
479 | /** | ||
480 | * _set_gpio_debounce - low level gpio debounce time | ||
481 | * @bank: the gpio bank we're acting upon | ||
482 | * @gpio: the gpio number on this @gpio | ||
483 | * @debounce: debounce time to use | ||
484 | * | ||
485 | * OMAP's debounce time is in 31us steps so we need | ||
486 | * to convert and round up to the closest unit. | ||
487 | */ | ||
488 | static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | ||
489 | unsigned debounce) | ||
490 | { | ||
491 | void __iomem *reg = bank->base; | ||
492 | u32 val; | ||
493 | u32 l; | ||
494 | |||
495 | if (!bank->dbck_flag) | ||
496 | return; | ||
497 | |||
498 | if (debounce < 32) | ||
499 | debounce = 0x01; | ||
500 | else if (debounce > 7936) | ||
501 | debounce = 0xff; | ||
502 | else | ||
503 | debounce = (debounce / 0x1f) - 1; | ||
504 | |||
505 | l = 1 << get_gpio_index(gpio); | ||
506 | |||
507 | if (bank->method == METHOD_GPIO_44XX) | ||
508 | reg += OMAP4_GPIO_DEBOUNCINGTIME; | ||
509 | else | ||
510 | reg += OMAP24XX_GPIO_DEBOUNCE_VAL; | ||
511 | |||
512 | __raw_writel(debounce, reg); | ||
513 | |||
514 | reg = bank->base; | ||
515 | if (bank->method == METHOD_GPIO_44XX) | ||
516 | reg += OMAP4_GPIO_DEBOUNCENABLE; | ||
517 | else | ||
518 | reg += OMAP24XX_GPIO_DEBOUNCE_EN; | ||
519 | |||
520 | val = __raw_readl(reg); | ||
521 | |||
522 | if (debounce) { | ||
523 | val |= l; | ||
524 | clk_enable(bank->dbck); | ||
525 | } else { | ||
526 | val &= ~l; | ||
527 | clk_disable(bank->dbck); | ||
528 | } | ||
529 | bank->dbck_enable_mask = val; | ||
530 | |||
531 | __raw_writel(val, reg); | ||
532 | } | ||
533 | |||
534 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
535 | static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | ||
536 | int trigger) | ||
537 | { | ||
538 | void __iomem *base = bank->base; | ||
539 | u32 gpio_bit = 1 << gpio; | ||
540 | u32 val; | ||
541 | |||
542 | if (cpu_is_omap44xx()) { | ||
543 | MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit, | ||
544 | trigger & IRQ_TYPE_LEVEL_LOW); | ||
545 | MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT1, gpio_bit, | ||
546 | trigger & IRQ_TYPE_LEVEL_HIGH); | ||
547 | MOD_REG_BIT(OMAP4_GPIO_RISINGDETECT, gpio_bit, | ||
548 | trigger & IRQ_TYPE_EDGE_RISING); | ||
549 | MOD_REG_BIT(OMAP4_GPIO_FALLINGDETECT, gpio_bit, | ||
550 | trigger & IRQ_TYPE_EDGE_FALLING); | ||
551 | } else { | ||
552 | MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, | ||
553 | trigger & IRQ_TYPE_LEVEL_LOW); | ||
554 | MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, | ||
555 | trigger & IRQ_TYPE_LEVEL_HIGH); | ||
556 | MOD_REG_BIT(OMAP24XX_GPIO_RISINGDETECT, gpio_bit, | ||
557 | trigger & IRQ_TYPE_EDGE_RISING); | ||
558 | MOD_REG_BIT(OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, | ||
559 | trigger & IRQ_TYPE_EDGE_FALLING); | ||
560 | } | ||
561 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { | ||
562 | if (cpu_is_omap44xx()) { | ||
563 | if (trigger != 0) | ||
564 | __raw_writel(1 << gpio, bank->base+ | ||
565 | OMAP4_GPIO_IRQWAKEN0); | ||
566 | else { | ||
567 | val = __raw_readl(bank->base + | ||
568 | OMAP4_GPIO_IRQWAKEN0); | ||
569 | __raw_writel(val & (~(1 << gpio)), bank->base + | ||
570 | OMAP4_GPIO_IRQWAKEN0); | ||
571 | } | ||
572 | } else { | ||
573 | /* | ||
574 | * GPIO wakeup request can only be generated on edge | ||
575 | * transitions | ||
576 | */ | ||
577 | if (trigger & IRQ_TYPE_EDGE_BOTH) | ||
578 | __raw_writel(1 << gpio, bank->base | ||
579 | + OMAP24XX_GPIO_SETWKUENA); | ||
580 | else | ||
581 | __raw_writel(1 << gpio, bank->base | ||
582 | + OMAP24XX_GPIO_CLEARWKUENA); | ||
583 | } | ||
584 | } | ||
585 | /* This part needs to be executed always for OMAP34xx */ | ||
586 | if (cpu_is_omap34xx() || (bank->non_wakeup_gpios & gpio_bit)) { | ||
587 | /* | ||
588 | * Log the edge gpio and manually trigger the IRQ | ||
589 | * after resume if the input level changes | ||
590 | * to avoid irq lost during PER RET/OFF mode | ||
591 | * Applies for omap2 non-wakeup gpio and all omap3 gpios | ||
592 | */ | ||
593 | if (trigger & IRQ_TYPE_EDGE_BOTH) | ||
594 | bank->enabled_non_wakeup_gpios |= gpio_bit; | ||
595 | else | ||
596 | bank->enabled_non_wakeup_gpios &= ~gpio_bit; | ||
597 | } | ||
598 | |||
599 | if (cpu_is_omap44xx()) { | ||
600 | bank->level_mask = | ||
601 | __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT0) | | ||
602 | __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT1); | ||
603 | } else { | ||
604 | bank->level_mask = | ||
605 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) | | ||
606 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | ||
607 | } | ||
608 | } | ||
609 | #endif | ||
610 | |||
611 | #ifdef CONFIG_ARCH_OMAP1 | ||
612 | /* | ||
613 | * This only applies to chips that can't do both rising and falling edge | ||
614 | * detection at once. For all other chips, this function is a noop. | ||
615 | */ | ||
616 | static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) | ||
617 | { | ||
618 | void __iomem *reg = bank->base; | ||
619 | u32 l = 0; | ||
620 | |||
621 | switch (bank->method) { | ||
622 | case METHOD_MPUIO: | ||
623 | reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride; | ||
624 | break; | ||
625 | #ifdef CONFIG_ARCH_OMAP15XX | ||
626 | case METHOD_GPIO_1510: | ||
627 | reg += OMAP1510_GPIO_INT_CONTROL; | ||
628 | break; | ||
629 | #endif | ||
630 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
631 | case METHOD_GPIO_7XX: | ||
632 | reg += OMAP7XX_GPIO_INT_CONTROL; | ||
633 | break; | ||
634 | #endif | ||
635 | default: | ||
636 | return; | ||
637 | } | ||
638 | |||
639 | l = __raw_readl(reg); | ||
640 | if ((l >> gpio) & 1) | ||
641 | l &= ~(1 << gpio); | ||
642 | else | ||
643 | l |= 1 << gpio; | ||
644 | |||
645 | __raw_writel(l, reg); | ||
646 | } | ||
647 | #endif | ||
648 | |||
649 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | ||
650 | { | ||
651 | void __iomem *reg = bank->base; | ||
652 | u32 l = 0; | ||
653 | |||
654 | switch (bank->method) { | ||
655 | #ifdef CONFIG_ARCH_OMAP1 | ||
656 | case METHOD_MPUIO: | ||
657 | reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride; | ||
658 | l = __raw_readl(reg); | ||
659 | if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) | ||
660 | bank->toggle_mask |= 1 << gpio; | ||
661 | if (trigger & IRQ_TYPE_EDGE_RISING) | ||
662 | l |= 1 << gpio; | ||
663 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | ||
664 | l &= ~(1 << gpio); | ||
665 | else | ||
666 | goto bad; | ||
667 | break; | ||
668 | #endif | ||
669 | #ifdef CONFIG_ARCH_OMAP15XX | ||
670 | case METHOD_GPIO_1510: | ||
671 | reg += OMAP1510_GPIO_INT_CONTROL; | ||
672 | l = __raw_readl(reg); | ||
673 | if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) | ||
674 | bank->toggle_mask |= 1 << gpio; | ||
675 | if (trigger & IRQ_TYPE_EDGE_RISING) | ||
676 | l |= 1 << gpio; | ||
677 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | ||
678 | l &= ~(1 << gpio); | ||
679 | else | ||
680 | goto bad; | ||
681 | break; | ||
682 | #endif | ||
683 | #ifdef CONFIG_ARCH_OMAP16XX | ||
684 | case METHOD_GPIO_1610: | ||
685 | if (gpio & 0x08) | ||
686 | reg += OMAP1610_GPIO_EDGE_CTRL2; | ||
687 | else | ||
688 | reg += OMAP1610_GPIO_EDGE_CTRL1; | ||
689 | gpio &= 0x07; | ||
690 | l = __raw_readl(reg); | ||
691 | l &= ~(3 << (gpio << 1)); | ||
692 | if (trigger & IRQ_TYPE_EDGE_RISING) | ||
693 | l |= 2 << (gpio << 1); | ||
694 | if (trigger & IRQ_TYPE_EDGE_FALLING) | ||
695 | l |= 1 << (gpio << 1); | ||
696 | if (trigger) | ||
697 | /* Enable wake-up during idle for dynamic tick */ | ||
698 | __raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_SET_WAKEUPENA); | ||
699 | else | ||
700 | __raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA); | ||
701 | break; | ||
702 | #endif | ||
703 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
704 | case METHOD_GPIO_7XX: | ||
705 | reg += OMAP7XX_GPIO_INT_CONTROL; | ||
706 | l = __raw_readl(reg); | ||
707 | if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) | ||
708 | bank->toggle_mask |= 1 << gpio; | ||
709 | if (trigger & IRQ_TYPE_EDGE_RISING) | ||
710 | l |= 1 << gpio; | ||
711 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | ||
712 | l &= ~(1 << gpio); | ||
713 | else | ||
714 | goto bad; | ||
715 | break; | ||
716 | #endif | ||
717 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
718 | case METHOD_GPIO_24XX: | ||
719 | case METHOD_GPIO_44XX: | ||
720 | set_24xx_gpio_triggering(bank, gpio, trigger); | ||
721 | return 0; | ||
722 | #endif | ||
723 | default: | ||
724 | goto bad; | ||
725 | } | ||
726 | __raw_writel(l, reg); | ||
727 | return 0; | ||
728 | bad: | ||
729 | return -EINVAL; | ||
730 | } | ||
731 | |||
732 | static int gpio_irq_type(struct irq_data *d, unsigned type) | ||
733 | { | ||
734 | struct gpio_bank *bank; | ||
735 | unsigned gpio; | ||
736 | int retval; | ||
737 | unsigned long flags; | ||
738 | |||
739 | if (!cpu_class_is_omap2() && d->irq > IH_MPUIO_BASE) | ||
740 | gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE); | ||
741 | else | ||
742 | gpio = d->irq - IH_GPIO_BASE; | ||
743 | |||
744 | if (check_gpio(gpio) < 0) | ||
745 | return -EINVAL; | ||
746 | |||
747 | if (type & ~IRQ_TYPE_SENSE_MASK) | ||
748 | return -EINVAL; | ||
749 | |||
750 | /* OMAP1 allows only only edge triggering */ | ||
751 | if (!cpu_class_is_omap2() | ||
752 | && (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH))) | ||
753 | return -EINVAL; | ||
754 | |||
755 | bank = irq_data_get_irq_chip_data(d); | ||
756 | spin_lock_irqsave(&bank->lock, flags); | ||
757 | retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type); | ||
758 | spin_unlock_irqrestore(&bank->lock, flags); | ||
759 | |||
760 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) | ||
761 | __irq_set_handler_locked(d->irq, handle_level_irq); | ||
762 | else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) | ||
763 | __irq_set_handler_locked(d->irq, handle_edge_irq); | ||
764 | |||
765 | return retval; | ||
766 | } | ||
767 | |||
768 | static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | ||
769 | { | ||
770 | void __iomem *reg = bank->base; | ||
771 | |||
772 | switch (bank->method) { | ||
773 | #ifdef CONFIG_ARCH_OMAP1 | ||
774 | case METHOD_MPUIO: | ||
775 | /* MPUIO irqstatus is reset by reading the status register, | ||
776 | * so do nothing here */ | ||
777 | return; | ||
778 | #endif | ||
779 | #ifdef CONFIG_ARCH_OMAP15XX | ||
780 | case METHOD_GPIO_1510: | ||
781 | reg += OMAP1510_GPIO_INT_STATUS; | ||
782 | break; | ||
783 | #endif | ||
784 | #ifdef CONFIG_ARCH_OMAP16XX | ||
785 | case METHOD_GPIO_1610: | ||
786 | reg += OMAP1610_GPIO_IRQSTATUS1; | ||
787 | break; | ||
788 | #endif | ||
789 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
790 | case METHOD_GPIO_7XX: | ||
791 | reg += OMAP7XX_GPIO_INT_STATUS; | ||
792 | break; | ||
793 | #endif | ||
794 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
795 | case METHOD_GPIO_24XX: | ||
796 | reg += OMAP24XX_GPIO_IRQSTATUS1; | ||
797 | break; | ||
798 | #endif | ||
799 | #if defined(CONFIG_ARCH_OMAP4) | ||
800 | case METHOD_GPIO_44XX: | ||
801 | reg += OMAP4_GPIO_IRQSTATUS0; | ||
802 | break; | ||
803 | #endif | ||
804 | default: | ||
805 | WARN_ON(1); | ||
806 | return; | ||
807 | } | ||
808 | __raw_writel(gpio_mask, reg); | ||
809 | |||
810 | /* Workaround for clearing DSP GPIO interrupts to allow retention */ | ||
811 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
812 | reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2; | ||
813 | else if (cpu_is_omap44xx()) | ||
814 | reg = bank->base + OMAP4_GPIO_IRQSTATUS1; | ||
815 | |||
816 | if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { | ||
817 | __raw_writel(gpio_mask, reg); | ||
818 | |||
819 | /* Flush posted write for the irq status to avoid spurious interrupts */ | ||
820 | __raw_readl(reg); | ||
821 | } | ||
822 | } | ||
823 | |||
824 | static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) | ||
825 | { | ||
826 | _clear_gpio_irqbank(bank, 1 << get_gpio_index(gpio)); | ||
827 | } | ||
828 | |||
829 | static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) | ||
830 | { | ||
831 | void __iomem *reg = bank->base; | ||
832 | int inv = 0; | ||
833 | u32 l; | ||
834 | u32 mask; | ||
835 | |||
836 | switch (bank->method) { | ||
837 | #ifdef CONFIG_ARCH_OMAP1 | ||
838 | case METHOD_MPUIO: | ||
839 | reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride; | ||
840 | mask = 0xffff; | ||
841 | inv = 1; | ||
842 | break; | ||
843 | #endif | ||
844 | #ifdef CONFIG_ARCH_OMAP15XX | ||
845 | case METHOD_GPIO_1510: | ||
846 | reg += OMAP1510_GPIO_INT_MASK; | ||
847 | mask = 0xffff; | ||
848 | inv = 1; | ||
849 | break; | ||
850 | #endif | ||
851 | #ifdef CONFIG_ARCH_OMAP16XX | ||
852 | case METHOD_GPIO_1610: | ||
853 | reg += OMAP1610_GPIO_IRQENABLE1; | ||
854 | mask = 0xffff; | ||
855 | break; | ||
856 | #endif | ||
857 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
858 | case METHOD_GPIO_7XX: | ||
859 | reg += OMAP7XX_GPIO_INT_MASK; | ||
860 | mask = 0xffffffff; | ||
861 | inv = 1; | ||
862 | break; | ||
863 | #endif | ||
864 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
865 | case METHOD_GPIO_24XX: | ||
866 | reg += OMAP24XX_GPIO_IRQENABLE1; | ||
867 | mask = 0xffffffff; | ||
868 | break; | ||
869 | #endif | ||
870 | #if defined(CONFIG_ARCH_OMAP4) | ||
871 | case METHOD_GPIO_44XX: | ||
872 | reg += OMAP4_GPIO_IRQSTATUSSET0; | ||
873 | mask = 0xffffffff; | ||
874 | break; | ||
875 | #endif | ||
876 | default: | ||
877 | WARN_ON(1); | ||
878 | return 0; | ||
879 | } | ||
880 | |||
881 | l = __raw_readl(reg); | ||
882 | if (inv) | ||
883 | l = ~l; | ||
884 | l &= mask; | ||
885 | return l; | ||
886 | } | ||
887 | |||
888 | static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable) | ||
889 | { | ||
890 | void __iomem *reg = bank->base; | ||
891 | u32 l; | ||
892 | |||
893 | switch (bank->method) { | ||
894 | #ifdef CONFIG_ARCH_OMAP1 | ||
895 | case METHOD_MPUIO: | ||
896 | reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride; | ||
897 | l = __raw_readl(reg); | ||
898 | if (enable) | ||
899 | l &= ~(gpio_mask); | ||
900 | else | ||
901 | l |= gpio_mask; | ||
902 | break; | ||
903 | #endif | ||
904 | #ifdef CONFIG_ARCH_OMAP15XX | ||
905 | case METHOD_GPIO_1510: | ||
906 | reg += OMAP1510_GPIO_INT_MASK; | ||
907 | l = __raw_readl(reg); | ||
908 | if (enable) | ||
909 | l &= ~(gpio_mask); | ||
910 | else | ||
911 | l |= gpio_mask; | ||
912 | break; | ||
913 | #endif | ||
914 | #ifdef CONFIG_ARCH_OMAP16XX | ||
915 | case METHOD_GPIO_1610: | ||
916 | if (enable) | ||
917 | reg += OMAP1610_GPIO_SET_IRQENABLE1; | ||
918 | else | ||
919 | reg += OMAP1610_GPIO_CLEAR_IRQENABLE1; | ||
920 | l = gpio_mask; | ||
921 | break; | ||
922 | #endif | ||
923 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
924 | case METHOD_GPIO_7XX: | ||
925 | reg += OMAP7XX_GPIO_INT_MASK; | ||
926 | l = __raw_readl(reg); | ||
927 | if (enable) | ||
928 | l &= ~(gpio_mask); | ||
929 | else | ||
930 | l |= gpio_mask; | ||
931 | break; | ||
932 | #endif | ||
933 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
934 | case METHOD_GPIO_24XX: | ||
935 | if (enable) | ||
936 | reg += OMAP24XX_GPIO_SETIRQENABLE1; | ||
937 | else | ||
938 | reg += OMAP24XX_GPIO_CLEARIRQENABLE1; | ||
939 | l = gpio_mask; | ||
940 | break; | ||
941 | #endif | ||
942 | #ifdef CONFIG_ARCH_OMAP4 | ||
943 | case METHOD_GPIO_44XX: | ||
944 | if (enable) | ||
945 | reg += OMAP4_GPIO_IRQSTATUSSET0; | ||
946 | else | ||
947 | reg += OMAP4_GPIO_IRQSTATUSCLR0; | ||
948 | l = gpio_mask; | ||
949 | break; | ||
950 | #endif | ||
951 | default: | ||
952 | WARN_ON(1); | ||
953 | return; | ||
954 | } | ||
955 | __raw_writel(l, reg); | ||
956 | } | ||
957 | |||
958 | static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) | ||
959 | { | ||
960 | _enable_gpio_irqbank(bank, 1 << get_gpio_index(gpio), enable); | ||
961 | } | ||
962 | |||
963 | /* | ||
964 | * Note that ENAWAKEUP needs to be enabled in GPIO_SYSCONFIG register. | ||
965 | * 1510 does not seem to have a wake-up register. If JTAG is connected | ||
966 | * to the target, system will wake up always on GPIO events. While | ||
967 | * system is running all registered GPIO interrupts need to have wake-up | ||
968 | * enabled. When system is suspended, only selected GPIO interrupts need | ||
969 | * to have wake-up enabled. | ||
970 | */ | ||
971 | static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | ||
972 | { | ||
973 | unsigned long uninitialized_var(flags); | ||
974 | |||
975 | switch (bank->method) { | ||
976 | #ifdef CONFIG_ARCH_OMAP16XX | ||
977 | case METHOD_MPUIO: | ||
978 | case METHOD_GPIO_1610: | ||
979 | spin_lock_irqsave(&bank->lock, flags); | ||
980 | if (enable) | ||
981 | bank->suspend_wakeup |= (1 << gpio); | ||
982 | else | ||
983 | bank->suspend_wakeup &= ~(1 << gpio); | ||
984 | spin_unlock_irqrestore(&bank->lock, flags); | ||
985 | return 0; | ||
986 | #endif | ||
987 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
988 | case METHOD_GPIO_24XX: | ||
989 | case METHOD_GPIO_44XX: | ||
990 | if (bank->non_wakeup_gpios & (1 << gpio)) { | ||
991 | printk(KERN_ERR "Unable to modify wakeup on " | ||
992 | "non-wakeup GPIO%d\n", | ||
993 | (bank - gpio_bank) * 32 + gpio); | ||
994 | return -EINVAL; | ||
995 | } | ||
996 | spin_lock_irqsave(&bank->lock, flags); | ||
997 | if (enable) | ||
998 | bank->suspend_wakeup |= (1 << gpio); | ||
999 | else | ||
1000 | bank->suspend_wakeup &= ~(1 << gpio); | ||
1001 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1002 | return 0; | ||
1003 | #endif | ||
1004 | default: | ||
1005 | printk(KERN_ERR "Can't enable GPIO wakeup for method %i\n", | ||
1006 | bank->method); | ||
1007 | return -EINVAL; | ||
1008 | } | ||
1009 | } | ||
1010 | |||
1011 | static void _reset_gpio(struct gpio_bank *bank, int gpio) | ||
1012 | { | ||
1013 | _set_gpio_direction(bank, get_gpio_index(gpio), 1); | ||
1014 | _set_gpio_irqenable(bank, gpio, 0); | ||
1015 | _clear_gpio_irqstatus(bank, gpio); | ||
1016 | _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); | ||
1017 | } | ||
1018 | |||
1019 | /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */ | ||
1020 | static int gpio_wake_enable(struct irq_data *d, unsigned int enable) | ||
1021 | { | ||
1022 | unsigned int gpio = d->irq - IH_GPIO_BASE; | ||
1023 | struct gpio_bank *bank; | ||
1024 | int retval; | ||
1025 | |||
1026 | if (check_gpio(gpio) < 0) | ||
1027 | return -ENODEV; | ||
1028 | bank = irq_data_get_irq_chip_data(d); | ||
1029 | retval = _set_gpio_wakeup(bank, get_gpio_index(gpio), enable); | ||
1030 | |||
1031 | return retval; | ||
1032 | } | ||
1033 | |||
1034 | static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) | ||
1035 | { | ||
1036 | struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); | ||
1037 | unsigned long flags; | ||
1038 | |||
1039 | spin_lock_irqsave(&bank->lock, flags); | ||
1040 | |||
1041 | /* Set trigger to none. You need to enable the desired trigger with | ||
1042 | * request_irq() or set_irq_type(). | ||
1043 | */ | ||
1044 | _set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); | ||
1045 | |||
1046 | #ifdef CONFIG_ARCH_OMAP15XX | ||
1047 | if (bank->method == METHOD_GPIO_1510) { | ||
1048 | void __iomem *reg; | ||
1049 | |||
1050 | /* Claim the pin for MPU */ | ||
1051 | reg = bank->base + OMAP1510_GPIO_PIN_CONTROL; | ||
1052 | __raw_writel(__raw_readl(reg) | (1 << offset), reg); | ||
1053 | } | ||
1054 | #endif | ||
1055 | if (!cpu_class_is_omap1()) { | ||
1056 | if (!bank->mod_usage) { | ||
1057 | void __iomem *reg = bank->base; | ||
1058 | u32 ctrl; | ||
1059 | |||
1060 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
1061 | reg += OMAP24XX_GPIO_CTRL; | ||
1062 | else if (cpu_is_omap44xx()) | ||
1063 | reg += OMAP4_GPIO_CTRL; | ||
1064 | ctrl = __raw_readl(reg); | ||
1065 | /* Module is enabled, clocks are not gated */ | ||
1066 | ctrl &= 0xFFFFFFFE; | ||
1067 | __raw_writel(ctrl, reg); | ||
1068 | } | ||
1069 | bank->mod_usage |= 1 << offset; | ||
1070 | } | ||
1071 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1072 | |||
1073 | return 0; | ||
1074 | } | ||
1075 | |||
1076 | static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) | ||
1077 | { | ||
1078 | struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); | ||
1079 | unsigned long flags; | ||
1080 | |||
1081 | spin_lock_irqsave(&bank->lock, flags); | ||
1082 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1083 | if (bank->method == METHOD_GPIO_1610) { | ||
1084 | /* Disable wake-up during idle for dynamic tick */ | ||
1085 | void __iomem *reg = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; | ||
1086 | __raw_writel(1 << offset, reg); | ||
1087 | } | ||
1088 | #endif | ||
1089 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
1090 | if (bank->method == METHOD_GPIO_24XX) { | ||
1091 | /* Disable wake-up during idle for dynamic tick */ | ||
1092 | void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | ||
1093 | __raw_writel(1 << offset, reg); | ||
1094 | } | ||
1095 | #endif | ||
1096 | #ifdef CONFIG_ARCH_OMAP4 | ||
1097 | if (bank->method == METHOD_GPIO_44XX) { | ||
1098 | /* Disable wake-up during idle for dynamic tick */ | ||
1099 | void __iomem *reg = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1100 | __raw_writel(1 << offset, reg); | ||
1101 | } | ||
1102 | #endif | ||
1103 | if (!cpu_class_is_omap1()) { | ||
1104 | bank->mod_usage &= ~(1 << offset); | ||
1105 | if (!bank->mod_usage) { | ||
1106 | void __iomem *reg = bank->base; | ||
1107 | u32 ctrl; | ||
1108 | |||
1109 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
1110 | reg += OMAP24XX_GPIO_CTRL; | ||
1111 | else if (cpu_is_omap44xx()) | ||
1112 | reg += OMAP4_GPIO_CTRL; | ||
1113 | ctrl = __raw_readl(reg); | ||
1114 | /* Module is disabled, clocks are gated */ | ||
1115 | ctrl |= 1; | ||
1116 | __raw_writel(ctrl, reg); | ||
1117 | } | ||
1118 | } | ||
1119 | _reset_gpio(bank, bank->chip.base + offset); | ||
1120 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1121 | } | ||
1122 | |||
1123 | /* | ||
1124 | * We need to unmask the GPIO bank interrupt as soon as possible to | ||
1125 | * avoid missing GPIO interrupts for other lines in the bank. | ||
1126 | * Then we need to mask-read-clear-unmask the triggered GPIO lines | ||
1127 | * in the bank to avoid missing nested interrupts for a GPIO line. | ||
1128 | * If we wait to unmask individual GPIO lines in the bank after the | ||
1129 | * line's interrupt handler has been run, we may miss some nested | ||
1130 | * interrupts. | ||
1131 | */ | ||
1132 | static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | ||
1133 | { | ||
1134 | void __iomem *isr_reg = NULL; | ||
1135 | u32 isr; | ||
1136 | unsigned int gpio_irq, gpio_index; | ||
1137 | struct gpio_bank *bank; | ||
1138 | u32 retrigger = 0; | ||
1139 | int unmasked = 0; | ||
1140 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
1141 | |||
1142 | chained_irq_enter(chip, desc); | ||
1143 | |||
1144 | bank = irq_get_handler_data(irq); | ||
1145 | #ifdef CONFIG_ARCH_OMAP1 | ||
1146 | if (bank->method == METHOD_MPUIO) | ||
1147 | isr_reg = bank->base + | ||
1148 | OMAP_MPUIO_GPIO_INT / bank->stride; | ||
1149 | #endif | ||
1150 | #ifdef CONFIG_ARCH_OMAP15XX | ||
1151 | if (bank->method == METHOD_GPIO_1510) | ||
1152 | isr_reg = bank->base + OMAP1510_GPIO_INT_STATUS; | ||
1153 | #endif | ||
1154 | #if defined(CONFIG_ARCH_OMAP16XX) | ||
1155 | if (bank->method == METHOD_GPIO_1610) | ||
1156 | isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1; | ||
1157 | #endif | ||
1158 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
1159 | if (bank->method == METHOD_GPIO_7XX) | ||
1160 | isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS; | ||
1161 | #endif | ||
1162 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
1163 | if (bank->method == METHOD_GPIO_24XX) | ||
1164 | isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; | ||
1165 | #endif | ||
1166 | #if defined(CONFIG_ARCH_OMAP4) | ||
1167 | if (bank->method == METHOD_GPIO_44XX) | ||
1168 | isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0; | ||
1169 | #endif | ||
1170 | |||
1171 | if (WARN_ON(!isr_reg)) | ||
1172 | goto exit; | ||
1173 | |||
1174 | while(1) { | ||
1175 | u32 isr_saved, level_mask = 0; | ||
1176 | u32 enabled; | ||
1177 | |||
1178 | enabled = _get_gpio_irqbank_mask(bank); | ||
1179 | isr_saved = isr = __raw_readl(isr_reg) & enabled; | ||
1180 | |||
1181 | if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO)) | ||
1182 | isr &= 0x0000ffff; | ||
1183 | |||
1184 | if (cpu_class_is_omap2()) { | ||
1185 | level_mask = bank->level_mask & enabled; | ||
1186 | } | ||
1187 | |||
1188 | /* clear edge sensitive interrupts before handler(s) are | ||
1189 | called so that we don't miss any interrupt occurred while | ||
1190 | executing them */ | ||
1191 | _enable_gpio_irqbank(bank, isr_saved & ~level_mask, 0); | ||
1192 | _clear_gpio_irqbank(bank, isr_saved & ~level_mask); | ||
1193 | _enable_gpio_irqbank(bank, isr_saved & ~level_mask, 1); | ||
1194 | |||
1195 | /* if there is only edge sensitive GPIO pin interrupts | ||
1196 | configured, we could unmask GPIO bank interrupt immediately */ | ||
1197 | if (!level_mask && !unmasked) { | ||
1198 | unmasked = 1; | ||
1199 | chained_irq_exit(chip, desc); | ||
1200 | } | ||
1201 | |||
1202 | isr |= retrigger; | ||
1203 | retrigger = 0; | ||
1204 | if (!isr) | ||
1205 | break; | ||
1206 | |||
1207 | gpio_irq = bank->virtual_irq_start; | ||
1208 | for (; isr != 0; isr >>= 1, gpio_irq++) { | ||
1209 | gpio_index = get_gpio_index(irq_to_gpio(gpio_irq)); | ||
1210 | |||
1211 | if (!(isr & 1)) | ||
1212 | continue; | ||
1213 | |||
1214 | #ifdef CONFIG_ARCH_OMAP1 | ||
1215 | /* | ||
1216 | * Some chips can't respond to both rising and falling | ||
1217 | * at the same time. If this irq was requested with | ||
1218 | * both flags, we need to flip the ICR data for the IRQ | ||
1219 | * to respond to the IRQ for the opposite direction. | ||
1220 | * This will be indicated in the bank toggle_mask. | ||
1221 | */ | ||
1222 | if (bank->toggle_mask & (1 << gpio_index)) | ||
1223 | _toggle_gpio_edge_triggering(bank, gpio_index); | ||
1224 | #endif | ||
1225 | |||
1226 | generic_handle_irq(gpio_irq); | ||
1227 | } | ||
1228 | } | ||
1229 | /* if bank has any level sensitive GPIO pin interrupt | ||
1230 | configured, we must unmask the bank interrupt only after | ||
1231 | handler(s) are executed in order to avoid spurious bank | ||
1232 | interrupt */ | ||
1233 | exit: | ||
1234 | if (!unmasked) | ||
1235 | chained_irq_exit(chip, desc); | ||
1236 | } | ||
1237 | |||
1238 | static void gpio_irq_shutdown(struct irq_data *d) | ||
1239 | { | ||
1240 | unsigned int gpio = d->irq - IH_GPIO_BASE; | ||
1241 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
1242 | |||
1243 | _reset_gpio(bank, gpio); | ||
1244 | } | ||
1245 | |||
1246 | static void gpio_ack_irq(struct irq_data *d) | ||
1247 | { | ||
1248 | unsigned int gpio = d->irq - IH_GPIO_BASE; | ||
1249 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
1250 | |||
1251 | _clear_gpio_irqstatus(bank, gpio); | ||
1252 | } | ||
1253 | |||
1254 | static void gpio_mask_irq(struct irq_data *d) | ||
1255 | { | ||
1256 | unsigned int gpio = d->irq - IH_GPIO_BASE; | ||
1257 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
1258 | |||
1259 | _set_gpio_irqenable(bank, gpio, 0); | ||
1260 | _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); | ||
1261 | } | ||
1262 | |||
1263 | static void gpio_unmask_irq(struct irq_data *d) | ||
1264 | { | ||
1265 | unsigned int gpio = d->irq - IH_GPIO_BASE; | ||
1266 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
1267 | unsigned int irq_mask = 1 << get_gpio_index(gpio); | ||
1268 | u32 trigger = irqd_get_trigger_type(d); | ||
1269 | |||
1270 | if (trigger) | ||
1271 | _set_gpio_triggering(bank, get_gpio_index(gpio), trigger); | ||
1272 | |||
1273 | /* For level-triggered GPIOs, the clearing must be done after | ||
1274 | * the HW source is cleared, thus after the handler has run */ | ||
1275 | if (bank->level_mask & irq_mask) { | ||
1276 | _set_gpio_irqenable(bank, gpio, 0); | ||
1277 | _clear_gpio_irqstatus(bank, gpio); | ||
1278 | } | ||
1279 | |||
1280 | _set_gpio_irqenable(bank, gpio, 1); | ||
1281 | } | ||
1282 | |||
1283 | static struct irq_chip gpio_irq_chip = { | ||
1284 | .name = "GPIO", | ||
1285 | .irq_shutdown = gpio_irq_shutdown, | ||
1286 | .irq_ack = gpio_ack_irq, | ||
1287 | .irq_mask = gpio_mask_irq, | ||
1288 | .irq_unmask = gpio_unmask_irq, | ||
1289 | .irq_set_type = gpio_irq_type, | ||
1290 | .irq_set_wake = gpio_wake_enable, | ||
1291 | }; | ||
1292 | |||
1293 | /*---------------------------------------------------------------------*/ | ||
1294 | |||
1295 | #ifdef CONFIG_ARCH_OMAP1 | ||
1296 | |||
1297 | /* MPUIO uses the always-on 32k clock */ | ||
1298 | |||
1299 | static void mpuio_ack_irq(struct irq_data *d) | ||
1300 | { | ||
1301 | /* The ISR is reset automatically, so do nothing here. */ | ||
1302 | } | ||
1303 | |||
1304 | static void mpuio_mask_irq(struct irq_data *d) | ||
1305 | { | ||
1306 | unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE); | ||
1307 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
1308 | |||
1309 | _set_gpio_irqenable(bank, gpio, 0); | ||
1310 | } | ||
1311 | |||
1312 | static void mpuio_unmask_irq(struct irq_data *d) | ||
1313 | { | ||
1314 | unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE); | ||
1315 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
1316 | |||
1317 | _set_gpio_irqenable(bank, gpio, 1); | ||
1318 | } | ||
1319 | |||
1320 | static struct irq_chip mpuio_irq_chip = { | ||
1321 | .name = "MPUIO", | ||
1322 | .irq_ack = mpuio_ack_irq, | ||
1323 | .irq_mask = mpuio_mask_irq, | ||
1324 | .irq_unmask = mpuio_unmask_irq, | ||
1325 | .irq_set_type = gpio_irq_type, | ||
1326 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1327 | /* REVISIT: assuming only 16xx supports MPUIO wake events */ | ||
1328 | .irq_set_wake = gpio_wake_enable, | ||
1329 | #endif | ||
1330 | }; | ||
1331 | |||
1332 | |||
1333 | #define bank_is_mpuio(bank) ((bank)->method == METHOD_MPUIO) | ||
1334 | |||
1335 | |||
1336 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1337 | |||
1338 | #include <linux/platform_device.h> | ||
1339 | |||
1340 | static int omap_mpuio_suspend_noirq(struct device *dev) | ||
1341 | { | ||
1342 | struct platform_device *pdev = to_platform_device(dev); | ||
1343 | struct gpio_bank *bank = platform_get_drvdata(pdev); | ||
1344 | void __iomem *mask_reg = bank->base + | ||
1345 | OMAP_MPUIO_GPIO_MASKIT / bank->stride; | ||
1346 | unsigned long flags; | ||
1347 | |||
1348 | spin_lock_irqsave(&bank->lock, flags); | ||
1349 | bank->saved_wakeup = __raw_readl(mask_reg); | ||
1350 | __raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg); | ||
1351 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1352 | |||
1353 | return 0; | ||
1354 | } | ||
1355 | |||
1356 | static int omap_mpuio_resume_noirq(struct device *dev) | ||
1357 | { | ||
1358 | struct platform_device *pdev = to_platform_device(dev); | ||
1359 | struct gpio_bank *bank = platform_get_drvdata(pdev); | ||
1360 | void __iomem *mask_reg = bank->base + | ||
1361 | OMAP_MPUIO_GPIO_MASKIT / bank->stride; | ||
1362 | unsigned long flags; | ||
1363 | |||
1364 | spin_lock_irqsave(&bank->lock, flags); | ||
1365 | __raw_writel(bank->saved_wakeup, mask_reg); | ||
1366 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1367 | |||
1368 | return 0; | ||
1369 | } | ||
1370 | |||
1371 | static const struct dev_pm_ops omap_mpuio_dev_pm_ops = { | ||
1372 | .suspend_noirq = omap_mpuio_suspend_noirq, | ||
1373 | .resume_noirq = omap_mpuio_resume_noirq, | ||
1374 | }; | ||
1375 | |||
1376 | /* use platform_driver for this. */ | ||
1377 | static struct platform_driver omap_mpuio_driver = { | ||
1378 | .driver = { | ||
1379 | .name = "mpuio", | ||
1380 | .pm = &omap_mpuio_dev_pm_ops, | ||
1381 | }, | ||
1382 | }; | ||
1383 | |||
1384 | static struct platform_device omap_mpuio_device = { | ||
1385 | .name = "mpuio", | ||
1386 | .id = -1, | ||
1387 | .dev = { | ||
1388 | .driver = &omap_mpuio_driver.driver, | ||
1389 | } | ||
1390 | /* could list the /proc/iomem resources */ | ||
1391 | }; | ||
1392 | |||
1393 | static inline void mpuio_init(void) | ||
1394 | { | ||
1395 | struct gpio_bank *bank = get_gpio_bank(OMAP_MPUIO(0)); | ||
1396 | platform_set_drvdata(&omap_mpuio_device, bank); | ||
1397 | |||
1398 | if (platform_driver_register(&omap_mpuio_driver) == 0) | ||
1399 | (void) platform_device_register(&omap_mpuio_device); | ||
1400 | } | ||
1401 | |||
1402 | #else | ||
1403 | static inline void mpuio_init(void) {} | ||
1404 | #endif /* 16xx */ | ||
1405 | |||
1406 | #else | ||
1407 | |||
1408 | extern struct irq_chip mpuio_irq_chip; | ||
1409 | |||
1410 | #define bank_is_mpuio(bank) 0 | ||
1411 | static inline void mpuio_init(void) {} | ||
1412 | |||
1413 | #endif | ||
1414 | |||
1415 | /*---------------------------------------------------------------------*/ | ||
1416 | |||
1417 | /* REVISIT these are stupid implementations! replace by ones that | ||
1418 | * don't switch on METHOD_* and which mostly avoid spinlocks | ||
1419 | */ | ||
1420 | |||
1421 | static int gpio_input(struct gpio_chip *chip, unsigned offset) | ||
1422 | { | ||
1423 | struct gpio_bank *bank; | ||
1424 | unsigned long flags; | ||
1425 | |||
1426 | bank = container_of(chip, struct gpio_bank, chip); | ||
1427 | spin_lock_irqsave(&bank->lock, flags); | ||
1428 | _set_gpio_direction(bank, offset, 1); | ||
1429 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1430 | return 0; | ||
1431 | } | ||
1432 | |||
1433 | static int gpio_is_input(struct gpio_bank *bank, int mask) | ||
1434 | { | ||
1435 | void __iomem *reg = bank->base; | ||
1436 | |||
1437 | switch (bank->method) { | ||
1438 | case METHOD_MPUIO: | ||
1439 | reg += OMAP_MPUIO_IO_CNTL / bank->stride; | ||
1440 | break; | ||
1441 | case METHOD_GPIO_1510: | ||
1442 | reg += OMAP1510_GPIO_DIR_CONTROL; | ||
1443 | break; | ||
1444 | case METHOD_GPIO_1610: | ||
1445 | reg += OMAP1610_GPIO_DIRECTION; | ||
1446 | break; | ||
1447 | case METHOD_GPIO_7XX: | ||
1448 | reg += OMAP7XX_GPIO_DIR_CONTROL; | ||
1449 | break; | ||
1450 | case METHOD_GPIO_24XX: | ||
1451 | reg += OMAP24XX_GPIO_OE; | ||
1452 | break; | ||
1453 | case METHOD_GPIO_44XX: | ||
1454 | reg += OMAP4_GPIO_OE; | ||
1455 | break; | ||
1456 | default: | ||
1457 | WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method"); | ||
1458 | return -EINVAL; | ||
1459 | } | ||
1460 | return __raw_readl(reg) & mask; | ||
1461 | } | ||
1462 | |||
1463 | static int gpio_get(struct gpio_chip *chip, unsigned offset) | ||
1464 | { | ||
1465 | struct gpio_bank *bank; | ||
1466 | void __iomem *reg; | ||
1467 | int gpio; | ||
1468 | u32 mask; | ||
1469 | |||
1470 | gpio = chip->base + offset; | ||
1471 | bank = get_gpio_bank(gpio); | ||
1472 | reg = bank->base; | ||
1473 | mask = 1 << get_gpio_index(gpio); | ||
1474 | |||
1475 | if (gpio_is_input(bank, mask)) | ||
1476 | return _get_gpio_datain(bank, gpio); | ||
1477 | else | ||
1478 | return _get_gpio_dataout(bank, gpio); | ||
1479 | } | ||
1480 | |||
1481 | static int gpio_output(struct gpio_chip *chip, unsigned offset, int value) | ||
1482 | { | ||
1483 | struct gpio_bank *bank; | ||
1484 | unsigned long flags; | ||
1485 | |||
1486 | bank = container_of(chip, struct gpio_bank, chip); | ||
1487 | spin_lock_irqsave(&bank->lock, flags); | ||
1488 | _set_gpio_dataout(bank, offset, value); | ||
1489 | _set_gpio_direction(bank, offset, 0); | ||
1490 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1491 | return 0; | ||
1492 | } | ||
1493 | |||
1494 | static int gpio_debounce(struct gpio_chip *chip, unsigned offset, | ||
1495 | unsigned debounce) | ||
1496 | { | ||
1497 | struct gpio_bank *bank; | ||
1498 | unsigned long flags; | ||
1499 | |||
1500 | bank = container_of(chip, struct gpio_bank, chip); | ||
1501 | |||
1502 | if (!bank->dbck) { | ||
1503 | bank->dbck = clk_get(bank->dev, "dbclk"); | ||
1504 | if (IS_ERR(bank->dbck)) | ||
1505 | dev_err(bank->dev, "Could not get gpio dbck\n"); | ||
1506 | } | ||
1507 | |||
1508 | spin_lock_irqsave(&bank->lock, flags); | ||
1509 | _set_gpio_debounce(bank, offset, debounce); | ||
1510 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1511 | |||
1512 | return 0; | ||
1513 | } | ||
1514 | |||
1515 | static void gpio_set(struct gpio_chip *chip, unsigned offset, int value) | ||
1516 | { | ||
1517 | struct gpio_bank *bank; | ||
1518 | unsigned long flags; | ||
1519 | |||
1520 | bank = container_of(chip, struct gpio_bank, chip); | ||
1521 | spin_lock_irqsave(&bank->lock, flags); | ||
1522 | _set_gpio_dataout(bank, offset, value); | ||
1523 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1524 | } | ||
1525 | |||
1526 | static int gpio_2irq(struct gpio_chip *chip, unsigned offset) | ||
1527 | { | ||
1528 | struct gpio_bank *bank; | ||
1529 | |||
1530 | bank = container_of(chip, struct gpio_bank, chip); | ||
1531 | return bank->virtual_irq_start + offset; | ||
1532 | } | ||
1533 | |||
1534 | /*---------------------------------------------------------------------*/ | ||
1535 | |||
1536 | static void __init omap_gpio_show_rev(struct gpio_bank *bank) | ||
1537 | { | ||
1538 | u32 rev; | ||
1539 | |||
1540 | if (cpu_is_omap16xx() && !(bank->method != METHOD_MPUIO)) | ||
1541 | rev = __raw_readw(bank->base + OMAP1610_GPIO_REVISION); | ||
1542 | else if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
1543 | rev = __raw_readl(bank->base + OMAP24XX_GPIO_REVISION); | ||
1544 | else if (cpu_is_omap44xx()) | ||
1545 | rev = __raw_readl(bank->base + OMAP4_GPIO_REVISION); | ||
1546 | else | ||
1547 | return; | ||
1548 | |||
1549 | printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n", | ||
1550 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
1551 | } | ||
1552 | |||
1553 | /* This lock class tells lockdep that GPIO irqs are in a different | ||
1554 | * category than their parents, so it won't report false recursion. | ||
1555 | */ | ||
1556 | static struct lock_class_key gpio_lock_class; | ||
1557 | |||
1558 | static inline int init_gpio_info(struct platform_device *pdev) | ||
1559 | { | ||
1560 | /* TODO: Analyze removing gpio_bank_count usage from driver code */ | ||
1561 | gpio_bank = kzalloc(gpio_bank_count * sizeof(struct gpio_bank), | ||
1562 | GFP_KERNEL); | ||
1563 | if (!gpio_bank) { | ||
1564 | dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n"); | ||
1565 | return -ENOMEM; | ||
1566 | } | ||
1567 | return 0; | ||
1568 | } | ||
1569 | |||
1570 | /* TODO: Cleanup cpu_is_* checks */ | ||
1571 | static void omap_gpio_mod_init(struct gpio_bank *bank, int id) | ||
1572 | { | ||
1573 | if (cpu_class_is_omap2()) { | ||
1574 | if (cpu_is_omap44xx()) { | ||
1575 | __raw_writel(0xffffffff, bank->base + | ||
1576 | OMAP4_GPIO_IRQSTATUSCLR0); | ||
1577 | __raw_writel(0x00000000, bank->base + | ||
1578 | OMAP4_GPIO_DEBOUNCENABLE); | ||
1579 | /* Initialize interface clk ungated, module enabled */ | ||
1580 | __raw_writel(0, bank->base + OMAP4_GPIO_CTRL); | ||
1581 | } else if (cpu_is_omap34xx()) { | ||
1582 | __raw_writel(0x00000000, bank->base + | ||
1583 | OMAP24XX_GPIO_IRQENABLE1); | ||
1584 | __raw_writel(0xffffffff, bank->base + | ||
1585 | OMAP24XX_GPIO_IRQSTATUS1); | ||
1586 | __raw_writel(0x00000000, bank->base + | ||
1587 | OMAP24XX_GPIO_DEBOUNCE_EN); | ||
1588 | |||
1589 | /* Initialize interface clk ungated, module enabled */ | ||
1590 | __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL); | ||
1591 | } else if (cpu_is_omap24xx()) { | ||
1592 | static const u32 non_wakeup_gpios[] = { | ||
1593 | 0xe203ffc0, 0x08700040 | ||
1594 | }; | ||
1595 | if (id < ARRAY_SIZE(non_wakeup_gpios)) | ||
1596 | bank->non_wakeup_gpios = non_wakeup_gpios[id]; | ||
1597 | } | ||
1598 | } else if (cpu_class_is_omap1()) { | ||
1599 | if (bank_is_mpuio(bank)) | ||
1600 | __raw_writew(0xffff, bank->base + | ||
1601 | OMAP_MPUIO_GPIO_MASKIT / bank->stride); | ||
1602 | if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) { | ||
1603 | __raw_writew(0xffff, bank->base | ||
1604 | + OMAP1510_GPIO_INT_MASK); | ||
1605 | __raw_writew(0x0000, bank->base | ||
1606 | + OMAP1510_GPIO_INT_STATUS); | ||
1607 | } | ||
1608 | if (cpu_is_omap16xx() && bank->method == METHOD_GPIO_1610) { | ||
1609 | __raw_writew(0x0000, bank->base | ||
1610 | + OMAP1610_GPIO_IRQENABLE1); | ||
1611 | __raw_writew(0xffff, bank->base | ||
1612 | + OMAP1610_GPIO_IRQSTATUS1); | ||
1613 | __raw_writew(0x0014, bank->base | ||
1614 | + OMAP1610_GPIO_SYSCONFIG); | ||
1615 | |||
1616 | /* | ||
1617 | * Enable system clock for GPIO module. | ||
1618 | * The CAM_CLK_CTRL *is* really the right place. | ||
1619 | */ | ||
1620 | omap_writel(omap_readl(ULPD_CAM_CLK_CTRL) | 0x04, | ||
1621 | ULPD_CAM_CLK_CTRL); | ||
1622 | } | ||
1623 | if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_7XX) { | ||
1624 | __raw_writel(0xffffffff, bank->base | ||
1625 | + OMAP7XX_GPIO_INT_MASK); | ||
1626 | __raw_writel(0x00000000, bank->base | ||
1627 | + OMAP7XX_GPIO_INT_STATUS); | ||
1628 | } | ||
1629 | } | ||
1630 | } | ||
1631 | |||
1632 | static void __init omap_gpio_chip_init(struct gpio_bank *bank) | ||
1633 | { | ||
1634 | int j; | ||
1635 | static int gpio; | ||
1636 | |||
1637 | bank->mod_usage = 0; | ||
1638 | /* | ||
1639 | * REVISIT eventually switch from OMAP-specific gpio structs | ||
1640 | * over to the generic ones | ||
1641 | */ | ||
1642 | bank->chip.request = omap_gpio_request; | ||
1643 | bank->chip.free = omap_gpio_free; | ||
1644 | bank->chip.direction_input = gpio_input; | ||
1645 | bank->chip.get = gpio_get; | ||
1646 | bank->chip.direction_output = gpio_output; | ||
1647 | bank->chip.set_debounce = gpio_debounce; | ||
1648 | bank->chip.set = gpio_set; | ||
1649 | bank->chip.to_irq = gpio_2irq; | ||
1650 | if (bank_is_mpuio(bank)) { | ||
1651 | bank->chip.label = "mpuio"; | ||
1652 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1653 | bank->chip.dev = &omap_mpuio_device.dev; | ||
1654 | #endif | ||
1655 | bank->chip.base = OMAP_MPUIO(0); | ||
1656 | } else { | ||
1657 | bank->chip.label = "gpio"; | ||
1658 | bank->chip.base = gpio; | ||
1659 | gpio += bank_width; | ||
1660 | } | ||
1661 | bank->chip.ngpio = bank_width; | ||
1662 | |||
1663 | gpiochip_add(&bank->chip); | ||
1664 | |||
1665 | for (j = bank->virtual_irq_start; | ||
1666 | j < bank->virtual_irq_start + bank_width; j++) { | ||
1667 | irq_set_lockdep_class(j, &gpio_lock_class); | ||
1668 | irq_set_chip_data(j, bank); | ||
1669 | if (bank_is_mpuio(bank)) | ||
1670 | irq_set_chip(j, &mpuio_irq_chip); | ||
1671 | else | ||
1672 | irq_set_chip(j, &gpio_irq_chip); | ||
1673 | irq_set_handler(j, handle_simple_irq); | ||
1674 | set_irq_flags(j, IRQF_VALID); | ||
1675 | } | ||
1676 | irq_set_chained_handler(bank->irq, gpio_irq_handler); | ||
1677 | irq_set_handler_data(bank->irq, bank); | ||
1678 | } | ||
1679 | |||
1680 | static int __devinit omap_gpio_probe(struct platform_device *pdev) | ||
1681 | { | ||
1682 | static int gpio_init_done; | ||
1683 | struct omap_gpio_platform_data *pdata; | ||
1684 | struct resource *res; | ||
1685 | int id; | ||
1686 | struct gpio_bank *bank; | ||
1687 | |||
1688 | if (!pdev->dev.platform_data) | ||
1689 | return -EINVAL; | ||
1690 | |||
1691 | pdata = pdev->dev.platform_data; | ||
1692 | |||
1693 | if (!gpio_init_done) { | ||
1694 | int ret; | ||
1695 | |||
1696 | ret = init_gpio_info(pdev); | ||
1697 | if (ret) | ||
1698 | return ret; | ||
1699 | } | ||
1700 | |||
1701 | id = pdev->id; | ||
1702 | bank = &gpio_bank[id]; | ||
1703 | |||
1704 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
1705 | if (unlikely(!res)) { | ||
1706 | dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n", id); | ||
1707 | return -ENODEV; | ||
1708 | } | ||
1709 | |||
1710 | bank->irq = res->start; | ||
1711 | bank->virtual_irq_start = pdata->virtual_irq_start; | ||
1712 | bank->method = pdata->bank_type; | ||
1713 | bank->dev = &pdev->dev; | ||
1714 | bank->dbck_flag = pdata->dbck_flag; | ||
1715 | bank->stride = pdata->bank_stride; | ||
1716 | bank_width = pdata->bank_width; | ||
1717 | |||
1718 | spin_lock_init(&bank->lock); | ||
1719 | |||
1720 | /* Static mapping, never released */ | ||
1721 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1722 | if (unlikely(!res)) { | ||
1723 | dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n", id); | ||
1724 | return -ENODEV; | ||
1725 | } | ||
1726 | |||
1727 | bank->base = ioremap(res->start, resource_size(res)); | ||
1728 | if (!bank->base) { | ||
1729 | dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n", id); | ||
1730 | return -ENOMEM; | ||
1731 | } | ||
1732 | |||
1733 | pm_runtime_enable(bank->dev); | ||
1734 | pm_runtime_get_sync(bank->dev); | ||
1735 | |||
1736 | omap_gpio_mod_init(bank, id); | ||
1737 | omap_gpio_chip_init(bank); | ||
1738 | omap_gpio_show_rev(bank); | ||
1739 | |||
1740 | if (!gpio_init_done) | ||
1741 | gpio_init_done = 1; | ||
1742 | |||
1743 | return 0; | ||
1744 | } | ||
1745 | |||
1746 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) | ||
1747 | static int omap_gpio_suspend(void) | ||
1748 | { | ||
1749 | int i; | ||
1750 | |||
1751 | if (!cpu_class_is_omap2() && !cpu_is_omap16xx()) | ||
1752 | return 0; | ||
1753 | |||
1754 | for (i = 0; i < gpio_bank_count; i++) { | ||
1755 | struct gpio_bank *bank = &gpio_bank[i]; | ||
1756 | void __iomem *wake_status; | ||
1757 | void __iomem *wake_clear; | ||
1758 | void __iomem *wake_set; | ||
1759 | unsigned long flags; | ||
1760 | |||
1761 | switch (bank->method) { | ||
1762 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1763 | case METHOD_GPIO_1610: | ||
1764 | wake_status = bank->base + OMAP1610_GPIO_WAKEUPENABLE; | ||
1765 | wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; | ||
1766 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | ||
1767 | break; | ||
1768 | #endif | ||
1769 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
1770 | case METHOD_GPIO_24XX: | ||
1771 | wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; | ||
1772 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | ||
1773 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | ||
1774 | break; | ||
1775 | #endif | ||
1776 | #ifdef CONFIG_ARCH_OMAP4 | ||
1777 | case METHOD_GPIO_44XX: | ||
1778 | wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1779 | wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1780 | wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1781 | break; | ||
1782 | #endif | ||
1783 | default: | ||
1784 | continue; | ||
1785 | } | ||
1786 | |||
1787 | spin_lock_irqsave(&bank->lock, flags); | ||
1788 | bank->saved_wakeup = __raw_readl(wake_status); | ||
1789 | __raw_writel(0xffffffff, wake_clear); | ||
1790 | __raw_writel(bank->suspend_wakeup, wake_set); | ||
1791 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1792 | } | ||
1793 | |||
1794 | return 0; | ||
1795 | } | ||
1796 | |||
1797 | static void omap_gpio_resume(void) | ||
1798 | { | ||
1799 | int i; | ||
1800 | |||
1801 | if (!cpu_class_is_omap2() && !cpu_is_omap16xx()) | ||
1802 | return; | ||
1803 | |||
1804 | for (i = 0; i < gpio_bank_count; i++) { | ||
1805 | struct gpio_bank *bank = &gpio_bank[i]; | ||
1806 | void __iomem *wake_clear; | ||
1807 | void __iomem *wake_set; | ||
1808 | unsigned long flags; | ||
1809 | |||
1810 | switch (bank->method) { | ||
1811 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1812 | case METHOD_GPIO_1610: | ||
1813 | wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; | ||
1814 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | ||
1815 | break; | ||
1816 | #endif | ||
1817 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
1818 | case METHOD_GPIO_24XX: | ||
1819 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | ||
1820 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | ||
1821 | break; | ||
1822 | #endif | ||
1823 | #ifdef CONFIG_ARCH_OMAP4 | ||
1824 | case METHOD_GPIO_44XX: | ||
1825 | wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1826 | wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1827 | break; | ||
1828 | #endif | ||
1829 | default: | ||
1830 | continue; | ||
1831 | } | ||
1832 | |||
1833 | spin_lock_irqsave(&bank->lock, flags); | ||
1834 | __raw_writel(0xffffffff, wake_clear); | ||
1835 | __raw_writel(bank->saved_wakeup, wake_set); | ||
1836 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1837 | } | ||
1838 | } | ||
1839 | |||
1840 | static struct syscore_ops omap_gpio_syscore_ops = { | ||
1841 | .suspend = omap_gpio_suspend, | ||
1842 | .resume = omap_gpio_resume, | ||
1843 | }; | ||
1844 | |||
1845 | #endif | ||
1846 | |||
1847 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
1848 | |||
1849 | static int workaround_enabled; | ||
1850 | |||
1851 | void omap2_gpio_prepare_for_idle(int off_mode) | ||
1852 | { | ||
1853 | int i, c = 0; | ||
1854 | int min = 0; | ||
1855 | |||
1856 | if (cpu_is_omap34xx()) | ||
1857 | min = 1; | ||
1858 | |||
1859 | for (i = min; i < gpio_bank_count; i++) { | ||
1860 | struct gpio_bank *bank = &gpio_bank[i]; | ||
1861 | u32 l1 = 0, l2 = 0; | ||
1862 | int j; | ||
1863 | |||
1864 | for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) | ||
1865 | clk_disable(bank->dbck); | ||
1866 | |||
1867 | if (!off_mode) | ||
1868 | continue; | ||
1869 | |||
1870 | /* If going to OFF, remove triggering for all | ||
1871 | * non-wakeup GPIOs. Otherwise spurious IRQs will be | ||
1872 | * generated. See OMAP2420 Errata item 1.101. */ | ||
1873 | if (!(bank->enabled_non_wakeup_gpios)) | ||
1874 | continue; | ||
1875 | |||
1876 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | ||
1877 | bank->saved_datain = __raw_readl(bank->base + | ||
1878 | OMAP24XX_GPIO_DATAIN); | ||
1879 | l1 = __raw_readl(bank->base + | ||
1880 | OMAP24XX_GPIO_FALLINGDETECT); | ||
1881 | l2 = __raw_readl(bank->base + | ||
1882 | OMAP24XX_GPIO_RISINGDETECT); | ||
1883 | } | ||
1884 | |||
1885 | if (cpu_is_omap44xx()) { | ||
1886 | bank->saved_datain = __raw_readl(bank->base + | ||
1887 | OMAP4_GPIO_DATAIN); | ||
1888 | l1 = __raw_readl(bank->base + | ||
1889 | OMAP4_GPIO_FALLINGDETECT); | ||
1890 | l2 = __raw_readl(bank->base + | ||
1891 | OMAP4_GPIO_RISINGDETECT); | ||
1892 | } | ||
1893 | |||
1894 | bank->saved_fallingdetect = l1; | ||
1895 | bank->saved_risingdetect = l2; | ||
1896 | l1 &= ~bank->enabled_non_wakeup_gpios; | ||
1897 | l2 &= ~bank->enabled_non_wakeup_gpios; | ||
1898 | |||
1899 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | ||
1900 | __raw_writel(l1, bank->base + | ||
1901 | OMAP24XX_GPIO_FALLINGDETECT); | ||
1902 | __raw_writel(l2, bank->base + | ||
1903 | OMAP24XX_GPIO_RISINGDETECT); | ||
1904 | } | ||
1905 | |||
1906 | if (cpu_is_omap44xx()) { | ||
1907 | __raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT); | ||
1908 | __raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT); | ||
1909 | } | ||
1910 | |||
1911 | c++; | ||
1912 | } | ||
1913 | if (!c) { | ||
1914 | workaround_enabled = 0; | ||
1915 | return; | ||
1916 | } | ||
1917 | workaround_enabled = 1; | ||
1918 | } | ||
1919 | |||
1920 | void omap2_gpio_resume_after_idle(void) | ||
1921 | { | ||
1922 | int i; | ||
1923 | int min = 0; | ||
1924 | |||
1925 | if (cpu_is_omap34xx()) | ||
1926 | min = 1; | ||
1927 | for (i = min; i < gpio_bank_count; i++) { | ||
1928 | struct gpio_bank *bank = &gpio_bank[i]; | ||
1929 | u32 l = 0, gen, gen0, gen1; | ||
1930 | int j; | ||
1931 | |||
1932 | for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) | ||
1933 | clk_enable(bank->dbck); | ||
1934 | |||
1935 | if (!workaround_enabled) | ||
1936 | continue; | ||
1937 | |||
1938 | if (!(bank->enabled_non_wakeup_gpios)) | ||
1939 | continue; | ||
1940 | |||
1941 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | ||
1942 | __raw_writel(bank->saved_fallingdetect, | ||
1943 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); | ||
1944 | __raw_writel(bank->saved_risingdetect, | ||
1945 | bank->base + OMAP24XX_GPIO_RISINGDETECT); | ||
1946 | l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); | ||
1947 | } | ||
1948 | |||
1949 | if (cpu_is_omap44xx()) { | ||
1950 | __raw_writel(bank->saved_fallingdetect, | ||
1951 | bank->base + OMAP4_GPIO_FALLINGDETECT); | ||
1952 | __raw_writel(bank->saved_risingdetect, | ||
1953 | bank->base + OMAP4_GPIO_RISINGDETECT); | ||
1954 | l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN); | ||
1955 | } | ||
1956 | |||
1957 | /* Check if any of the non-wakeup interrupt GPIOs have changed | ||
1958 | * state. If so, generate an IRQ by software. This is | ||
1959 | * horribly racy, but it's the best we can do to work around | ||
1960 | * this silicon bug. */ | ||
1961 | l ^= bank->saved_datain; | ||
1962 | l &= bank->enabled_non_wakeup_gpios; | ||
1963 | |||
1964 | /* | ||
1965 | * No need to generate IRQs for the rising edge for gpio IRQs | ||
1966 | * configured with falling edge only; and vice versa. | ||
1967 | */ | ||
1968 | gen0 = l & bank->saved_fallingdetect; | ||
1969 | gen0 &= bank->saved_datain; | ||
1970 | |||
1971 | gen1 = l & bank->saved_risingdetect; | ||
1972 | gen1 &= ~(bank->saved_datain); | ||
1973 | |||
1974 | /* FIXME: Consider GPIO IRQs with level detections properly! */ | ||
1975 | gen = l & (~(bank->saved_fallingdetect) & | ||
1976 | ~(bank->saved_risingdetect)); | ||
1977 | /* Consider all GPIO IRQs needed to be updated */ | ||
1978 | gen |= gen0 | gen1; | ||
1979 | |||
1980 | if (gen) { | ||
1981 | u32 old0, old1; | ||
1982 | |||
1983 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | ||
1984 | old0 = __raw_readl(bank->base + | ||
1985 | OMAP24XX_GPIO_LEVELDETECT0); | ||
1986 | old1 = __raw_readl(bank->base + | ||
1987 | OMAP24XX_GPIO_LEVELDETECT1); | ||
1988 | __raw_writel(old0 | gen, bank->base + | ||
1989 | OMAP24XX_GPIO_LEVELDETECT0); | ||
1990 | __raw_writel(old1 | gen, bank->base + | ||
1991 | OMAP24XX_GPIO_LEVELDETECT1); | ||
1992 | __raw_writel(old0, bank->base + | ||
1993 | OMAP24XX_GPIO_LEVELDETECT0); | ||
1994 | __raw_writel(old1, bank->base + | ||
1995 | OMAP24XX_GPIO_LEVELDETECT1); | ||
1996 | } | ||
1997 | |||
1998 | if (cpu_is_omap44xx()) { | ||
1999 | old0 = __raw_readl(bank->base + | ||
2000 | OMAP4_GPIO_LEVELDETECT0); | ||
2001 | old1 = __raw_readl(bank->base + | ||
2002 | OMAP4_GPIO_LEVELDETECT1); | ||
2003 | __raw_writel(old0 | l, bank->base + | ||
2004 | OMAP4_GPIO_LEVELDETECT0); | ||
2005 | __raw_writel(old1 | l, bank->base + | ||
2006 | OMAP4_GPIO_LEVELDETECT1); | ||
2007 | __raw_writel(old0, bank->base + | ||
2008 | OMAP4_GPIO_LEVELDETECT0); | ||
2009 | __raw_writel(old1, bank->base + | ||
2010 | OMAP4_GPIO_LEVELDETECT1); | ||
2011 | } | ||
2012 | } | ||
2013 | } | ||
2014 | |||
2015 | } | ||
2016 | |||
2017 | #endif | ||
2018 | |||
2019 | #ifdef CONFIG_ARCH_OMAP3 | ||
2020 | /* save the registers of bank 2-6 */ | ||
2021 | void omap_gpio_save_context(void) | ||
2022 | { | ||
2023 | int i; | ||
2024 | |||
2025 | /* saving banks from 2-6 only since GPIO1 is in WKUP */ | ||
2026 | for (i = 1; i < gpio_bank_count; i++) { | ||
2027 | struct gpio_bank *bank = &gpio_bank[i]; | ||
2028 | gpio_context[i].irqenable1 = | ||
2029 | __raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE1); | ||
2030 | gpio_context[i].irqenable2 = | ||
2031 | __raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE2); | ||
2032 | gpio_context[i].wake_en = | ||
2033 | __raw_readl(bank->base + OMAP24XX_GPIO_WAKE_EN); | ||
2034 | gpio_context[i].ctrl = | ||
2035 | __raw_readl(bank->base + OMAP24XX_GPIO_CTRL); | ||
2036 | gpio_context[i].oe = | ||
2037 | __raw_readl(bank->base + OMAP24XX_GPIO_OE); | ||
2038 | gpio_context[i].leveldetect0 = | ||
2039 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); | ||
2040 | gpio_context[i].leveldetect1 = | ||
2041 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | ||
2042 | gpio_context[i].risingdetect = | ||
2043 | __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); | ||
2044 | gpio_context[i].fallingdetect = | ||
2045 | __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); | ||
2046 | gpio_context[i].dataout = | ||
2047 | __raw_readl(bank->base + OMAP24XX_GPIO_DATAOUT); | ||
2048 | } | ||
2049 | } | ||
2050 | |||
2051 | /* restore the required registers of bank 2-6 */ | ||
2052 | void omap_gpio_restore_context(void) | ||
2053 | { | ||
2054 | int i; | ||
2055 | |||
2056 | for (i = 1; i < gpio_bank_count; i++) { | ||
2057 | struct gpio_bank *bank = &gpio_bank[i]; | ||
2058 | __raw_writel(gpio_context[i].irqenable1, | ||
2059 | bank->base + OMAP24XX_GPIO_IRQENABLE1); | ||
2060 | __raw_writel(gpio_context[i].irqenable2, | ||
2061 | bank->base + OMAP24XX_GPIO_IRQENABLE2); | ||
2062 | __raw_writel(gpio_context[i].wake_en, | ||
2063 | bank->base + OMAP24XX_GPIO_WAKE_EN); | ||
2064 | __raw_writel(gpio_context[i].ctrl, | ||
2065 | bank->base + OMAP24XX_GPIO_CTRL); | ||
2066 | __raw_writel(gpio_context[i].oe, | ||
2067 | bank->base + OMAP24XX_GPIO_OE); | ||
2068 | __raw_writel(gpio_context[i].leveldetect0, | ||
2069 | bank->base + OMAP24XX_GPIO_LEVELDETECT0); | ||
2070 | __raw_writel(gpio_context[i].leveldetect1, | ||
2071 | bank->base + OMAP24XX_GPIO_LEVELDETECT1); | ||
2072 | __raw_writel(gpio_context[i].risingdetect, | ||
2073 | bank->base + OMAP24XX_GPIO_RISINGDETECT); | ||
2074 | __raw_writel(gpio_context[i].fallingdetect, | ||
2075 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); | ||
2076 | __raw_writel(gpio_context[i].dataout, | ||
2077 | bank->base + OMAP24XX_GPIO_DATAOUT); | ||
2078 | } | ||
2079 | } | ||
2080 | #endif | ||
2081 | |||
2082 | static struct platform_driver omap_gpio_driver = { | ||
2083 | .probe = omap_gpio_probe, | ||
2084 | .driver = { | ||
2085 | .name = "omap_gpio", | ||
2086 | }, | ||
2087 | }; | ||
2088 | |||
2089 | /* | ||
2090 | * gpio driver register needs to be done before | ||
2091 | * machine_init functions access gpio APIs. | ||
2092 | * Hence omap_gpio_drv_reg() is a postcore_initcall. | ||
2093 | */ | ||
2094 | static int __init omap_gpio_drv_reg(void) | ||
2095 | { | ||
2096 | return platform_driver_register(&omap_gpio_driver); | ||
2097 | } | ||
2098 | postcore_initcall(omap_gpio_drv_reg); | ||
2099 | |||
2100 | static int __init omap_gpio_sysinit(void) | ||
2101 | { | ||
2102 | mpuio_init(); | ||
2103 | |||
2104 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) | ||
2105 | if (cpu_is_omap16xx() || cpu_class_is_omap2()) | ||
2106 | register_syscore_ops(&omap_gpio_syscore_ops); | ||
2107 | #endif | ||
2108 | |||
2109 | return 0; | ||
2110 | } | ||
2111 | |||
2112 | arch_initcall(omap_gpio_sysinit); | ||
diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h index cac2e8ac6968..ec97e00cb581 100644 --- a/arch/arm/plat-omap/include/plat/gpio.h +++ b/arch/arm/plat-omap/include/plat/gpio.h | |||
@@ -52,6 +52,109 @@ | |||
52 | 52 | ||
53 | #define OMAP34XX_NR_GPIOS 6 | 53 | #define OMAP34XX_NR_GPIOS 6 |
54 | 54 | ||
55 | /* | ||
56 | * OMAP1510 GPIO registers | ||
57 | */ | ||
58 | #define OMAP1510_GPIO_DATA_INPUT 0x00 | ||
59 | #define OMAP1510_GPIO_DATA_OUTPUT 0x04 | ||
60 | #define OMAP1510_GPIO_DIR_CONTROL 0x08 | ||
61 | #define OMAP1510_GPIO_INT_CONTROL 0x0c | ||
62 | #define OMAP1510_GPIO_INT_MASK 0x10 | ||
63 | #define OMAP1510_GPIO_INT_STATUS 0x14 | ||
64 | #define OMAP1510_GPIO_PIN_CONTROL 0x18 | ||
65 | |||
66 | #define OMAP1510_IH_GPIO_BASE 64 | ||
67 | |||
68 | /* | ||
69 | * OMAP1610 specific GPIO registers | ||
70 | */ | ||
71 | #define OMAP1610_GPIO_REVISION 0x0000 | ||
72 | #define OMAP1610_GPIO_SYSCONFIG 0x0010 | ||
73 | #define OMAP1610_GPIO_SYSSTATUS 0x0014 | ||
74 | #define OMAP1610_GPIO_IRQSTATUS1 0x0018 | ||
75 | #define OMAP1610_GPIO_IRQENABLE1 0x001c | ||
76 | #define OMAP1610_GPIO_WAKEUPENABLE 0x0028 | ||
77 | #define OMAP1610_GPIO_DATAIN 0x002c | ||
78 | #define OMAP1610_GPIO_DATAOUT 0x0030 | ||
79 | #define OMAP1610_GPIO_DIRECTION 0x0034 | ||
80 | #define OMAP1610_GPIO_EDGE_CTRL1 0x0038 | ||
81 | #define OMAP1610_GPIO_EDGE_CTRL2 0x003c | ||
82 | #define OMAP1610_GPIO_CLEAR_IRQENABLE1 0x009c | ||
83 | #define OMAP1610_GPIO_CLEAR_WAKEUPENA 0x00a8 | ||
84 | #define OMAP1610_GPIO_CLEAR_DATAOUT 0x00b0 | ||
85 | #define OMAP1610_GPIO_SET_IRQENABLE1 0x00dc | ||
86 | #define OMAP1610_GPIO_SET_WAKEUPENA 0x00e8 | ||
87 | #define OMAP1610_GPIO_SET_DATAOUT 0x00f0 | ||
88 | |||
89 | /* | ||
90 | * OMAP7XX specific GPIO registers | ||
91 | */ | ||
92 | #define OMAP7XX_GPIO_DATA_INPUT 0x00 | ||
93 | #define OMAP7XX_GPIO_DATA_OUTPUT 0x04 | ||
94 | #define OMAP7XX_GPIO_DIR_CONTROL 0x08 | ||
95 | #define OMAP7XX_GPIO_INT_CONTROL 0x0c | ||
96 | #define OMAP7XX_GPIO_INT_MASK 0x10 | ||
97 | #define OMAP7XX_GPIO_INT_STATUS 0x14 | ||
98 | |||
99 | /* | ||
100 | * omap2+ specific GPIO registers | ||
101 | */ | ||
102 | #define OMAP24XX_GPIO_REVISION 0x0000 | ||
103 | #define OMAP24XX_GPIO_IRQSTATUS1 0x0018 | ||
104 | #define OMAP24XX_GPIO_IRQSTATUS2 0x0028 | ||
105 | #define OMAP24XX_GPIO_IRQENABLE2 0x002c | ||
106 | #define OMAP24XX_GPIO_IRQENABLE1 0x001c | ||
107 | #define OMAP24XX_GPIO_WAKE_EN 0x0020 | ||
108 | #define OMAP24XX_GPIO_CTRL 0x0030 | ||
109 | #define OMAP24XX_GPIO_OE 0x0034 | ||
110 | #define OMAP24XX_GPIO_DATAIN 0x0038 | ||
111 | #define OMAP24XX_GPIO_DATAOUT 0x003c | ||
112 | #define OMAP24XX_GPIO_LEVELDETECT0 0x0040 | ||
113 | #define OMAP24XX_GPIO_LEVELDETECT1 0x0044 | ||
114 | #define OMAP24XX_GPIO_RISINGDETECT 0x0048 | ||
115 | #define OMAP24XX_GPIO_FALLINGDETECT 0x004c | ||
116 | #define OMAP24XX_GPIO_DEBOUNCE_EN 0x0050 | ||
117 | #define OMAP24XX_GPIO_DEBOUNCE_VAL 0x0054 | ||
118 | #define OMAP24XX_GPIO_CLEARIRQENABLE1 0x0060 | ||
119 | #define OMAP24XX_GPIO_SETIRQENABLE1 0x0064 | ||
120 | #define OMAP24XX_GPIO_CLEARWKUENA 0x0080 | ||
121 | #define OMAP24XX_GPIO_SETWKUENA 0x0084 | ||
122 | #define OMAP24XX_GPIO_CLEARDATAOUT 0x0090 | ||
123 | #define OMAP24XX_GPIO_SETDATAOUT 0x0094 | ||
124 | |||
125 | #define OMAP4_GPIO_REVISION 0x0000 | ||
126 | #define OMAP4_GPIO_EOI 0x0020 | ||
127 | #define OMAP4_GPIO_IRQSTATUSRAW0 0x0024 | ||
128 | #define OMAP4_GPIO_IRQSTATUSRAW1 0x0028 | ||
129 | #define OMAP4_GPIO_IRQSTATUS0 0x002c | ||
130 | #define OMAP4_GPIO_IRQSTATUS1 0x0030 | ||
131 | #define OMAP4_GPIO_IRQSTATUSSET0 0x0034 | ||
132 | #define OMAP4_GPIO_IRQSTATUSSET1 0x0038 | ||
133 | #define OMAP4_GPIO_IRQSTATUSCLR0 0x003c | ||
134 | #define OMAP4_GPIO_IRQSTATUSCLR1 0x0040 | ||
135 | #define OMAP4_GPIO_IRQWAKEN0 0x0044 | ||
136 | #define OMAP4_GPIO_IRQWAKEN1 0x0048 | ||
137 | #define OMAP4_GPIO_IRQENABLE1 0x011c | ||
138 | #define OMAP4_GPIO_WAKE_EN 0x0120 | ||
139 | #define OMAP4_GPIO_IRQSTATUS2 0x0128 | ||
140 | #define OMAP4_GPIO_IRQENABLE2 0x012c | ||
141 | #define OMAP4_GPIO_CTRL 0x0130 | ||
142 | #define OMAP4_GPIO_OE 0x0134 | ||
143 | #define OMAP4_GPIO_DATAIN 0x0138 | ||
144 | #define OMAP4_GPIO_DATAOUT 0x013c | ||
145 | #define OMAP4_GPIO_LEVELDETECT0 0x0140 | ||
146 | #define OMAP4_GPIO_LEVELDETECT1 0x0144 | ||
147 | #define OMAP4_GPIO_RISINGDETECT 0x0148 | ||
148 | #define OMAP4_GPIO_FALLINGDETECT 0x014c | ||
149 | #define OMAP4_GPIO_DEBOUNCENABLE 0x0150 | ||
150 | #define OMAP4_GPIO_DEBOUNCINGTIME 0x0154 | ||
151 | #define OMAP4_GPIO_CLEARIRQENABLE1 0x0160 | ||
152 | #define OMAP4_GPIO_SETIRQENABLE1 0x0164 | ||
153 | #define OMAP4_GPIO_CLEARWKUENA 0x0180 | ||
154 | #define OMAP4_GPIO_SETWKUENA 0x0184 | ||
155 | #define OMAP4_GPIO_CLEARDATAOUT 0x0190 | ||
156 | #define OMAP4_GPIO_SETDATAOUT 0x0194 | ||
157 | |||
55 | #define OMAP_MPUIO(nr) (OMAP_MAX_GPIO_LINES + (nr)) | 158 | #define OMAP_MPUIO(nr) (OMAP_MAX_GPIO_LINES + (nr)) |
56 | #define OMAP_GPIO_IS_MPUIO(nr) ((nr) >= OMAP_MAX_GPIO_LINES) | 159 | #define OMAP_GPIO_IS_MPUIO(nr) ((nr) >= OMAP_MAX_GPIO_LINES) |
57 | 160 | ||
diff --git a/arch/arm/plat-omap/include/plat/gpmc-smsc911x.h b/arch/arm/plat-omap/include/plat/gpmc-smsc911x.h index 872de0bf1e6b..ea6c9c88c725 100644 --- a/arch/arm/plat-omap/include/plat/gpmc-smsc911x.h +++ b/arch/arm/plat-omap/include/plat/gpmc-smsc911x.h | |||
@@ -14,14 +14,14 @@ | |||
14 | #ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__ | 14 | #ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__ |
15 | 15 | ||
16 | struct omap_smsc911x_platform_data { | 16 | struct omap_smsc911x_platform_data { |
17 | int id; | ||
17 | int cs; | 18 | int cs; |
18 | int gpio_irq; | 19 | int gpio_irq; |
19 | int gpio_reset; | 20 | int gpio_reset; |
20 | u32 flags; | 21 | u32 flags; |
21 | }; | 22 | }; |
22 | 23 | ||
23 | #if defined(CONFIG_SMSC911X) || \ | 24 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
24 | defined(CONFIG_SMSC911X_MODULE) | ||
25 | 25 | ||
26 | extern void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d); | 26 | extern void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d); |
27 | 27 | ||
diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h index 565d2664f5a7..ac4b60d9aa29 100644 --- a/arch/arm/plat-omap/include/plat/uncompress.h +++ b/arch/arm/plat-omap/include/plat/uncompress.h | |||
@@ -129,7 +129,6 @@ static inline void __arch_decomp_setup(unsigned long arch_id) | |||
129 | DEBUG_LL_OMAP1(3, sx1); | 129 | DEBUG_LL_OMAP1(3, sx1); |
130 | 130 | ||
131 | /* omap2 based boards using UART1 */ | 131 | /* omap2 based boards using UART1 */ |
132 | DEBUG_LL_OMAP2(1, omap2evm); | ||
133 | DEBUG_LL_OMAP2(1, omap_2430sdp); | 132 | DEBUG_LL_OMAP2(1, omap_2430sdp); |
134 | DEBUG_LL_OMAP2(1, omap_apollon); | 133 | DEBUG_LL_OMAP2(1, omap_apollon); |
135 | DEBUG_LL_OMAP2(1, omap_h4); | 134 | DEBUG_LL_OMAP2(1, omap_h4); |
diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h index 02b96c8f6a17..17d3c939775c 100644 --- a/arch/arm/plat-omap/include/plat/usb.h +++ b/arch/arm/plat-omap/include/plat/usb.h | |||
@@ -113,7 +113,7 @@ extern int omap4430_phy_suspend(struct device *dev, int suspend); | |||
113 | extern void am35x_musb_reset(void); | 113 | extern void am35x_musb_reset(void); |
114 | extern void am35x_musb_phy_power(u8 on); | 114 | extern void am35x_musb_phy_power(u8 on); |
115 | extern void am35x_musb_clear_irq(void); | 115 | extern void am35x_musb_clear_irq(void); |
116 | extern void am35x_musb_set_mode(u8 musb_mode); | 116 | extern void am35x_set_mode(u8 musb_mode); |
117 | 117 | ||
118 | /* | 118 | /* |
119 | * FIXME correct answer depends on hmc_mode, | 119 | * FIXME correct answer depends on hmc_mode, |
diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig index 6751bcf7b888..e98f5c5c7879 100644 --- a/arch/arm/plat-s5p/Kconfig +++ b/arch/arm/plat-s5p/Kconfig | |||
@@ -7,7 +7,7 @@ | |||
7 | 7 | ||
8 | config PLAT_S5P | 8 | config PLAT_S5P |
9 | bool | 9 | bool |
10 | depends on (ARCH_S5P64X0 || ARCH_S5P6442 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS4) | 10 | depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS4) |
11 | default y | 11 | default y |
12 | select ARM_VIC if !ARCH_EXYNOS4 | 12 | select ARM_VIC if !ARCH_EXYNOS4 |
13 | select ARM_GIC if ARCH_EXYNOS4 | 13 | select ARM_GIC if ARCH_EXYNOS4 |
diff --git a/arch/arm/plat-s5p/cpu.c b/arch/arm/plat-s5p/cpu.c index 5cf5e721e6ca..bbc2aa7449ca 100644 --- a/arch/arm/plat-s5p/cpu.c +++ b/arch/arm/plat-s5p/cpu.c | |||
@@ -21,7 +21,6 @@ | |||
21 | 21 | ||
22 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
23 | #include <plat/s5p6440.h> | 23 | #include <plat/s5p6440.h> |
24 | #include <plat/s5p6442.h> | ||
25 | #include <plat/s5p6450.h> | 24 | #include <plat/s5p6450.h> |
26 | #include <plat/s5pc100.h> | 25 | #include <plat/s5pc100.h> |
27 | #include <plat/s5pv210.h> | 26 | #include <plat/s5pv210.h> |
@@ -30,7 +29,6 @@ | |||
30 | /* table of supported CPUs */ | 29 | /* table of supported CPUs */ |
31 | 30 | ||
32 | static const char name_s5p6440[] = "S5P6440"; | 31 | static const char name_s5p6440[] = "S5P6440"; |
33 | static const char name_s5p6442[] = "S5P6442"; | ||
34 | static const char name_s5p6450[] = "S5P6450"; | 32 | static const char name_s5p6450[] = "S5P6450"; |
35 | static const char name_s5pc100[] = "S5PC100"; | 33 | static const char name_s5pc100[] = "S5PC100"; |
36 | static const char name_s5pv210[] = "S5PV210/S5PC110"; | 34 | static const char name_s5pv210[] = "S5PV210/S5PC110"; |
@@ -46,14 +44,6 @@ static struct cpu_table cpu_ids[] __initdata = { | |||
46 | .init = s5p64x0_init, | 44 | .init = s5p64x0_init, |
47 | .name = name_s5p6440, | 45 | .name = name_s5p6440, |
48 | }, { | 46 | }, { |
49 | .idcode = 0x36442000, | ||
50 | .idmask = 0xfffff000, | ||
51 | .map_io = s5p6442_map_io, | ||
52 | .init_clocks = s5p6442_init_clocks, | ||
53 | .init_uarts = s5p6442_init_uarts, | ||
54 | .init = s5p6442_init, | ||
55 | .name = name_s5p6442, | ||
56 | }, { | ||
57 | .idcode = 0x36450000, | 47 | .idcode = 0x36450000, |
58 | .idmask = 0xfffff000, | 48 | .idmask = 0xfffff000, |
59 | .map_io = s5p6450_map_io, | 49 | .map_io = s5p6450_map_io, |
diff --git a/arch/arm/plat-s5p/include/plat/s5p6442.h b/arch/arm/plat-s5p/include/plat/s5p6442.h deleted file mode 100644 index 7b8801349c94..000000000000 --- a/arch/arm/plat-s5p/include/plat/s5p6442.h +++ /dev/null | |||
@@ -1,33 +0,0 @@ | |||
1 | /* arch/arm/plat-s5p/include/plat/s5p6442.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * Header file for s5p6442 cpu support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | /* Common init code for S5P6442 related SoCs */ | ||
14 | |||
15 | extern void s5p6442_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
16 | extern void s5p6442_register_clocks(void); | ||
17 | extern void s5p6442_setup_clocks(void); | ||
18 | |||
19 | #ifdef CONFIG_CPU_S5P6442 | ||
20 | |||
21 | extern int s5p6442_init(void); | ||
22 | extern void s5p6442_init_irq(void); | ||
23 | extern void s5p6442_map_io(void); | ||
24 | extern void s5p6442_init_clocks(int xtal); | ||
25 | |||
26 | #define s5p6442_init_uarts s5p6442_common_init_uarts | ||
27 | |||
28 | #else | ||
29 | #define s5p6442_init_clocks NULL | ||
30 | #define s5p6442_init_uarts NULL | ||
31 | #define s5p6442_map_io NULL | ||
32 | #define s5p6442_init NULL | ||
33 | #endif | ||
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile index e9de58a2e294..53eb15b0a07d 100644 --- a/arch/arm/plat-samsung/Makefile +++ b/arch/arm/plat-samsung/Makefile | |||
@@ -19,7 +19,6 @@ obj-y += gpio.o | |||
19 | obj-y += gpio-config.o | 19 | obj-y += gpio-config.o |
20 | obj-y += dev-asocdma.o | 20 | obj-y += dev-asocdma.o |
21 | 21 | ||
22 | obj-$(CONFIG_SAMSUNG_GPIOLIB_4BIT) += gpiolib.o | ||
23 | obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o | 22 | obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o |
24 | 23 | ||
25 | obj-$(CONFIG_SAMSUNG_IRQ_UART) += irq-uart.o | 24 | obj-$(CONFIG_SAMSUNG_IRQ_UART) += irq-uart.o |
diff --git a/arch/arm/plat-samsung/gpiolib.c b/arch/arm/plat-samsung/gpiolib.c deleted file mode 100644 index ea37c0461788..000000000000 --- a/arch/arm/plat-samsung/gpiolib.c +++ /dev/null | |||
@@ -1,206 +0,0 @@ | |||
1 | /* arch/arm/plat-samsung/gpiolib.c | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * Copyright (c) 2009 Samsung Electronics Co., Ltd. | ||
9 | * http://www.samsung.com/ | ||
10 | * | ||
11 | * SAMSUNG - GPIOlib support | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License version 2 as | ||
15 | * published by the Free Software Foundation. | ||
16 | */ | ||
17 | |||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/gpio.h> | ||
22 | #include <plat/gpio-core.h> | ||
23 | #include <plat/gpio-cfg.h> | ||
24 | #include <plat/gpio-cfg-helpers.h> | ||
25 | |||
26 | #ifndef DEBUG_GPIO | ||
27 | #define gpio_dbg(x...) do { } while (0) | ||
28 | #else | ||
29 | #define gpio_dbg(x...) printk(KERN_DEBUG x) | ||
30 | #endif | ||
31 | |||
32 | /* The samsung_gpiolib_4bit routines are to control the gpio banks where | ||
33 | * the gpio configuration register (GPxCON) has 4 bits per GPIO, as the | ||
34 | * following example: | ||
35 | * | ||
36 | * base + 0x00: Control register, 4 bits per gpio | ||
37 | * gpio n: 4 bits starting at (4*n) | ||
38 | * 0000 = input, 0001 = output, others mean special-function | ||
39 | * base + 0x04: Data register, 1 bit per gpio | ||
40 | * bit n: data bit n | ||
41 | * | ||
42 | * Note, since the data register is one bit per gpio and is at base + 0x4 | ||
43 | * we can use s3c_gpiolib_get and s3c_gpiolib_set to change the state of | ||
44 | * the output. | ||
45 | */ | ||
46 | |||
47 | static int samsung_gpiolib_4bit_input(struct gpio_chip *chip, | ||
48 | unsigned int offset) | ||
49 | { | ||
50 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
51 | void __iomem *base = ourchip->base; | ||
52 | unsigned long con; | ||
53 | |||
54 | con = __raw_readl(base + GPIOCON_OFF); | ||
55 | con &= ~(0xf << con_4bit_shift(offset)); | ||
56 | __raw_writel(con, base + GPIOCON_OFF); | ||
57 | |||
58 | gpio_dbg("%s: %p: CON now %08lx\n", __func__, base, con); | ||
59 | |||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | static int samsung_gpiolib_4bit_output(struct gpio_chip *chip, | ||
64 | unsigned int offset, int value) | ||
65 | { | ||
66 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
67 | void __iomem *base = ourchip->base; | ||
68 | unsigned long con; | ||
69 | unsigned long dat; | ||
70 | |||
71 | con = __raw_readl(base + GPIOCON_OFF); | ||
72 | con &= ~(0xf << con_4bit_shift(offset)); | ||
73 | con |= 0x1 << con_4bit_shift(offset); | ||
74 | |||
75 | dat = __raw_readl(base + GPIODAT_OFF); | ||
76 | |||
77 | if (value) | ||
78 | dat |= 1 << offset; | ||
79 | else | ||
80 | dat &= ~(1 << offset); | ||
81 | |||
82 | __raw_writel(dat, base + GPIODAT_OFF); | ||
83 | __raw_writel(con, base + GPIOCON_OFF); | ||
84 | __raw_writel(dat, base + GPIODAT_OFF); | ||
85 | |||
86 | gpio_dbg("%s: %p: CON %08lx, DAT %08lx\n", __func__, base, con, dat); | ||
87 | |||
88 | return 0; | ||
89 | } | ||
90 | |||
91 | /* The next set of routines are for the case where the GPIO configuration | ||
92 | * registers are 4 bits per GPIO but there is more than one register (the | ||
93 | * bank has more than 8 GPIOs. | ||
94 | * | ||
95 | * This case is the similar to the 4 bit case, but the registers are as | ||
96 | * follows: | ||
97 | * | ||
98 | * base + 0x00: Control register, 4 bits per gpio (lower 8 GPIOs) | ||
99 | * gpio n: 4 bits starting at (4*n) | ||
100 | * 0000 = input, 0001 = output, others mean special-function | ||
101 | * base + 0x04: Control register, 4 bits per gpio (up to 8 additions GPIOs) | ||
102 | * gpio n: 4 bits starting at (4*n) | ||
103 | * 0000 = input, 0001 = output, others mean special-function | ||
104 | * base + 0x08: Data register, 1 bit per gpio | ||
105 | * bit n: data bit n | ||
106 | * | ||
107 | * To allow us to use the s3c_gpiolib_get and s3c_gpiolib_set routines we | ||
108 | * store the 'base + 0x4' address so that these routines see the data | ||
109 | * register at ourchip->base + 0x04. | ||
110 | */ | ||
111 | |||
112 | static int samsung_gpiolib_4bit2_input(struct gpio_chip *chip, | ||
113 | unsigned int offset) | ||
114 | { | ||
115 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
116 | void __iomem *base = ourchip->base; | ||
117 | void __iomem *regcon = base; | ||
118 | unsigned long con; | ||
119 | |||
120 | if (offset > 7) | ||
121 | offset -= 8; | ||
122 | else | ||
123 | regcon -= 4; | ||
124 | |||
125 | con = __raw_readl(regcon); | ||
126 | con &= ~(0xf << con_4bit_shift(offset)); | ||
127 | __raw_writel(con, regcon); | ||
128 | |||
129 | gpio_dbg("%s: %p: CON %08lx\n", __func__, base, con); | ||
130 | |||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | static int samsung_gpiolib_4bit2_output(struct gpio_chip *chip, | ||
135 | unsigned int offset, int value) | ||
136 | { | ||
137 | struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip); | ||
138 | void __iomem *base = ourchip->base; | ||
139 | void __iomem *regcon = base; | ||
140 | unsigned long con; | ||
141 | unsigned long dat; | ||
142 | unsigned con_offset = offset; | ||
143 | |||
144 | if (con_offset > 7) | ||
145 | con_offset -= 8; | ||
146 | else | ||
147 | regcon -= 4; | ||
148 | |||
149 | con = __raw_readl(regcon); | ||
150 | con &= ~(0xf << con_4bit_shift(con_offset)); | ||
151 | con |= 0x1 << con_4bit_shift(con_offset); | ||
152 | |||
153 | dat = __raw_readl(base + GPIODAT_OFF); | ||
154 | |||
155 | if (value) | ||
156 | dat |= 1 << offset; | ||
157 | else | ||
158 | dat &= ~(1 << offset); | ||
159 | |||
160 | __raw_writel(dat, base + GPIODAT_OFF); | ||
161 | __raw_writel(con, regcon); | ||
162 | __raw_writel(dat, base + GPIODAT_OFF); | ||
163 | |||
164 | gpio_dbg("%s: %p: CON %08lx, DAT %08lx\n", __func__, base, con, dat); | ||
165 | |||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | void __init samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip) | ||
170 | { | ||
171 | chip->chip.direction_input = samsung_gpiolib_4bit_input; | ||
172 | chip->chip.direction_output = samsung_gpiolib_4bit_output; | ||
173 | chip->pm = __gpio_pm(&s3c_gpio_pm_4bit); | ||
174 | } | ||
175 | |||
176 | void __init samsung_gpiolib_add_4bit2(struct s3c_gpio_chip *chip) | ||
177 | { | ||
178 | chip->chip.direction_input = samsung_gpiolib_4bit2_input; | ||
179 | chip->chip.direction_output = samsung_gpiolib_4bit2_output; | ||
180 | chip->pm = __gpio_pm(&s3c_gpio_pm_4bit); | ||
181 | } | ||
182 | |||
183 | void __init samsung_gpiolib_add_4bit_chips(struct s3c_gpio_chip *chip, | ||
184 | int nr_chips) | ||
185 | { | ||
186 | for (; nr_chips > 0; nr_chips--, chip++) { | ||
187 | samsung_gpiolib_add_4bit(chip); | ||
188 | s3c_gpiolib_add(chip); | ||
189 | } | ||
190 | } | ||
191 | |||
192 | void __init samsung_gpiolib_add_4bit2_chips(struct s3c_gpio_chip *chip, | ||
193 | int nr_chips) | ||
194 | { | ||
195 | for (; nr_chips > 0; nr_chips--, chip++) { | ||
196 | samsung_gpiolib_add_4bit2(chip); | ||
197 | s3c_gpiolib_add(chip); | ||
198 | } | ||
199 | } | ||
200 | |||
201 | void __init samsung_gpiolib_add_2bit_chips(struct s3c_gpio_chip *chip, | ||
202 | int nr_chips) | ||
203 | { | ||
204 | for (; nr_chips > 0; nr_chips--, chip++) | ||
205 | s3c_gpiolib_add(chip); | ||
206 | } | ||
diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index 3aedac0034ba..c0a5741b23e6 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h | |||
@@ -86,7 +86,6 @@ extern struct sysdev_class s3c2443_sysclass; | |||
86 | extern struct sysdev_class s3c6410_sysclass; | 86 | extern struct sysdev_class s3c6410_sysclass; |
87 | extern struct sysdev_class s3c64xx_sysclass; | 87 | extern struct sysdev_class s3c64xx_sysclass; |
88 | extern struct sysdev_class s5p64x0_sysclass; | 88 | extern struct sysdev_class s5p64x0_sysclass; |
89 | extern struct sysdev_class s5p6442_sysclass; | ||
90 | extern struct sysdev_class s5pv210_sysclass; | 89 | extern struct sysdev_class s5pv210_sysclass; |
91 | extern struct sysdev_class exynos4_sysclass; | 90 | extern struct sysdev_class exynos4_sysclass; |
92 | 91 | ||
diff --git a/arch/arm/plat-samsung/include/plat/debug-macro.S b/arch/arm/plat-samsung/include/plat/debug-macro.S index dc6efd90e8ff..207e275362a8 100644 --- a/arch/arm/plat-samsung/include/plat/debug-macro.S +++ b/arch/arm/plat-samsung/include/plat/debug-macro.S | |||
@@ -11,7 +11,7 @@ | |||
11 | 11 | ||
12 | #include <plat/regs-serial.h> | 12 | #include <plat/regs-serial.h> |
13 | 13 | ||
14 | /* The S5PV210/S5PC110 and S5P6442 implementations are as belows. */ | 14 | /* The S5PV210/S5PC110 implementations are as belows. */ |
15 | 15 | ||
16 | .macro fifo_level_s5pv210 rd, rx | 16 | .macro fifo_level_s5pv210 rd, rx |
17 | ldr \rd, [ \rx, # S3C2410_UFSTAT ] | 17 | ldr \rd, [ \rx, # S3C2410_UFSTAT ] |
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index 39818d8da420..b61b8ee7cc52 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h | |||
@@ -111,12 +111,6 @@ extern struct platform_device exynos4_device_spdif; | |||
111 | extern struct platform_device exynos4_device_pd[]; | 111 | extern struct platform_device exynos4_device_pd[]; |
112 | extern struct platform_device exynos4_device_ahci; | 112 | extern struct platform_device exynos4_device_ahci; |
113 | 113 | ||
114 | extern struct platform_device s5p6442_device_pcm0; | ||
115 | extern struct platform_device s5p6442_device_pcm1; | ||
116 | extern struct platform_device s5p6442_device_iis0; | ||
117 | extern struct platform_device s5p6442_device_iis1; | ||
118 | extern struct platform_device s5p6442_device_spi; | ||
119 | |||
120 | extern struct platform_device s5p6440_device_pcm; | 114 | extern struct platform_device s5p6440_device_pcm; |
121 | extern struct platform_device s5p6440_device_iis; | 115 | extern struct platform_device s5p6440_device_iis; |
122 | 116 | ||
diff --git a/arch/arm/plat-samsung/include/plat/regs-serial.h b/arch/arm/plat-samsung/include/plat/regs-serial.h index 788837e99cb3..c151c5f94a87 100644 --- a/arch/arm/plat-samsung/include/plat/regs-serial.h +++ b/arch/arm/plat-samsung/include/plat/regs-serial.h | |||
@@ -194,7 +194,7 @@ | |||
194 | #define S3C64XX_UINTSP 0x34 | 194 | #define S3C64XX_UINTSP 0x34 |
195 | #define S3C64XX_UINTM 0x38 | 195 | #define S3C64XX_UINTM 0x38 |
196 | 196 | ||
197 | /* Following are specific to S5PV210 and S5P6442 */ | 197 | /* Following are specific to S5PV210 */ |
198 | #define S5PV210_UCON_CLKMASK (1<<10) | 198 | #define S5PV210_UCON_CLKMASK (1<<10) |
199 | #define S5PV210_UCON_PCLK (0<<10) | 199 | #define S5PV210_UCON_PCLK (0<<10) |
200 | #define S5PV210_UCON_UCLK (1<<10) | 200 | #define S5PV210_UCON_UCLK (1<<10) |
diff --git a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h index ff1a561b326e..0ffe34a21554 100644 --- a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h +++ b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h | |||
@@ -69,6 +69,5 @@ extern void s3c64xx_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); | |||
69 | extern void s5pc100_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); | 69 | extern void s5pc100_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); |
70 | extern void s5pv210_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); | 70 | extern void s5pv210_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); |
71 | extern void s5p64x0_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); | 71 | extern void s5p64x0_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); |
72 | extern void s5p6442_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); | ||
73 | 72 | ||
74 | #endif /* __S3C64XX_PLAT_SPI_H */ | 73 | #endif /* __S3C64XX_PLAT_SPI_H */ |
diff --git a/arch/avr32/include/asm/bitops.h b/arch/avr32/include/asm/bitops.h index 72444d97f80c..b70c19bab63a 100644 --- a/arch/avr32/include/asm/bitops.h +++ b/arch/avr32/include/asm/bitops.h | |||
@@ -270,14 +270,21 @@ static inline int __fls(unsigned long word) | |||
270 | 270 | ||
271 | unsigned long find_first_zero_bit(const unsigned long *addr, | 271 | unsigned long find_first_zero_bit(const unsigned long *addr, |
272 | unsigned long size); | 272 | unsigned long size); |
273 | #define find_first_zero_bit find_first_zero_bit | ||
274 | |||
273 | unsigned long find_next_zero_bit(const unsigned long *addr, | 275 | unsigned long find_next_zero_bit(const unsigned long *addr, |
274 | unsigned long size, | 276 | unsigned long size, |
275 | unsigned long offset); | 277 | unsigned long offset); |
278 | #define find_next_zero_bit find_next_zero_bit | ||
279 | |||
276 | unsigned long find_first_bit(const unsigned long *addr, | 280 | unsigned long find_first_bit(const unsigned long *addr, |
277 | unsigned long size); | 281 | unsigned long size); |
282 | #define find_first_bit find_first_bit | ||
283 | |||
278 | unsigned long find_next_bit(const unsigned long *addr, | 284 | unsigned long find_next_bit(const unsigned long *addr, |
279 | unsigned long size, | 285 | unsigned long size, |
280 | unsigned long offset); | 286 | unsigned long offset); |
287 | #define find_next_bit find_next_bit | ||
281 | 288 | ||
282 | /* | 289 | /* |
283 | * ffs: find first bit set. This is defined the same way as | 290 | * ffs: find first bit set. This is defined the same way as |
@@ -299,6 +306,14 @@ static inline int ffs(unsigned long word) | |||
299 | #include <asm-generic/bitops/hweight.h> | 306 | #include <asm-generic/bitops/hweight.h> |
300 | #include <asm-generic/bitops/lock.h> | 307 | #include <asm-generic/bitops/lock.h> |
301 | 308 | ||
309 | extern unsigned long find_next_zero_bit_le(const void *addr, | ||
310 | unsigned long size, unsigned long offset); | ||
311 | #define find_next_zero_bit_le find_next_zero_bit_le | ||
312 | |||
313 | extern unsigned long find_next_bit_le(const void *addr, | ||
314 | unsigned long size, unsigned long offset); | ||
315 | #define find_next_bit_le find_next_bit_le | ||
316 | |||
302 | #include <asm-generic/bitops/le.h> | 317 | #include <asm-generic/bitops/le.h> |
303 | #include <asm-generic/bitops/ext2-atomic.h> | 318 | #include <asm-generic/bitops/ext2-atomic.h> |
304 | 319 | ||
diff --git a/arch/avr32/include/asm/unistd.h b/arch/avr32/include/asm/unistd.h index 89861a27543e..f714544e5560 100644 --- a/arch/avr32/include/asm/unistd.h +++ b/arch/avr32/include/asm/unistd.h | |||
@@ -299,9 +299,10 @@ | |||
299 | #define __NR_signalfd 279 | 299 | #define __NR_signalfd 279 |
300 | /* 280 was __NR_timerfd */ | 300 | /* 280 was __NR_timerfd */ |
301 | #define __NR_eventfd 281 | 301 | #define __NR_eventfd 281 |
302 | #define __NR_setns 283 | ||
302 | 303 | ||
303 | #ifdef __KERNEL__ | 304 | #ifdef __KERNEL__ |
304 | #define NR_syscalls 282 | 305 | #define NR_syscalls 284 |
305 | 306 | ||
306 | /* Old stuff */ | 307 | /* Old stuff */ |
307 | #define __IGNORE_uselib | 308 | #define __IGNORE_uselib |
diff --git a/arch/avr32/kernel/syscall_table.S b/arch/avr32/kernel/syscall_table.S index e76bad16b0f0..c7fd394d28a4 100644 --- a/arch/avr32/kernel/syscall_table.S +++ b/arch/avr32/kernel/syscall_table.S | |||
@@ -296,4 +296,5 @@ sys_call_table: | |||
296 | .long sys_ni_syscall /* 280, was sys_timerfd */ | 296 | .long sys_ni_syscall /* 280, was sys_timerfd */ |
297 | .long sys_eventfd | 297 | .long sys_eventfd |
298 | .long sys_recvmmsg | 298 | .long sys_recvmmsg |
299 | .long sys_setns | ||
299 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ | 300 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ |
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index bfc9d071db9b..aa677e2a3823 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c | |||
@@ -1014,6 +1014,7 @@ static struct platform_device *__initdata at32_usarts[4]; | |||
1014 | void __init at32_map_usart(unsigned int hw_id, unsigned int line, int flags) | 1014 | void __init at32_map_usart(unsigned int hw_id, unsigned int line, int flags) |
1015 | { | 1015 | { |
1016 | struct platform_device *pdev; | 1016 | struct platform_device *pdev; |
1017 | struct atmel_uart_data *pdata; | ||
1017 | 1018 | ||
1018 | switch (hw_id) { | 1019 | switch (hw_id) { |
1019 | case 0: | 1020 | case 0: |
@@ -1042,7 +1043,8 @@ void __init at32_map_usart(unsigned int hw_id, unsigned int line, int flags) | |||
1042 | data->regs = (void __iomem *)pdev->resource[0].start; | 1043 | data->regs = (void __iomem *)pdev->resource[0].start; |
1043 | } | 1044 | } |
1044 | 1045 | ||
1045 | pdev->id = line; | 1046 | pdata = pdev->dev.platform_data; |
1047 | pdata->num = portnr; | ||
1046 | at32_usarts[line] = pdev; | 1048 | at32_usarts[line] = pdev; |
1047 | } | 1049 | } |
1048 | 1050 | ||
diff --git a/arch/avr32/mach-at32ap/include/mach/board.h b/arch/avr32/mach-at32ap/include/mach/board.h index 61740201b311..679458d9a622 100644 --- a/arch/avr32/mach-at32ap/include/mach/board.h +++ b/arch/avr32/mach-at32ap/include/mach/board.h | |||
@@ -33,6 +33,7 @@ extern struct platform_device *atmel_default_console_device; | |||
33 | #define ATMEL_USART_CLK 0x04 | 33 | #define ATMEL_USART_CLK 0x04 |
34 | 34 | ||
35 | struct atmel_uart_data { | 35 | struct atmel_uart_data { |
36 | int num; /* port num */ | ||
36 | short use_dma_tx; /* use transmit DMA? */ | 37 | short use_dma_tx; /* use transmit DMA? */ |
37 | short use_dma_rx; /* use receive DMA? */ | 38 | short use_dma_rx; /* use receive DMA? */ |
38 | void __iomem *regs; /* virtual base address, if any */ | 39 | void __iomem *regs; /* virtual base address, if any */ |
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index a18180f2d007..d619b17c4413 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
@@ -47,9 +47,6 @@ config GENERIC_BUG | |||
47 | config ZONE_DMA | 47 | config ZONE_DMA |
48 | def_bool y | 48 | def_bool y |
49 | 49 | ||
50 | config GENERIC_FIND_NEXT_BIT | ||
51 | def_bool y | ||
52 | |||
53 | config GENERIC_GPIO | 50 | config GENERIC_GPIO |
54 | def_bool y | 51 | def_bool y |
55 | 52 | ||
diff --git a/arch/blackfin/include/asm/bfin_serial.h b/arch/blackfin/include/asm/bfin_serial.h index 7dbc664eab1e..7fd0ec7b5b0f 100644 --- a/arch/blackfin/include/asm/bfin_serial.h +++ b/arch/blackfin/include/asm/bfin_serial.h | |||
@@ -184,7 +184,7 @@ struct bfin_uart_regs { | |||
184 | #undef __BFP | 184 | #undef __BFP |
185 | 185 | ||
186 | #ifndef port_membase | 186 | #ifndef port_membase |
187 | # define port_membase(p) (((struct bfin_serial_port *)(p))->port.membase) | 187 | # define port_membase(p) 0 |
188 | #endif | 188 | #endif |
189 | 189 | ||
190 | #define UART_GET_CHAR(p) bfin_read16(port_membase(p) + OFFSET_RBR) | 190 | #define UART_GET_CHAR(p) bfin_read16(port_membase(p) + OFFSET_RBR) |
@@ -235,10 +235,10 @@ struct bfin_uart_regs { | |||
235 | #define UART_SET_DLAB(p) do { UART_PUT_LCR(p, UART_GET_LCR(p) | DLAB); SSYNC(); } while (0) | 235 | #define UART_SET_DLAB(p) do { UART_PUT_LCR(p, UART_GET_LCR(p) | DLAB); SSYNC(); } while (0) |
236 | 236 | ||
237 | #ifndef put_lsr_cache | 237 | #ifndef put_lsr_cache |
238 | # define put_lsr_cache(p, v) (((struct bfin_serial_port *)(p))->lsr = (v)) | 238 | # define put_lsr_cache(p, v) |
239 | #endif | 239 | #endif |
240 | #ifndef get_lsr_cache | 240 | #ifndef get_lsr_cache |
241 | # define get_lsr_cache(p) (((struct bfin_serial_port *)(p))->lsr) | 241 | # define get_lsr_cache(p) 0 |
242 | #endif | 242 | #endif |
243 | 243 | ||
244 | /* The hardware clears the LSR bits upon read, so we need to cache | 244 | /* The hardware clears the LSR bits upon read, so we need to cache |
diff --git a/arch/blackfin/include/asm/gptimers.h b/arch/blackfin/include/asm/gptimers.h index c722acdda0d3..38657dac1235 100644 --- a/arch/blackfin/include/asm/gptimers.h +++ b/arch/blackfin/include/asm/gptimers.h | |||
@@ -193,4 +193,22 @@ uint16_t get_enabled_gptimers(void); | |||
193 | uint32_t get_gptimer_status(unsigned int group); | 193 | uint32_t get_gptimer_status(unsigned int group); |
194 | void set_gptimer_status(unsigned int group, uint32_t value); | 194 | void set_gptimer_status(unsigned int group, uint32_t value); |
195 | 195 | ||
196 | /* | ||
197 | * All Blackfin system MMRs are padded to 32bits even if the register | ||
198 | * itself is only 16bits. So use a helper macro to streamline this. | ||
199 | */ | ||
200 | #define __BFP(m) u16 m; u16 __pad_##m | ||
201 | |||
202 | /* | ||
203 | * bfin timer registers layout | ||
204 | */ | ||
205 | struct bfin_gptimer_regs { | ||
206 | __BFP(config); | ||
207 | u32 counter; | ||
208 | u32 period; | ||
209 | u32 width; | ||
210 | }; | ||
211 | |||
212 | #undef __BFP | ||
213 | |||
196 | #endif | 214 | #endif |
diff --git a/arch/blackfin/include/asm/kgdb.h b/arch/blackfin/include/asm/kgdb.h index 3ac0c72e9fee..aaf884591b07 100644 --- a/arch/blackfin/include/asm/kgdb.h +++ b/arch/blackfin/include/asm/kgdb.h | |||
@@ -108,6 +108,7 @@ static inline void arch_kgdb_breakpoint(void) | |||
108 | #else | 108 | #else |
109 | # define CACHE_FLUSH_IS_SAFE 1 | 109 | # define CACHE_FLUSH_IS_SAFE 1 |
110 | #endif | 110 | #endif |
111 | #define GDB_ADJUSTS_BREAK_OFFSET | ||
111 | #define HW_INST_WATCHPOINT_NUM 6 | 112 | #define HW_INST_WATCHPOINT_NUM 6 |
112 | #define HW_WATCHPOINT_NUM 8 | 113 | #define HW_WATCHPOINT_NUM 8 |
113 | #define TYPE_INST_WATCHPOINT 0 | 114 | #define TYPE_INST_WATCHPOINT 0 |
diff --git a/arch/blackfin/include/asm/ptrace.h b/arch/blackfin/include/asm/ptrace.h index 1066d63e62b5..7854d4367c15 100644 --- a/arch/blackfin/include/asm/ptrace.h +++ b/arch/blackfin/include/asm/ptrace.h | |||
@@ -102,9 +102,6 @@ struct pt_regs { | |||
102 | /* user_mode returns true if only one bit is set in IPEND, other than the | 102 | /* user_mode returns true if only one bit is set in IPEND, other than the |
103 | master interrupt enable. */ | 103 | master interrupt enable. */ |
104 | #define user_mode(regs) (!(((regs)->ipend & ~0x10) & (((regs)->ipend & ~0x10) - 1))) | 104 | #define user_mode(regs) (!(((regs)->ipend & ~0x10) & (((regs)->ipend & ~0x10) - 1))) |
105 | #define instruction_pointer(regs) ((regs)->pc) | ||
106 | #define user_stack_pointer(regs) ((regs)->usp) | ||
107 | #define profile_pc(regs) instruction_pointer(regs) | ||
108 | extern void show_regs(struct pt_regs *); | 105 | extern void show_regs(struct pt_regs *); |
109 | 106 | ||
110 | #define arch_has_single_step() (1) | 107 | #define arch_has_single_step() (1) |
@@ -128,6 +125,8 @@ extern int is_user_addr_valid(struct task_struct *child, | |||
128 | ((unsigned long)task_stack_page(task) + \ | 125 | ((unsigned long)task_stack_page(task) + \ |
129 | (THREAD_SIZE - sizeof(struct pt_regs))) | 126 | (THREAD_SIZE - sizeof(struct pt_regs))) |
130 | 127 | ||
128 | #include <asm-generic/ptrace.h> | ||
129 | |||
131 | #endif /* __KERNEL__ */ | 130 | #endif /* __KERNEL__ */ |
132 | 131 | ||
133 | #endif /* __ASSEMBLY__ */ | 132 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/blackfin/include/asm/unistd.h b/arch/blackfin/include/asm/unistd.h index ff9a9f35d50b..0ccba60b9ccf 100644 --- a/arch/blackfin/include/asm/unistd.h +++ b/arch/blackfin/include/asm/unistd.h | |||
@@ -397,8 +397,10 @@ | |||
397 | #define __NR_open_by_handle_at 376 | 397 | #define __NR_open_by_handle_at 376 |
398 | #define __NR_clock_adjtime 377 | 398 | #define __NR_clock_adjtime 377 |
399 | #define __NR_syncfs 378 | 399 | #define __NR_syncfs 378 |
400 | #define __NR_setns 379 | ||
401 | #define __NR_sendmmsg 380 | ||
400 | 402 | ||
401 | #define __NR_syscall 379 | 403 | #define __NR_syscall 381 |
402 | #define NR_syscalls __NR_syscall | 404 | #define NR_syscalls __NR_syscall |
403 | 405 | ||
404 | /* Old optional stuff no one actually uses */ | 406 | /* Old optional stuff no one actually uses */ |
diff --git a/arch/blackfin/kernel/debug-mmrs.c b/arch/blackfin/kernel/debug-mmrs.c index 94b1d8a0256a..fce4807ceef9 100644 --- a/arch/blackfin/kernel/debug-mmrs.c +++ b/arch/blackfin/kernel/debug-mmrs.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <asm/blackfin.h> | 14 | #include <asm/blackfin.h> |
15 | #include <asm/gpio.h> | 15 | #include <asm/gpio.h> |
16 | #include <asm/gptimers.h> | ||
16 | #include <asm/bfin_can.h> | 17 | #include <asm/bfin_can.h> |
17 | #include <asm/bfin_dma.h> | 18 | #include <asm/bfin_dma.h> |
18 | #include <asm/bfin_ppi.h> | 19 | #include <asm/bfin_ppi.h> |
@@ -230,8 +231,8 @@ bfin_debug_mmrs_dma(struct dentry *parent, unsigned long base, int num, char mdm | |||
230 | #define DMA(num) _DMA(num, DMA##num##_NEXT_DESC_PTR, 0, "") | 231 | #define DMA(num) _DMA(num, DMA##num##_NEXT_DESC_PTR, 0, "") |
231 | #define _MDMA(num, x) \ | 232 | #define _MDMA(num, x) \ |
232 | do { \ | 233 | do { \ |
233 | _DMA(num, x##DMA_D##num##_CONFIG, 'D', #x); \ | 234 | _DMA(num, x##DMA_D##num##_NEXT_DESC_PTR, 'D', #x); \ |
234 | _DMA(num, x##DMA_S##num##_CONFIG, 'S', #x); \ | 235 | _DMA(num, x##DMA_S##num##_NEXT_DESC_PTR, 'S', #x); \ |
235 | } while (0) | 236 | } while (0) |
236 | #define MDMA(num) _MDMA(num, M) | 237 | #define MDMA(num) _MDMA(num, M) |
237 | #define IMDMA(num) _MDMA(num, IM) | 238 | #define IMDMA(num) _MDMA(num, IM) |
@@ -264,20 +265,15 @@ bfin_debug_mmrs_eppi(struct dentry *parent, unsigned long base, int num) | |||
264 | /* | 265 | /* |
265 | * General Purpose Timers | 266 | * General Purpose Timers |
266 | */ | 267 | */ |
267 | #define GPTIMER_OFF(mmr) (TIMER0_##mmr - TIMER0_CONFIG) | 268 | #define __GPTIMER(uname, lname) __REGS(gptimer, #uname, lname) |
268 | #define __GPTIMER(name) \ | ||
269 | do { \ | ||
270 | strcpy(_buf, #name); \ | ||
271 | debugfs_create_x16(buf, S_IRUSR|S_IWUSR, parent, (u16 *)(base + GPTIMER_OFF(name))); \ | ||
272 | } while (0) | ||
273 | static void __init __maybe_unused | 269 | static void __init __maybe_unused |
274 | bfin_debug_mmrs_gptimer(struct dentry *parent, unsigned long base, int num) | 270 | bfin_debug_mmrs_gptimer(struct dentry *parent, unsigned long base, int num) |
275 | { | 271 | { |
276 | char buf[32], *_buf = REGS_STR_PFX(buf, TIMER, num); | 272 | char buf[32], *_buf = REGS_STR_PFX(buf, TIMER, num); |
277 | __GPTIMER(CONFIG); | 273 | __GPTIMER(CONFIG, config); |
278 | __GPTIMER(COUNTER); | 274 | __GPTIMER(COUNTER, counter); |
279 | __GPTIMER(PERIOD); | 275 | __GPTIMER(PERIOD, period); |
280 | __GPTIMER(WIDTH); | 276 | __GPTIMER(WIDTH, width); |
281 | } | 277 | } |
282 | #define GPTIMER(num) bfin_debug_mmrs_gptimer(parent, TIMER##num##_CONFIG, num) | 278 | #define GPTIMER(num) bfin_debug_mmrs_gptimer(parent, TIMER##num##_CONFIG, num) |
283 | 279 | ||
@@ -355,7 +351,7 @@ bfin_debug_mmrs_ppi(struct dentry *parent, unsigned long base, int num) | |||
355 | __PPI(DELAY, delay); | 351 | __PPI(DELAY, delay); |
356 | __PPI(FRAME, frame); | 352 | __PPI(FRAME, frame); |
357 | } | 353 | } |
358 | #define PPI(num) bfin_debug_mmrs_ppi(parent, PPI##num##_STATUS, num) | 354 | #define PPI(num) bfin_debug_mmrs_ppi(parent, PPI##num##_CONTROL, num) |
359 | 355 | ||
360 | /* | 356 | /* |
361 | * SPI | 357 | * SPI |
@@ -1288,15 +1284,15 @@ static int __init bfin_debug_mmrs_init(void) | |||
1288 | D16(VR_CTL); | 1284 | D16(VR_CTL); |
1289 | D32(CHIPID); /* it's part of this hardware block */ | 1285 | D32(CHIPID); /* it's part of this hardware block */ |
1290 | 1286 | ||
1291 | #if defined(PPI_STATUS) || defined(PPI0_STATUS) || defined(PPI1_STATUS) | 1287 | #if defined(PPI_CONTROL) || defined(PPI0_CONTROL) || defined(PPI1_CONTROL) |
1292 | parent = debugfs_create_dir("ppi", top); | 1288 | parent = debugfs_create_dir("ppi", top); |
1293 | # ifdef PPI_STATUS | 1289 | # ifdef PPI_CONTROL |
1294 | bfin_debug_mmrs_ppi(parent, PPI_STATUS, -1); | 1290 | bfin_debug_mmrs_ppi(parent, PPI_CONTROL, -1); |
1295 | # endif | 1291 | # endif |
1296 | # ifdef PPI0_STATUS | 1292 | # ifdef PPI0_CONTROL |
1297 | PPI(0); | 1293 | PPI(0); |
1298 | # endif | 1294 | # endif |
1299 | # ifdef PPI1_STATUS | 1295 | # ifdef PPI1_CONTROL |
1300 | PPI(1); | 1296 | PPI(1); |
1301 | # endif | 1297 | # endif |
1302 | #endif | 1298 | #endif |
@@ -1341,6 +1337,10 @@ static int __init bfin_debug_mmrs_init(void) | |||
1341 | D16(RSI_PID1); | 1337 | D16(RSI_PID1); |
1342 | D16(RSI_PID2); | 1338 | D16(RSI_PID2); |
1343 | D16(RSI_PID3); | 1339 | D16(RSI_PID3); |
1340 | D16(RSI_PID4); | ||
1341 | D16(RSI_PID5); | ||
1342 | D16(RSI_PID6); | ||
1343 | D16(RSI_PID7); | ||
1344 | D16(RSI_PWR_CONTROL); | 1344 | D16(RSI_PWR_CONTROL); |
1345 | D16(RSI_RD_WAIT_EN); | 1345 | D16(RSI_RD_WAIT_EN); |
1346 | D32(RSI_RESPONSE0); | 1346 | D32(RSI_RESPONSE0); |
diff --git a/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h deleted file mode 100644 index f6d924ac0c44..000000000000 --- a/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h +++ /dev/null | |||
@@ -1,79 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2008-2009 Analog Devices Inc. | ||
3 | * | ||
4 | * Licensed under the GPL-2 or later | ||
5 | */ | ||
6 | |||
7 | #include <asm/dma.h> | ||
8 | #include <asm/portmux.h> | ||
9 | |||
10 | #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) | ||
11 | # define CONFIG_SERIAL_BFIN_CTSRTS | ||
12 | |||
13 | # ifndef CONFIG_UART0_CTS_PIN | ||
14 | # define CONFIG_UART0_CTS_PIN -1 | ||
15 | # endif | ||
16 | |||
17 | # ifndef CONFIG_UART0_RTS_PIN | ||
18 | # define CONFIG_UART0_RTS_PIN -1 | ||
19 | # endif | ||
20 | |||
21 | # ifndef CONFIG_UART1_CTS_PIN | ||
22 | # define CONFIG_UART1_CTS_PIN -1 | ||
23 | # endif | ||
24 | |||
25 | # ifndef CONFIG_UART1_RTS_PIN | ||
26 | # define CONFIG_UART1_RTS_PIN -1 | ||
27 | # endif | ||
28 | #endif | ||
29 | |||
30 | struct bfin_serial_res { | ||
31 | unsigned long uart_base_addr; | ||
32 | int uart_irq; | ||
33 | int uart_status_irq; | ||
34 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
35 | unsigned int uart_tx_dma_channel; | ||
36 | unsigned int uart_rx_dma_channel; | ||
37 | #endif | ||
38 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
39 | int uart_cts_pin; | ||
40 | int uart_rts_pin; | ||
41 | #endif | ||
42 | }; | ||
43 | |||
44 | struct bfin_serial_res bfin_serial_resource[] = { | ||
45 | #ifdef CONFIG_SERIAL_BFIN_UART0 | ||
46 | { | ||
47 | 0xFFC00400, | ||
48 | IRQ_UART0_RX, | ||
49 | IRQ_UART0_ERROR, | ||
50 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
51 | CH_UART0_TX, | ||
52 | CH_UART0_RX, | ||
53 | #endif | ||
54 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
55 | CONFIG_UART0_CTS_PIN, | ||
56 | CONFIG_UART0_RTS_PIN, | ||
57 | #endif | ||
58 | }, | ||
59 | #endif | ||
60 | #ifdef CONFIG_SERIAL_BFIN_UART1 | ||
61 | { | ||
62 | 0xFFC02000, | ||
63 | IRQ_UART1_RX, | ||
64 | IRQ_UART1_ERROR, | ||
65 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
66 | CH_UART1_TX, | ||
67 | CH_UART1_RX, | ||
68 | #endif | ||
69 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
70 | CONFIG_UART1_CTS_PIN, | ||
71 | CONFIG_UART1_RTS_PIN, | ||
72 | #endif | ||
73 | }, | ||
74 | #endif | ||
75 | }; | ||
76 | |||
77 | #define DRIVER_NAME "bfin-uart" | ||
78 | |||
79 | #include <asm/bfin_serial.h> | ||
diff --git a/arch/blackfin/mach-bf518/include/mach/defBF514.h b/arch/blackfin/mach-bf518/include/mach/defBF514.h index 98a51c479290..cfab428e577c 100644 --- a/arch/blackfin/mach-bf518/include/mach/defBF514.h +++ b/arch/blackfin/mach-bf518/include/mach/defBF514.h | |||
@@ -36,13 +36,13 @@ | |||
36 | #define RSI_EMASK 0xFFC038C4 /* RSI Exception Mask Register */ | 36 | #define RSI_EMASK 0xFFC038C4 /* RSI Exception Mask Register */ |
37 | #define RSI_CONFIG 0xFFC038C8 /* RSI Configuration Register */ | 37 | #define RSI_CONFIG 0xFFC038C8 /* RSI Configuration Register */ |
38 | #define RSI_RD_WAIT_EN 0xFFC038CC /* RSI Read Wait Enable Register */ | 38 | #define RSI_RD_WAIT_EN 0xFFC038CC /* RSI Read Wait Enable Register */ |
39 | #define RSI_PID0 0xFFC03FE0 /* RSI Peripheral ID Register 0 */ | 39 | #define RSI_PID0 0xFFC038D0 /* RSI Peripheral ID Register 0 */ |
40 | #define RSI_PID1 0xFFC03FE4 /* RSI Peripheral ID Register 1 */ | 40 | #define RSI_PID1 0xFFC038D4 /* RSI Peripheral ID Register 1 */ |
41 | #define RSI_PID2 0xFFC03FE8 /* RSI Peripheral ID Register 2 */ | 41 | #define RSI_PID2 0xFFC038D8 /* RSI Peripheral ID Register 2 */ |
42 | #define RSI_PID3 0xFFC03FEC /* RSI Peripheral ID Register 3 */ | 42 | #define RSI_PID3 0xFFC038DC /* RSI Peripheral ID Register 3 */ |
43 | #define RSI_PID4 0xFFC03FF0 /* RSI Peripheral ID Register 4 */ | 43 | #define RSI_PID4 0xFFC038E0 /* RSI Peripheral ID Register 0 */ |
44 | #define RSI_PID5 0xFFC03FF4 /* RSI Peripheral ID Register 5 */ | 44 | #define RSI_PID5 0xFFC038E4 /* RSI Peripheral ID Register 1 */ |
45 | #define RSI_PID6 0xFFC03FF8 /* RSI Peripheral ID Register 6 */ | 45 | #define RSI_PID6 0xFFC038E8 /* RSI Peripheral ID Register 2 */ |
46 | #define RSI_PID7 0xFFC03FFC /* RSI Peripheral ID Register 7 */ | 46 | #define RSI_PID7 0xFFC038EC /* RSI Peripheral ID Register 3 */ |
47 | 47 | ||
48 | #endif /* _DEF_BF514_H */ | 48 | #endif /* _DEF_BF514_H */ |
diff --git a/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h deleted file mode 100644 index 960e08919def..000000000000 --- a/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h +++ /dev/null | |||
@@ -1,79 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2007-2009 Analog Devices Inc. | ||
3 | * | ||
4 | * Licensed under the GPL-2 or later | ||
5 | */ | ||
6 | |||
7 | #include <asm/dma.h> | ||
8 | #include <asm/portmux.h> | ||
9 | |||
10 | #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) | ||
11 | # define CONFIG_SERIAL_BFIN_CTSRTS | ||
12 | |||
13 | # ifndef CONFIG_UART0_CTS_PIN | ||
14 | # define CONFIG_UART0_CTS_PIN -1 | ||
15 | # endif | ||
16 | |||
17 | # ifndef CONFIG_UART0_RTS_PIN | ||
18 | # define CONFIG_UART0_RTS_PIN -1 | ||
19 | # endif | ||
20 | |||
21 | # ifndef CONFIG_UART1_CTS_PIN | ||
22 | # define CONFIG_UART1_CTS_PIN -1 | ||
23 | # endif | ||
24 | |||
25 | # ifndef CONFIG_UART1_RTS_PIN | ||
26 | # define CONFIG_UART1_RTS_PIN -1 | ||
27 | # endif | ||
28 | #endif | ||
29 | |||
30 | struct bfin_serial_res { | ||
31 | unsigned long uart_base_addr; | ||
32 | int uart_irq; | ||
33 | int uart_status_irq; | ||
34 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
35 | unsigned int uart_tx_dma_channel; | ||
36 | unsigned int uart_rx_dma_channel; | ||
37 | #endif | ||
38 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
39 | int uart_cts_pin; | ||
40 | int uart_rts_pin; | ||
41 | #endif | ||
42 | }; | ||
43 | |||
44 | struct bfin_serial_res bfin_serial_resource[] = { | ||
45 | #ifdef CONFIG_SERIAL_BFIN_UART0 | ||
46 | { | ||
47 | 0xFFC00400, | ||
48 | IRQ_UART0_RX, | ||
49 | IRQ_UART0_ERROR, | ||
50 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
51 | CH_UART0_TX, | ||
52 | CH_UART0_RX, | ||
53 | #endif | ||
54 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
55 | CONFIG_UART0_CTS_PIN, | ||
56 | CONFIG_UART0_RTS_PIN, | ||
57 | #endif | ||
58 | }, | ||
59 | #endif | ||
60 | #ifdef CONFIG_SERIAL_BFIN_UART1 | ||
61 | { | ||
62 | 0xFFC02000, | ||
63 | IRQ_UART1_RX, | ||
64 | IRQ_UART1_ERROR, | ||
65 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
66 | CH_UART1_TX, | ||
67 | CH_UART1_RX, | ||
68 | #endif | ||
69 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
70 | CONFIG_UART1_CTS_PIN, | ||
71 | CONFIG_UART1_RTS_PIN, | ||
72 | #endif | ||
73 | }, | ||
74 | #endif | ||
75 | }; | ||
76 | |||
77 | #define DRIVER_NAME "bfin-uart" | ||
78 | |||
79 | #include <asm/bfin_serial.h> | ||
diff --git a/arch/blackfin/mach-bf527/include/mach/defBF525.h b/arch/blackfin/mach-bf527/include/mach/defBF525.h index cc383adfdffa..aab80bb1a683 100644 --- a/arch/blackfin/mach-bf527/include/mach/defBF525.h +++ b/arch/blackfin/mach-bf527/include/mach/defBF525.h | |||
@@ -185,8 +185,8 @@ | |||
185 | #define USB_EP_NI7_TXTYPE 0xffc03bd4 /* Sets the transaction protocol and peripheral endpoint number for the Host Tx endpoint7 */ | 185 | #define USB_EP_NI7_TXTYPE 0xffc03bd4 /* Sets the transaction protocol and peripheral endpoint number for the Host Tx endpoint7 */ |
186 | #define USB_EP_NI7_TXINTERVAL 0xffc03bd8 /* Sets the NAK response timeout on Endpoint7 */ | 186 | #define USB_EP_NI7_TXINTERVAL 0xffc03bd8 /* Sets the NAK response timeout on Endpoint7 */ |
187 | #define USB_EP_NI7_RXTYPE 0xffc03bdc /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint7 */ | 187 | #define USB_EP_NI7_RXTYPE 0xffc03bdc /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint7 */ |
188 | #define USB_EP_NI7_RXINTERVAL 0xffc03bf0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint7 */ | 188 | #define USB_EP_NI7_RXINTERVAL 0xffc03be0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint7 */ |
189 | #define USB_EP_NI7_TXCOUNT 0xffc03bf8 /* Number of bytes to be written to the endpoint7 Tx FIFO */ | 189 | #define USB_EP_NI7_TXCOUNT 0xffc03be8 /* Number of bytes to be written to the endpoint7 Tx FIFO */ |
190 | 190 | ||
191 | #define USB_DMA_INTERRUPT 0xffc03c00 /* Indicates pending interrupts for the DMA channels */ | 191 | #define USB_DMA_INTERRUPT 0xffc03c00 /* Indicates pending interrupts for the DMA channels */ |
192 | 192 | ||
diff --git a/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h deleted file mode 100644 index 45dcaa4f3e41..000000000000 --- a/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h +++ /dev/null | |||
@@ -1,52 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2006-2009 Analog Devices Inc. | ||
3 | * | ||
4 | * Licensed under the GPL-2 or later | ||
5 | */ | ||
6 | |||
7 | #include <asm/dma.h> | ||
8 | #include <asm/portmux.h> | ||
9 | |||
10 | #ifdef CONFIG_BFIN_UART0_CTSRTS | ||
11 | # define CONFIG_SERIAL_BFIN_CTSRTS | ||
12 | # ifndef CONFIG_UART0_CTS_PIN | ||
13 | # define CONFIG_UART0_CTS_PIN -1 | ||
14 | # endif | ||
15 | # ifndef CONFIG_UART0_RTS_PIN | ||
16 | # define CONFIG_UART0_RTS_PIN -1 | ||
17 | # endif | ||
18 | #endif | ||
19 | |||
20 | struct bfin_serial_res { | ||
21 | unsigned long uart_base_addr; | ||
22 | int uart_irq; | ||
23 | int uart_status_irq; | ||
24 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
25 | unsigned int uart_tx_dma_channel; | ||
26 | unsigned int uart_rx_dma_channel; | ||
27 | #endif | ||
28 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
29 | int uart_cts_pin; | ||
30 | int uart_rts_pin; | ||
31 | #endif | ||
32 | }; | ||
33 | |||
34 | struct bfin_serial_res bfin_serial_resource[] = { | ||
35 | { | ||
36 | 0xFFC00400, | ||
37 | IRQ_UART0_RX, | ||
38 | IRQ_UART0_ERROR, | ||
39 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
40 | CH_UART0_TX, | ||
41 | CH_UART0_RX, | ||
42 | #endif | ||
43 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
44 | CONFIG_UART0_CTS_PIN, | ||
45 | CONFIG_UART0_RTS_PIN, | ||
46 | #endif | ||
47 | } | ||
48 | }; | ||
49 | |||
50 | #define DRIVER_NAME "bfin-uart" | ||
51 | |||
52 | #include <asm/bfin_serial.h> | ||
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c index e16dc4560048..76db1d483173 100644 --- a/arch/blackfin/mach-bf537/boards/stamp.c +++ b/arch/blackfin/mach-bf537/boards/stamp.c | |||
@@ -382,7 +382,6 @@ static struct platform_device net2272_bfin_device = { | |||
382 | #endif | 382 | #endif |
383 | 383 | ||
384 | #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE) | 384 | #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE) |
385 | #ifdef CONFIG_MTD_PARTITIONS | ||
386 | const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; | 385 | const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; |
387 | 386 | ||
388 | static struct mtd_partition bfin_plat_nand_partitions[] = { | 387 | static struct mtd_partition bfin_plat_nand_partitions[] = { |
@@ -396,7 +395,6 @@ static struct mtd_partition bfin_plat_nand_partitions[] = { | |||
396 | .offset = MTDPART_OFS_APPEND, | 395 | .offset = MTDPART_OFS_APPEND, |
397 | }, | 396 | }, |
398 | }; | 397 | }; |
399 | #endif | ||
400 | 398 | ||
401 | #define BFIN_NAND_PLAT_CLE 2 | 399 | #define BFIN_NAND_PLAT_CLE 2 |
402 | #define BFIN_NAND_PLAT_ALE 1 | 400 | #define BFIN_NAND_PLAT_ALE 1 |
@@ -423,11 +421,9 @@ static struct platform_nand_data bfin_plat_nand_data = { | |||
423 | .chip = { | 421 | .chip = { |
424 | .nr_chips = 1, | 422 | .nr_chips = 1, |
425 | .chip_delay = 30, | 423 | .chip_delay = 30, |
426 | #ifdef CONFIG_MTD_PARTITIONS | ||
427 | .part_probe_types = part_probes, | 424 | .part_probe_types = part_probes, |
428 | .partitions = bfin_plat_nand_partitions, | 425 | .partitions = bfin_plat_nand_partitions, |
429 | .nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions), | 426 | .nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions), |
430 | #endif | ||
431 | }, | 427 | }, |
432 | .ctrl = { | 428 | .ctrl = { |
433 | .cmd_ctrl = bfin_plat_nand_cmd_ctrl, | 429 | .cmd_ctrl = bfin_plat_nand_cmd_ctrl, |
diff --git a/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h deleted file mode 100644 index 3e955dba8951..000000000000 --- a/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h +++ /dev/null | |||
@@ -1,79 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2006-2009 Analog Devices Inc. | ||
3 | * | ||
4 | * Licensed under the GPL-2 or later | ||
5 | */ | ||
6 | |||
7 | #include <asm/dma.h> | ||
8 | #include <asm/portmux.h> | ||
9 | |||
10 | #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) | ||
11 | # define CONFIG_SERIAL_BFIN_CTSRTS | ||
12 | |||
13 | # ifndef CONFIG_UART0_CTS_PIN | ||
14 | # define CONFIG_UART0_CTS_PIN -1 | ||
15 | # endif | ||
16 | |||
17 | # ifndef CONFIG_UART0_RTS_PIN | ||
18 | # define CONFIG_UART0_RTS_PIN -1 | ||
19 | # endif | ||
20 | |||
21 | # ifndef CONFIG_UART1_CTS_PIN | ||
22 | # define CONFIG_UART1_CTS_PIN -1 | ||
23 | # endif | ||
24 | |||
25 | # ifndef CONFIG_UART1_RTS_PIN | ||
26 | # define CONFIG_UART1_RTS_PIN -1 | ||
27 | # endif | ||
28 | #endif | ||
29 | |||
30 | struct bfin_serial_res { | ||
31 | unsigned long uart_base_addr; | ||
32 | int uart_irq; | ||
33 | int uart_status_irq; | ||
34 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
35 | unsigned int uart_tx_dma_channel; | ||
36 | unsigned int uart_rx_dma_channel; | ||
37 | #endif | ||
38 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
39 | int uart_cts_pin; | ||
40 | int uart_rts_pin; | ||
41 | #endif | ||
42 | }; | ||
43 | |||
44 | struct bfin_serial_res bfin_serial_resource[] = { | ||
45 | #ifdef CONFIG_SERIAL_BFIN_UART0 | ||
46 | { | ||
47 | 0xFFC00400, | ||
48 | IRQ_UART0_RX, | ||
49 | IRQ_UART0_ERROR, | ||
50 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
51 | CH_UART0_TX, | ||
52 | CH_UART0_RX, | ||
53 | #endif | ||
54 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
55 | CONFIG_UART0_CTS_PIN, | ||
56 | CONFIG_UART0_RTS_PIN, | ||
57 | #endif | ||
58 | }, | ||
59 | #endif | ||
60 | #ifdef CONFIG_SERIAL_BFIN_UART1 | ||
61 | { | ||
62 | 0xFFC02000, | ||
63 | IRQ_UART1_RX, | ||
64 | IRQ_UART1_ERROR, | ||
65 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
66 | CH_UART1_TX, | ||
67 | CH_UART1_RX, | ||
68 | #endif | ||
69 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
70 | CONFIG_UART1_CTS_PIN, | ||
71 | CONFIG_UART1_RTS_PIN, | ||
72 | #endif | ||
73 | }, | ||
74 | #endif | ||
75 | }; | ||
76 | |||
77 | #define DRIVER_NAME "bfin-uart" | ||
78 | |||
79 | #include <asm/bfin_serial.h> | ||
diff --git a/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h deleted file mode 100644 index beb502e9cb33..000000000000 --- a/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h +++ /dev/null | |||
@@ -1,93 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2008-2009 Analog Devices Inc. | ||
3 | * | ||
4 | * Licensed under the GPL-2 or later. | ||
5 | */ | ||
6 | |||
7 | #include <asm/dma.h> | ||
8 | #include <asm/portmux.h> | ||
9 | |||
10 | #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) | ||
11 | # define CONFIG_SERIAL_BFIN_CTSRTS | ||
12 | |||
13 | # ifndef CONFIG_UART0_CTS_PIN | ||
14 | # define CONFIG_UART0_CTS_PIN -1 | ||
15 | # endif | ||
16 | |||
17 | # ifndef CONFIG_UART0_RTS_PIN | ||
18 | # define CONFIG_UART0_RTS_PIN -1 | ||
19 | # endif | ||
20 | |||
21 | # ifndef CONFIG_UART1_CTS_PIN | ||
22 | # define CONFIG_UART1_CTS_PIN -1 | ||
23 | # endif | ||
24 | |||
25 | # ifndef CONFIG_UART1_RTS_PIN | ||
26 | # define CONFIG_UART1_RTS_PIN -1 | ||
27 | # endif | ||
28 | #endif | ||
29 | |||
30 | struct bfin_serial_res { | ||
31 | unsigned long uart_base_addr; | ||
32 | int uart_irq; | ||
33 | int uart_status_irq; | ||
34 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
35 | unsigned int uart_tx_dma_channel; | ||
36 | unsigned int uart_rx_dma_channel; | ||
37 | #endif | ||
38 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
39 | int uart_cts_pin; | ||
40 | int uart_rts_pin; | ||
41 | #endif | ||
42 | }; | ||
43 | |||
44 | struct bfin_serial_res bfin_serial_resource[] = { | ||
45 | #ifdef CONFIG_SERIAL_BFIN_UART0 | ||
46 | { | ||
47 | 0xFFC00400, | ||
48 | IRQ_UART0_RX, | ||
49 | IRQ_UART0_ERROR, | ||
50 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
51 | CH_UART0_TX, | ||
52 | CH_UART0_RX, | ||
53 | #endif | ||
54 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
55 | CONFIG_UART0_CTS_PIN, | ||
56 | CONFIG_UART0_RTS_PIN, | ||
57 | #endif | ||
58 | }, | ||
59 | #endif | ||
60 | #ifdef CONFIG_SERIAL_BFIN_UART1 | ||
61 | { | ||
62 | 0xFFC02000, | ||
63 | IRQ_UART1_RX, | ||
64 | IRQ_UART1_ERROR, | ||
65 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
66 | CH_UART1_TX, | ||
67 | CH_UART1_RX, | ||
68 | #endif | ||
69 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
70 | CONFIG_UART1_CTS_PIN, | ||
71 | CONFIG_UART1_RTS_PIN, | ||
72 | #endif | ||
73 | }, | ||
74 | #endif | ||
75 | #ifdef CONFIG_SERIAL_BFIN_UART2 | ||
76 | { | ||
77 | 0xFFC02100, | ||
78 | IRQ_UART2_RX, | ||
79 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
80 | CH_UART2_TX, | ||
81 | CH_UART2_RX, | ||
82 | #endif | ||
83 | #ifdef CONFIG_BFIN_UART2_CTSRTS | ||
84 | CONFIG_UART2_CTS_PIN, | ||
85 | CONFIG_UART2_RTS_PIN, | ||
86 | #endif | ||
87 | }, | ||
88 | #endif | ||
89 | }; | ||
90 | |||
91 | #define DRIVER_NAME "bfin-uart" | ||
92 | |||
93 | #include <asm/bfin_serial.h> | ||
diff --git a/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h deleted file mode 100644 index 0d94edaaaa2e..000000000000 --- a/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h +++ /dev/null | |||
@@ -1,94 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2007-2009 Analog Devices Inc. | ||
3 | * | ||
4 | * Licensed under the GPL-2 or later. | ||
5 | */ | ||
6 | |||
7 | #include <asm/dma.h> | ||
8 | #include <asm/portmux.h> | ||
9 | |||
10 | #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) || \ | ||
11 | defined(CONFIG_BFIN_UART2_CTSRTS) || defined(CONFIG_BFIN_UART3_CTSRTS) | ||
12 | # define CONFIG_SERIAL_BFIN_HARD_CTSRTS | ||
13 | #endif | ||
14 | |||
15 | struct bfin_serial_res { | ||
16 | unsigned long uart_base_addr; | ||
17 | int uart_irq; | ||
18 | int uart_status_irq; | ||
19 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
20 | unsigned int uart_tx_dma_channel; | ||
21 | unsigned int uart_rx_dma_channel; | ||
22 | #endif | ||
23 | #ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS | ||
24 | int uart_cts_pin; | ||
25 | int uart_rts_pin; | ||
26 | #endif | ||
27 | }; | ||
28 | |||
29 | struct bfin_serial_res bfin_serial_resource[] = { | ||
30 | #ifdef CONFIG_SERIAL_BFIN_UART0 | ||
31 | { | ||
32 | 0xFFC00400, | ||
33 | IRQ_UART0_RX, | ||
34 | IRQ_UART0_ERROR, | ||
35 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
36 | CH_UART0_TX, | ||
37 | CH_UART0_RX, | ||
38 | #endif | ||
39 | #ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS | ||
40 | 0, | ||
41 | 0, | ||
42 | #endif | ||
43 | }, | ||
44 | #endif | ||
45 | #ifdef CONFIG_SERIAL_BFIN_UART1 | ||
46 | { | ||
47 | 0xFFC02000, | ||
48 | IRQ_UART1_RX, | ||
49 | IRQ_UART1_ERROR, | ||
50 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
51 | CH_UART1_TX, | ||
52 | CH_UART1_RX, | ||
53 | #endif | ||
54 | #ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS | ||
55 | GPIO_PE10, | ||
56 | GPIO_PE9, | ||
57 | #endif | ||
58 | }, | ||
59 | #endif | ||
60 | #ifdef CONFIG_SERIAL_BFIN_UART2 | ||
61 | { | ||
62 | 0xFFC02100, | ||
63 | IRQ_UART2_RX, | ||
64 | IRQ_UART2_ERROR, | ||
65 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
66 | CH_UART2_TX, | ||
67 | CH_UART2_RX, | ||
68 | #endif | ||
69 | #ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS | ||
70 | 0, | ||
71 | 0, | ||
72 | #endif | ||
73 | }, | ||
74 | #endif | ||
75 | #ifdef CONFIG_SERIAL_BFIN_UART3 | ||
76 | { | ||
77 | 0xFFC03100, | ||
78 | IRQ_UART3_RX, | ||
79 | IRQ_UART3_ERROR, | ||
80 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
81 | CH_UART3_TX, | ||
82 | CH_UART3_RX, | ||
83 | #endif | ||
84 | #ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS | ||
85 | GPIO_PB3, | ||
86 | GPIO_PB2, | ||
87 | #endif | ||
88 | }, | ||
89 | #endif | ||
90 | }; | ||
91 | |||
92 | #define DRIVER_NAME "bfin-uart" | ||
93 | |||
94 | #include <asm/bfin_serial.h> | ||
diff --git a/arch/blackfin/mach-bf548/include/mach/defBF547.h b/arch/blackfin/mach-bf548/include/mach/defBF547.h index 1cbba115f96f..1fa41ec03f31 100644 --- a/arch/blackfin/mach-bf548/include/mach/defBF547.h +++ b/arch/blackfin/mach-bf548/include/mach/defBF547.h | |||
@@ -271,10 +271,10 @@ | |||
271 | #define USB_EP_NI0_TXINTERVAL 0xffc03e18 /* Sets the NAK response timeout on Endpoint 0 */ | 271 | #define USB_EP_NI0_TXINTERVAL 0xffc03e18 /* Sets the NAK response timeout on Endpoint 0 */ |
272 | #define USB_EP_NI0_RXTYPE 0xffc03e1c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint0 */ | 272 | #define USB_EP_NI0_RXTYPE 0xffc03e1c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint0 */ |
273 | #define USB_EP_NI0_RXINTERVAL 0xffc03e20 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint0 */ | 273 | #define USB_EP_NI0_RXINTERVAL 0xffc03e20 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint0 */ |
274 | #define USB_EP_NI0_TXCOUNT 0xffc03e28 /* Number of bytes to be written to the endpoint0 Tx FIFO */ | ||
274 | 275 | ||
275 | /* USB Endpoint 1 Control Registers */ | 276 | /* USB Endpoint 1 Control Registers */ |
276 | 277 | ||
277 | #define USB_EP_NI0_TXCOUNT 0xffc03e28 /* Number of bytes to be written to the endpoint0 Tx FIFO */ | ||
278 | #define USB_EP_NI1_TXMAXP 0xffc03e40 /* Maximum packet size for Host Tx endpoint1 */ | 278 | #define USB_EP_NI1_TXMAXP 0xffc03e40 /* Maximum packet size for Host Tx endpoint1 */ |
279 | #define USB_EP_NI1_TXCSR 0xffc03e44 /* Control Status register for endpoint1 */ | 279 | #define USB_EP_NI1_TXCSR 0xffc03e44 /* Control Status register for endpoint1 */ |
280 | #define USB_EP_NI1_RXMAXP 0xffc03e48 /* Maximum packet size for Host Rx endpoint1 */ | 280 | #define USB_EP_NI1_RXMAXP 0xffc03e48 /* Maximum packet size for Host Rx endpoint1 */ |
@@ -284,10 +284,10 @@ | |||
284 | #define USB_EP_NI1_TXINTERVAL 0xffc03e58 /* Sets the NAK response timeout on Endpoint1 */ | 284 | #define USB_EP_NI1_TXINTERVAL 0xffc03e58 /* Sets the NAK response timeout on Endpoint1 */ |
285 | #define USB_EP_NI1_RXTYPE 0xffc03e5c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint1 */ | 285 | #define USB_EP_NI1_RXTYPE 0xffc03e5c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint1 */ |
286 | #define USB_EP_NI1_RXINTERVAL 0xffc03e60 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint1 */ | 286 | #define USB_EP_NI1_RXINTERVAL 0xffc03e60 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint1 */ |
287 | #define USB_EP_NI1_TXCOUNT 0xffc03e68 /* Number of bytes to be written to the+H102 endpoint1 Tx FIFO */ | ||
287 | 288 | ||
288 | /* USB Endpoint 2 Control Registers */ | 289 | /* USB Endpoint 2 Control Registers */ |
289 | 290 | ||
290 | #define USB_EP_NI1_TXCOUNT 0xffc03e68 /* Number of bytes to be written to the+H102 endpoint1 Tx FIFO */ | ||
291 | #define USB_EP_NI2_TXMAXP 0xffc03e80 /* Maximum packet size for Host Tx endpoint2 */ | 291 | #define USB_EP_NI2_TXMAXP 0xffc03e80 /* Maximum packet size for Host Tx endpoint2 */ |
292 | #define USB_EP_NI2_TXCSR 0xffc03e84 /* Control Status register for endpoint2 */ | 292 | #define USB_EP_NI2_TXCSR 0xffc03e84 /* Control Status register for endpoint2 */ |
293 | #define USB_EP_NI2_RXMAXP 0xffc03e88 /* Maximum packet size for Host Rx endpoint2 */ | 293 | #define USB_EP_NI2_RXMAXP 0xffc03e88 /* Maximum packet size for Host Rx endpoint2 */ |
@@ -297,10 +297,10 @@ | |||
297 | #define USB_EP_NI2_TXINTERVAL 0xffc03e98 /* Sets the NAK response timeout on Endpoint2 */ | 297 | #define USB_EP_NI2_TXINTERVAL 0xffc03e98 /* Sets the NAK response timeout on Endpoint2 */ |
298 | #define USB_EP_NI2_RXTYPE 0xffc03e9c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint2 */ | 298 | #define USB_EP_NI2_RXTYPE 0xffc03e9c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint2 */ |
299 | #define USB_EP_NI2_RXINTERVAL 0xffc03ea0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint2 */ | 299 | #define USB_EP_NI2_RXINTERVAL 0xffc03ea0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint2 */ |
300 | #define USB_EP_NI2_TXCOUNT 0xffc03ea8 /* Number of bytes to be written to the endpoint2 Tx FIFO */ | ||
300 | 301 | ||
301 | /* USB Endpoint 3 Control Registers */ | 302 | /* USB Endpoint 3 Control Registers */ |
302 | 303 | ||
303 | #define USB_EP_NI2_TXCOUNT 0xffc03ea8 /* Number of bytes to be written to the endpoint2 Tx FIFO */ | ||
304 | #define USB_EP_NI3_TXMAXP 0xffc03ec0 /* Maximum packet size for Host Tx endpoint3 */ | 304 | #define USB_EP_NI3_TXMAXP 0xffc03ec0 /* Maximum packet size for Host Tx endpoint3 */ |
305 | #define USB_EP_NI3_TXCSR 0xffc03ec4 /* Control Status register for endpoint3 */ | 305 | #define USB_EP_NI3_TXCSR 0xffc03ec4 /* Control Status register for endpoint3 */ |
306 | #define USB_EP_NI3_RXMAXP 0xffc03ec8 /* Maximum packet size for Host Rx endpoint3 */ | 306 | #define USB_EP_NI3_RXMAXP 0xffc03ec8 /* Maximum packet size for Host Rx endpoint3 */ |
@@ -310,10 +310,10 @@ | |||
310 | #define USB_EP_NI3_TXINTERVAL 0xffc03ed8 /* Sets the NAK response timeout on Endpoint3 */ | 310 | #define USB_EP_NI3_TXINTERVAL 0xffc03ed8 /* Sets the NAK response timeout on Endpoint3 */ |
311 | #define USB_EP_NI3_RXTYPE 0xffc03edc /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint3 */ | 311 | #define USB_EP_NI3_RXTYPE 0xffc03edc /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint3 */ |
312 | #define USB_EP_NI3_RXINTERVAL 0xffc03ee0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint3 */ | 312 | #define USB_EP_NI3_RXINTERVAL 0xffc03ee0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint3 */ |
313 | #define USB_EP_NI3_TXCOUNT 0xffc03ee8 /* Number of bytes to be written to the H124endpoint3 Tx FIFO */ | ||
313 | 314 | ||
314 | /* USB Endpoint 4 Control Registers */ | 315 | /* USB Endpoint 4 Control Registers */ |
315 | 316 | ||
316 | #define USB_EP_NI3_TXCOUNT 0xffc03ee8 /* Number of bytes to be written to the H124endpoint3 Tx FIFO */ | ||
317 | #define USB_EP_NI4_TXMAXP 0xffc03f00 /* Maximum packet size for Host Tx endpoint4 */ | 317 | #define USB_EP_NI4_TXMAXP 0xffc03f00 /* Maximum packet size for Host Tx endpoint4 */ |
318 | #define USB_EP_NI4_TXCSR 0xffc03f04 /* Control Status register for endpoint4 */ | 318 | #define USB_EP_NI4_TXCSR 0xffc03f04 /* Control Status register for endpoint4 */ |
319 | #define USB_EP_NI4_RXMAXP 0xffc03f08 /* Maximum packet size for Host Rx endpoint4 */ | 319 | #define USB_EP_NI4_RXMAXP 0xffc03f08 /* Maximum packet size for Host Rx endpoint4 */ |
@@ -323,10 +323,10 @@ | |||
323 | #define USB_EP_NI4_TXINTERVAL 0xffc03f18 /* Sets the NAK response timeout on Endpoint4 */ | 323 | #define USB_EP_NI4_TXINTERVAL 0xffc03f18 /* Sets the NAK response timeout on Endpoint4 */ |
324 | #define USB_EP_NI4_RXTYPE 0xffc03f1c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint4 */ | 324 | #define USB_EP_NI4_RXTYPE 0xffc03f1c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint4 */ |
325 | #define USB_EP_NI4_RXINTERVAL 0xffc03f20 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint4 */ | 325 | #define USB_EP_NI4_RXINTERVAL 0xffc03f20 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint4 */ |
326 | #define USB_EP_NI4_TXCOUNT 0xffc03f28 /* Number of bytes to be written to the endpoint4 Tx FIFO */ | ||
326 | 327 | ||
327 | /* USB Endpoint 5 Control Registers */ | 328 | /* USB Endpoint 5 Control Registers */ |
328 | 329 | ||
329 | #define USB_EP_NI4_TXCOUNT 0xffc03f28 /* Number of bytes to be written to the endpoint4 Tx FIFO */ | ||
330 | #define USB_EP_NI5_TXMAXP 0xffc03f40 /* Maximum packet size for Host Tx endpoint5 */ | 330 | #define USB_EP_NI5_TXMAXP 0xffc03f40 /* Maximum packet size for Host Tx endpoint5 */ |
331 | #define USB_EP_NI5_TXCSR 0xffc03f44 /* Control Status register for endpoint5 */ | 331 | #define USB_EP_NI5_TXCSR 0xffc03f44 /* Control Status register for endpoint5 */ |
332 | #define USB_EP_NI5_RXMAXP 0xffc03f48 /* Maximum packet size for Host Rx endpoint5 */ | 332 | #define USB_EP_NI5_RXMAXP 0xffc03f48 /* Maximum packet size for Host Rx endpoint5 */ |
@@ -336,10 +336,10 @@ | |||
336 | #define USB_EP_NI5_TXINTERVAL 0xffc03f58 /* Sets the NAK response timeout on Endpoint5 */ | 336 | #define USB_EP_NI5_TXINTERVAL 0xffc03f58 /* Sets the NAK response timeout on Endpoint5 */ |
337 | #define USB_EP_NI5_RXTYPE 0xffc03f5c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint5 */ | 337 | #define USB_EP_NI5_RXTYPE 0xffc03f5c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint5 */ |
338 | #define USB_EP_NI5_RXINTERVAL 0xffc03f60 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint5 */ | 338 | #define USB_EP_NI5_RXINTERVAL 0xffc03f60 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint5 */ |
339 | #define USB_EP_NI5_TXCOUNT 0xffc03f68 /* Number of bytes to be written to the H145endpoint5 Tx FIFO */ | ||
339 | 340 | ||
340 | /* USB Endpoint 6 Control Registers */ | 341 | /* USB Endpoint 6 Control Registers */ |
341 | 342 | ||
342 | #define USB_EP_NI5_TXCOUNT 0xffc03f68 /* Number of bytes to be written to the H145endpoint5 Tx FIFO */ | ||
343 | #define USB_EP_NI6_TXMAXP 0xffc03f80 /* Maximum packet size for Host Tx endpoint6 */ | 343 | #define USB_EP_NI6_TXMAXP 0xffc03f80 /* Maximum packet size for Host Tx endpoint6 */ |
344 | #define USB_EP_NI6_TXCSR 0xffc03f84 /* Control Status register for endpoint6 */ | 344 | #define USB_EP_NI6_TXCSR 0xffc03f84 /* Control Status register for endpoint6 */ |
345 | #define USB_EP_NI6_RXMAXP 0xffc03f88 /* Maximum packet size for Host Rx endpoint6 */ | 345 | #define USB_EP_NI6_RXMAXP 0xffc03f88 /* Maximum packet size for Host Rx endpoint6 */ |
@@ -349,10 +349,10 @@ | |||
349 | #define USB_EP_NI6_TXINTERVAL 0xffc03f98 /* Sets the NAK response timeout on Endpoint6 */ | 349 | #define USB_EP_NI6_TXINTERVAL 0xffc03f98 /* Sets the NAK response timeout on Endpoint6 */ |
350 | #define USB_EP_NI6_RXTYPE 0xffc03f9c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint6 */ | 350 | #define USB_EP_NI6_RXTYPE 0xffc03f9c /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint6 */ |
351 | #define USB_EP_NI6_RXINTERVAL 0xffc03fa0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint6 */ | 351 | #define USB_EP_NI6_RXINTERVAL 0xffc03fa0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint6 */ |
352 | #define USB_EP_NI6_TXCOUNT 0xffc03fa8 /* Number of bytes to be written to the endpoint6 Tx FIFO */ | ||
352 | 353 | ||
353 | /* USB Endpoint 7 Control Registers */ | 354 | /* USB Endpoint 7 Control Registers */ |
354 | 355 | ||
355 | #define USB_EP_NI6_TXCOUNT 0xffc03fa8 /* Number of bytes to be written to the endpoint6 Tx FIFO */ | ||
356 | #define USB_EP_NI7_TXMAXP 0xffc03fc0 /* Maximum packet size for Host Tx endpoint7 */ | 356 | #define USB_EP_NI7_TXMAXP 0xffc03fc0 /* Maximum packet size for Host Tx endpoint7 */ |
357 | #define USB_EP_NI7_TXCSR 0xffc03fc4 /* Control Status register for endpoint7 */ | 357 | #define USB_EP_NI7_TXCSR 0xffc03fc4 /* Control Status register for endpoint7 */ |
358 | #define USB_EP_NI7_RXMAXP 0xffc03fc8 /* Maximum packet size for Host Rx endpoint7 */ | 358 | #define USB_EP_NI7_RXMAXP 0xffc03fc8 /* Maximum packet size for Host Rx endpoint7 */ |
@@ -361,8 +361,9 @@ | |||
361 | #define USB_EP_NI7_TXTYPE 0xffc03fd4 /* Sets the transaction protocol and peripheral endpoint number for the Host Tx endpoint7 */ | 361 | #define USB_EP_NI7_TXTYPE 0xffc03fd4 /* Sets the transaction protocol and peripheral endpoint number for the Host Tx endpoint7 */ |
362 | #define USB_EP_NI7_TXINTERVAL 0xffc03fd8 /* Sets the NAK response timeout on Endpoint7 */ | 362 | #define USB_EP_NI7_TXINTERVAL 0xffc03fd8 /* Sets the NAK response timeout on Endpoint7 */ |
363 | #define USB_EP_NI7_RXTYPE 0xffc03fdc /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint7 */ | 363 | #define USB_EP_NI7_RXTYPE 0xffc03fdc /* Sets the transaction protocol and peripheral endpoint number for the Host Rx endpoint7 */ |
364 | #define USB_EP_NI7_RXINTERVAL 0xffc03ff0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint7 */ | 364 | #define USB_EP_NI7_RXINTERVAL 0xffc03fe0 /* Sets the polling interval for Interrupt/Isochronous transfers or the NAK response timeout on Bulk transfers for Host Rx endpoint7 */ |
365 | #define USB_EP_NI7_TXCOUNT 0xffc03ff8 /* Number of bytes to be written to the endpoint7 Tx FIFO */ | 365 | #define USB_EP_NI7_TXCOUNT 0xffc03fe8 /* Number of bytes to be written to the endpoint7 Tx FIFO */ |
366 | |||
366 | #define USB_DMA_INTERRUPT 0xffc04000 /* Indicates pending interrupts for the DMA channels */ | 367 | #define USB_DMA_INTERRUPT 0xffc04000 /* Indicates pending interrupts for the DMA channels */ |
367 | 368 | ||
368 | /* USB Channel 0 Config Registers */ | 369 | /* USB Channel 0 Config Registers */ |
diff --git a/arch/blackfin/mach-bf561/boards/acvilon.c b/arch/blackfin/mach-bf561/boards/acvilon.c index 3926cd909b66..9231a942892b 100644 --- a/arch/blackfin/mach-bf561/boards/acvilon.c +++ b/arch/blackfin/mach-bf561/boards/acvilon.c | |||
@@ -243,7 +243,6 @@ static struct platform_device bfin_uart0_device = { | |||
243 | 243 | ||
244 | #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE) | 244 | #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE) |
245 | 245 | ||
246 | #ifdef CONFIG_MTD_PARTITIONS | ||
247 | const char *part_probes[] = { "cmdlinepart", NULL }; | 246 | const char *part_probes[] = { "cmdlinepart", NULL }; |
248 | 247 | ||
249 | static struct mtd_partition bfin_plat_nand_partitions[] = { | 248 | static struct mtd_partition bfin_plat_nand_partitions[] = { |
@@ -257,7 +256,6 @@ static struct mtd_partition bfin_plat_nand_partitions[] = { | |||
257 | .offset = MTDPART_OFS_APPEND, | 256 | .offset = MTDPART_OFS_APPEND, |
258 | }, | 257 | }, |
259 | }; | 258 | }; |
260 | #endif | ||
261 | 259 | ||
262 | #define BFIN_NAND_PLAT_CLE 2 | 260 | #define BFIN_NAND_PLAT_CLE 2 |
263 | #define BFIN_NAND_PLAT_ALE 3 | 261 | #define BFIN_NAND_PLAT_ALE 3 |
@@ -286,11 +284,9 @@ static struct platform_nand_data bfin_plat_nand_data = { | |||
286 | .chip = { | 284 | .chip = { |
287 | .nr_chips = 1, | 285 | .nr_chips = 1, |
288 | .chip_delay = 30, | 286 | .chip_delay = 30, |
289 | #ifdef CONFIG_MTD_PARTITIONS | ||
290 | .part_probe_types = part_probes, | 287 | .part_probe_types = part_probes, |
291 | .partitions = bfin_plat_nand_partitions, | 288 | .partitions = bfin_plat_nand_partitions, |
292 | .nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions), | 289 | .nr_partitions = ARRAY_SIZE(bfin_plat_nand_partitions), |
293 | #endif | ||
294 | }, | 290 | }, |
295 | .ctrl = { | 291 | .ctrl = { |
296 | .cmd_ctrl = bfin_plat_nand_cmd_ctrl, | 292 | .cmd_ctrl = bfin_plat_nand_cmd_ctrl, |
diff --git a/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h deleted file mode 100644 index 3a6947456cf1..000000000000 --- a/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h +++ /dev/null | |||
@@ -1,52 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2006-2009 Analog Devices Inc. | ||
3 | * | ||
4 | * Licensed under the GPL-2 or later. | ||
5 | */ | ||
6 | |||
7 | #include <asm/dma.h> | ||
8 | #include <asm/portmux.h> | ||
9 | |||
10 | #ifdef CONFIG_BFIN_UART0_CTSRTS | ||
11 | # define CONFIG_SERIAL_BFIN_CTSRTS | ||
12 | # ifndef CONFIG_UART0_CTS_PIN | ||
13 | # define CONFIG_UART0_CTS_PIN -1 | ||
14 | # endif | ||
15 | # ifndef CONFIG_UART0_RTS_PIN | ||
16 | # define CONFIG_UART0_RTS_PIN -1 | ||
17 | # endif | ||
18 | #endif | ||
19 | |||
20 | struct bfin_serial_res { | ||
21 | unsigned long uart_base_addr; | ||
22 | int uart_irq; | ||
23 | int uart_status_irq; | ||
24 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
25 | unsigned int uart_tx_dma_channel; | ||
26 | unsigned int uart_rx_dma_channel; | ||
27 | #endif | ||
28 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
29 | int uart_cts_pin; | ||
30 | int uart_rts_pin; | ||
31 | #endif | ||
32 | }; | ||
33 | |||
34 | struct bfin_serial_res bfin_serial_resource[] = { | ||
35 | { | ||
36 | 0xFFC00400, | ||
37 | IRQ_UART_RX, | ||
38 | IRQ_UART_ERROR, | ||
39 | #ifdef CONFIG_SERIAL_BFIN_DMA | ||
40 | CH_UART_TX, | ||
41 | CH_UART_RX, | ||
42 | #endif | ||
43 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
44 | CONFIG_UART0_CTS_PIN, | ||
45 | CONFIG_UART0_RTS_PIN, | ||
46 | #endif | ||
47 | } | ||
48 | }; | ||
49 | |||
50 | #define DRIVER_NAME "bfin-uart" | ||
51 | |||
52 | #include <asm/bfin_serial.h> | ||
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index f96933f48a7f..225d311c9701 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -1753,6 +1753,8 @@ ENTRY(_sys_call_table) | |||
1753 | .long _sys_open_by_handle_at | 1753 | .long _sys_open_by_handle_at |
1754 | .long _sys_clock_adjtime | 1754 | .long _sys_clock_adjtime |
1755 | .long _sys_syncfs | 1755 | .long _sys_syncfs |
1756 | .long _sys_setns | ||
1757 | .long _sys_sendmmsg /* 380 */ | ||
1756 | 1758 | ||
1757 | .rept NR_syscalls-(.-_sys_call_table)/4 | 1759 | .rept NR_syscalls-(.-_sys_call_table)/4 |
1758 | .long _sys_ni_syscall | 1760 | .long _sys_ni_syscall |
diff --git a/arch/blackfin/mm/maccess.c b/arch/blackfin/mm/maccess.c index b71cebc1f8a3..e2532114c5fd 100644 --- a/arch/blackfin/mm/maccess.c +++ b/arch/blackfin/mm/maccess.c | |||
@@ -16,7 +16,7 @@ static int validate_memory_access_address(unsigned long addr, int size) | |||
16 | return bfin_mem_access_type(addr, size); | 16 | return bfin_mem_access_type(addr, size); |
17 | } | 17 | } |
18 | 18 | ||
19 | long probe_kernel_read(void *dst, void *src, size_t size) | 19 | long probe_kernel_read(void *dst, const void *src, size_t size) |
20 | { | 20 | { |
21 | unsigned long lsrc = (unsigned long)src; | 21 | unsigned long lsrc = (unsigned long)src; |
22 | int mem_type; | 22 | int mem_type; |
@@ -55,7 +55,7 @@ long probe_kernel_read(void *dst, void *src, size_t size) | |||
55 | return -EFAULT; | 55 | return -EFAULT; |
56 | } | 56 | } |
57 | 57 | ||
58 | long probe_kernel_write(void *dst, void *src, size_t size) | 58 | long probe_kernel_write(void *dst, const void *src, size_t size) |
59 | { | 59 | { |
60 | unsigned long ldst = (unsigned long)dst; | 60 | unsigned long ldst = (unsigned long)dst; |
61 | int mem_type; | 61 | int mem_type; |
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index a6d03069d0ff..17addacb169e 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig | |||
@@ -31,10 +31,6 @@ config ARCH_HAS_ILOG2_U64 | |||
31 | bool | 31 | bool |
32 | default n | 32 | default n |
33 | 33 | ||
34 | config GENERIC_FIND_NEXT_BIT | ||
35 | bool | ||
36 | default y | ||
37 | |||
38 | config GENERIC_HWEIGHT | 34 | config GENERIC_HWEIGHT |
39 | bool | 35 | bool |
40 | default y | 36 | default y |
@@ -274,7 +270,6 @@ config ETRAX_AXISFLASHMAP | |||
274 | select MTD_JEDECPROBE if ETRAX_ARCH_V32 | 270 | select MTD_JEDECPROBE if ETRAX_ARCH_V32 |
275 | select MTD_CHAR | 271 | select MTD_CHAR |
276 | select MTD_BLOCK | 272 | select MTD_BLOCK |
277 | select MTD_PARTITIONS | ||
278 | select MTD_COMPLEX_MAPPINGS | 273 | select MTD_COMPLEX_MAPPINGS |
279 | help | 274 | help |
280 | This option enables MTD mapping of flash devices. Needed to use | 275 | This option enables MTD mapping of flash devices. Needed to use |
diff --git a/arch/cris/arch-v10/drivers/axisflashmap.c b/arch/cris/arch-v10/drivers/axisflashmap.c index ed708e19d09e..a4bbdfd37bd8 100644 --- a/arch/cris/arch-v10/drivers/axisflashmap.c +++ b/arch/cris/arch-v10/drivers/axisflashmap.c | |||
@@ -372,7 +372,7 @@ static int __init init_axis_flash(void) | |||
372 | #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE | 372 | #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE |
373 | if (mymtd) { | 373 | if (mymtd) { |
374 | main_partition.size = mymtd->size; | 374 | main_partition.size = mymtd->size; |
375 | err = add_mtd_partitions(mymtd, &main_partition, 1); | 375 | err = mtd_device_register(mymtd, &main_partition, 1); |
376 | if (err) | 376 | if (err) |
377 | panic("axisflashmap: Could not initialize " | 377 | panic("axisflashmap: Could not initialize " |
378 | "partition for whole main mtd device!\n"); | 378 | "partition for whole main mtd device!\n"); |
@@ -382,10 +382,12 @@ static int __init init_axis_flash(void) | |||
382 | if (mymtd) { | 382 | if (mymtd) { |
383 | if (use_default_ptable) { | 383 | if (use_default_ptable) { |
384 | printk(KERN_INFO " Using default partition table.\n"); | 384 | printk(KERN_INFO " Using default partition table.\n"); |
385 | err = add_mtd_partitions(mymtd, axis_default_partitions, | 385 | err = mtd_device_register(mymtd, |
386 | NUM_DEFAULT_PARTITIONS); | 386 | axis_default_partitions, |
387 | NUM_DEFAULT_PARTITIONS); | ||
387 | } else { | 388 | } else { |
388 | err = add_mtd_partitions(mymtd, axis_partitions, pidx); | 389 | err = mtd_device_register(mymtd, axis_partitions, |
390 | pidx); | ||
389 | } | 391 | } |
390 | 392 | ||
391 | if (err) | 393 | if (err) |
diff --git a/arch/cris/arch-v10/kernel/entry.S b/arch/cris/arch-v10/kernel/entry.S index 0d6420d087fd..1161883eb582 100644 --- a/arch/cris/arch-v10/kernel/entry.S +++ b/arch/cris/arch-v10/kernel/entry.S | |||
@@ -937,6 +937,7 @@ sys_call_table: | |||
937 | .long sys_inotify_init1 | 937 | .long sys_inotify_init1 |
938 | .long sys_preadv | 938 | .long sys_preadv |
939 | .long sys_pwritev | 939 | .long sys_pwritev |
940 | .long sys_setns /* 335 */ | ||
940 | 941 | ||
941 | /* | 942 | /* |
942 | * NOTE!! This doesn't have to be exact - we just have | 943 | * NOTE!! This doesn't have to be exact - we just have |
diff --git a/arch/cris/arch-v32/drivers/Kconfig b/arch/cris/arch-v32/drivers/Kconfig index 1633b120aa81..41a2732e8b9c 100644 --- a/arch/cris/arch-v32/drivers/Kconfig +++ b/arch/cris/arch-v32/drivers/Kconfig | |||
@@ -405,7 +405,6 @@ config ETRAX_AXISFLASHMAP | |||
405 | select MTD_JEDECPROBE | 405 | select MTD_JEDECPROBE |
406 | select MTD_CHAR | 406 | select MTD_CHAR |
407 | select MTD_BLOCK | 407 | select MTD_BLOCK |
408 | select MTD_PARTITIONS | ||
409 | select MTD_COMPLEX_MAPPINGS | 408 | select MTD_COMPLEX_MAPPINGS |
410 | help | 409 | help |
411 | This option enables MTD mapping of flash devices. Needed to use | 410 | This option enables MTD mapping of flash devices. Needed to use |
diff --git a/arch/cris/arch-v32/drivers/axisflashmap.c b/arch/cris/arch-v32/drivers/axisflashmap.c index 7b155f8203b8..a2bde3744622 100644 --- a/arch/cris/arch-v32/drivers/axisflashmap.c +++ b/arch/cris/arch-v32/drivers/axisflashmap.c | |||
@@ -561,7 +561,7 @@ static int __init init_axis_flash(void) | |||
561 | #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE | 561 | #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE |
562 | if (main_mtd) { | 562 | if (main_mtd) { |
563 | main_partition.size = main_mtd->size; | 563 | main_partition.size = main_mtd->size; |
564 | err = add_mtd_partitions(main_mtd, &main_partition, 1); | 564 | err = mtd_device_register(main_mtd, &main_partition, 1); |
565 | if (err) | 565 | if (err) |
566 | panic("axisflashmap: Could not initialize " | 566 | panic("axisflashmap: Could not initialize " |
567 | "partition for whole main mtd device!\n"); | 567 | "partition for whole main mtd device!\n"); |
@@ -597,7 +597,8 @@ static int __init init_axis_flash(void) | |||
597 | mtd_ram->erasesize = (main_mtd ? main_mtd->erasesize : | 597 | mtd_ram->erasesize = (main_mtd ? main_mtd->erasesize : |
598 | CONFIG_ETRAX_PTABLE_SECTOR); | 598 | CONFIG_ETRAX_PTABLE_SECTOR); |
599 | } else { | 599 | } else { |
600 | err = add_mtd_partitions(main_mtd, &partition[part], 1); | 600 | err = mtd_device_register(main_mtd, &partition[part], |
601 | 1); | ||
601 | if (err) | 602 | if (err) |
602 | panic("axisflashmap: Could not add mtd " | 603 | panic("axisflashmap: Could not add mtd " |
603 | "partition %d\n", part); | 604 | "partition %d\n", part); |
@@ -633,7 +634,7 @@ static int __init init_axis_flash(void) | |||
633 | #ifndef CONFIG_ETRAX_VCS_SIM | 634 | #ifndef CONFIG_ETRAX_VCS_SIM |
634 | if (aux_mtd) { | 635 | if (aux_mtd) { |
635 | aux_partition.size = aux_mtd->size; | 636 | aux_partition.size = aux_mtd->size; |
636 | err = add_mtd_partitions(aux_mtd, &aux_partition, 1); | 637 | err = mtd_device_register(aux_mtd, &aux_partition, 1); |
637 | if (err) | 638 | if (err) |
638 | panic("axisflashmap: Could not initialize " | 639 | panic("axisflashmap: Could not initialize " |
639 | "aux mtd device!\n"); | 640 | "aux mtd device!\n"); |
diff --git a/arch/cris/arch-v32/kernel/entry.S b/arch/cris/arch-v32/kernel/entry.S index 3abf12c23e5f..84fed7e91ada 100644 --- a/arch/cris/arch-v32/kernel/entry.S +++ b/arch/cris/arch-v32/kernel/entry.S | |||
@@ -880,6 +880,7 @@ sys_call_table: | |||
880 | .long sys_inotify_init1 | 880 | .long sys_inotify_init1 |
881 | .long sys_preadv | 881 | .long sys_preadv |
882 | .long sys_pwritev | 882 | .long sys_pwritev |
883 | .long sys_setns /* 335 */ | ||
883 | 884 | ||
884 | /* | 885 | /* |
885 | * NOTE!! This doesn't have to be exact - we just have | 886 | * NOTE!! This doesn't have to be exact - we just have |
diff --git a/arch/cris/include/asm/unistd.h b/arch/cris/include/asm/unistd.h index f6fad83b3a8c..f921b8b0f97e 100644 --- a/arch/cris/include/asm/unistd.h +++ b/arch/cris/include/asm/unistd.h | |||
@@ -339,10 +339,11 @@ | |||
339 | #define __NR_inotify_init1 332 | 339 | #define __NR_inotify_init1 332 |
340 | #define __NR_preadv 333 | 340 | #define __NR_preadv 333 |
341 | #define __NR_pwritev 334 | 341 | #define __NR_pwritev 334 |
342 | #define __NR_setns 335 | ||
342 | 343 | ||
343 | #ifdef __KERNEL__ | 344 | #ifdef __KERNEL__ |
344 | 345 | ||
345 | #define NR_syscalls 335 | 346 | #define NR_syscalls 336 |
346 | 347 | ||
347 | #include <arch/unistd.h> | 348 | #include <arch/unistd.h> |
348 | 349 | ||
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index 064f62196745..cb884e489425 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig | |||
@@ -19,14 +19,6 @@ config RWSEM_GENERIC_SPINLOCK | |||
19 | config RWSEM_XCHGADD_ALGORITHM | 19 | config RWSEM_XCHGADD_ALGORITHM |
20 | bool | 20 | bool |
21 | 21 | ||
22 | config GENERIC_FIND_NEXT_BIT | ||
23 | bool | ||
24 | default y | ||
25 | |||
26 | config GENERIC_FIND_BIT_LE | ||
27 | bool | ||
28 | default y | ||
29 | |||
30 | config GENERIC_HWEIGHT | 22 | config GENERIC_HWEIGHT |
31 | bool | 23 | bool |
32 | default y | 24 | default y |
diff --git a/arch/frv/include/asm/suspend.h b/arch/frv/include/asm/suspend.h deleted file mode 100644 index 5fa7b5a6ee40..000000000000 --- a/arch/frv/include/asm/suspend.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* suspend.h: suspension stuff | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SUSPEND_H | ||
13 | #define _ASM_SUSPEND_H | ||
14 | |||
15 | static inline int arch_prepare_suspend(void) | ||
16 | { | ||
17 | return 0; | ||
18 | } | ||
19 | |||
20 | #endif /* _ASM_SUSPEND_H */ | ||
diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h index b28da499e22a..a569dff7cd59 100644 --- a/arch/frv/include/asm/unistd.h +++ b/arch/frv/include/asm/unistd.h | |||
@@ -343,10 +343,11 @@ | |||
343 | #define __NR_pwritev 334 | 343 | #define __NR_pwritev 334 |
344 | #define __NR_rt_tgsigqueueinfo 335 | 344 | #define __NR_rt_tgsigqueueinfo 335 |
345 | #define __NR_perf_event_open 336 | 345 | #define __NR_perf_event_open 336 |
346 | #define __NR_setns 337 | ||
346 | 347 | ||
347 | #ifdef __KERNEL__ | 348 | #ifdef __KERNEL__ |
348 | 349 | ||
349 | #define NR_syscalls 337 | 350 | #define NR_syscalls 338 |
350 | 351 | ||
351 | #define __ARCH_WANT_IPC_PARSE_VERSION | 352 | #define __ARCH_WANT_IPC_PARSE_VERSION |
352 | /* #define __ARCH_WANT_OLD_READDIR */ | 353 | /* #define __ARCH_WANT_OLD_READDIR */ |
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S index 63d579bf1c29..017d6d7b784f 100644 --- a/arch/frv/kernel/entry.S +++ b/arch/frv/kernel/entry.S | |||
@@ -1526,5 +1526,6 @@ sys_call_table: | |||
1526 | .long sys_pwritev | 1526 | .long sys_pwritev |
1527 | .long sys_rt_tgsigqueueinfo /* 335 */ | 1527 | .long sys_rt_tgsigqueueinfo /* 335 */ |
1528 | .long sys_perf_event_open | 1528 | .long sys_perf_event_open |
1529 | .long sys_setns | ||
1529 | 1530 | ||
1530 | syscall_table_size = (. - sys_call_table) | 1531 | syscall_table_size = (. - sys_call_table) |
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index e20322ffcaf8..091ed6192ae8 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig | |||
@@ -41,14 +41,6 @@ config ARCH_HAS_ILOG2_U64 | |||
41 | bool | 41 | bool |
42 | default n | 42 | default n |
43 | 43 | ||
44 | config GENERIC_FIND_NEXT_BIT | ||
45 | bool | ||
46 | default y | ||
47 | |||
48 | config GENERIC_FIND_BIT_LE | ||
49 | bool | ||
50 | default y | ||
51 | |||
52 | config GENERIC_HWEIGHT | 44 | config GENERIC_HWEIGHT |
53 | bool | 45 | bool |
54 | default y | 46 | default y |
diff --git a/arch/h8300/include/asm/unistd.h b/arch/h8300/include/asm/unistd.h index 50f2c5a36591..2c3f8e60b1e0 100644 --- a/arch/h8300/include/asm/unistd.h +++ b/arch/h8300/include/asm/unistd.h | |||
@@ -325,10 +325,11 @@ | |||
325 | #define __NR_move_pages 317 | 325 | #define __NR_move_pages 317 |
326 | #define __NR_getcpu 318 | 326 | #define __NR_getcpu 318 |
327 | #define __NR_epoll_pwait 319 | 327 | #define __NR_epoll_pwait 319 |
328 | #define __NR_setns 320 | ||
328 | 329 | ||
329 | #ifdef __KERNEL__ | 330 | #ifdef __KERNEL__ |
330 | 331 | ||
331 | #define NR_syscalls 320 | 332 | #define NR_syscalls 321 |
332 | 333 | ||
333 | #define __ARCH_WANT_IPC_PARSE_VERSION | 334 | #define __ARCH_WANT_IPC_PARSE_VERSION |
334 | #define __ARCH_WANT_OLD_READDIR | 335 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S index faefaff7d43d..f4b2e67bcc34 100644 --- a/arch/h8300/kernel/syscalls.S +++ b/arch/h8300/kernel/syscalls.S | |||
@@ -333,6 +333,7 @@ SYMBOL_NAME_LABEL(sys_call_table) | |||
333 | .long SYMBOL_NAME(sys_ni_syscall) /* sys_move_pages */ | 333 | .long SYMBOL_NAME(sys_ni_syscall) /* sys_move_pages */ |
334 | .long SYMBOL_NAME(sys_getcpu) | 334 | .long SYMBOL_NAME(sys_getcpu) |
335 | .long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_pwait */ | 335 | .long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_pwait */ |
336 | .long SYMBOL_NAME(sys_setns) /* 320 */ | ||
336 | 337 | ||
337 | .macro call_sp addr | 338 | .macro call_sp addr |
338 | mov.l #SYMBOL_NAME(\addr),er6 | 339 | mov.l #SYMBOL_NAME(\addr),er6 |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index e5cc56ae6ce3..38280ef4a2af 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -78,10 +78,6 @@ config HUGETLB_PAGE_SIZE_VARIABLE | |||
78 | depends on HUGETLB_PAGE | 78 | depends on HUGETLB_PAGE |
79 | default y | 79 | default y |
80 | 80 | ||
81 | config GENERIC_FIND_NEXT_BIT | ||
82 | bool | ||
83 | default y | ||
84 | |||
85 | config GENERIC_CALIBRATE_DELAY | 81 | config GENERIC_CALIBRATE_DELAY |
86 | bool | 82 | bool |
87 | default y | 83 | default y |
diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h index 404d037c5e10..7c928da35b17 100644 --- a/arch/ia64/include/asm/unistd.h +++ b/arch/ia64/include/asm/unistd.h | |||
@@ -319,11 +319,13 @@ | |||
319 | #define __NR_open_by_handle_at 1327 | 319 | #define __NR_open_by_handle_at 1327 |
320 | #define __NR_clock_adjtime 1328 | 320 | #define __NR_clock_adjtime 1328 |
321 | #define __NR_syncfs 1329 | 321 | #define __NR_syncfs 1329 |
322 | #define __NR_setns 1330 | ||
323 | #define __NR_sendmmsg 1331 | ||
322 | 324 | ||
323 | #ifdef __KERNEL__ | 325 | #ifdef __KERNEL__ |
324 | 326 | ||
325 | 327 | ||
326 | #define NR_syscalls 306 /* length of syscall table */ | 328 | #define NR_syscalls 308 /* length of syscall table */ |
327 | 329 | ||
328 | /* | 330 | /* |
329 | * The following defines stop scripts/checksyscalls.sh from complaining about | 331 | * The following defines stop scripts/checksyscalls.sh from complaining about |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 6de2e23b3636..97dd2abdeb1a 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -1775,6 +1775,8 @@ sys_call_table: | |||
1775 | data8 sys_open_by_handle_at | 1775 | data8 sys_open_by_handle_at |
1776 | data8 sys_clock_adjtime | 1776 | data8 sys_clock_adjtime |
1777 | data8 sys_syncfs | 1777 | data8 sys_syncfs |
1778 | data8 sys_setns // 1330 | ||
1779 | data8 sys_sendmmsg | ||
1778 | 1780 | ||
1779 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls | 1781 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls |
1780 | #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */ | 1782 | #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */ |
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index 04440cc09b40..85118dfe9bb5 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
@@ -36,7 +36,7 @@ | |||
36 | static cycle_t itc_get_cycles(struct clocksource *cs); | 36 | static cycle_t itc_get_cycles(struct clocksource *cs); |
37 | 37 | ||
38 | struct fsyscall_gtod_data_t fsyscall_gtod_data = { | 38 | struct fsyscall_gtod_data_t fsyscall_gtod_data = { |
39 | .lock = SEQLOCK_UNLOCKED, | 39 | .lock = __SEQLOCK_UNLOCKED(fsyscall_gtod_data.lock), |
40 | }; | 40 | }; |
41 | 41 | ||
42 | struct itc_jitter_data_t itc_jitter_data; | 42 | struct itc_jitter_data_t itc_jitter_data; |
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index 736b808d2291..85b44e858225 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig | |||
@@ -256,14 +256,6 @@ config ARCH_HAS_ILOG2_U64 | |||
256 | bool | 256 | bool |
257 | default n | 257 | default n |
258 | 258 | ||
259 | config GENERIC_FIND_NEXT_BIT | ||
260 | bool | ||
261 | default y | ||
262 | |||
263 | config GENERIC_FIND_BIT_LE | ||
264 | bool | ||
265 | default y | ||
266 | |||
267 | config GENERIC_HWEIGHT | 259 | config GENERIC_HWEIGHT |
268 | bool | 260 | bool |
269 | default y | 261 | default y |
diff --git a/arch/m32r/include/asm/smp.h b/arch/m32r/include/asm/smp.h index 8accc1bb0263..cf7829a61551 100644 --- a/arch/m32r/include/asm/smp.h +++ b/arch/m32r/include/asm/smp.h | |||
@@ -81,11 +81,11 @@ static __inline__ int cpu_number_map(int cpu) | |||
81 | 81 | ||
82 | static __inline__ unsigned int num_booting_cpus(void) | 82 | static __inline__ unsigned int num_booting_cpus(void) |
83 | { | 83 | { |
84 | return cpus_weight(cpu_callout_map); | 84 | return cpumask_weight(&cpu_callout_map); |
85 | } | 85 | } |
86 | 86 | ||
87 | extern void smp_send_timer(void); | 87 | extern void smp_send_timer(void); |
88 | extern unsigned long send_IPI_mask_phys(cpumask_t, int, int); | 88 | extern unsigned long send_IPI_mask_phys(const cpumask_t*, int, int); |
89 | 89 | ||
90 | extern void arch_send_call_function_single_ipi(int cpu); | 90 | extern void arch_send_call_function_single_ipi(int cpu); |
91 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); | 91 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); |
diff --git a/arch/m32r/include/asm/unistd.h b/arch/m32r/include/asm/unistd.h index c70545689da8..3e1db561aacc 100644 --- a/arch/m32r/include/asm/unistd.h +++ b/arch/m32r/include/asm/unistd.h | |||
@@ -330,10 +330,11 @@ | |||
330 | /* #define __NR_timerfd 322 removed */ | 330 | /* #define __NR_timerfd 322 removed */ |
331 | #define __NR_eventfd 323 | 331 | #define __NR_eventfd 323 |
332 | #define __NR_fallocate 324 | 332 | #define __NR_fallocate 324 |
333 | #define __NR_setns 325 | ||
333 | 334 | ||
334 | #ifdef __KERNEL__ | 335 | #ifdef __KERNEL__ |
335 | 336 | ||
336 | #define NR_syscalls 325 | 337 | #define NR_syscalls 326 |
337 | 338 | ||
338 | #define __ARCH_WANT_IPC_PARSE_VERSION | 339 | #define __ARCH_WANT_IPC_PARSE_VERSION |
339 | #define __ARCH_WANT_STAT64 | 340 | #define __ARCH_WANT_STAT64 |
diff --git a/arch/m32r/kernel/smp.c b/arch/m32r/kernel/smp.c index fc10b39893d4..092d40a6708e 100644 --- a/arch/m32r/kernel/smp.c +++ b/arch/m32r/kernel/smp.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/io.h> | 30 | #include <asm/io.h> |
31 | #include <asm/mmu_context.h> | 31 | #include <asm/mmu_context.h> |
32 | #include <asm/m32r.h> | 32 | #include <asm/m32r.h> |
33 | #include <asm/tlbflush.h> | ||
33 | 34 | ||
34 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | 35 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ |
35 | /* Data structures and variables */ | 36 | /* Data structures and variables */ |
@@ -61,33 +62,22 @@ extern spinlock_t ipi_lock[]; | |||
61 | /* Function Prototypes */ | 62 | /* Function Prototypes */ |
62 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | 63 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ |
63 | 64 | ||
64 | void smp_send_reschedule(int); | ||
65 | void smp_reschedule_interrupt(void); | 65 | void smp_reschedule_interrupt(void); |
66 | |||
67 | void smp_flush_cache_all(void); | ||
68 | void smp_flush_cache_all_interrupt(void); | 66 | void smp_flush_cache_all_interrupt(void); |
69 | 67 | ||
70 | void smp_flush_tlb_all(void); | ||
71 | static void flush_tlb_all_ipi(void *); | 68 | static void flush_tlb_all_ipi(void *); |
72 | |||
73 | void smp_flush_tlb_mm(struct mm_struct *); | ||
74 | void smp_flush_tlb_range(struct vm_area_struct *, unsigned long, \ | ||
75 | unsigned long); | ||
76 | void smp_flush_tlb_page(struct vm_area_struct *, unsigned long); | ||
77 | static void flush_tlb_others(cpumask_t, struct mm_struct *, | 69 | static void flush_tlb_others(cpumask_t, struct mm_struct *, |
78 | struct vm_area_struct *, unsigned long); | 70 | struct vm_area_struct *, unsigned long); |
71 | |||
79 | void smp_invalidate_interrupt(void); | 72 | void smp_invalidate_interrupt(void); |
80 | 73 | ||
81 | void smp_send_stop(void); | ||
82 | static void stop_this_cpu(void *); | 74 | static void stop_this_cpu(void *); |
83 | 75 | ||
84 | void smp_send_timer(void); | ||
85 | void smp_ipi_timer_interrupt(struct pt_regs *); | 76 | void smp_ipi_timer_interrupt(struct pt_regs *); |
86 | void smp_local_timer_interrupt(void); | 77 | void smp_local_timer_interrupt(void); |
87 | 78 | ||
88 | static void send_IPI_allbutself(int, int); | 79 | static void send_IPI_allbutself(int, int); |
89 | static void send_IPI_mask(const struct cpumask *, int, int); | 80 | static void send_IPI_mask(const struct cpumask *, int, int); |
90 | unsigned long send_IPI_mask_phys(cpumask_t, int, int); | ||
91 | 81 | ||
92 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | 82 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ |
93 | /* Rescheduling request Routines */ | 83 | /* Rescheduling request Routines */ |
@@ -162,10 +152,10 @@ void smp_flush_cache_all(void) | |||
162 | unsigned long *mask; | 152 | unsigned long *mask; |
163 | 153 | ||
164 | preempt_disable(); | 154 | preempt_disable(); |
165 | cpumask = cpu_online_map; | 155 | cpumask_copy(&cpumask, cpu_online_mask); |
166 | cpu_clear(smp_processor_id(), cpumask); | 156 | cpumask_clear_cpu(smp_processor_id(), &cpumask); |
167 | spin_lock(&flushcache_lock); | 157 | spin_lock(&flushcache_lock); |
168 | mask=cpus_addr(cpumask); | 158 | mask=cpumask_bits(&cpumask); |
169 | atomic_set_mask(*mask, (atomic_t *)&flushcache_cpumask); | 159 | atomic_set_mask(*mask, (atomic_t *)&flushcache_cpumask); |
170 | send_IPI_mask(&cpumask, INVALIDATE_CACHE_IPI, 0); | 160 | send_IPI_mask(&cpumask, INVALIDATE_CACHE_IPI, 0); |
171 | _flush_cache_copyback_all(); | 161 | _flush_cache_copyback_all(); |
@@ -263,8 +253,8 @@ void smp_flush_tlb_mm(struct mm_struct *mm) | |||
263 | preempt_disable(); | 253 | preempt_disable(); |
264 | cpu_id = smp_processor_id(); | 254 | cpu_id = smp_processor_id(); |
265 | mmc = &mm->context[cpu_id]; | 255 | mmc = &mm->context[cpu_id]; |
266 | cpu_mask = *mm_cpumask(mm); | 256 | cpumask_copy(&cpu_mask, mm_cpumask(mm)); |
267 | cpu_clear(cpu_id, cpu_mask); | 257 | cpumask_clear_cpu(cpu_id, &cpu_mask); |
268 | 258 | ||
269 | if (*mmc != NO_CONTEXT) { | 259 | if (*mmc != NO_CONTEXT) { |
270 | local_irq_save(flags); | 260 | local_irq_save(flags); |
@@ -275,7 +265,7 @@ void smp_flush_tlb_mm(struct mm_struct *mm) | |||
275 | cpumask_clear_cpu(cpu_id, mm_cpumask(mm)); | 265 | cpumask_clear_cpu(cpu_id, mm_cpumask(mm)); |
276 | local_irq_restore(flags); | 266 | local_irq_restore(flags); |
277 | } | 267 | } |
278 | if (!cpus_empty(cpu_mask)) | 268 | if (!cpumask_empty(&cpu_mask)) |
279 | flush_tlb_others(cpu_mask, mm, NULL, FLUSH_ALL); | 269 | flush_tlb_others(cpu_mask, mm, NULL, FLUSH_ALL); |
280 | 270 | ||
281 | preempt_enable(); | 271 | preempt_enable(); |
@@ -333,8 +323,8 @@ void smp_flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | |||
333 | preempt_disable(); | 323 | preempt_disable(); |
334 | cpu_id = smp_processor_id(); | 324 | cpu_id = smp_processor_id(); |
335 | mmc = &mm->context[cpu_id]; | 325 | mmc = &mm->context[cpu_id]; |
336 | cpu_mask = *mm_cpumask(mm); | 326 | cpumask_copy(&cpu_mask, mm_cpumask(mm)); |
337 | cpu_clear(cpu_id, cpu_mask); | 327 | cpumask_clear_cpu(cpu_id, &cpu_mask); |
338 | 328 | ||
339 | #ifdef DEBUG_SMP | 329 | #ifdef DEBUG_SMP |
340 | if (!mm) | 330 | if (!mm) |
@@ -348,7 +338,7 @@ void smp_flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | |||
348 | __flush_tlb_page(va); | 338 | __flush_tlb_page(va); |
349 | local_irq_restore(flags); | 339 | local_irq_restore(flags); |
350 | } | 340 | } |
351 | if (!cpus_empty(cpu_mask)) | 341 | if (!cpumask_empty(&cpu_mask)) |
352 | flush_tlb_others(cpu_mask, mm, vma, va); | 342 | flush_tlb_others(cpu_mask, mm, vma, va); |
353 | 343 | ||
354 | preempt_enable(); | 344 | preempt_enable(); |
@@ -395,14 +385,14 @@ static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | |||
395 | * - current CPU must not be in mask | 385 | * - current CPU must not be in mask |
396 | * - mask must exist :) | 386 | * - mask must exist :) |
397 | */ | 387 | */ |
398 | BUG_ON(cpus_empty(cpumask)); | 388 | BUG_ON(cpumask_empty(&cpumask)); |
399 | 389 | ||
400 | BUG_ON(cpu_isset(smp_processor_id(), cpumask)); | 390 | BUG_ON(cpumask_test_cpu(smp_processor_id(), &cpumask)); |
401 | BUG_ON(!mm); | 391 | BUG_ON(!mm); |
402 | 392 | ||
403 | /* If a CPU which we ran on has gone down, OK. */ | 393 | /* If a CPU which we ran on has gone down, OK. */ |
404 | cpus_and(cpumask, cpumask, cpu_online_map); | 394 | cpumask_and(&cpumask, &cpumask, cpu_online_mask); |
405 | if (cpus_empty(cpumask)) | 395 | if (cpumask_empty(&cpumask)) |
406 | return; | 396 | return; |
407 | 397 | ||
408 | /* | 398 | /* |
@@ -416,7 +406,7 @@ static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | |||
416 | flush_mm = mm; | 406 | flush_mm = mm; |
417 | flush_vma = vma; | 407 | flush_vma = vma; |
418 | flush_va = va; | 408 | flush_va = va; |
419 | mask=cpus_addr(cpumask); | 409 | mask=cpumask_bits(&cpumask); |
420 | atomic_set_mask(*mask, (atomic_t *)&flush_cpumask); | 410 | atomic_set_mask(*mask, (atomic_t *)&flush_cpumask); |
421 | 411 | ||
422 | /* | 412 | /* |
@@ -425,7 +415,7 @@ static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | |||
425 | */ | 415 | */ |
426 | send_IPI_mask(&cpumask, INVALIDATE_TLB_IPI, 0); | 416 | send_IPI_mask(&cpumask, INVALIDATE_TLB_IPI, 0); |
427 | 417 | ||
428 | while (!cpus_empty(flush_cpumask)) { | 418 | while (!cpumask_empty((cpumask_t*)&flush_cpumask)) { |
429 | /* nothing. lockup detection does not belong here */ | 419 | /* nothing. lockup detection does not belong here */ |
430 | mb(); | 420 | mb(); |
431 | } | 421 | } |
@@ -460,7 +450,7 @@ void smp_invalidate_interrupt(void) | |||
460 | int cpu_id = smp_processor_id(); | 450 | int cpu_id = smp_processor_id(); |
461 | unsigned long *mmc = &flush_mm->context[cpu_id]; | 451 | unsigned long *mmc = &flush_mm->context[cpu_id]; |
462 | 452 | ||
463 | if (!cpu_isset(cpu_id, flush_cpumask)) | 453 | if (!cpumask_test_cpu(cpu_id, &flush_cpumask)) |
464 | return; | 454 | return; |
465 | 455 | ||
466 | if (flush_va == FLUSH_ALL) { | 456 | if (flush_va == FLUSH_ALL) { |
@@ -478,7 +468,7 @@ void smp_invalidate_interrupt(void) | |||
478 | __flush_tlb_page(va); | 468 | __flush_tlb_page(va); |
479 | } | 469 | } |
480 | } | 470 | } |
481 | cpu_clear(cpu_id, flush_cpumask); | 471 | cpumask_clear_cpu(cpu_id, (cpumask_t*)&flush_cpumask); |
482 | } | 472 | } |
483 | 473 | ||
484 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | 474 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ |
@@ -530,7 +520,7 @@ static void stop_this_cpu(void *dummy) | |||
530 | /* | 520 | /* |
531 | * Remove this CPU: | 521 | * Remove this CPU: |
532 | */ | 522 | */ |
533 | cpu_clear(cpu_id, cpu_online_map); | 523 | set_cpu_online(cpu_id, false); |
534 | 524 | ||
535 | /* | 525 | /* |
536 | * PSW IE = 1; | 526 | * PSW IE = 1; |
@@ -725,8 +715,8 @@ static void send_IPI_allbutself(int ipi_num, int try) | |||
725 | { | 715 | { |
726 | cpumask_t cpumask; | 716 | cpumask_t cpumask; |
727 | 717 | ||
728 | cpumask = cpu_online_map; | 718 | cpumask_copy(&cpumask, cpu_online_mask); |
729 | cpu_clear(smp_processor_id(), cpumask); | 719 | cpumask_clear_cpu(smp_processor_id(), &cpumask); |
730 | 720 | ||
731 | send_IPI_mask(&cpumask, ipi_num, try); | 721 | send_IPI_mask(&cpumask, ipi_num, try); |
732 | } | 722 | } |
@@ -763,13 +753,13 @@ static void send_IPI_mask(const struct cpumask *cpumask, int ipi_num, int try) | |||
763 | cpumask_and(&tmp, cpumask, cpu_online_mask); | 753 | cpumask_and(&tmp, cpumask, cpu_online_mask); |
764 | BUG_ON(!cpumask_equal(cpumask, &tmp)); | 754 | BUG_ON(!cpumask_equal(cpumask, &tmp)); |
765 | 755 | ||
766 | physid_mask = CPU_MASK_NONE; | 756 | cpumask_clear(&physid_mask); |
767 | for_each_cpu(cpu_id, cpumask) { | 757 | for_each_cpu(cpu_id, cpumask) { |
768 | if ((phys_id = cpu_to_physid(cpu_id)) != -1) | 758 | if ((phys_id = cpu_to_physid(cpu_id)) != -1) |
769 | cpu_set(phys_id, physid_mask); | 759 | cpumask_set_cpu(phys_id, &physid_mask); |
770 | } | 760 | } |
771 | 761 | ||
772 | send_IPI_mask_phys(physid_mask, ipi_num, try); | 762 | send_IPI_mask_phys(&physid_mask, ipi_num, try); |
773 | } | 763 | } |
774 | 764 | ||
775 | /*==========================================================================* | 765 | /*==========================================================================* |
@@ -792,14 +782,14 @@ static void send_IPI_mask(const struct cpumask *cpumask, int ipi_num, int try) | |||
792 | * ---------- --- -------------------------------------------------------- | 782 | * ---------- --- -------------------------------------------------------- |
793 | * | 783 | * |
794 | *==========================================================================*/ | 784 | *==========================================================================*/ |
795 | unsigned long send_IPI_mask_phys(cpumask_t physid_mask, int ipi_num, | 785 | unsigned long send_IPI_mask_phys(const cpumask_t *physid_mask, int ipi_num, |
796 | int try) | 786 | int try) |
797 | { | 787 | { |
798 | spinlock_t *ipilock; | 788 | spinlock_t *ipilock; |
799 | volatile unsigned long *ipicr_addr; | 789 | volatile unsigned long *ipicr_addr; |
800 | unsigned long ipicr_val; | 790 | unsigned long ipicr_val; |
801 | unsigned long my_physid_mask; | 791 | unsigned long my_physid_mask; |
802 | unsigned long mask = cpus_addr(physid_mask)[0]; | 792 | unsigned long mask = cpumask_bits(physid_mask)[0]; |
803 | 793 | ||
804 | 794 | ||
805 | if (mask & ~physids_coerce(phys_cpu_present_map)) | 795 | if (mask & ~physids_coerce(phys_cpu_present_map)) |
diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c index e034844cfc0d..cfdbe5d15002 100644 --- a/arch/m32r/kernel/smpboot.c +++ b/arch/m32r/kernel/smpboot.c | |||
@@ -135,9 +135,9 @@ void __devinit smp_prepare_boot_cpu(void) | |||
135 | { | 135 | { |
136 | bsp_phys_id = hard_smp_processor_id(); | 136 | bsp_phys_id = hard_smp_processor_id(); |
137 | physid_set(bsp_phys_id, phys_cpu_present_map); | 137 | physid_set(bsp_phys_id, phys_cpu_present_map); |
138 | cpu_set(0, cpu_online_map); /* BSP's cpu_id == 0 */ | 138 | set_cpu_online(0, true); /* BSP's cpu_id == 0 */ |
139 | cpu_set(0, cpu_callout_map); | 139 | cpumask_set_cpu(0, &cpu_callout_map); |
140 | cpu_set(0, cpu_callin_map); | 140 | cpumask_set_cpu(0, &cpu_callin_map); |
141 | 141 | ||
142 | /* | 142 | /* |
143 | * Initialize the logical to physical CPU number mapping | 143 | * Initialize the logical to physical CPU number mapping |
@@ -178,7 +178,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
178 | for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++) | 178 | for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++) |
179 | physid_set(phys_id, phys_cpu_present_map); | 179 | physid_set(phys_id, phys_cpu_present_map); |
180 | #ifndef CONFIG_HOTPLUG_CPU | 180 | #ifndef CONFIG_HOTPLUG_CPU |
181 | init_cpu_present(&cpu_possible_map); | 181 | init_cpu_present(cpu_possible_mask); |
182 | #endif | 182 | #endif |
183 | 183 | ||
184 | show_mp_info(nr_cpu); | 184 | show_mp_info(nr_cpu); |
@@ -294,10 +294,10 @@ static void __init do_boot_cpu(int phys_id) | |||
294 | send_status = 0; | 294 | send_status = 0; |
295 | boot_status = 0; | 295 | boot_status = 0; |
296 | 296 | ||
297 | cpu_set(phys_id, cpu_bootout_map); | 297 | cpumask_set_cpu(phys_id, &cpu_bootout_map); |
298 | 298 | ||
299 | /* Send Startup IPI */ | 299 | /* Send Startup IPI */ |
300 | send_IPI_mask_phys(cpumask_of_cpu(phys_id), CPU_BOOT_IPI, 0); | 300 | send_IPI_mask_phys(cpumask_of(phys_id), CPU_BOOT_IPI, 0); |
301 | 301 | ||
302 | Dprintk("Waiting for send to finish...\n"); | 302 | Dprintk("Waiting for send to finish...\n"); |
303 | timeout = 0; | 303 | timeout = 0; |
@@ -306,7 +306,7 @@ static void __init do_boot_cpu(int phys_id) | |||
306 | do { | 306 | do { |
307 | Dprintk("+"); | 307 | Dprintk("+"); |
308 | udelay(1000); | 308 | udelay(1000); |
309 | send_status = !cpu_isset(phys_id, cpu_bootin_map); | 309 | send_status = !cpumask_test_cpu(phys_id, &cpu_bootin_map); |
310 | } while (send_status && (timeout++ < 100)); | 310 | } while (send_status && (timeout++ < 100)); |
311 | 311 | ||
312 | Dprintk("After Startup.\n"); | 312 | Dprintk("After Startup.\n"); |
@@ -316,19 +316,19 @@ static void __init do_boot_cpu(int phys_id) | |||
316 | * allow APs to start initializing. | 316 | * allow APs to start initializing. |
317 | */ | 317 | */ |
318 | Dprintk("Before Callout %d.\n", cpu_id); | 318 | Dprintk("Before Callout %d.\n", cpu_id); |
319 | cpu_set(cpu_id, cpu_callout_map); | 319 | cpumask_set_cpu(cpu_id, &cpu_callout_map); |
320 | Dprintk("After Callout %d.\n", cpu_id); | 320 | Dprintk("After Callout %d.\n", cpu_id); |
321 | 321 | ||
322 | /* | 322 | /* |
323 | * Wait 5s total for a response | 323 | * Wait 5s total for a response |
324 | */ | 324 | */ |
325 | for (timeout = 0; timeout < 5000; timeout++) { | 325 | for (timeout = 0; timeout < 5000; timeout++) { |
326 | if (cpu_isset(cpu_id, cpu_callin_map)) | 326 | if (cpumask_test_cpu(cpu_id, &cpu_callin_map)) |
327 | break; /* It has booted */ | 327 | break; /* It has booted */ |
328 | udelay(1000); | 328 | udelay(1000); |
329 | } | 329 | } |
330 | 330 | ||
331 | if (cpu_isset(cpu_id, cpu_callin_map)) { | 331 | if (cpumask_test_cpu(cpu_id, &cpu_callin_map)) { |
332 | /* number CPUs logically, starting from 1 (BSP is 0) */ | 332 | /* number CPUs logically, starting from 1 (BSP is 0) */ |
333 | Dprintk("OK.\n"); | 333 | Dprintk("OK.\n"); |
334 | } else { | 334 | } else { |
@@ -340,9 +340,9 @@ static void __init do_boot_cpu(int phys_id) | |||
340 | 340 | ||
341 | if (send_status || boot_status) { | 341 | if (send_status || boot_status) { |
342 | unmap_cpu_to_physid(cpu_id, phys_id); | 342 | unmap_cpu_to_physid(cpu_id, phys_id); |
343 | cpu_clear(cpu_id, cpu_callout_map); | 343 | cpumask_clear_cpu(cpu_id, &cpu_callout_map); |
344 | cpu_clear(cpu_id, cpu_callin_map); | 344 | cpumask_clear_cpu(cpu_id, &cpu_callin_map); |
345 | cpu_clear(cpu_id, cpu_initialized); | 345 | cpumask_clear_cpu(cpu_id, &cpu_initialized); |
346 | cpucount--; | 346 | cpucount--; |
347 | } | 347 | } |
348 | } | 348 | } |
@@ -351,17 +351,17 @@ int __cpuinit __cpu_up(unsigned int cpu_id) | |||
351 | { | 351 | { |
352 | int timeout; | 352 | int timeout; |
353 | 353 | ||
354 | cpu_set(cpu_id, smp_commenced_mask); | 354 | cpumask_set_cpu(cpu_id, &smp_commenced_mask); |
355 | 355 | ||
356 | /* | 356 | /* |
357 | * Wait 5s total for a response | 357 | * Wait 5s total for a response |
358 | */ | 358 | */ |
359 | for (timeout = 0; timeout < 5000; timeout++) { | 359 | for (timeout = 0; timeout < 5000; timeout++) { |
360 | if (cpu_isset(cpu_id, cpu_online_map)) | 360 | if (cpu_online(cpu_id)) |
361 | break; | 361 | break; |
362 | udelay(1000); | 362 | udelay(1000); |
363 | } | 363 | } |
364 | if (!cpu_isset(cpu_id, cpu_online_map)) | 364 | if (!cpu_online(cpu_id)) |
365 | BUG(); | 365 | BUG(); |
366 | 366 | ||
367 | return 0; | 367 | return 0; |
@@ -373,11 +373,11 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
373 | unsigned long bogosum = 0; | 373 | unsigned long bogosum = 0; |
374 | 374 | ||
375 | for (timeout = 0; timeout < 5000; timeout++) { | 375 | for (timeout = 0; timeout < 5000; timeout++) { |
376 | if (cpus_equal(cpu_callin_map, cpu_online_map)) | 376 | if (cpumask_equal(&cpu_callin_map, cpu_online_mask)) |
377 | break; | 377 | break; |
378 | udelay(1000); | 378 | udelay(1000); |
379 | } | 379 | } |
380 | if (!cpus_equal(cpu_callin_map, cpu_online_map)) | 380 | if (!cpumask_equal(&cpu_callin_map, cpu_online_mask)) |
381 | BUG(); | 381 | BUG(); |
382 | 382 | ||
383 | for (cpu_id = 0 ; cpu_id < num_online_cpus() ; cpu_id++) | 383 | for (cpu_id = 0 ; cpu_id < num_online_cpus() ; cpu_id++) |
@@ -388,7 +388,7 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
388 | */ | 388 | */ |
389 | Dprintk("Before bogomips.\n"); | 389 | Dprintk("Before bogomips.\n"); |
390 | if (cpucount) { | 390 | if (cpucount) { |
391 | for_each_cpu_mask(cpu_id, cpu_online_map) | 391 | for_each_cpu(cpu_id,cpu_online_mask) |
392 | bogosum += cpu_data[cpu_id].loops_per_jiffy; | 392 | bogosum += cpu_data[cpu_id].loops_per_jiffy; |
393 | 393 | ||
394 | printk(KERN_INFO "Total of %d processors activated " \ | 394 | printk(KERN_INFO "Total of %d processors activated " \ |
@@ -425,7 +425,7 @@ int __init start_secondary(void *unused) | |||
425 | cpu_init(); | 425 | cpu_init(); |
426 | preempt_disable(); | 426 | preempt_disable(); |
427 | smp_callin(); | 427 | smp_callin(); |
428 | while (!cpu_isset(smp_processor_id(), smp_commenced_mask)) | 428 | while (!cpumask_test_cpu(smp_processor_id(), &smp_commenced_mask)) |
429 | cpu_relax(); | 429 | cpu_relax(); |
430 | 430 | ||
431 | smp_online(); | 431 | smp_online(); |
@@ -463,7 +463,7 @@ static void __init smp_callin(void) | |||
463 | int cpu_id = smp_processor_id(); | 463 | int cpu_id = smp_processor_id(); |
464 | unsigned long timeout; | 464 | unsigned long timeout; |
465 | 465 | ||
466 | if (cpu_isset(cpu_id, cpu_callin_map)) { | 466 | if (cpumask_test_cpu(cpu_id, &cpu_callin_map)) { |
467 | printk("huh, phys CPU#%d, CPU#%d already present??\n", | 467 | printk("huh, phys CPU#%d, CPU#%d already present??\n", |
468 | phys_id, cpu_id); | 468 | phys_id, cpu_id); |
469 | BUG(); | 469 | BUG(); |
@@ -474,7 +474,7 @@ static void __init smp_callin(void) | |||
474 | timeout = jiffies + (2 * HZ); | 474 | timeout = jiffies + (2 * HZ); |
475 | while (time_before(jiffies, timeout)) { | 475 | while (time_before(jiffies, timeout)) { |
476 | /* Has the boot CPU finished it's STARTUP sequence ? */ | 476 | /* Has the boot CPU finished it's STARTUP sequence ? */ |
477 | if (cpu_isset(cpu_id, cpu_callout_map)) | 477 | if (cpumask_test_cpu(cpu_id, &cpu_callout_map)) |
478 | break; | 478 | break; |
479 | cpu_relax(); | 479 | cpu_relax(); |
480 | } | 480 | } |
@@ -486,7 +486,7 @@ static void __init smp_callin(void) | |||
486 | } | 486 | } |
487 | 487 | ||
488 | /* Allow the master to continue. */ | 488 | /* Allow the master to continue. */ |
489 | cpu_set(cpu_id, cpu_callin_map); | 489 | cpumask_set_cpu(cpu_id, &cpu_callin_map); |
490 | } | 490 | } |
491 | 491 | ||
492 | static void __init smp_online(void) | 492 | static void __init smp_online(void) |
@@ -503,7 +503,7 @@ static void __init smp_online(void) | |||
503 | /* Save our processor parameters */ | 503 | /* Save our processor parameters */ |
504 | smp_store_cpu_info(cpu_id); | 504 | smp_store_cpu_info(cpu_id); |
505 | 505 | ||
506 | cpu_set(cpu_id, cpu_online_map); | 506 | set_cpu_online(cpu_id, true); |
507 | } | 507 | } |
508 | 508 | ||
509 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | 509 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ |
diff --git a/arch/m32r/kernel/syscall_table.S b/arch/m32r/kernel/syscall_table.S index 60536e271233..528f2e6ad064 100644 --- a/arch/m32r/kernel/syscall_table.S +++ b/arch/m32r/kernel/syscall_table.S | |||
@@ -324,3 +324,4 @@ ENTRY(sys_call_table) | |||
324 | .long sys_ni_syscall | 324 | .long sys_ni_syscall |
325 | .long sys_eventfd | 325 | .long sys_eventfd |
326 | .long sys_fallocate | 326 | .long sys_fallocate |
327 | .long sys_setns /* 325 */ | ||
diff --git a/arch/m68k/Kconfig.nommu b/arch/m68k/Kconfig.nommu index 273bccab9517..fc98f9b9d4d2 100644 --- a/arch/m68k/Kconfig.nommu +++ b/arch/m68k/Kconfig.nommu | |||
@@ -2,10 +2,6 @@ config FPU | |||
2 | bool | 2 | bool |
3 | default n | 3 | default n |
4 | 4 | ||
5 | config GENERIC_FIND_NEXT_BIT | ||
6 | bool | ||
7 | default y | ||
8 | |||
9 | config GENERIC_GPIO | 5 | config GENERIC_GPIO |
10 | bool | 6 | bool |
11 | default n | 7 | default n |
diff --git a/arch/m68k/include/asm/bitops_mm.h b/arch/m68k/include/asm/bitops_mm.h index e9020f88a748..89cf5b814a4d 100644 --- a/arch/m68k/include/asm/bitops_mm.h +++ b/arch/m68k/include/asm/bitops_mm.h | |||
@@ -200,6 +200,7 @@ out: | |||
200 | res += ((long)p - (long)vaddr - 4) * 8; | 200 | res += ((long)p - (long)vaddr - 4) * 8; |
201 | return res < size ? res : size; | 201 | return res < size ? res : size; |
202 | } | 202 | } |
203 | #define find_first_zero_bit find_first_zero_bit | ||
203 | 204 | ||
204 | static inline int find_next_zero_bit(const unsigned long *vaddr, int size, | 205 | static inline int find_next_zero_bit(const unsigned long *vaddr, int size, |
205 | int offset) | 206 | int offset) |
@@ -229,6 +230,7 @@ static inline int find_next_zero_bit(const unsigned long *vaddr, int size, | |||
229 | /* No zero yet, search remaining full bytes for a zero */ | 230 | /* No zero yet, search remaining full bytes for a zero */ |
230 | return offset + find_first_zero_bit(p, size - offset); | 231 | return offset + find_first_zero_bit(p, size - offset); |
231 | } | 232 | } |
233 | #define find_next_zero_bit find_next_zero_bit | ||
232 | 234 | ||
233 | static inline int find_first_bit(const unsigned long *vaddr, unsigned size) | 235 | static inline int find_first_bit(const unsigned long *vaddr, unsigned size) |
234 | { | 236 | { |
@@ -253,6 +255,7 @@ out: | |||
253 | res += ((long)p - (long)vaddr - 4) * 8; | 255 | res += ((long)p - (long)vaddr - 4) * 8; |
254 | return res < size ? res : size; | 256 | return res < size ? res : size; |
255 | } | 257 | } |
258 | #define find_first_bit find_first_bit | ||
256 | 259 | ||
257 | static inline int find_next_bit(const unsigned long *vaddr, int size, | 260 | static inline int find_next_bit(const unsigned long *vaddr, int size, |
258 | int offset) | 261 | int offset) |
@@ -282,6 +285,7 @@ static inline int find_next_bit(const unsigned long *vaddr, int size, | |||
282 | /* No one yet, search remaining full bytes for a one */ | 285 | /* No one yet, search remaining full bytes for a one */ |
283 | return offset + find_first_bit(p, size - offset); | 286 | return offset + find_first_bit(p, size - offset); |
284 | } | 287 | } |
288 | #define find_next_bit find_next_bit | ||
285 | 289 | ||
286 | /* | 290 | /* |
287 | * ffz = Find First Zero in word. Undefined if no zero exists, | 291 | * ffz = Find First Zero in word. Undefined if no zero exists, |
@@ -398,6 +402,7 @@ out: | |||
398 | res += (p - addr) * 32; | 402 | res += (p - addr) * 32; |
399 | return res < size ? res : size; | 403 | return res < size ? res : size; |
400 | } | 404 | } |
405 | #define find_first_zero_bit_le find_first_zero_bit_le | ||
401 | 406 | ||
402 | static inline unsigned long find_next_zero_bit_le(const void *addr, | 407 | static inline unsigned long find_next_zero_bit_le(const void *addr, |
403 | unsigned long size, unsigned long offset) | 408 | unsigned long size, unsigned long offset) |
@@ -427,6 +432,7 @@ static inline unsigned long find_next_zero_bit_le(const void *addr, | |||
427 | /* No zero yet, search remaining full bytes for a zero */ | 432 | /* No zero yet, search remaining full bytes for a zero */ |
428 | return offset + find_first_zero_bit_le(p, size - offset); | 433 | return offset + find_first_zero_bit_le(p, size - offset); |
429 | } | 434 | } |
435 | #define find_next_zero_bit_le find_next_zero_bit_le | ||
430 | 436 | ||
431 | static inline int find_first_bit_le(const void *vaddr, unsigned size) | 437 | static inline int find_first_bit_le(const void *vaddr, unsigned size) |
432 | { | 438 | { |
@@ -451,6 +457,7 @@ out: | |||
451 | res += (p - addr) * 32; | 457 | res += (p - addr) * 32; |
452 | return res < size ? res : size; | 458 | return res < size ? res : size; |
453 | } | 459 | } |
460 | #define find_first_bit_le find_first_bit_le | ||
454 | 461 | ||
455 | static inline unsigned long find_next_bit_le(const void *addr, | 462 | static inline unsigned long find_next_bit_le(const void *addr, |
456 | unsigned long size, unsigned long offset) | 463 | unsigned long size, unsigned long offset) |
@@ -480,6 +487,7 @@ static inline unsigned long find_next_bit_le(const void *addr, | |||
480 | /* No set bit yet, search remaining full bytes for a set bit */ | 487 | /* No set bit yet, search remaining full bytes for a set bit */ |
481 | return offset + find_first_bit_le(p, size - offset); | 488 | return offset + find_first_bit_le(p, size - offset); |
482 | } | 489 | } |
490 | #define find_next_bit_le find_next_bit_le | ||
483 | 491 | ||
484 | /* Bitmap functions for the ext2 filesystem. */ | 492 | /* Bitmap functions for the ext2 filesystem. */ |
485 | 493 | ||
diff --git a/arch/m68k/include/asm/bitops_no.h b/arch/m68k/include/asm/bitops_no.h index 6b0e2d349f0e..72e85acdd7bd 100644 --- a/arch/m68k/include/asm/bitops_no.h +++ b/arch/m68k/include/asm/bitops_no.h | |||
@@ -319,6 +319,10 @@ found_first: | |||
319 | found_middle: | 319 | found_middle: |
320 | return result + ffz(__swab32(tmp)); | 320 | return result + ffz(__swab32(tmp)); |
321 | } | 321 | } |
322 | #define find_next_zero_bit_le find_next_zero_bit_le | ||
323 | |||
324 | extern unsigned long find_next_bit_le(const void *addr, | ||
325 | unsigned long size, unsigned long offset); | ||
322 | 326 | ||
323 | #endif /* __KERNEL__ */ | 327 | #endif /* __KERNEL__ */ |
324 | 328 | ||
diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index f3b649de2a1b..43f984e93970 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h | |||
@@ -349,10 +349,11 @@ | |||
349 | #define __NR_open_by_handle_at 341 | 349 | #define __NR_open_by_handle_at 341 |
350 | #define __NR_clock_adjtime 342 | 350 | #define __NR_clock_adjtime 342 |
351 | #define __NR_syncfs 343 | 351 | #define __NR_syncfs 343 |
352 | #define __NR_setns 344 | ||
352 | 353 | ||
353 | #ifdef __KERNEL__ | 354 | #ifdef __KERNEL__ |
354 | 355 | ||
355 | #define NR_syscalls 344 | 356 | #define NR_syscalls 345 |
356 | 357 | ||
357 | #define __ARCH_WANT_IPC_PARSE_VERSION | 358 | #define __ARCH_WANT_IPC_PARSE_VERSION |
358 | #define __ARCH_WANT_OLD_READDIR | 359 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/m68k/kernel/syscalltable.S b/arch/m68k/kernel/syscalltable.S index 6f7b09122a00..00d1452f9571 100644 --- a/arch/m68k/kernel/syscalltable.S +++ b/arch/m68k/kernel/syscalltable.S | |||
@@ -364,4 +364,5 @@ ENTRY(sys_call_table) | |||
364 | .long sys_open_by_handle_at | 364 | .long sys_open_by_handle_at |
365 | .long sys_clock_adjtime | 365 | .long sys_clock_adjtime |
366 | .long sys_syncfs | 366 | .long sys_syncfs |
367 | .long sys_setns | ||
367 | 368 | ||
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index eccdefe70d4e..e446bab2427b 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig | |||
@@ -33,12 +33,6 @@ config ARCH_HAS_ILOG2_U32 | |||
33 | config ARCH_HAS_ILOG2_U64 | 33 | config ARCH_HAS_ILOG2_U64 |
34 | def_bool n | 34 | def_bool n |
35 | 35 | ||
36 | config GENERIC_FIND_NEXT_BIT | ||
37 | def_bool y | ||
38 | |||
39 | config GENERIC_FIND_BIT_LE | ||
40 | def_bool y | ||
41 | |||
42 | config GENERIC_HWEIGHT | 36 | config GENERIC_HWEIGHT |
43 | def_bool y | 37 | def_bool y |
44 | 38 | ||
diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h index 30edd61a6b8f..7d7092b917ac 100644 --- a/arch/microblaze/include/asm/unistd.h +++ b/arch/microblaze/include/asm/unistd.h | |||
@@ -390,8 +390,9 @@ | |||
390 | #define __NR_open_by_handle_at 372 | 390 | #define __NR_open_by_handle_at 372 |
391 | #define __NR_clock_adjtime 373 | 391 | #define __NR_clock_adjtime 373 |
392 | #define __NR_syncfs 374 | 392 | #define __NR_syncfs 374 |
393 | #define __NR_setns 375 | ||
393 | 394 | ||
394 | #define __NR_syscalls 375 | 395 | #define __NR_syscalls 376 |
395 | 396 | ||
396 | #ifdef __KERNEL__ | 397 | #ifdef __KERNEL__ |
397 | #ifndef __ASSEMBLY__ | 398 | #ifndef __ASSEMBLY__ |
diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c index 00ee90f08343..b15cc219b1d9 100644 --- a/arch/microblaze/kernel/prom.c +++ b/arch/microblaze/kernel/prom.c | |||
@@ -130,7 +130,7 @@ void __init early_init_devtree(void *params) | |||
130 | * device-tree, including the platform type, initrd location and | 130 | * device-tree, including the platform type, initrd location and |
131 | * size, TCE reserve, and more ... | 131 | * size, TCE reserve, and more ... |
132 | */ | 132 | */ |
133 | of_scan_flat_dt(early_init_dt_scan_chosen, NULL); | 133 | of_scan_flat_dt(early_init_dt_scan_chosen, cmd_line); |
134 | 134 | ||
135 | /* Scan memory nodes and rebuild MEMBLOCKs */ | 135 | /* Scan memory nodes and rebuild MEMBLOCKs */ |
136 | memblock_init(); | 136 | memblock_init(); |
diff --git a/arch/microblaze/kernel/syscall_table.S b/arch/microblaze/kernel/syscall_table.S index 85cea81d1ca1..d915a122c865 100644 --- a/arch/microblaze/kernel/syscall_table.S +++ b/arch/microblaze/kernel/syscall_table.S | |||
@@ -379,3 +379,4 @@ ENTRY(sys_call_table) | |||
379 | .long sys_open_by_handle_at | 379 | .long sys_open_by_handle_at |
380 | .long sys_clock_adjtime | 380 | .long sys_clock_adjtime |
381 | .long sys_syncfs | 381 | .long sys_syncfs |
382 | .long sys_setns /* 375 */ | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index cef1a854487d..653da62d0682 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -821,14 +821,6 @@ config ARCH_SUPPORTS_OPROFILE | |||
821 | bool | 821 | bool |
822 | default y if !MIPS_MT_SMTC | 822 | default y if !MIPS_MT_SMTC |
823 | 823 | ||
824 | config GENERIC_FIND_NEXT_BIT | ||
825 | bool | ||
826 | default y | ||
827 | |||
828 | config GENERIC_FIND_BIT_LE | ||
829 | bool | ||
830 | default y | ||
831 | |||
832 | config GENERIC_HWEIGHT | 824 | config GENERIC_HWEIGHT |
833 | bool | 825 | bool |
834 | default y | 826 | default y |
diff --git a/arch/mips/cavium-octeon/flash_setup.c b/arch/mips/cavium-octeon/flash_setup.c index 008f657116eb..0ee02f5e51cc 100644 --- a/arch/mips/cavium-octeon/flash_setup.c +++ b/arch/mips/cavium-octeon/flash_setup.c | |||
@@ -16,7 +16,6 @@ | |||
16 | 16 | ||
17 | static struct map_info flash_map; | 17 | static struct map_info flash_map; |
18 | static struct mtd_info *mymtd; | 18 | static struct mtd_info *mymtd; |
19 | #ifdef CONFIG_MTD_PARTITIONS | ||
20 | static int nr_parts; | 19 | static int nr_parts; |
21 | static struct mtd_partition *parts; | 20 | static struct mtd_partition *parts; |
22 | static const char *part_probe_types[] = { | 21 | static const char *part_probe_types[] = { |
@@ -26,7 +25,6 @@ static const char *part_probe_types[] = { | |||
26 | #endif | 25 | #endif |
27 | NULL | 26 | NULL |
28 | }; | 27 | }; |
29 | #endif | ||
30 | 28 | ||
31 | /** | 29 | /** |
32 | * Module/ driver initialization. | 30 | * Module/ driver initialization. |
@@ -63,17 +61,10 @@ static int __init flash_init(void) | |||
63 | if (mymtd) { | 61 | if (mymtd) { |
64 | mymtd->owner = THIS_MODULE; | 62 | mymtd->owner = THIS_MODULE; |
65 | 63 | ||
66 | #ifdef CONFIG_MTD_PARTITIONS | ||
67 | nr_parts = parse_mtd_partitions(mymtd, | 64 | nr_parts = parse_mtd_partitions(mymtd, |
68 | part_probe_types, | 65 | part_probe_types, |
69 | &parts, 0); | 66 | &parts, 0); |
70 | if (nr_parts > 0) | 67 | mtd_device_register(mymtd, parts, nr_parts); |
71 | add_mtd_partitions(mymtd, parts, nr_parts); | ||
72 | else | ||
73 | add_mtd_device(mymtd); | ||
74 | #else | ||
75 | add_mtd_device(mymtd); | ||
76 | #endif | ||
77 | } else { | 68 | } else { |
78 | pr_err("Failed to register MTD device for flash\n"); | 69 | pr_err("Failed to register MTD device for flash\n"); |
79 | } | 70 | } |
diff --git a/arch/mips/configs/bcm47xx_defconfig b/arch/mips/configs/bcm47xx_defconfig index 22fdf2f0cc23..ad15fb10322b 100644 --- a/arch/mips/configs/bcm47xx_defconfig +++ b/arch/mips/configs/bcm47xx_defconfig | |||
@@ -16,7 +16,6 @@ CONFIG_TASK_IO_ACCOUNTING=y | |||
16 | CONFIG_AUDIT=y | 16 | CONFIG_AUDIT=y |
17 | CONFIG_TINY_RCU=y | 17 | CONFIG_TINY_RCU=y |
18 | CONFIG_CGROUPS=y | 18 | CONFIG_CGROUPS=y |
19 | CONFIG_CGROUP_NS=y | ||
20 | CONFIG_CGROUP_CPUACCT=y | 19 | CONFIG_CGROUP_CPUACCT=y |
21 | CONFIG_RELAY=y | 20 | CONFIG_RELAY=y |
22 | CONFIG_BLK_DEV_INITRD=y | 21 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/mips/include/asm/prom.h b/arch/mips/include/asm/prom.h index f29b862d9db3..857d9b7858ad 100644 --- a/arch/mips/include/asm/prom.h +++ b/arch/mips/include/asm/prom.h | |||
@@ -14,9 +14,6 @@ | |||
14 | #ifdef CONFIG_OF | 14 | #ifdef CONFIG_OF |
15 | #include <asm/bootinfo.h> | 15 | #include <asm/bootinfo.h> |
16 | 16 | ||
17 | /* which is compatible with the flattened device tree (FDT) */ | ||
18 | #define cmd_line arcs_cmdline | ||
19 | |||
20 | extern int early_init_dt_scan_memory_arch(unsigned long node, | 17 | extern int early_init_dt_scan_memory_arch(unsigned long node, |
21 | const char *uname, int depth, void *data); | 18 | const char *uname, int depth, void *data); |
22 | 19 | ||
diff --git a/arch/mips/include/asm/suspend.h b/arch/mips/include/asm/suspend.h index 294cdb66c5fc..3adac3b53d19 100644 --- a/arch/mips/include/asm/suspend.h +++ b/arch/mips/include/asm/suspend.h | |||
@@ -1,8 +1,6 @@ | |||
1 | #ifndef __ASM_SUSPEND_H | 1 | #ifndef __ASM_SUSPEND_H |
2 | #define __ASM_SUSPEND_H | 2 | #define __ASM_SUSPEND_H |
3 | 3 | ||
4 | static inline int arch_prepare_suspend(void) { return 0; } | ||
5 | |||
6 | /* References to section boundaries */ | 4 | /* References to section boundaries */ |
7 | extern const void __nosave_begin, __nosave_end; | 5 | extern const void __nosave_begin, __nosave_end; |
8 | 6 | ||
diff --git a/arch/mips/include/asm/unistd.h b/arch/mips/include/asm/unistd.h index fa2e37ea2be1..6fcfc480e9d0 100644 --- a/arch/mips/include/asm/unistd.h +++ b/arch/mips/include/asm/unistd.h | |||
@@ -363,16 +363,17 @@ | |||
363 | #define __NR_open_by_handle_at (__NR_Linux + 340) | 363 | #define __NR_open_by_handle_at (__NR_Linux + 340) |
364 | #define __NR_clock_adjtime (__NR_Linux + 341) | 364 | #define __NR_clock_adjtime (__NR_Linux + 341) |
365 | #define __NR_syncfs (__NR_Linux + 342) | 365 | #define __NR_syncfs (__NR_Linux + 342) |
366 | #define __NR_setns (__NR_Linux + 343) | ||
366 | 367 | ||
367 | /* | 368 | /* |
368 | * Offset of the last Linux o32 flavoured syscall | 369 | * Offset of the last Linux o32 flavoured syscall |
369 | */ | 370 | */ |
370 | #define __NR_Linux_syscalls 342 | 371 | #define __NR_Linux_syscalls 343 |
371 | 372 | ||
372 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | 373 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ |
373 | 374 | ||
374 | #define __NR_O32_Linux 4000 | 375 | #define __NR_O32_Linux 4000 |
375 | #define __NR_O32_Linux_syscalls 342 | 376 | #define __NR_O32_Linux_syscalls 343 |
376 | 377 | ||
377 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | 378 | #if _MIPS_SIM == _MIPS_SIM_ABI64 |
378 | 379 | ||
@@ -682,16 +683,17 @@ | |||
682 | #define __NR_open_by_handle_at (__NR_Linux + 299) | 683 | #define __NR_open_by_handle_at (__NR_Linux + 299) |
683 | #define __NR_clock_adjtime (__NR_Linux + 300) | 684 | #define __NR_clock_adjtime (__NR_Linux + 300) |
684 | #define __NR_syncfs (__NR_Linux + 301) | 685 | #define __NR_syncfs (__NR_Linux + 301) |
686 | #define __NR_setns (__NR_Linux + 302) | ||
685 | 687 | ||
686 | /* | 688 | /* |
687 | * Offset of the last Linux 64-bit flavoured syscall | 689 | * Offset of the last Linux 64-bit flavoured syscall |
688 | */ | 690 | */ |
689 | #define __NR_Linux_syscalls 301 | 691 | #define __NR_Linux_syscalls 302 |
690 | 692 | ||
691 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 693 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
692 | 694 | ||
693 | #define __NR_64_Linux 5000 | 695 | #define __NR_64_Linux 5000 |
694 | #define __NR_64_Linux_syscalls 301 | 696 | #define __NR_64_Linux_syscalls 302 |
695 | 697 | ||
696 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 698 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
697 | 699 | ||
@@ -1006,16 +1008,17 @@ | |||
1006 | #define __NR_open_by_handle_at (__NR_Linux + 304) | 1008 | #define __NR_open_by_handle_at (__NR_Linux + 304) |
1007 | #define __NR_clock_adjtime (__NR_Linux + 305) | 1009 | #define __NR_clock_adjtime (__NR_Linux + 305) |
1008 | #define __NR_syncfs (__NR_Linux + 306) | 1010 | #define __NR_syncfs (__NR_Linux + 306) |
1011 | #define __NR_setns (__NR_Linux + 307) | ||
1009 | 1012 | ||
1010 | /* | 1013 | /* |
1011 | * Offset of the last N32 flavoured syscall | 1014 | * Offset of the last N32 flavoured syscall |
1012 | */ | 1015 | */ |
1013 | #define __NR_Linux_syscalls 306 | 1016 | #define __NR_Linux_syscalls 307 |
1014 | 1017 | ||
1015 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | 1018 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ |
1016 | 1019 | ||
1017 | #define __NR_N32_Linux 6000 | 1020 | #define __NR_N32_Linux 6000 |
1018 | #define __NR_N32_Linux_syscalls 306 | 1021 | #define __NR_N32_Linux_syscalls 307 |
1019 | 1022 | ||
1020 | #ifdef __KERNEL__ | 1023 | #ifdef __KERNEL__ |
1021 | 1024 | ||
diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c index a19811e98a41..5b7eade41fa3 100644 --- a/arch/mips/kernel/prom.c +++ b/arch/mips/kernel/prom.c | |||
@@ -83,7 +83,8 @@ void __init early_init_devtree(void *params) | |||
83 | * device-tree, including the platform type, initrd location and | 83 | * device-tree, including the platform type, initrd location and |
84 | * size, and more ... | 84 | * size, and more ... |
85 | */ | 85 | */ |
86 | of_scan_flat_dt(early_init_dt_scan_chosen, NULL); | 86 | of_scan_flat_dt(early_init_dt_scan_chosen, arcs_cmdline); |
87 | |||
87 | 88 | ||
88 | /* Scan memory nodes */ | 89 | /* Scan memory nodes */ |
89 | of_scan_flat_dt(early_init_dt_scan_root, NULL); | 90 | of_scan_flat_dt(early_init_dt_scan_root, NULL); |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 7a8e1dd7f6f2..99e656e425f3 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
@@ -589,6 +589,7 @@ einval: li v0, -ENOSYS | |||
589 | sys sys_open_by_handle_at 3 /* 4340 */ | 589 | sys sys_open_by_handle_at 3 /* 4340 */ |
590 | sys sys_clock_adjtime 2 | 590 | sys sys_clock_adjtime 2 |
591 | sys sys_syncfs 1 | 591 | sys sys_syncfs 1 |
592 | sys sys_setns 2 | ||
592 | .endm | 593 | .endm |
593 | 594 | ||
594 | /* We pre-compute the number of _instruction_ bytes needed to | 595 | /* We pre-compute the number of _instruction_ bytes needed to |
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 2d31c83224f9..fb0575f47f3d 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
@@ -428,4 +428,5 @@ sys_call_table: | |||
428 | PTR sys_open_by_handle_at | 428 | PTR sys_open_by_handle_at |
429 | PTR sys_clock_adjtime /* 5300 */ | 429 | PTR sys_clock_adjtime /* 5300 */ |
430 | PTR sys_syncfs | 430 | PTR sys_syncfs |
431 | PTR sys_setns | ||
431 | .size sys_call_table,.-sys_call_table | 432 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 38a0503b9a4a..4de0c5534e73 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -428,4 +428,5 @@ EXPORT(sysn32_call_table) | |||
428 | PTR sys_open_by_handle_at | 428 | PTR sys_open_by_handle_at |
429 | PTR compat_sys_clock_adjtime /* 6305 */ | 429 | PTR compat_sys_clock_adjtime /* 6305 */ |
430 | PTR sys_syncfs | 430 | PTR sys_syncfs |
431 | PTR sys_setns | ||
431 | .size sysn32_call_table,.-sysn32_call_table | 432 | .size sysn32_call_table,.-sysn32_call_table |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 91ea5e4041dd..4a387de08bfa 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -546,4 +546,5 @@ sys_call_table: | |||
546 | PTR compat_sys_open_by_handle_at /* 4340 */ | 546 | PTR compat_sys_open_by_handle_at /* 4340 */ |
547 | PTR compat_sys_clock_adjtime | 547 | PTR compat_sys_clock_adjtime |
548 | PTR sys_syncfs | 548 | PTR sys_syncfs |
549 | PTR sys_setns | ||
549 | .size sys_call_table,.-sys_call_table | 550 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index 812816c45662..ec38e00b2559 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c | |||
@@ -639,7 +639,6 @@ void __init txx9_physmap_flash_init(int no, unsigned long addr, | |||
639 | .flags = IORESOURCE_MEM, | 639 | .flags = IORESOURCE_MEM, |
640 | }; | 640 | }; |
641 | struct platform_device *pdev; | 641 | struct platform_device *pdev; |
642 | #ifdef CONFIG_MTD_PARTITIONS | ||
643 | static struct mtd_partition parts[2]; | 642 | static struct mtd_partition parts[2]; |
644 | struct physmap_flash_data pdata_part; | 643 | struct physmap_flash_data pdata_part; |
645 | 644 | ||
@@ -658,7 +657,7 @@ void __init txx9_physmap_flash_init(int no, unsigned long addr, | |||
658 | pdata_part.parts = parts; | 657 | pdata_part.parts = parts; |
659 | pdata = &pdata_part; | 658 | pdata = &pdata_part; |
660 | } | 659 | } |
661 | #endif | 660 | |
662 | pdev = platform_device_alloc("physmap-flash", no); | 661 | pdev = platform_device_alloc("physmap-flash", no); |
663 | if (!pdev || | 662 | if (!pdev || |
664 | platform_device_add_resources(pdev, &res, 1) || | 663 | platform_device_add_resources(pdev, &res, 1) || |
diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index feaf09cc8632..1f870340ebdd 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig | |||
@@ -44,9 +44,6 @@ config GENERIC_CALIBRATE_DELAY | |||
44 | config GENERIC_CMOS_UPDATE | 44 | config GENERIC_CMOS_UPDATE |
45 | def_bool n | 45 | def_bool n |
46 | 46 | ||
47 | config GENERIC_FIND_NEXT_BIT | ||
48 | def_bool y | ||
49 | |||
50 | config GENERIC_HWEIGHT | 47 | config GENERIC_HWEIGHT |
51 | def_bool y | 48 | def_bool y |
52 | 49 | ||
diff --git a/arch/mn10300/configs/asb2364_defconfig b/arch/mn10300/configs/asb2364_defconfig index 31d76261a3d5..fbb96ae3122a 100644 --- a/arch/mn10300/configs/asb2364_defconfig +++ b/arch/mn10300/configs/asb2364_defconfig | |||
@@ -8,7 +8,6 @@ CONFIG_TASK_XACCT=y | |||
8 | CONFIG_TASK_IO_ACCOUNTING=y | 8 | CONFIG_TASK_IO_ACCOUNTING=y |
9 | CONFIG_LOG_BUF_SHIFT=14 | 9 | CONFIG_LOG_BUF_SHIFT=14 |
10 | CONFIG_CGROUPS=y | 10 | CONFIG_CGROUPS=y |
11 | CONFIG_CGROUP_NS=y | ||
12 | CONFIG_CGROUP_FREEZER=y | 11 | CONFIG_CGROUP_FREEZER=y |
13 | CONFIG_CGROUP_DEVICE=y | 12 | CONFIG_CGROUP_DEVICE=y |
14 | CONFIG_CGROUP_CPUACCT=y | 13 | CONFIG_CGROUP_CPUACCT=y |
diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h index 9d056f515929..9051f921cbc7 100644 --- a/arch/mn10300/include/asm/unistd.h +++ b/arch/mn10300/include/asm/unistd.h | |||
@@ -349,10 +349,11 @@ | |||
349 | #define __NR_rt_tgsigqueueinfo 336 | 349 | #define __NR_rt_tgsigqueueinfo 336 |
350 | #define __NR_perf_event_open 337 | 350 | #define __NR_perf_event_open 337 |
351 | #define __NR_recvmmsg 338 | 351 | #define __NR_recvmmsg 338 |
352 | #define __NR_setns 339 | ||
352 | 353 | ||
353 | #ifdef __KERNEL__ | 354 | #ifdef __KERNEL__ |
354 | 355 | ||
355 | #define NR_syscalls 339 | 356 | #define NR_syscalls 340 |
356 | 357 | ||
357 | /* | 358 | /* |
358 | * specify the deprecated syscalls we want to support on this arch | 359 | * specify the deprecated syscalls we want to support on this arch |
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index fb93ad720b82..ae435e1d5669 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S | |||
@@ -759,6 +759,7 @@ ENTRY(sys_call_table) | |||
759 | .long sys_rt_tgsigqueueinfo | 759 | .long sys_rt_tgsigqueueinfo |
760 | .long sys_perf_event_open | 760 | .long sys_perf_event_open |
761 | .long sys_recvmmsg | 761 | .long sys_recvmmsg |
762 | .long sys_setns | ||
762 | 763 | ||
763 | 764 | ||
764 | nr_syscalls=(.-sys_call_table)/4 | 765 | nr_syscalls=(.-sys_call_table)/4 |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 69ff049c8571..65adc86a230e 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -47,14 +47,6 @@ config ARCH_HAS_ILOG2_U64 | |||
47 | bool | 47 | bool |
48 | default n | 48 | default n |
49 | 49 | ||
50 | config GENERIC_FIND_NEXT_BIT | ||
51 | bool | ||
52 | default y | ||
53 | |||
54 | config GENERIC_FIND_BIT_LE | ||
55 | bool | ||
56 | default y | ||
57 | |||
58 | config GENERIC_BUG | 50 | config GENERIC_BUG |
59 | bool | 51 | bool |
60 | default y | 52 | default y |
diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h index 9cbc2c3bf630..3392de3e7be0 100644 --- a/arch/parisc/include/asm/unistd.h +++ b/arch/parisc/include/asm/unistd.h | |||
@@ -820,8 +820,9 @@ | |||
820 | #define __NR_name_to_handle_at (__NR_Linux + 325) | 820 | #define __NR_name_to_handle_at (__NR_Linux + 325) |
821 | #define __NR_open_by_handle_at (__NR_Linux + 326) | 821 | #define __NR_open_by_handle_at (__NR_Linux + 326) |
822 | #define __NR_syncfs (__NR_Linux + 327) | 822 | #define __NR_syncfs (__NR_Linux + 327) |
823 | #define __NR_setns (__NR_Linux + 328) | ||
823 | 824 | ||
824 | #define __NR_Linux_syscalls (__NR_syncfs + 1) | 825 | #define __NR_Linux_syscalls (__NR_setns + 1) |
825 | 826 | ||
826 | 827 | ||
827 | #define __IGNORE_select /* newselect */ | 828 | #define __IGNORE_select /* newselect */ |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index a5b02ce4d41e..34a4f5a2fffb 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -426,6 +426,7 @@ | |||
426 | ENTRY_SAME(name_to_handle_at) /* 325 */ | 426 | ENTRY_SAME(name_to_handle_at) /* 325 */ |
427 | ENTRY_COMP(open_by_handle_at) | 427 | ENTRY_COMP(open_by_handle_at) |
428 | ENTRY_SAME(syncfs) | 428 | ENTRY_SAME(syncfs) |
429 | ENTRY_SAME(setns) | ||
429 | 430 | ||
430 | /* Nothing yet */ | 431 | /* Nothing yet */ |
431 | 432 | ||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 423145a6f7ba..2729c6663d8a 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -91,14 +91,6 @@ config GENERIC_HWEIGHT | |||
91 | bool | 91 | bool |
92 | default y | 92 | default y |
93 | 93 | ||
94 | config GENERIC_FIND_NEXT_BIT | ||
95 | bool | ||
96 | default y | ||
97 | |||
98 | config GENERIC_FIND_BIT_LE | ||
99 | bool | ||
100 | default y | ||
101 | |||
102 | config GENERIC_GPIO | 94 | config GENERIC_GPIO |
103 | bool | 95 | bool |
104 | help | 96 | help |
@@ -141,6 +133,7 @@ config PPC | |||
141 | select GENERIC_IRQ_SHOW | 133 | select GENERIC_IRQ_SHOW |
142 | select GENERIC_IRQ_SHOW_LEVEL | 134 | select GENERIC_IRQ_SHOW_LEVEL |
143 | select HAVE_RCU_TABLE_FREE if SMP | 135 | select HAVE_RCU_TABLE_FREE if SMP |
136 | select HAVE_SYSCALL_TRACEPOINTS | ||
144 | 137 | ||
145 | config EARLY_PRINTK | 138 | config EARLY_PRINTK |
146 | bool | 139 | bool |
diff --git a/arch/powerpc/boot/dts/canyonlands.dts b/arch/powerpc/boot/dts/canyonlands.dts index 2779f08313a5..22dd6ae84da0 100644 --- a/arch/powerpc/boot/dts/canyonlands.dts +++ b/arch/powerpc/boot/dts/canyonlands.dts | |||
@@ -530,5 +530,23 @@ | |||
530 | 0x0 0x0 0x0 0x3 &UIC3 0x12 0x4 /* swizzled int C */ | 530 | 0x0 0x0 0x0 0x3 &UIC3 0x12 0x4 /* swizzled int C */ |
531 | 0x0 0x0 0x0 0x4 &UIC3 0x13 0x4 /* swizzled int D */>; | 531 | 0x0 0x0 0x0 0x4 &UIC3 0x13 0x4 /* swizzled int D */>; |
532 | }; | 532 | }; |
533 | |||
534 | MSI: ppc4xx-msi@C10000000 { | ||
535 | compatible = "amcc,ppc4xx-msi", "ppc4xx-msi"; | ||
536 | reg = < 0xC 0x10000000 0x100>; | ||
537 | sdr-base = <0x36C>; | ||
538 | msi-data = <0x00000000>; | ||
539 | msi-mask = <0x44440000>; | ||
540 | interrupt-count = <3>; | ||
541 | interrupts = <0 1 2 3>; | ||
542 | interrupt-parent = <&UIC3>; | ||
543 | #interrupt-cells = <1>; | ||
544 | #address-cells = <0>; | ||
545 | #size-cells = <0>; | ||
546 | interrupt-map = <0 &UIC3 0x18 1 | ||
547 | 1 &UIC3 0x19 1 | ||
548 | 2 &UIC3 0x1A 1 | ||
549 | 3 &UIC3 0x1B 1>; | ||
550 | }; | ||
533 | }; | 551 | }; |
534 | }; | 552 | }; |
diff --git a/arch/powerpc/boot/dts/katmai.dts b/arch/powerpc/boot/dts/katmai.dts index 7c3be5e45748..f913dbe25d35 100644 --- a/arch/powerpc/boot/dts/katmai.dts +++ b/arch/powerpc/boot/dts/katmai.dts | |||
@@ -442,6 +442,24 @@ | |||
442 | 0x0 0x0 0x0 0x4 &UIC3 0xb 0x4 /* swizzled int D */>; | 442 | 0x0 0x0 0x0 0x4 &UIC3 0xb 0x4 /* swizzled int D */>; |
443 | }; | 443 | }; |
444 | 444 | ||
445 | MSI: ppc4xx-msi@400300000 { | ||
446 | compatible = "amcc,ppc4xx-msi", "ppc4xx-msi"; | ||
447 | reg = < 0x4 0x00300000 0x100>; | ||
448 | sdr-base = <0x3B0>; | ||
449 | msi-data = <0x00000000>; | ||
450 | msi-mask = <0x44440000>; | ||
451 | interrupt-count = <3>; | ||
452 | interrupts =<0 1 2 3>; | ||
453 | interrupt-parent = <&UIC0>; | ||
454 | #interrupt-cells = <1>; | ||
455 | #address-cells = <0>; | ||
456 | #size-cells = <0>; | ||
457 | interrupt-map = <0 &UIC0 0xC 1 | ||
458 | 1 &UIC0 0x0D 1 | ||
459 | 2 &UIC0 0x0E 1 | ||
460 | 3 &UIC0 0x0F 1>; | ||
461 | }; | ||
462 | |||
445 | I2O: i2o@400100000 { | 463 | I2O: i2o@400100000 { |
446 | compatible = "ibm,i2o-440spe"; | 464 | compatible = "ibm,i2o-440spe"; |
447 | reg = <0x00000004 0x00100000 0x100>; | 465 | reg = <0x00000004 0x00100000 0x100>; |
diff --git a/arch/powerpc/boot/dts/kilauea.dts b/arch/powerpc/boot/dts/kilauea.dts index 89edb16649c3..1613d6e4049e 100644 --- a/arch/powerpc/boot/dts/kilauea.dts +++ b/arch/powerpc/boot/dts/kilauea.dts | |||
@@ -403,5 +403,33 @@ | |||
403 | 0x0 0x0 0x0 0x3 &UIC2 0xd 0x4 /* swizzled int C */ | 403 | 0x0 0x0 0x0 0x3 &UIC2 0xd 0x4 /* swizzled int C */ |
404 | 0x0 0x0 0x0 0x4 &UIC2 0xe 0x4 /* swizzled int D */>; | 404 | 0x0 0x0 0x0 0x4 &UIC2 0xe 0x4 /* swizzled int D */>; |
405 | }; | 405 | }; |
406 | |||
407 | MSI: ppc4xx-msi@C10000000 { | ||
408 | compatible = "amcc,ppc4xx-msi", "ppc4xx-msi"; | ||
409 | reg = < 0x0 0xEF620000 0x100>; | ||
410 | sdr-base = <0x4B0>; | ||
411 | msi-data = <0x00000000>; | ||
412 | msi-mask = <0x44440000>; | ||
413 | interrupt-count = <12>; | ||
414 | interrupts = <0 1 2 3 4 5 6 7 8 9 0xA 0xB 0xC 0xD>; | ||
415 | interrupt-parent = <&UIC2>; | ||
416 | #interrupt-cells = <1>; | ||
417 | #address-cells = <0>; | ||
418 | #size-cells = <0>; | ||
419 | interrupt-map = <0 &UIC2 0x10 1 | ||
420 | 1 &UIC2 0x11 1 | ||
421 | 2 &UIC2 0x12 1 | ||
422 | 2 &UIC2 0x13 1 | ||
423 | 2 &UIC2 0x14 1 | ||
424 | 2 &UIC2 0x15 1 | ||
425 | 2 &UIC2 0x16 1 | ||
426 | 2 &UIC2 0x17 1 | ||
427 | 2 &UIC2 0x18 1 | ||
428 | 2 &UIC2 0x19 1 | ||
429 | 2 &UIC2 0x1A 1 | ||
430 | 2 &UIC2 0x1B 1 | ||
431 | 2 &UIC2 0x1C 1 | ||
432 | 3 &UIC2 0x1D 1>; | ||
433 | }; | ||
406 | }; | 434 | }; |
407 | }; | 435 | }; |
diff --git a/arch/powerpc/boot/dts/redwood.dts b/arch/powerpc/boot/dts/redwood.dts index 81636c01d906..d86a3a498118 100644 --- a/arch/powerpc/boot/dts/redwood.dts +++ b/arch/powerpc/boot/dts/redwood.dts | |||
@@ -358,8 +358,28 @@ | |||
358 | 0x0 0x0 0x0 0x4 &UIC3 0xb 0x4 /* swizzled int D */>; | 358 | 0x0 0x0 0x0 0x4 &UIC3 0xb 0x4 /* swizzled int D */>; |
359 | }; | 359 | }; |
360 | 360 | ||
361 | MSI: ppc4xx-msi@400300000 { | ||
362 | compatible = "amcc,ppc4xx-msi", "ppc4xx-msi"; | ||
363 | reg = < 0x4 0x00300000 0x100 | ||
364 | 0x4 0x00300000 0x100>; | ||
365 | sdr-base = <0x3B0>; | ||
366 | msi-data = <0x00000000>; | ||
367 | msi-mask = <0x44440000>; | ||
368 | interrupt-count = <3>; | ||
369 | interrupts =<0 1 2 3>; | ||
370 | interrupt-parent = <&UIC0>; | ||
371 | #interrupt-cells = <1>; | ||
372 | #address-cells = <0>; | ||
373 | #size-cells = <0>; | ||
374 | interrupt-map = <0 &UIC0 0xC 1 | ||
375 | 1 &UIC0 0x0D 1 | ||
376 | 2 &UIC0 0x0E 1 | ||
377 | 3 &UIC0 0x0F 1>; | ||
378 | }; | ||
379 | |||
361 | }; | 380 | }; |
362 | 381 | ||
382 | |||
363 | chosen { | 383 | chosen { |
364 | linux,stdout-path = "/plb/opb/serial@ef600200"; | 384 | linux,stdout-path = "/plb/opb/serial@ef600200"; |
365 | }; | 385 | }; |
diff --git a/arch/powerpc/configs/ppc6xx_defconfig b/arch/powerpc/configs/ppc6xx_defconfig index 214208924a9c..04360f9b0109 100644 --- a/arch/powerpc/configs/ppc6xx_defconfig +++ b/arch/powerpc/configs/ppc6xx_defconfig | |||
@@ -10,7 +10,6 @@ CONFIG_TASK_XACCT=y | |||
10 | CONFIG_TASK_IO_ACCOUNTING=y | 10 | CONFIG_TASK_IO_ACCOUNTING=y |
11 | CONFIG_AUDIT=y | 11 | CONFIG_AUDIT=y |
12 | CONFIG_CGROUPS=y | 12 | CONFIG_CGROUPS=y |
13 | CONFIG_CGROUP_NS=y | ||
14 | CONFIG_CGROUP_DEVICE=y | 13 | CONFIG_CGROUP_DEVICE=y |
15 | CONFIG_CGROUP_CPUACCT=y | 14 | CONFIG_CGROUP_CPUACCT=y |
16 | CONFIG_RESOURCE_COUNTERS=y | 15 | CONFIG_RESOURCE_COUNTERS=y |
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 7de13865508c..c9f212b5f3de 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
@@ -15,7 +15,6 @@ CONFIG_AUDITSYSCALL=y | |||
15 | CONFIG_IKCONFIG=y | 15 | CONFIG_IKCONFIG=y |
16 | CONFIG_IKCONFIG_PROC=y | 16 | CONFIG_IKCONFIG_PROC=y |
17 | CONFIG_CGROUPS=y | 17 | CONFIG_CGROUPS=y |
18 | CONFIG_CGROUP_NS=y | ||
19 | CONFIG_CGROUP_FREEZER=y | 18 | CONFIG_CGROUP_FREEZER=y |
20 | CONFIG_CGROUP_DEVICE=y | 19 | CONFIG_CGROUP_DEVICE=y |
21 | CONFIG_CPUSETS=y | 20 | CONFIG_CPUSETS=y |
diff --git a/arch/powerpc/include/asm/fsl_lbc.h b/arch/powerpc/include/asm/fsl_lbc.h index 5c1bf3466749..8a0b5ece8f76 100644 --- a/arch/powerpc/include/asm/fsl_lbc.h +++ b/arch/powerpc/include/asm/fsl_lbc.h | |||
@@ -157,6 +157,8 @@ struct fsl_lbc_regs { | |||
157 | #define LBCR_EPAR_SHIFT 16 | 157 | #define LBCR_EPAR_SHIFT 16 |
158 | #define LBCR_BMT 0x0000FF00 | 158 | #define LBCR_BMT 0x0000FF00 |
159 | #define LBCR_BMT_SHIFT 8 | 159 | #define LBCR_BMT_SHIFT 8 |
160 | #define LBCR_BMTPS 0x0000000F | ||
161 | #define LBCR_BMTPS_SHIFT 0 | ||
160 | #define LBCR_INIT 0x00040000 | 162 | #define LBCR_INIT 0x00040000 |
161 | __be32 lcrr; /**< Clock Ratio Register */ | 163 | __be32 lcrr; /**< Clock Ratio Register */ |
162 | #define LCRR_DBYP 0x80000000 | 164 | #define LCRR_DBYP 0x80000000 |
diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h index dde1296b8b41..169d039ed402 100644 --- a/arch/powerpc/include/asm/ftrace.h +++ b/arch/powerpc/include/asm/ftrace.h | |||
@@ -60,4 +60,18 @@ struct dyn_arch_ftrace { | |||
60 | 60 | ||
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | #if defined(CONFIG_FTRACE_SYSCALLS) && defined(CONFIG_PPC64) && !defined(__ASSEMBLY__) | ||
64 | #define ARCH_HAS_SYSCALL_MATCH_SYM_NAME | ||
65 | static inline bool arch_syscall_match_sym_name(const char *sym, const char *name) | ||
66 | { | ||
67 | /* | ||
68 | * Compare the symbol name with the system call name. Skip the .sys or .SyS | ||
69 | * prefix from the symbol name and the sys prefix from the system call name and | ||
70 | * just match the rest. This is only needed on ppc64 since symbol names on | ||
71 | * 32bit do not start with a period so the generic function will work. | ||
72 | */ | ||
73 | return !strcmp(sym + 4, name + 3); | ||
74 | } | ||
75 | #endif /* CONFIG_FTRACE_SYSCALLS && CONFIG_PPC64 && !__ASSEMBLY__ */ | ||
76 | |||
63 | #endif /* _ASM_POWERPC_FTRACE */ | 77 | #endif /* _ASM_POWERPC_FTRACE */ |
diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index 852b8c1c09db..fd8201dddd4b 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h | |||
@@ -236,7 +236,7 @@ | |||
236 | #define H_HOME_NODE_ASSOCIATIVITY 0x2EC | 236 | #define H_HOME_NODE_ASSOCIATIVITY 0x2EC |
237 | #define H_BEST_ENERGY 0x2F4 | 237 | #define H_BEST_ENERGY 0x2F4 |
238 | #define H_GET_MPP_X 0x314 | 238 | #define H_GET_MPP_X 0x314 |
239 | #define MAX_HCALL_OPCODE H_BEST_ENERGY | 239 | #define MAX_HCALL_OPCODE H_GET_MPP_X |
240 | 240 | ||
241 | #ifndef __ASSEMBLY__ | 241 | #ifndef __ASSEMBLY__ |
242 | 242 | ||
diff --git a/arch/powerpc/include/asm/rio.h b/arch/powerpc/include/asm/rio.h index 0018bf80cb25..d902abd33995 100644 --- a/arch/powerpc/include/asm/rio.h +++ b/arch/powerpc/include/asm/rio.h | |||
@@ -14,5 +14,10 @@ | |||
14 | #define ASM_PPC_RIO_H | 14 | #define ASM_PPC_RIO_H |
15 | 15 | ||
16 | extern void platform_rio_init(void); | 16 | extern void platform_rio_init(void); |
17 | #ifdef CONFIG_RAPIDIO | ||
18 | extern int fsl_rio_mcheck_exception(struct pt_regs *); | ||
19 | #else | ||
20 | static inline int fsl_rio_mcheck_exception(struct pt_regs *regs) {return 0; } | ||
21 | #endif | ||
17 | 22 | ||
18 | #endif /* ASM_PPC_RIO_H */ | 23 | #endif /* ASM_PPC_RIO_H */ |
diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index 880b8c1e6e53..11eb404b5606 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h | |||
@@ -191,8 +191,6 @@ extern unsigned long __secondary_hold_spinloop; | |||
191 | extern unsigned long __secondary_hold_acknowledge; | 191 | extern unsigned long __secondary_hold_acknowledge; |
192 | extern char __secondary_hold; | 192 | extern char __secondary_hold; |
193 | 193 | ||
194 | extern irqreturn_t debug_ipi_action(int irq, void *data); | ||
195 | |||
196 | #endif /* __ASSEMBLY__ */ | 194 | #endif /* __ASSEMBLY__ */ |
197 | 195 | ||
198 | #endif /* __KERNEL__ */ | 196 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/include/asm/suspend.h b/arch/powerpc/include/asm/suspend.h deleted file mode 100644 index c6efc3466aa6..000000000000 --- a/arch/powerpc/include/asm/suspend.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | #ifndef __ASM_POWERPC_SUSPEND_H | ||
2 | #define __ASM_POWERPC_SUSPEND_H | ||
3 | |||
4 | static inline int arch_prepare_suspend(void) { return 0; } | ||
5 | |||
6 | #endif /* __ASM_POWERPC_SUSPEND_H */ | ||
diff --git a/arch/powerpc/include/asm/syscall.h b/arch/powerpc/include/asm/syscall.h index 23913e902fc3..b54b2add07be 100644 --- a/arch/powerpc/include/asm/syscall.h +++ b/arch/powerpc/include/asm/syscall.h | |||
@@ -15,6 +15,11 @@ | |||
15 | 15 | ||
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | 17 | ||
18 | /* ftrace syscalls requires exporting the sys_call_table */ | ||
19 | #ifdef CONFIG_FTRACE_SYSCALLS | ||
20 | extern const unsigned long *sys_call_table; | ||
21 | #endif /* CONFIG_FTRACE_SYSCALLS */ | ||
22 | |||
18 | static inline long syscall_get_nr(struct task_struct *task, | 23 | static inline long syscall_get_nr(struct task_struct *task, |
19 | struct pt_regs *regs) | 24 | struct pt_regs *regs) |
20 | { | 25 | { |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index 8489d372077f..f6736b7da463 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -353,3 +353,4 @@ COMPAT_SYS_SPU(open_by_handle_at) | |||
353 | COMPAT_SYS_SPU(clock_adjtime) | 353 | COMPAT_SYS_SPU(clock_adjtime) |
354 | SYSCALL_SPU(syncfs) | 354 | SYSCALL_SPU(syncfs) |
355 | COMPAT_SYS_SPU(sendmmsg) | 355 | COMPAT_SYS_SPU(sendmmsg) |
356 | SYSCALL_SPU(setns) | ||
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index 37c353e8af7c..836f231ec1f0 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
@@ -110,7 +110,8 @@ static inline struct thread_info *current_thread_info(void) | |||
110 | #define TIF_NOERROR 12 /* Force successful syscall return */ | 110 | #define TIF_NOERROR 12 /* Force successful syscall return */ |
111 | #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ | 111 | #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ |
112 | #define TIF_FREEZE 14 /* Freezing for suspend */ | 112 | #define TIF_FREEZE 14 /* Freezing for suspend */ |
113 | #define TIF_RUNLATCH 15 /* Is the runlatch enabled? */ | 113 | #define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ |
114 | #define TIF_RUNLATCH 16 /* Is the runlatch enabled? */ | ||
114 | 115 | ||
115 | /* as above, but as bit values */ | 116 | /* as above, but as bit values */ |
116 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 117 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
@@ -127,8 +128,10 @@ static inline struct thread_info *current_thread_info(void) | |||
127 | #define _TIF_NOERROR (1<<TIF_NOERROR) | 128 | #define _TIF_NOERROR (1<<TIF_NOERROR) |
128 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) | 129 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) |
129 | #define _TIF_FREEZE (1<<TIF_FREEZE) | 130 | #define _TIF_FREEZE (1<<TIF_FREEZE) |
131 | #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) | ||
130 | #define _TIF_RUNLATCH (1<<TIF_RUNLATCH) | 132 | #define _TIF_RUNLATCH (1<<TIF_RUNLATCH) |
131 | #define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP) | 133 | #define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ |
134 | _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT) | ||
132 | 135 | ||
133 | #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ | 136 | #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ |
134 | _TIF_NOTIFY_RESUME) | 137 | _TIF_NOTIFY_RESUME) |
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 6d23c8193caa..b8b3f599362b 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h | |||
@@ -372,10 +372,11 @@ | |||
372 | #define __NR_clock_adjtime 347 | 372 | #define __NR_clock_adjtime 347 |
373 | #define __NR_syncfs 348 | 373 | #define __NR_syncfs 348 |
374 | #define __NR_sendmmsg 349 | 374 | #define __NR_sendmmsg 349 |
375 | #define __NR_setns 350 | ||
375 | 376 | ||
376 | #ifdef __KERNEL__ | 377 | #ifdef __KERNEL__ |
377 | 378 | ||
378 | #define __NR_syscalls 350 | 379 | #define __NR_syscalls 351 |
379 | 380 | ||
380 | #define __NR__exit __NR_exit | 381 | #define __NR__exit __NR_exit |
381 | #define NR_syscalls __NR_syscalls | 382 | #define NR_syscalls __NR_syscalls |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 9aab36312572..e8b981897d44 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -109,6 +109,7 @@ obj-$(CONFIG_PPC_IO_WORKAROUNDS) += io-workarounds.o | |||
109 | 109 | ||
110 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o | 110 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o |
111 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o | 111 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o |
112 | obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o | ||
112 | obj-$(CONFIG_PERF_EVENTS) += perf_callchain.o | 113 | obj-$(CONFIG_PERF_EVENTS) += perf_callchain.o |
113 | 114 | ||
114 | obj-$(CONFIG_PPC_PERF_CTRS) += perf_event.o | 115 | obj-$(CONFIG_PPC_PERF_CTRS) += perf_event.o |
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c index ce1f3e44c24f..bf99cfa6bbfe 100644 --- a/arch/powerpc/kernel/ftrace.c +++ b/arch/powerpc/kernel/ftrace.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/cacheflush.h> | 22 | #include <asm/cacheflush.h> |
23 | #include <asm/code-patching.h> | 23 | #include <asm/code-patching.h> |
24 | #include <asm/ftrace.h> | 24 | #include <asm/ftrace.h> |
25 | #include <asm/syscall.h> | ||
25 | 26 | ||
26 | 27 | ||
27 | #ifdef CONFIG_DYNAMIC_FTRACE | 28 | #ifdef CONFIG_DYNAMIC_FTRACE |
@@ -600,3 +601,10 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | |||
600 | } | 601 | } |
601 | } | 602 | } |
602 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 603 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
604 | |||
605 | #if defined(CONFIG_FTRACE_SYSCALLS) && defined(CONFIG_PPC64) | ||
606 | unsigned long __init arch_syscall_addr(int nr) | ||
607 | { | ||
608 | return sys_call_table[nr*2]; | ||
609 | } | ||
610 | #endif /* CONFIG_FTRACE_SYSCALLS && CONFIG_PPC64 */ | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index a24d37d4cf51..5b428e308666 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -295,17 +295,20 @@ static inline void handle_one_irq(unsigned int irq) | |||
295 | unsigned long saved_sp_limit; | 295 | unsigned long saved_sp_limit; |
296 | struct irq_desc *desc; | 296 | struct irq_desc *desc; |
297 | 297 | ||
298 | desc = irq_to_desc(irq); | ||
299 | if (!desc) | ||
300 | return; | ||
301 | |||
298 | /* Switch to the irq stack to handle this */ | 302 | /* Switch to the irq stack to handle this */ |
299 | curtp = current_thread_info(); | 303 | curtp = current_thread_info(); |
300 | irqtp = hardirq_ctx[smp_processor_id()]; | 304 | irqtp = hardirq_ctx[smp_processor_id()]; |
301 | 305 | ||
302 | if (curtp == irqtp) { | 306 | if (curtp == irqtp) { |
303 | /* We're already on the irq stack, just handle it */ | 307 | /* We're already on the irq stack, just handle it */ |
304 | generic_handle_irq(irq); | 308 | desc->handle_irq(irq, desc); |
305 | return; | 309 | return; |
306 | } | 310 | } |
307 | 311 | ||
308 | desc = irq_to_desc(irq); | ||
309 | saved_sp_limit = current->thread.ksp_limit; | 312 | saved_sp_limit = current->thread.ksp_limit; |
310 | 313 | ||
311 | irqtp->task = curtp->task; | 314 | irqtp->task = curtp->task; |
@@ -557,15 +560,8 @@ struct irq_host *irq_alloc_host(struct device_node *of_node, | |||
557 | if (revmap_type == IRQ_HOST_MAP_LEGACY) { | 560 | if (revmap_type == IRQ_HOST_MAP_LEGACY) { |
558 | if (irq_map[0].host != NULL) { | 561 | if (irq_map[0].host != NULL) { |
559 | raw_spin_unlock_irqrestore(&irq_big_lock, flags); | 562 | raw_spin_unlock_irqrestore(&irq_big_lock, flags); |
560 | /* If we are early boot, we can't free the structure, | 563 | of_node_put(host->of_node); |
561 | * too bad... | 564 | kfree(host); |
562 | * this will be fixed once slab is made available early | ||
563 | * instead of the current cruft | ||
564 | */ | ||
565 | if (mem_init_done) { | ||
566 | of_node_put(host->of_node); | ||
567 | kfree(host); | ||
568 | } | ||
569 | return NULL; | 565 | return NULL; |
570 | } | 566 | } |
571 | irq_map[0].host = host; | 567 | irq_map[0].host = host; |
@@ -727,9 +723,7 @@ unsigned int irq_create_mapping(struct irq_host *host, | |||
727 | } | 723 | } |
728 | pr_debug("irq: -> using host @%p\n", host); | 724 | pr_debug("irq: -> using host @%p\n", host); |
729 | 725 | ||
730 | /* Check if mapping already exist, if it does, call | 726 | /* Check if mapping already exists */ |
731 | * host->ops->map() to update the flags | ||
732 | */ | ||
733 | virq = irq_find_mapping(host, hwirq); | 727 | virq = irq_find_mapping(host, hwirq); |
734 | if (virq != NO_IRQ) { | 728 | if (virq != NO_IRQ) { |
735 | pr_debug("irq: -> existing mapping on virq %d\n", virq); | 729 | pr_debug("irq: -> existing mapping on virq %d\n", virq); |
@@ -899,10 +893,13 @@ unsigned int irq_radix_revmap_lookup(struct irq_host *host, | |||
899 | return irq_find_mapping(host, hwirq); | 893 | return irq_find_mapping(host, hwirq); |
900 | 894 | ||
901 | /* | 895 | /* |
902 | * No rcu_read_lock(ing) needed, the ptr returned can't go under us | 896 | * The ptr returned references the static global irq_map. |
903 | * as it's referencing an entry in the static irq_map table. | 897 | * but freeing an irq can delete nodes along the path to |
898 | * do the lookup via call_rcu. | ||
904 | */ | 899 | */ |
900 | rcu_read_lock(); | ||
905 | ptr = radix_tree_lookup(&host->revmap_data.tree, hwirq); | 901 | ptr = radix_tree_lookup(&host->revmap_data.tree, hwirq); |
902 | rcu_read_unlock(); | ||
906 | 903 | ||
907 | /* | 904 | /* |
908 | * If found in radix tree, then fine. | 905 | * If found in radix tree, then fine. |
@@ -1010,14 +1007,23 @@ void irq_free_virt(unsigned int virq, unsigned int count) | |||
1010 | WARN_ON (virq < NUM_ISA_INTERRUPTS); | 1007 | WARN_ON (virq < NUM_ISA_INTERRUPTS); |
1011 | WARN_ON (count == 0 || (virq + count) > irq_virq_count); | 1008 | WARN_ON (count == 0 || (virq + count) > irq_virq_count); |
1012 | 1009 | ||
1010 | if (virq < NUM_ISA_INTERRUPTS) { | ||
1011 | if (virq + count < NUM_ISA_INTERRUPTS) | ||
1012 | return; | ||
1013 | count =- NUM_ISA_INTERRUPTS - virq; | ||
1014 | virq = NUM_ISA_INTERRUPTS; | ||
1015 | } | ||
1016 | |||
1017 | if (count > irq_virq_count || virq > irq_virq_count - count) { | ||
1018 | if (virq > irq_virq_count) | ||
1019 | return; | ||
1020 | count = irq_virq_count - virq; | ||
1021 | } | ||
1022 | |||
1013 | raw_spin_lock_irqsave(&irq_big_lock, flags); | 1023 | raw_spin_lock_irqsave(&irq_big_lock, flags); |
1014 | for (i = virq; i < (virq + count); i++) { | 1024 | for (i = virq; i < (virq + count); i++) { |
1015 | struct irq_host *host; | 1025 | struct irq_host *host; |
1016 | 1026 | ||
1017 | if (i < NUM_ISA_INTERRUPTS || | ||
1018 | (virq + count) > irq_virq_count) | ||
1019 | continue; | ||
1020 | |||
1021 | host = irq_map[i].host; | 1027 | host = irq_map[i].host; |
1022 | irq_map[i].hwirq = host->inval_irq; | 1028 | irq_map[i].hwirq = host->inval_irq; |
1023 | smp_wmb(); | 1029 | smp_wmb(); |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 48aeb55faae9..f2c906b1d8d3 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -694,7 +694,7 @@ void __init early_init_devtree(void *params) | |||
694 | * device-tree, including the platform type, initrd location and | 694 | * device-tree, including the platform type, initrd location and |
695 | * size, TCE reserve, and more ... | 695 | * size, TCE reserve, and more ... |
696 | */ | 696 | */ |
697 | of_scan_flat_dt(early_init_dt_scan_chosen_ppc, NULL); | 697 | of_scan_flat_dt(early_init_dt_scan_chosen_ppc, cmd_line); |
698 | 698 | ||
699 | /* Scan memory nodes and rebuild MEMBLOCKs */ | 699 | /* Scan memory nodes and rebuild MEMBLOCKs */ |
700 | memblock_init(); | 700 | memblock_init(); |
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index a6ae1cfad86c..cb22024f2b42 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/signal.h> | 29 | #include <linux/signal.h> |
30 | #include <linux/seccomp.h> | 30 | #include <linux/seccomp.h> |
31 | #include <linux/audit.h> | 31 | #include <linux/audit.h> |
32 | #include <trace/syscall.h> | ||
32 | #ifdef CONFIG_PPC32 | 33 | #ifdef CONFIG_PPC32 |
33 | #include <linux/module.h> | 34 | #include <linux/module.h> |
34 | #endif | 35 | #endif |
@@ -40,6 +41,9 @@ | |||
40 | #include <asm/pgtable.h> | 41 | #include <asm/pgtable.h> |
41 | #include <asm/system.h> | 42 | #include <asm/system.h> |
42 | 43 | ||
44 | #define CREATE_TRACE_POINTS | ||
45 | #include <trace/events/syscalls.h> | ||
46 | |||
43 | /* | 47 | /* |
44 | * The parameter save area on the stack is used to store arguments being passed | 48 | * The parameter save area on the stack is used to store arguments being passed |
45 | * to callee function and is located at fixed offset from stack pointer. | 49 | * to callee function and is located at fixed offset from stack pointer. |
@@ -1710,6 +1714,9 @@ long do_syscall_trace_enter(struct pt_regs *regs) | |||
1710 | */ | 1714 | */ |
1711 | ret = -1L; | 1715 | ret = -1L; |
1712 | 1716 | ||
1717 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) | ||
1718 | trace_sys_enter(regs, regs->gpr[0]); | ||
1719 | |||
1713 | if (unlikely(current->audit_context)) { | 1720 | if (unlikely(current->audit_context)) { |
1714 | #ifdef CONFIG_PPC64 | 1721 | #ifdef CONFIG_PPC64 |
1715 | if (!is_32bit_task()) | 1722 | if (!is_32bit_task()) |
@@ -1738,6 +1745,9 @@ void do_syscall_trace_leave(struct pt_regs *regs) | |||
1738 | audit_syscall_exit((regs->ccr&0x10000000)?AUDITSC_FAILURE:AUDITSC_SUCCESS, | 1745 | audit_syscall_exit((regs->ccr&0x10000000)?AUDITSC_FAILURE:AUDITSC_SUCCESS, |
1739 | regs->result); | 1746 | regs->result); |
1740 | 1747 | ||
1748 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) | ||
1749 | trace_sys_exit(regs, regs->result); | ||
1750 | |||
1741 | step = test_thread_flag(TIF_SINGLESTEP); | 1751 | step = test_thread_flag(TIF_SINGLESTEP); |
1742 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) | 1752 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) |
1743 | tracehook_report_syscall_exit(regs, step); | 1753 | tracehook_report_syscall_exit(regs, step); |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 4a6f2ec7e761..8ebc6700b98d 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -129,7 +129,7 @@ static irqreturn_t call_function_single_action(int irq, void *data) | |||
129 | return IRQ_HANDLED; | 129 | return IRQ_HANDLED; |
130 | } | 130 | } |
131 | 131 | ||
132 | irqreturn_t debug_ipi_action(int irq, void *data) | 132 | static irqreturn_t debug_ipi_action(int irq, void *data) |
133 | { | 133 | { |
134 | if (crash_ipi_function_ptr) { | 134 | if (crash_ipi_function_ptr) { |
135 | crash_ipi_function_ptr(get_irq_regs()); | 135 | crash_ipi_function_ptr(get_irq_regs()); |
diff --git a/arch/powerpc/kernel/swsusp.c b/arch/powerpc/kernel/swsusp.c index 560c96119501..aa17b76dd427 100644 --- a/arch/powerpc/kernel/swsusp.c +++ b/arch/powerpc/kernel/swsusp.c | |||
@@ -10,7 +10,6 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
13 | #include <asm/suspend.h> | ||
14 | #include <asm/system.h> | 13 | #include <asm/system.h> |
15 | #include <asm/current.h> | 14 | #include <asm/current.h> |
16 | #include <asm/mmu_context.h> | 15 | #include <asm/mmu_context.h> |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index b13306b0d925..0ff4ab98d50c 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #endif | 55 | #endif |
56 | #include <asm/kexec.h> | 56 | #include <asm/kexec.h> |
57 | #include <asm/ppc-opcode.h> | 57 | #include <asm/ppc-opcode.h> |
58 | #include <asm/rio.h> | ||
58 | 59 | ||
59 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) | 60 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) |
60 | int (*__debugger)(struct pt_regs *regs) __read_mostly; | 61 | int (*__debugger)(struct pt_regs *regs) __read_mostly; |
@@ -424,6 +425,12 @@ int machine_check_e500mc(struct pt_regs *regs) | |||
424 | unsigned long reason = mcsr; | 425 | unsigned long reason = mcsr; |
425 | int recoverable = 1; | 426 | int recoverable = 1; |
426 | 427 | ||
428 | if (reason & MCSR_BUS_RBERR) { | ||
429 | recoverable = fsl_rio_mcheck_exception(regs); | ||
430 | if (recoverable == 1) | ||
431 | goto silent_out; | ||
432 | } | ||
433 | |||
427 | printk("Machine check in kernel mode.\n"); | 434 | printk("Machine check in kernel mode.\n"); |
428 | printk("Caused by (from MCSR=%lx): ", reason); | 435 | printk("Caused by (from MCSR=%lx): ", reason); |
429 | 436 | ||
@@ -499,6 +506,7 @@ int machine_check_e500mc(struct pt_regs *regs) | |||
499 | reason & MCSR_MEA ? "Effective" : "Physical", addr); | 506 | reason & MCSR_MEA ? "Effective" : "Physical", addr); |
500 | } | 507 | } |
501 | 508 | ||
509 | silent_out: | ||
502 | mtspr(SPRN_MCSR, mcsr); | 510 | mtspr(SPRN_MCSR, mcsr); |
503 | return mfspr(SPRN_MCSR) == 0 && recoverable; | 511 | return mfspr(SPRN_MCSR) == 0 && recoverable; |
504 | } | 512 | } |
@@ -507,6 +515,11 @@ int machine_check_e500(struct pt_regs *regs) | |||
507 | { | 515 | { |
508 | unsigned long reason = get_mc_reason(regs); | 516 | unsigned long reason = get_mc_reason(regs); |
509 | 517 | ||
518 | if (reason & MCSR_BUS_RBERR) { | ||
519 | if (fsl_rio_mcheck_exception(regs)) | ||
520 | return 1; | ||
521 | } | ||
522 | |||
510 | printk("Machine check in kernel mode.\n"); | 523 | printk("Machine check in kernel mode.\n"); |
511 | printk("Caused by (from MCSR=%lx): ", reason); | 524 | printk("Caused by (from MCSR=%lx): ", reason); |
512 | 525 | ||
diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c index 8ee51a252cf1..e6bec74be131 100644 --- a/arch/powerpc/oprofile/op_model_power4.c +++ b/arch/powerpc/oprofile/op_model_power4.c | |||
@@ -261,6 +261,28 @@ static int get_kernel(unsigned long pc, unsigned long mmcra) | |||
261 | return is_kernel; | 261 | return is_kernel; |
262 | } | 262 | } |
263 | 263 | ||
264 | static bool pmc_overflow(unsigned long val) | ||
265 | { | ||
266 | if ((int)val < 0) | ||
267 | return true; | ||
268 | |||
269 | /* | ||
270 | * Events on POWER7 can roll back if a speculative event doesn't | ||
271 | * eventually complete. Unfortunately in some rare cases they will | ||
272 | * raise a performance monitor exception. We need to catch this to | ||
273 | * ensure we reset the PMC. In all cases the PMC will be 256 or less | ||
274 | * cycles from overflow. | ||
275 | * | ||
276 | * We only do this if the first pass fails to find any overflowing | ||
277 | * PMCs because a user might set a period of less than 256 and we | ||
278 | * don't want to mistakenly reset them. | ||
279 | */ | ||
280 | if (__is_processor(PV_POWER7) && ((0x80000000 - val) <= 256)) | ||
281 | return true; | ||
282 | |||
283 | return false; | ||
284 | } | ||
285 | |||
264 | static void power4_handle_interrupt(struct pt_regs *regs, | 286 | static void power4_handle_interrupt(struct pt_regs *regs, |
265 | struct op_counter_config *ctr) | 287 | struct op_counter_config *ctr) |
266 | { | 288 | { |
@@ -281,7 +303,7 @@ static void power4_handle_interrupt(struct pt_regs *regs, | |||
281 | 303 | ||
282 | for (i = 0; i < cur_cpu_spec->num_pmcs; ++i) { | 304 | for (i = 0; i < cur_cpu_spec->num_pmcs; ++i) { |
283 | val = classic_ctr_read(i); | 305 | val = classic_ctr_read(i); |
284 | if (val < 0) { | 306 | if (pmc_overflow(val)) { |
285 | if (oprofile_running && ctr[i].enabled) { | 307 | if (oprofile_running && ctr[i].enabled) { |
286 | oprofile_add_ext_sample(pc, regs, i, is_kernel); | 308 | oprofile_add_ext_sample(pc, regs, i, is_kernel); |
287 | classic_ctr_write(i, reset_value[i]); | 309 | classic_ctr_write(i, reset_value[i]); |
diff --git a/arch/powerpc/platforms/40x/Kconfig b/arch/powerpc/platforms/40x/Kconfig index b72176434ebe..d733d7ca939c 100644 --- a/arch/powerpc/platforms/40x/Kconfig +++ b/arch/powerpc/platforms/40x/Kconfig | |||
@@ -57,6 +57,8 @@ config KILAUEA | |||
57 | select 405EX | 57 | select 405EX |
58 | select PPC40x_SIMPLE | 58 | select PPC40x_SIMPLE |
59 | select PPC4xx_PCI_EXPRESS | 59 | select PPC4xx_PCI_EXPRESS |
60 | select PCI_MSI | ||
61 | select PPC4xx_MSI | ||
60 | help | 62 | help |
61 | This option enables support for the AMCC PPC405EX evaluation board. | 63 | This option enables support for the AMCC PPC405EX evaluation board. |
62 | 64 | ||
diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig index f485fc5f6d5e..e958b6f48ec2 100644 --- a/arch/powerpc/platforms/44x/Kconfig +++ b/arch/powerpc/platforms/44x/Kconfig | |||
@@ -74,6 +74,8 @@ config KATMAI | |||
74 | select 440SPe | 74 | select 440SPe |
75 | select PCI | 75 | select PCI |
76 | select PPC4xx_PCI_EXPRESS | 76 | select PPC4xx_PCI_EXPRESS |
77 | select PCI_MSI | ||
78 | select PCC4xx_MSI | ||
77 | help | 79 | help |
78 | This option enables support for the AMCC PPC440SPe evaluation board. | 80 | This option enables support for the AMCC PPC440SPe evaluation board. |
79 | 81 | ||
@@ -118,6 +120,8 @@ config CANYONLANDS | |||
118 | select 460EX | 120 | select 460EX |
119 | select PCI | 121 | select PCI |
120 | select PPC4xx_PCI_EXPRESS | 122 | select PPC4xx_PCI_EXPRESS |
123 | select PCI_MSI | ||
124 | select PPC4xx_MSI | ||
121 | select IBM_NEW_EMAC_RGMII | 125 | select IBM_NEW_EMAC_RGMII |
122 | select IBM_NEW_EMAC_ZMII | 126 | select IBM_NEW_EMAC_ZMII |
123 | help | 127 | help |
@@ -144,6 +148,8 @@ config REDWOOD | |||
144 | select 460SX | 148 | select 460SX |
145 | select PCI | 149 | select PCI |
146 | select PPC4xx_PCI_EXPRESS | 150 | select PPC4xx_PCI_EXPRESS |
151 | select PCI_MSI | ||
152 | select PPC4xx_MSI | ||
147 | help | 153 | help |
148 | This option enables support for the AMCC PPC460SX Redwood board. | 154 | This option enables support for the AMCC PPC460SX Redwood board. |
149 | 155 | ||
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 449c08c15862..3e4eba603e6b 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -176,14 +176,14 @@ EXPORT_SYMBOL_GPL(iic_get_target_id); | |||
176 | #ifdef CONFIG_SMP | 176 | #ifdef CONFIG_SMP |
177 | 177 | ||
178 | /* Use the highest interrupt priorities for IPI */ | 178 | /* Use the highest interrupt priorities for IPI */ |
179 | static inline int iic_ipi_to_irq(int ipi) | 179 | static inline int iic_msg_to_irq(int msg) |
180 | { | 180 | { |
181 | return IIC_IRQ_TYPE_IPI + 0xf - ipi; | 181 | return IIC_IRQ_TYPE_IPI + 0xf - msg; |
182 | } | 182 | } |
183 | 183 | ||
184 | void iic_cause_IPI(int cpu, int mesg) | 184 | void iic_message_pass(int cpu, int msg) |
185 | { | 185 | { |
186 | out_be64(&per_cpu(cpu_iic, cpu).regs->generate, (0xf - mesg) << 4); | 186 | out_be64(&per_cpu(cpu_iic, cpu).regs->generate, (0xf - msg) << 4); |
187 | } | 187 | } |
188 | 188 | ||
189 | struct irq_host *iic_get_irq_host(int node) | 189 | struct irq_host *iic_get_irq_host(int node) |
@@ -192,50 +192,31 @@ struct irq_host *iic_get_irq_host(int node) | |||
192 | } | 192 | } |
193 | EXPORT_SYMBOL_GPL(iic_get_irq_host); | 193 | EXPORT_SYMBOL_GPL(iic_get_irq_host); |
194 | 194 | ||
195 | static irqreturn_t iic_ipi_action(int irq, void *dev_id) | 195 | static void iic_request_ipi(int msg) |
196 | { | ||
197 | int ipi = (int)(long)dev_id; | ||
198 | |||
199 | switch(ipi) { | ||
200 | case PPC_MSG_CALL_FUNCTION: | ||
201 | generic_smp_call_function_interrupt(); | ||
202 | break; | ||
203 | case PPC_MSG_RESCHEDULE: | ||
204 | scheduler_ipi(); | ||
205 | break; | ||
206 | case PPC_MSG_CALL_FUNC_SINGLE: | ||
207 | generic_smp_call_function_single_interrupt(); | ||
208 | break; | ||
209 | case PPC_MSG_DEBUGGER_BREAK: | ||
210 | debug_ipi_action(0, NULL); | ||
211 | break; | ||
212 | } | ||
213 | return IRQ_HANDLED; | ||
214 | } | ||
215 | static void iic_request_ipi(int ipi, const char *name) | ||
216 | { | 196 | { |
217 | int virq; | 197 | int virq; |
218 | 198 | ||
219 | virq = irq_create_mapping(iic_host, iic_ipi_to_irq(ipi)); | 199 | virq = irq_create_mapping(iic_host, iic_msg_to_irq(msg)); |
220 | if (virq == NO_IRQ) { | 200 | if (virq == NO_IRQ) { |
221 | printk(KERN_ERR | 201 | printk(KERN_ERR |
222 | "iic: failed to map IPI %s\n", name); | 202 | "iic: failed to map IPI %s\n", smp_ipi_name[msg]); |
223 | return; | 203 | return; |
224 | } | 204 | } |
225 | if (request_irq(virq, iic_ipi_action, IRQF_DISABLED, name, | 205 | |
226 | (void *)(long)ipi)) | 206 | /* |
227 | printk(KERN_ERR | 207 | * If smp_request_message_ipi encounters an error it will notify |
228 | "iic: failed to request IPI %s\n", name); | 208 | * the error. If a message is not needed it will return non-zero. |
209 | */ | ||
210 | if (smp_request_message_ipi(virq, msg)) | ||
211 | irq_dispose_mapping(virq); | ||
229 | } | 212 | } |
230 | 213 | ||
231 | void iic_request_IPIs(void) | 214 | void iic_request_IPIs(void) |
232 | { | 215 | { |
233 | iic_request_ipi(PPC_MSG_CALL_FUNCTION, "IPI-call"); | 216 | iic_request_ipi(PPC_MSG_CALL_FUNCTION); |
234 | iic_request_ipi(PPC_MSG_RESCHEDULE, "IPI-resched"); | 217 | iic_request_ipi(PPC_MSG_RESCHEDULE); |
235 | iic_request_ipi(PPC_MSG_CALL_FUNC_SINGLE, "IPI-call-single"); | 218 | iic_request_ipi(PPC_MSG_CALL_FUNC_SINGLE); |
236 | #ifdef CONFIG_DEBUGGER | 219 | iic_request_ipi(PPC_MSG_DEBUGGER_BREAK); |
237 | iic_request_ipi(PPC_MSG_DEBUGGER_BREAK, "IPI-debug"); | ||
238 | #endif /* CONFIG_DEBUGGER */ | ||
239 | } | 220 | } |
240 | 221 | ||
241 | #endif /* CONFIG_SMP */ | 222 | #endif /* CONFIG_SMP */ |
diff --git a/arch/powerpc/platforms/cell/interrupt.h b/arch/powerpc/platforms/cell/interrupt.h index 942dc39d6045..4f60ae6ca358 100644 --- a/arch/powerpc/platforms/cell/interrupt.h +++ b/arch/powerpc/platforms/cell/interrupt.h | |||
@@ -75,7 +75,7 @@ enum { | |||
75 | }; | 75 | }; |
76 | 76 | ||
77 | extern void iic_init_IRQ(void); | 77 | extern void iic_init_IRQ(void); |
78 | extern void iic_cause_IPI(int cpu, int mesg); | 78 | extern void iic_message_pass(int cpu, int msg); |
79 | extern void iic_request_IPIs(void); | 79 | extern void iic_request_IPIs(void); |
80 | extern void iic_setup_cpu(void); | 80 | extern void iic_setup_cpu(void); |
81 | 81 | ||
diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c index d176e6148e3f..dbb641ea90dd 100644 --- a/arch/powerpc/platforms/cell/smp.c +++ b/arch/powerpc/platforms/cell/smp.c | |||
@@ -152,7 +152,7 @@ static int smp_cell_cpu_bootable(unsigned int nr) | |||
152 | return 1; | 152 | return 1; |
153 | } | 153 | } |
154 | static struct smp_ops_t bpa_iic_smp_ops = { | 154 | static struct smp_ops_t bpa_iic_smp_ops = { |
155 | .message_pass = iic_cause_IPI, | 155 | .message_pass = iic_message_pass, |
156 | .probe = smp_iic_probe, | 156 | .probe = smp_iic_probe, |
157 | .kick_cpu = smp_cell_kick_cpu, | 157 | .kick_cpu = smp_cell_kick_cpu, |
158 | .setup_cpu = smp_cell_setup_cpu, | 158 | .setup_cpu = smp_cell_setup_cpu, |
diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platforms/powermac/pic.c index 9089b0421191..7667db448aa7 100644 --- a/arch/powerpc/platforms/powermac/pic.c +++ b/arch/powerpc/platforms/powermac/pic.c | |||
@@ -715,7 +715,8 @@ static struct syscore_ops pmacpic_syscore_ops = { | |||
715 | 715 | ||
716 | static int __init init_pmacpic_syscore(void) | 716 | static int __init init_pmacpic_syscore(void) |
717 | { | 717 | { |
718 | register_syscore_ops(&pmacpic_syscore_ops); | 718 | if (pmac_irq_hw[0]) |
719 | register_syscore_ops(&pmacpic_syscore_ops); | ||
719 | return 0; | 720 | return 0; |
720 | } | 721 | } |
721 | 722 | ||
diff --git a/arch/powerpc/sysdev/Kconfig b/arch/powerpc/sysdev/Kconfig index d775fd148d13..7b4df37ac381 100644 --- a/arch/powerpc/sysdev/Kconfig +++ b/arch/powerpc/sysdev/Kconfig | |||
@@ -7,11 +7,18 @@ config PPC4xx_PCI_EXPRESS | |||
7 | depends on PCI && 4xx | 7 | depends on PCI && 4xx |
8 | default n | 8 | default n |
9 | 9 | ||
10 | config PPC4xx_MSI | ||
11 | bool | ||
12 | depends on PCI_MSI | ||
13 | depends on PCI && 4xx | ||
14 | default n | ||
15 | |||
10 | config PPC_MSI_BITMAP | 16 | config PPC_MSI_BITMAP |
11 | bool | 17 | bool |
12 | depends on PCI_MSI | 18 | depends on PCI_MSI |
13 | default y if MPIC | 19 | default y if MPIC |
14 | default y if FSL_PCI | 20 | default y if FSL_PCI |
21 | default y if PPC4xx_MSI | ||
15 | 22 | ||
16 | source "arch/powerpc/sysdev/xics/Kconfig" | 23 | source "arch/powerpc/sysdev/xics/Kconfig" |
17 | 24 | ||
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index 6076e0074a87..0efa990e3344 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -41,6 +41,7 @@ obj-$(CONFIG_OF_RTC) += of_rtc.o | |||
41 | ifeq ($(CONFIG_PCI),y) | 41 | ifeq ($(CONFIG_PCI),y) |
42 | obj-$(CONFIG_4xx) += ppc4xx_pci.o | 42 | obj-$(CONFIG_4xx) += ppc4xx_pci.o |
43 | endif | 43 | endif |
44 | obj-$(CONFIG_PPC4xx_MSI) += ppc4xx_msi.o | ||
44 | obj-$(CONFIG_PPC4xx_CPM) += ppc4xx_cpm.o | 45 | obj-$(CONFIG_PPC4xx_CPM) += ppc4xx_cpm.o |
45 | obj-$(CONFIG_PPC4xx_GPIO) += ppc4xx_gpio.o | 46 | obj-$(CONFIG_PPC4xx_GPIO) += ppc4xx_gpio.o |
46 | 47 | ||
diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c index 4fcb5a4e60dd..0608b1657da4 100644 --- a/arch/powerpc/sysdev/fsl_lbc.c +++ b/arch/powerpc/sysdev/fsl_lbc.c | |||
@@ -184,7 +184,8 @@ int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar) | |||
184 | } | 184 | } |
185 | EXPORT_SYMBOL(fsl_upm_run_pattern); | 185 | EXPORT_SYMBOL(fsl_upm_run_pattern); |
186 | 186 | ||
187 | static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl) | 187 | static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl, |
188 | struct device_node *node) | ||
188 | { | 189 | { |
189 | struct fsl_lbc_regs __iomem *lbc = ctrl->regs; | 190 | struct fsl_lbc_regs __iomem *lbc = ctrl->regs; |
190 | 191 | ||
@@ -198,6 +199,10 @@ static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl) | |||
198 | /* Enable interrupts for any detected events */ | 199 | /* Enable interrupts for any detected events */ |
199 | out_be32(&lbc->lteir, LTEIR_ENABLE); | 200 | out_be32(&lbc->lteir, LTEIR_ENABLE); |
200 | 201 | ||
202 | /* Set the monitor timeout value to the maximum for erratum A001 */ | ||
203 | if (of_device_is_compatible(node, "fsl,elbc")) | ||
204 | clrsetbits_be32(&lbc->lbcr, LBCR_BMT, LBCR_BMTPS); | ||
205 | |||
201 | return 0; | 206 | return 0; |
202 | } | 207 | } |
203 | 208 | ||
@@ -304,7 +309,7 @@ static int __devinit fsl_lbc_ctrl_probe(struct platform_device *dev) | |||
304 | 309 | ||
305 | fsl_lbc_ctrl_dev->dev = &dev->dev; | 310 | fsl_lbc_ctrl_dev->dev = &dev->dev; |
306 | 311 | ||
307 | ret = fsl_lbc_ctrl_init(fsl_lbc_ctrl_dev); | 312 | ret = fsl_lbc_ctrl_init(fsl_lbc_ctrl_dev, dev->dev.of_node); |
308 | if (ret < 0) | 313 | if (ret < 0) |
309 | goto err; | 314 | goto err; |
310 | 315 | ||
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 49798532b477..5b206a2fe17c 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * - Added Port-Write message handling | 10 | * - Added Port-Write message handling |
11 | * - Added Machine Check exception handling | 11 | * - Added Machine Check exception handling |
12 | * | 12 | * |
13 | * Copyright (C) 2007, 2008 Freescale Semiconductor, Inc. | 13 | * Copyright (C) 2007, 2008, 2010 Freescale Semiconductor, Inc. |
14 | * Zhang Wei <wei.zhang@freescale.com> | 14 | * Zhang Wei <wei.zhang@freescale.com> |
15 | * | 15 | * |
16 | * Copyright 2005 MontaVista Software, Inc. | 16 | * Copyright 2005 MontaVista Software, Inc. |
@@ -47,15 +47,33 @@ | |||
47 | #define IRQ_RIO_RX(m) (((struct rio_priv *)(m->priv))->rxirq) | 47 | #define IRQ_RIO_RX(m) (((struct rio_priv *)(m->priv))->rxirq) |
48 | #define IRQ_RIO_PW(m) (((struct rio_priv *)(m->priv))->pwirq) | 48 | #define IRQ_RIO_PW(m) (((struct rio_priv *)(m->priv))->pwirq) |
49 | 49 | ||
50 | #define IPWSR_CLEAR 0x98 | ||
51 | #define OMSR_CLEAR 0x1cb3 | ||
52 | #define IMSR_CLEAR 0x491 | ||
53 | #define IDSR_CLEAR 0x91 | ||
54 | #define ODSR_CLEAR 0x1c00 | ||
55 | #define LTLEECSR_ENABLE_ALL 0xFFC000FC | ||
56 | #define ESCSR_CLEAR 0x07120204 | ||
57 | |||
58 | #define RIO_PORT1_EDCSR 0x0640 | ||
59 | #define RIO_PORT2_EDCSR 0x0680 | ||
60 | #define RIO_PORT1_IECSR 0x10130 | ||
61 | #define RIO_PORT2_IECSR 0x101B0 | ||
62 | #define RIO_IM0SR 0x13064 | ||
63 | #define RIO_IM1SR 0x13164 | ||
64 | #define RIO_OM0SR 0x13004 | ||
65 | #define RIO_OM1SR 0x13104 | ||
66 | |||
50 | #define RIO_ATMU_REGS_OFFSET 0x10c00 | 67 | #define RIO_ATMU_REGS_OFFSET 0x10c00 |
51 | #define RIO_P_MSG_REGS_OFFSET 0x11000 | 68 | #define RIO_P_MSG_REGS_OFFSET 0x11000 |
52 | #define RIO_S_MSG_REGS_OFFSET 0x13000 | 69 | #define RIO_S_MSG_REGS_OFFSET 0x13000 |
53 | #define RIO_GCCSR 0x13c | 70 | #define RIO_GCCSR 0x13c |
54 | #define RIO_ESCSR 0x158 | 71 | #define RIO_ESCSR 0x158 |
72 | #define RIO_PORT2_ESCSR 0x178 | ||
55 | #define RIO_CCSR 0x15c | 73 | #define RIO_CCSR 0x15c |
56 | #define RIO_LTLEDCSR 0x0608 | 74 | #define RIO_LTLEDCSR 0x0608 |
57 | #define RIO_LTLEDCSR_IER 0x80000000 | 75 | #define RIO_LTLEDCSR_IER 0x80000000 |
58 | #define RIO_LTLEDCSR_PRT 0x01000000 | 76 | #define RIO_LTLEDCSR_PRT 0x01000000 |
59 | #define RIO_LTLEECSR 0x060c | 77 | #define RIO_LTLEECSR 0x060c |
60 | #define RIO_EPWISR 0x10010 | 78 | #define RIO_EPWISR 0x10010 |
61 | #define RIO_ISR_AACR 0x10120 | 79 | #define RIO_ISR_AACR 0x10120 |
@@ -88,7 +106,10 @@ | |||
88 | #define RIO_IPWSR_PWD 0x00000008 | 106 | #define RIO_IPWSR_PWD 0x00000008 |
89 | #define RIO_IPWSR_PWB 0x00000004 | 107 | #define RIO_IPWSR_PWB 0x00000004 |
90 | 108 | ||
91 | #define RIO_EPWISR_PINT 0x80000000 | 109 | /* EPWISR Error match value */ |
110 | #define RIO_EPWISR_PINT1 0x80000000 | ||
111 | #define RIO_EPWISR_PINT2 0x40000000 | ||
112 | #define RIO_EPWISR_MU 0x00000002 | ||
92 | #define RIO_EPWISR_PW 0x00000001 | 113 | #define RIO_EPWISR_PW 0x00000001 |
93 | 114 | ||
94 | #define RIO_MSG_DESC_SIZE 32 | 115 | #define RIO_MSG_DESC_SIZE 32 |
@@ -260,9 +281,7 @@ struct rio_priv { | |||
260 | static void __iomem *rio_regs_win; | 281 | static void __iomem *rio_regs_win; |
261 | 282 | ||
262 | #ifdef CONFIG_E500 | 283 | #ifdef CONFIG_E500 |
263 | static int (*saved_mcheck_exception)(struct pt_regs *regs); | 284 | int fsl_rio_mcheck_exception(struct pt_regs *regs) |
264 | |||
265 | static int fsl_rio_mcheck_exception(struct pt_regs *regs) | ||
266 | { | 285 | { |
267 | const struct exception_table_entry *entry = NULL; | 286 | const struct exception_table_entry *entry = NULL; |
268 | unsigned long reason = mfspr(SPRN_MCSR); | 287 | unsigned long reason = mfspr(SPRN_MCSR); |
@@ -284,11 +303,9 @@ static int fsl_rio_mcheck_exception(struct pt_regs *regs) | |||
284 | } | 303 | } |
285 | } | 304 | } |
286 | 305 | ||
287 | if (saved_mcheck_exception) | 306 | return 0; |
288 | return saved_mcheck_exception(regs); | ||
289 | else | ||
290 | return cur_cpu_spec->machine_check(regs); | ||
291 | } | 307 | } |
308 | EXPORT_SYMBOL_GPL(fsl_rio_mcheck_exception); | ||
292 | #endif | 309 | #endif |
293 | 310 | ||
294 | /** | 311 | /** |
@@ -1064,6 +1081,40 @@ static int fsl_rio_doorbell_init(struct rio_mport *mport) | |||
1064 | return rc; | 1081 | return rc; |
1065 | } | 1082 | } |
1066 | 1083 | ||
1084 | static void port_error_handler(struct rio_mport *port, int offset) | ||
1085 | { | ||
1086 | /*XXX: Error recovery is not implemented, we just clear errors */ | ||
1087 | out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR), 0); | ||
1088 | |||
1089 | if (offset == 0) { | ||
1090 | out_be32((u32 *)(rio_regs_win + RIO_PORT1_EDCSR), 0); | ||
1091 | out_be32((u32 *)(rio_regs_win + RIO_PORT1_IECSR), 0); | ||
1092 | out_be32((u32 *)(rio_regs_win + RIO_ESCSR), ESCSR_CLEAR); | ||
1093 | } else { | ||
1094 | out_be32((u32 *)(rio_regs_win + RIO_PORT2_EDCSR), 0); | ||
1095 | out_be32((u32 *)(rio_regs_win + RIO_PORT2_IECSR), 0); | ||
1096 | out_be32((u32 *)(rio_regs_win + RIO_PORT2_ESCSR), ESCSR_CLEAR); | ||
1097 | } | ||
1098 | } | ||
1099 | |||
1100 | static void msg_unit_error_handler(struct rio_mport *port) | ||
1101 | { | ||
1102 | struct rio_priv *priv = port->priv; | ||
1103 | |||
1104 | /*XXX: Error recovery is not implemented, we just clear errors */ | ||
1105 | out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR), 0); | ||
1106 | |||
1107 | out_be32((u32 *)(rio_regs_win + RIO_IM0SR), IMSR_CLEAR); | ||
1108 | out_be32((u32 *)(rio_regs_win + RIO_IM1SR), IMSR_CLEAR); | ||
1109 | out_be32((u32 *)(rio_regs_win + RIO_OM0SR), OMSR_CLEAR); | ||
1110 | out_be32((u32 *)(rio_regs_win + RIO_OM1SR), OMSR_CLEAR); | ||
1111 | |||
1112 | out_be32(&priv->msg_regs->odsr, ODSR_CLEAR); | ||
1113 | out_be32(&priv->msg_regs->dsr, IDSR_CLEAR); | ||
1114 | |||
1115 | out_be32(&priv->msg_regs->pwsr, IPWSR_CLEAR); | ||
1116 | } | ||
1117 | |||
1067 | /** | 1118 | /** |
1068 | * fsl_rio_port_write_handler - MPC85xx port write interrupt handler | 1119 | * fsl_rio_port_write_handler - MPC85xx port write interrupt handler |
1069 | * @irq: Linux interrupt number | 1120 | * @irq: Linux interrupt number |
@@ -1144,10 +1195,22 @@ fsl_rio_port_write_handler(int irq, void *dev_instance) | |||
1144 | } | 1195 | } |
1145 | 1196 | ||
1146 | pw_done: | 1197 | pw_done: |
1147 | if (epwisr & RIO_EPWISR_PINT) { | 1198 | if (epwisr & RIO_EPWISR_PINT1) { |
1199 | tmp = in_be32(priv->regs_win + RIO_LTLEDCSR); | ||
1200 | pr_debug("RIO_LTLEDCSR = 0x%x\n", tmp); | ||
1201 | port_error_handler(port, 0); | ||
1202 | } | ||
1203 | |||
1204 | if (epwisr & RIO_EPWISR_PINT2) { | ||
1148 | tmp = in_be32(priv->regs_win + RIO_LTLEDCSR); | 1205 | tmp = in_be32(priv->regs_win + RIO_LTLEDCSR); |
1149 | pr_debug("RIO_LTLEDCSR = 0x%x\n", tmp); | 1206 | pr_debug("RIO_LTLEDCSR = 0x%x\n", tmp); |
1150 | out_be32(priv->regs_win + RIO_LTLEDCSR, 0); | 1207 | port_error_handler(port, 1); |
1208 | } | ||
1209 | |||
1210 | if (epwisr & RIO_EPWISR_MU) { | ||
1211 | tmp = in_be32(priv->regs_win + RIO_LTLEDCSR); | ||
1212 | pr_debug("RIO_LTLEDCSR = 0x%x\n", tmp); | ||
1213 | msg_unit_error_handler(port); | ||
1151 | } | 1214 | } |
1152 | 1215 | ||
1153 | return IRQ_HANDLED; | 1216 | return IRQ_HANDLED; |
@@ -1258,12 +1321,14 @@ static int fsl_rio_port_write_init(struct rio_mport *mport) | |||
1258 | 1321 | ||
1259 | 1322 | ||
1260 | /* Hook up port-write handler */ | 1323 | /* Hook up port-write handler */ |
1261 | rc = request_irq(IRQ_RIO_PW(mport), fsl_rio_port_write_handler, 0, | 1324 | rc = request_irq(IRQ_RIO_PW(mport), fsl_rio_port_write_handler, |
1262 | "port-write", (void *)mport); | 1325 | IRQF_SHARED, "port-write", (void *)mport); |
1263 | if (rc < 0) { | 1326 | if (rc < 0) { |
1264 | pr_err("MPC85xx RIO: unable to request inbound doorbell irq"); | 1327 | pr_err("MPC85xx RIO: unable to request inbound doorbell irq"); |
1265 | goto err_out; | 1328 | goto err_out; |
1266 | } | 1329 | } |
1330 | /* Enable Error Interrupt */ | ||
1331 | out_be32((u32 *)(rio_regs_win + RIO_LTLEECSR), LTLEECSR_ENABLE_ALL); | ||
1267 | 1332 | ||
1268 | INIT_WORK(&priv->pw_work, fsl_pw_dpc); | 1333 | INIT_WORK(&priv->pw_work, fsl_pw_dpc); |
1269 | spin_lock_init(&priv->pw_fifo_lock); | 1334 | spin_lock_init(&priv->pw_fifo_lock); |
@@ -1538,11 +1603,6 @@ int fsl_rio_setup(struct platform_device *dev) | |||
1538 | fsl_rio_doorbell_init(port); | 1603 | fsl_rio_doorbell_init(port); |
1539 | fsl_rio_port_write_init(port); | 1604 | fsl_rio_port_write_init(port); |
1540 | 1605 | ||
1541 | #ifdef CONFIG_E500 | ||
1542 | saved_mcheck_exception = ppc_md.machine_check_exception; | ||
1543 | ppc_md.machine_check_exception = fsl_rio_mcheck_exception; | ||
1544 | #endif | ||
1545 | |||
1546 | return 0; | 1606 | return 0; |
1547 | err: | 1607 | err: |
1548 | iounmap(priv->regs_win); | 1608 | iounmap(priv->regs_win); |
diff --git a/arch/powerpc/sysdev/ppc4xx_msi.c b/arch/powerpc/sysdev/ppc4xx_msi.c new file mode 100644 index 000000000000..367af0241851 --- /dev/null +++ b/arch/powerpc/sysdev/ppc4xx_msi.c | |||
@@ -0,0 +1,276 @@ | |||
1 | /* | ||
2 | * Adding PCI-E MSI support for PPC4XX SoCs. | ||
3 | * | ||
4 | * Copyright (c) 2010, Applied Micro Circuits Corporation | ||
5 | * Authors: Tirumala R Marri <tmarri@apm.com> | ||
6 | * Feng Kan <fkan@apm.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License as | ||
10 | * published by the Free Software Foundation; either version 2 of | ||
11 | * the License, or (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
21 | * MA 02111-1307 USA | ||
22 | */ | ||
23 | |||
24 | #include <linux/irq.h> | ||
25 | #include <linux/bootmem.h> | ||
26 | #include <linux/pci.h> | ||
27 | #include <linux/msi.h> | ||
28 | #include <linux/of_platform.h> | ||
29 | #include <linux/interrupt.h> | ||
30 | #include <asm/prom.h> | ||
31 | #include <asm/hw_irq.h> | ||
32 | #include <asm/ppc-pci.h> | ||
33 | #include <boot/dcr.h> | ||
34 | #include <asm/dcr-regs.h> | ||
35 | #include <asm/msi_bitmap.h> | ||
36 | |||
37 | #define PEIH_TERMADH 0x00 | ||
38 | #define PEIH_TERMADL 0x08 | ||
39 | #define PEIH_MSIED 0x10 | ||
40 | #define PEIH_MSIMK 0x18 | ||
41 | #define PEIH_MSIASS 0x20 | ||
42 | #define PEIH_FLUSH0 0x30 | ||
43 | #define PEIH_FLUSH1 0x38 | ||
44 | #define PEIH_CNTRST 0x48 | ||
45 | #define NR_MSI_IRQS 4 | ||
46 | |||
47 | struct ppc4xx_msi { | ||
48 | u32 msi_addr_lo; | ||
49 | u32 msi_addr_hi; | ||
50 | void __iomem *msi_regs; | ||
51 | int msi_virqs[NR_MSI_IRQS]; | ||
52 | struct msi_bitmap bitmap; | ||
53 | struct device_node *msi_dev; | ||
54 | }; | ||
55 | |||
56 | static struct ppc4xx_msi ppc4xx_msi; | ||
57 | |||
58 | static int ppc4xx_msi_init_allocator(struct platform_device *dev, | ||
59 | struct ppc4xx_msi *msi_data) | ||
60 | { | ||
61 | int err; | ||
62 | |||
63 | err = msi_bitmap_alloc(&msi_data->bitmap, NR_MSI_IRQS, | ||
64 | dev->dev.of_node); | ||
65 | if (err) | ||
66 | return err; | ||
67 | |||
68 | err = msi_bitmap_reserve_dt_hwirqs(&msi_data->bitmap); | ||
69 | if (err < 0) { | ||
70 | msi_bitmap_free(&msi_data->bitmap); | ||
71 | return err; | ||
72 | } | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static int ppc4xx_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | ||
78 | { | ||
79 | int int_no = -ENOMEM; | ||
80 | unsigned int virq; | ||
81 | struct msi_msg msg; | ||
82 | struct msi_desc *entry; | ||
83 | struct ppc4xx_msi *msi_data = &ppc4xx_msi; | ||
84 | |||
85 | list_for_each_entry(entry, &dev->msi_list, list) { | ||
86 | int_no = msi_bitmap_alloc_hwirqs(&msi_data->bitmap, 1); | ||
87 | if (int_no >= 0) | ||
88 | break; | ||
89 | if (int_no < 0) { | ||
90 | pr_debug("%s: fail allocating msi interrupt\n", | ||
91 | __func__); | ||
92 | } | ||
93 | virq = irq_of_parse_and_map(msi_data->msi_dev, int_no); | ||
94 | if (virq == NO_IRQ) { | ||
95 | dev_err(&dev->dev, "%s: fail mapping irq\n", __func__); | ||
96 | msi_bitmap_free_hwirqs(&msi_data->bitmap, int_no, 1); | ||
97 | return -ENOSPC; | ||
98 | } | ||
99 | dev_dbg(&dev->dev, "%s: virq = %d\n", __func__, virq); | ||
100 | |||
101 | /* Setup msi address space */ | ||
102 | msg.address_hi = msi_data->msi_addr_hi; | ||
103 | msg.address_lo = msi_data->msi_addr_lo; | ||
104 | |||
105 | irq_set_msi_desc(virq, entry); | ||
106 | msg.data = int_no; | ||
107 | write_msi_msg(virq, &msg); | ||
108 | } | ||
109 | return 0; | ||
110 | } | ||
111 | |||
112 | void ppc4xx_teardown_msi_irqs(struct pci_dev *dev) | ||
113 | { | ||
114 | struct msi_desc *entry; | ||
115 | struct ppc4xx_msi *msi_data = &ppc4xx_msi; | ||
116 | |||
117 | dev_dbg(&dev->dev, "PCIE-MSI: tearing down msi irqs\n"); | ||
118 | |||
119 | list_for_each_entry(entry, &dev->msi_list, list) { | ||
120 | if (entry->irq == NO_IRQ) | ||
121 | continue; | ||
122 | irq_set_msi_desc(entry->irq, NULL); | ||
123 | msi_bitmap_free_hwirqs(&msi_data->bitmap, | ||
124 | virq_to_hw(entry->irq), 1); | ||
125 | irq_dispose_mapping(entry->irq); | ||
126 | } | ||
127 | } | ||
128 | |||
129 | static int ppc4xx_msi_check_device(struct pci_dev *pdev, int nvec, int type) | ||
130 | { | ||
131 | dev_dbg(&pdev->dev, "PCIE-MSI:%s called. vec %x type %d\n", | ||
132 | __func__, nvec, type); | ||
133 | if (type == PCI_CAP_ID_MSIX) | ||
134 | pr_debug("ppc4xx msi: MSI-X untested, trying anyway.\n"); | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | static int ppc4xx_setup_pcieh_hw(struct platform_device *dev, | ||
140 | struct resource res, struct ppc4xx_msi *msi) | ||
141 | { | ||
142 | const u32 *msi_data; | ||
143 | const u32 *msi_mask; | ||
144 | const u32 *sdr_addr; | ||
145 | dma_addr_t msi_phys; | ||
146 | void *msi_virt; | ||
147 | |||
148 | sdr_addr = of_get_property(dev->dev.of_node, "sdr-base", NULL); | ||
149 | if (!sdr_addr) | ||
150 | return -1; | ||
151 | |||
152 | SDR0_WRITE(sdr_addr, (u64)res.start >> 32); /*HIGH addr */ | ||
153 | SDR0_WRITE(sdr_addr + 1, res.start & 0xFFFFFFFF); /* Low addr */ | ||
154 | |||
155 | |||
156 | msi->msi_dev = of_find_node_by_name(NULL, "ppc4xx-msi"); | ||
157 | if (msi->msi_dev) | ||
158 | return -ENODEV; | ||
159 | |||
160 | msi->msi_regs = of_iomap(msi->msi_dev, 0); | ||
161 | if (!msi->msi_regs) { | ||
162 | dev_err(&dev->dev, "of_iomap problem failed\n"); | ||
163 | return -ENOMEM; | ||
164 | } | ||
165 | dev_dbg(&dev->dev, "PCIE-MSI: msi register mapped 0x%x 0x%x\n", | ||
166 | (u32) (msi->msi_regs + PEIH_TERMADH), (u32) (msi->msi_regs)); | ||
167 | |||
168 | msi_virt = dma_alloc_coherent(&dev->dev, 64, &msi_phys, GFP_KERNEL); | ||
169 | msi->msi_addr_hi = 0x0; | ||
170 | msi->msi_addr_lo = (u32) msi_phys; | ||
171 | dev_dbg(&dev->dev, "PCIE-MSI: msi address 0x%x\n", msi->msi_addr_lo); | ||
172 | |||
173 | /* Progam the Interrupt handler Termination addr registers */ | ||
174 | out_be32(msi->msi_regs + PEIH_TERMADH, msi->msi_addr_hi); | ||
175 | out_be32(msi->msi_regs + PEIH_TERMADL, msi->msi_addr_lo); | ||
176 | |||
177 | msi_data = of_get_property(dev->dev.of_node, "msi-data", NULL); | ||
178 | if (!msi_data) | ||
179 | return -1; | ||
180 | msi_mask = of_get_property(dev->dev.of_node, "msi-mask", NULL); | ||
181 | if (!msi_mask) | ||
182 | return -1; | ||
183 | /* Program MSI Expected data and Mask bits */ | ||
184 | out_be32(msi->msi_regs + PEIH_MSIED, *msi_data); | ||
185 | out_be32(msi->msi_regs + PEIH_MSIMK, *msi_mask); | ||
186 | |||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | static int ppc4xx_of_msi_remove(struct platform_device *dev) | ||
191 | { | ||
192 | struct ppc4xx_msi *msi = dev->dev.platform_data; | ||
193 | int i; | ||
194 | int virq; | ||
195 | |||
196 | for (i = 0; i < NR_MSI_IRQS; i++) { | ||
197 | virq = msi->msi_virqs[i]; | ||
198 | if (virq != NO_IRQ) | ||
199 | irq_dispose_mapping(virq); | ||
200 | } | ||
201 | |||
202 | if (msi->bitmap.bitmap) | ||
203 | msi_bitmap_free(&msi->bitmap); | ||
204 | iounmap(msi->msi_regs); | ||
205 | of_node_put(msi->msi_dev); | ||
206 | kfree(msi); | ||
207 | |||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | static int __devinit ppc4xx_msi_probe(struct platform_device *dev) | ||
212 | { | ||
213 | struct ppc4xx_msi *msi; | ||
214 | struct resource res; | ||
215 | int err = 0; | ||
216 | |||
217 | msi = &ppc4xx_msi;/*keep the msi data for further use*/ | ||
218 | |||
219 | dev_dbg(&dev->dev, "PCIE-MSI: Setting up MSI support...\n"); | ||
220 | |||
221 | msi = kzalloc(sizeof(struct ppc4xx_msi), GFP_KERNEL); | ||
222 | if (!msi) { | ||
223 | dev_err(&dev->dev, "No memory for MSI structure\n"); | ||
224 | return -ENOMEM; | ||
225 | } | ||
226 | dev->dev.platform_data = msi; | ||
227 | |||
228 | /* Get MSI ranges */ | ||
229 | err = of_address_to_resource(dev->dev.of_node, 0, &res); | ||
230 | if (err) { | ||
231 | dev_err(&dev->dev, "%s resource error!\n", | ||
232 | dev->dev.of_node->full_name); | ||
233 | goto error_out; | ||
234 | } | ||
235 | |||
236 | if (ppc4xx_setup_pcieh_hw(dev, res, msi)) | ||
237 | goto error_out; | ||
238 | |||
239 | err = ppc4xx_msi_init_allocator(dev, msi); | ||
240 | if (err) { | ||
241 | dev_err(&dev->dev, "Error allocating MSI bitmap\n"); | ||
242 | goto error_out; | ||
243 | } | ||
244 | |||
245 | ppc_md.setup_msi_irqs = ppc4xx_setup_msi_irqs; | ||
246 | ppc_md.teardown_msi_irqs = ppc4xx_teardown_msi_irqs; | ||
247 | ppc_md.msi_check_device = ppc4xx_msi_check_device; | ||
248 | return err; | ||
249 | |||
250 | error_out: | ||
251 | ppc4xx_of_msi_remove(dev); | ||
252 | return err; | ||
253 | } | ||
254 | static const struct of_device_id ppc4xx_msi_ids[] = { | ||
255 | { | ||
256 | .compatible = "amcc,ppc4xx-msi", | ||
257 | }, | ||
258 | {} | ||
259 | }; | ||
260 | static struct platform_driver ppc4xx_msi_driver = { | ||
261 | .probe = ppc4xx_msi_probe, | ||
262 | .remove = ppc4xx_of_msi_remove, | ||
263 | .driver = { | ||
264 | .name = "ppc4xx-msi", | ||
265 | .owner = THIS_MODULE, | ||
266 | .of_match_table = ppc4xx_msi_ids, | ||
267 | }, | ||
268 | |||
269 | }; | ||
270 | |||
271 | static __init int ppc4xx_msi_init(void) | ||
272 | { | ||
273 | return platform_driver_register(&ppc4xx_msi_driver); | ||
274 | } | ||
275 | |||
276 | subsys_initcall(ppc4xx_msi_init); | ||
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index ff2d2371b2e9..9fab2aa9c2c8 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -2,7 +2,7 @@ config MMU | |||
2 | def_bool y | 2 | def_bool y |
3 | 3 | ||
4 | config ZONE_DMA | 4 | config ZONE_DMA |
5 | def_bool y if 64BIT | 5 | def_bool y |
6 | 6 | ||
7 | config LOCKDEP_SUPPORT | 7 | config LOCKDEP_SUPPORT |
8 | def_bool y | 8 | def_bool y |
diff --git a/arch/s390/appldata/appldata_mem.c b/arch/s390/appldata/appldata_mem.c index e43fe7537031..f7d3dc555bdb 100644 --- a/arch/s390/appldata/appldata_mem.c +++ b/arch/s390/appldata/appldata_mem.c | |||
@@ -92,9 +92,7 @@ static void appldata_get_mem_data(void *data) | |||
92 | mem_data->pswpin = ev[PSWPIN]; | 92 | mem_data->pswpin = ev[PSWPIN]; |
93 | mem_data->pswpout = ev[PSWPOUT]; | 93 | mem_data->pswpout = ev[PSWPOUT]; |
94 | mem_data->pgalloc = ev[PGALLOC_NORMAL]; | 94 | mem_data->pgalloc = ev[PGALLOC_NORMAL]; |
95 | #ifdef CONFIG_ZONE_DMA | ||
96 | mem_data->pgalloc += ev[PGALLOC_DMA]; | 95 | mem_data->pgalloc += ev[PGALLOC_DMA]; |
97 | #endif | ||
98 | mem_data->pgfault = ev[PGFAULT]; | 96 | mem_data->pgfault = ev[PGFAULT]; |
99 | mem_data->pgmajfault = ev[PGMAJFAULT]; | 97 | mem_data->pgmajfault = ev[PGMAJFAULT]; |
100 | 98 | ||
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h index e1c8f3a49884..667c6e9f6a34 100644 --- a/arch/s390/include/asm/bitops.h +++ b/arch/s390/include/asm/bitops.h | |||
@@ -621,6 +621,7 @@ static inline unsigned long find_first_zero_bit(const unsigned long *addr, | |||
621 | bits = __ffz_word(bytes*8, __load_ulong_be(addr, bytes)); | 621 | bits = __ffz_word(bytes*8, __load_ulong_be(addr, bytes)); |
622 | return (bits < size) ? bits : size; | 622 | return (bits < size) ? bits : size; |
623 | } | 623 | } |
624 | #define find_first_zero_bit find_first_zero_bit | ||
624 | 625 | ||
625 | /** | 626 | /** |
626 | * find_first_bit - find the first set bit in a memory region | 627 | * find_first_bit - find the first set bit in a memory region |
@@ -641,6 +642,7 @@ static inline unsigned long find_first_bit(const unsigned long * addr, | |||
641 | bits = __ffs_word(bytes*8, __load_ulong_be(addr, bytes)); | 642 | bits = __ffs_word(bytes*8, __load_ulong_be(addr, bytes)); |
642 | return (bits < size) ? bits : size; | 643 | return (bits < size) ? bits : size; |
643 | } | 644 | } |
645 | #define find_first_bit find_first_bit | ||
644 | 646 | ||
645 | /** | 647 | /** |
646 | * find_next_zero_bit - find the first zero bit in a memory region | 648 | * find_next_zero_bit - find the first zero bit in a memory region |
@@ -677,6 +679,7 @@ static inline int find_next_zero_bit (const unsigned long * addr, | |||
677 | } | 679 | } |
678 | return offset + find_first_zero_bit(p, size); | 680 | return offset + find_first_zero_bit(p, size); |
679 | } | 681 | } |
682 | #define find_next_zero_bit find_next_zero_bit | ||
680 | 683 | ||
681 | /** | 684 | /** |
682 | * find_next_bit - find the first set bit in a memory region | 685 | * find_next_bit - find the first set bit in a memory region |
@@ -713,6 +716,7 @@ static inline int find_next_bit (const unsigned long * addr, | |||
713 | } | 716 | } |
714 | return offset + find_first_bit(p, size); | 717 | return offset + find_first_bit(p, size); |
715 | } | 718 | } |
719 | #define find_next_bit find_next_bit | ||
716 | 720 | ||
717 | /* | 721 | /* |
718 | * Every architecture must define this function. It's the fastest | 722 | * Every architecture must define this function. It's the fastest |
@@ -742,41 +746,6 @@ static inline int sched_find_first_bit(unsigned long *b) | |||
742 | * 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24 | 746 | * 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24 |
743 | */ | 747 | */ |
744 | 748 | ||
745 | static inline void __set_bit_le(unsigned long nr, void *addr) | ||
746 | { | ||
747 | __set_bit(nr ^ (__BITOPS_WORDSIZE - 8), addr); | ||
748 | } | ||
749 | |||
750 | static inline void __clear_bit_le(unsigned long nr, void *addr) | ||
751 | { | ||
752 | __clear_bit(nr ^ (__BITOPS_WORDSIZE - 8), addr); | ||
753 | } | ||
754 | |||
755 | static inline int __test_and_set_bit_le(unsigned long nr, void *addr) | ||
756 | { | ||
757 | return __test_and_set_bit(nr ^ (__BITOPS_WORDSIZE - 8), addr); | ||
758 | } | ||
759 | |||
760 | static inline int test_and_set_bit_le(unsigned long nr, void *addr) | ||
761 | { | ||
762 | return test_and_set_bit(nr ^ (__BITOPS_WORDSIZE - 8), addr); | ||
763 | } | ||
764 | |||
765 | static inline int __test_and_clear_bit_le(unsigned long nr, void *addr) | ||
766 | { | ||
767 | return __test_and_clear_bit(nr ^ (__BITOPS_WORDSIZE - 8), addr); | ||
768 | } | ||
769 | |||
770 | static inline int test_and_clear_bit_le(unsigned long nr, void *addr) | ||
771 | { | ||
772 | return test_and_clear_bit(nr ^ (__BITOPS_WORDSIZE - 8), addr); | ||
773 | } | ||
774 | |||
775 | static inline int test_bit_le(unsigned long nr, const void *addr) | ||
776 | { | ||
777 | return test_bit(nr ^ (__BITOPS_WORDSIZE - 8), addr); | ||
778 | } | ||
779 | |||
780 | static inline int find_first_zero_bit_le(void *vaddr, unsigned int size) | 749 | static inline int find_first_zero_bit_le(void *vaddr, unsigned int size) |
781 | { | 750 | { |
782 | unsigned long bytes, bits; | 751 | unsigned long bytes, bits; |
@@ -787,6 +756,7 @@ static inline int find_first_zero_bit_le(void *vaddr, unsigned int size) | |||
787 | bits = __ffz_word(bytes*8, __load_ulong_le(vaddr, bytes)); | 756 | bits = __ffz_word(bytes*8, __load_ulong_le(vaddr, bytes)); |
788 | return (bits < size) ? bits : size; | 757 | return (bits < size) ? bits : size; |
789 | } | 758 | } |
759 | #define find_first_zero_bit_le find_first_zero_bit_le | ||
790 | 760 | ||
791 | static inline int find_next_zero_bit_le(void *vaddr, unsigned long size, | 761 | static inline int find_next_zero_bit_le(void *vaddr, unsigned long size, |
792 | unsigned long offset) | 762 | unsigned long offset) |
@@ -816,6 +786,7 @@ static inline int find_next_zero_bit_le(void *vaddr, unsigned long size, | |||
816 | } | 786 | } |
817 | return offset + find_first_zero_bit_le(p, size); | 787 | return offset + find_first_zero_bit_le(p, size); |
818 | } | 788 | } |
789 | #define find_next_zero_bit_le find_next_zero_bit_le | ||
819 | 790 | ||
820 | static inline unsigned long find_first_bit_le(void *vaddr, unsigned long size) | 791 | static inline unsigned long find_first_bit_le(void *vaddr, unsigned long size) |
821 | { | 792 | { |
@@ -827,6 +798,7 @@ static inline unsigned long find_first_bit_le(void *vaddr, unsigned long size) | |||
827 | bits = __ffs_word(bytes*8, __load_ulong_le(vaddr, bytes)); | 798 | bits = __ffs_word(bytes*8, __load_ulong_le(vaddr, bytes)); |
828 | return (bits < size) ? bits : size; | 799 | return (bits < size) ? bits : size; |
829 | } | 800 | } |
801 | #define find_first_bit_le find_first_bit_le | ||
830 | 802 | ||
831 | static inline int find_next_bit_le(void *vaddr, unsigned long size, | 803 | static inline int find_next_bit_le(void *vaddr, unsigned long size, |
832 | unsigned long offset) | 804 | unsigned long offset) |
@@ -856,6 +828,9 @@ static inline int find_next_bit_le(void *vaddr, unsigned long size, | |||
856 | } | 828 | } |
857 | return offset + find_first_bit_le(p, size); | 829 | return offset + find_first_bit_le(p, size); |
858 | } | 830 | } |
831 | #define find_next_bit_le find_next_bit_le | ||
832 | |||
833 | #include <asm-generic/bitops/le.h> | ||
859 | 834 | ||
860 | #define ext2_set_bit_atomic(lock, nr, addr) \ | 835 | #define ext2_set_bit_atomic(lock, nr, addr) \ |
861 | test_and_set_bit_le(nr, addr) | 836 | test_and_set_bit_le(nr, addr) |
diff --git a/arch/s390/include/asm/delay.h b/arch/s390/include/asm/delay.h index 8a096b83f51f..0e3b35f96be1 100644 --- a/arch/s390/include/asm/delay.h +++ b/arch/s390/include/asm/delay.h | |||
@@ -14,10 +14,12 @@ | |||
14 | #ifndef _S390_DELAY_H | 14 | #ifndef _S390_DELAY_H |
15 | #define _S390_DELAY_H | 15 | #define _S390_DELAY_H |
16 | 16 | ||
17 | extern void __udelay(unsigned long long usecs); | 17 | void __ndelay(unsigned long long nsecs); |
18 | extern void udelay_simple(unsigned long long usecs); | 18 | void __udelay(unsigned long long usecs); |
19 | extern void __delay(unsigned long loops); | 19 | void udelay_simple(unsigned long long usecs); |
20 | void __delay(unsigned long loops); | ||
20 | 21 | ||
22 | #define ndelay(n) __ndelay((unsigned long long) (n)) | ||
21 | #define udelay(n) __udelay((unsigned long long) (n)) | 23 | #define udelay(n) __udelay((unsigned long long) (n)) |
22 | #define mdelay(n) __udelay((unsigned long long) (n) * 1000) | 24 | #define mdelay(n) __udelay((unsigned long long) (n) * 1000) |
23 | 25 | ||
diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h index 1544b90bd6d6..ba7b01c726a3 100644 --- a/arch/s390/include/asm/irq.h +++ b/arch/s390/include/asm/irq.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _ASM_IRQ_H | 2 | #define _ASM_IRQ_H |
3 | 3 | ||
4 | #include <linux/hardirq.h> | 4 | #include <linux/hardirq.h> |
5 | #include <linux/types.h> | ||
5 | 6 | ||
6 | enum interruption_class { | 7 | enum interruption_class { |
7 | EXTERNAL_INTERRUPT, | 8 | EXTERNAL_INTERRUPT, |
@@ -31,4 +32,11 @@ enum interruption_class { | |||
31 | NR_IRQS, | 32 | NR_IRQS, |
32 | }; | 33 | }; |
33 | 34 | ||
35 | typedef void (*ext_int_handler_t)(unsigned int, unsigned int, unsigned long); | ||
36 | |||
37 | int register_external_interrupt(u16 code, ext_int_handler_t handler); | ||
38 | int unregister_external_interrupt(u16 code, ext_int_handler_t handler); | ||
39 | void service_subclass_irq_register(void); | ||
40 | void service_subclass_irq_unregister(void); | ||
41 | |||
34 | #endif /* _ASM_IRQ_H */ | 42 | #endif /* _ASM_IRQ_H */ |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index c4773a2ef3d3..e4efacfe1b63 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -577,16 +577,16 @@ static inline void pgste_set_unlock(pte_t *ptep, pgste_t pgste) | |||
577 | static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) | 577 | static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) |
578 | { | 578 | { |
579 | #ifdef CONFIG_PGSTE | 579 | #ifdef CONFIG_PGSTE |
580 | unsigned long pfn, bits; | 580 | unsigned long address, bits; |
581 | unsigned char skey; | 581 | unsigned char skey; |
582 | 582 | ||
583 | pfn = pte_val(*ptep) >> PAGE_SHIFT; | 583 | address = pte_val(*ptep) & PAGE_MASK; |
584 | skey = page_get_storage_key(pfn); | 584 | skey = page_get_storage_key(address); |
585 | bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED); | 585 | bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED); |
586 | /* Clear page changed & referenced bit in the storage key */ | 586 | /* Clear page changed & referenced bit in the storage key */ |
587 | if (bits) { | 587 | if (bits) { |
588 | skey ^= bits; | 588 | skey ^= bits; |
589 | page_set_storage_key(pfn, skey, 1); | 589 | page_set_storage_key(address, skey, 1); |
590 | } | 590 | } |
591 | /* Transfer page changed & referenced bit to guest bits in pgste */ | 591 | /* Transfer page changed & referenced bit to guest bits in pgste */ |
592 | pgste_val(pgste) |= bits << 48; /* RCP_GR_BIT & RCP_GC_BIT */ | 592 | pgste_val(pgste) |= bits << 48; /* RCP_GR_BIT & RCP_GC_BIT */ |
@@ -628,16 +628,16 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste) | |||
628 | static inline void pgste_set_pte(pte_t *ptep, pgste_t pgste) | 628 | static inline void pgste_set_pte(pte_t *ptep, pgste_t pgste) |
629 | { | 629 | { |
630 | #ifdef CONFIG_PGSTE | 630 | #ifdef CONFIG_PGSTE |
631 | unsigned long pfn; | 631 | unsigned long address; |
632 | unsigned long okey, nkey; | 632 | unsigned long okey, nkey; |
633 | 633 | ||
634 | pfn = pte_val(*ptep) >> PAGE_SHIFT; | 634 | address = pte_val(*ptep) & PAGE_MASK; |
635 | okey = nkey = page_get_storage_key(pfn); | 635 | okey = nkey = page_get_storage_key(address); |
636 | nkey &= ~(_PAGE_ACC_BITS | _PAGE_FP_BIT); | 636 | nkey &= ~(_PAGE_ACC_BITS | _PAGE_FP_BIT); |
637 | /* Set page access key and fetch protection bit from pgste */ | 637 | /* Set page access key and fetch protection bit from pgste */ |
638 | nkey |= (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; | 638 | nkey |= (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; |
639 | if (okey != nkey) | 639 | if (okey != nkey) |
640 | page_set_storage_key(pfn, nkey, 1); | 640 | page_set_storage_key(address, nkey, 1); |
641 | #endif | 641 | #endif |
642 | } | 642 | } |
643 | 643 | ||
diff --git a/arch/s390/include/asm/s390_ext.h b/arch/s390/include/asm/s390_ext.h deleted file mode 100644 index 080876d5f196..000000000000 --- a/arch/s390/include/asm/s390_ext.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright IBM Corp. 1999,2010 | ||
3 | * Author(s): Holger Smolinski <Holger.Smolinski@de.ibm.com>, | ||
4 | * Martin Schwidefsky <schwidefsky@de.ibm.com>, | ||
5 | */ | ||
6 | |||
7 | #ifndef _S390_EXTINT_H | ||
8 | #define _S390_EXTINT_H | ||
9 | |||
10 | #include <linux/types.h> | ||
11 | |||
12 | typedef void (*ext_int_handler_t)(unsigned int, unsigned int, unsigned long); | ||
13 | |||
14 | int register_external_interrupt(__u16 code, ext_int_handler_t handler); | ||
15 | int unregister_external_interrupt(__u16 code, ext_int_handler_t handler); | ||
16 | |||
17 | #endif /* _S390_EXTINT_H */ | ||
diff --git a/arch/s390/include/asm/suspend.h b/arch/s390/include/asm/suspend.h deleted file mode 100644 index dc75c616eafe..000000000000 --- a/arch/s390/include/asm/suspend.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | #ifndef __ASM_S390_SUSPEND_H | ||
2 | #define __ASM_S390_SUSPEND_H | ||
3 | |||
4 | static inline int arch_prepare_suspend(void) | ||
5 | { | ||
6 | return 0; | ||
7 | } | ||
8 | |||
9 | #endif | ||
10 | |||
diff --git a/arch/s390/include/asm/topology.h b/arch/s390/include/asm/topology.h index c5338834ddbd..005d77d8ae2a 100644 --- a/arch/s390/include/asm/topology.h +++ b/arch/s390/include/asm/topology.h | |||
@@ -7,7 +7,7 @@ | |||
7 | extern unsigned char cpu_core_id[NR_CPUS]; | 7 | extern unsigned char cpu_core_id[NR_CPUS]; |
8 | extern cpumask_t cpu_core_map[NR_CPUS]; | 8 | extern cpumask_t cpu_core_map[NR_CPUS]; |
9 | 9 | ||
10 | static inline const struct cpumask *cpu_coregroup_mask(unsigned int cpu) | 10 | static inline const struct cpumask *cpu_coregroup_mask(int cpu) |
11 | { | 11 | { |
12 | return &cpu_core_map[cpu]; | 12 | return &cpu_core_map[cpu]; |
13 | } | 13 | } |
@@ -21,7 +21,7 @@ static inline const struct cpumask *cpu_coregroup_mask(unsigned int cpu) | |||
21 | extern unsigned char cpu_book_id[NR_CPUS]; | 21 | extern unsigned char cpu_book_id[NR_CPUS]; |
22 | extern cpumask_t cpu_book_map[NR_CPUS]; | 22 | extern cpumask_t cpu_book_map[NR_CPUS]; |
23 | 23 | ||
24 | static inline const struct cpumask *cpu_book_mask(unsigned int cpu) | 24 | static inline const struct cpumask *cpu_book_mask(int cpu) |
25 | { | 25 | { |
26 | return &cpu_book_map[cpu]; | 26 | return &cpu_book_map[cpu]; |
27 | } | 27 | } |
diff --git a/arch/s390/include/asm/uaccess.h b/arch/s390/include/asm/uaccess.h index 2d9ea11f919a..2b23885e81e9 100644 --- a/arch/s390/include/asm/uaccess.h +++ b/arch/s390/include/asm/uaccess.h | |||
@@ -49,12 +49,13 @@ | |||
49 | 49 | ||
50 | #define segment_eq(a,b) ((a).ar4 == (b).ar4) | 50 | #define segment_eq(a,b) ((a).ar4 == (b).ar4) |
51 | 51 | ||
52 | #define __access_ok(addr, size) \ | ||
53 | ({ \ | ||
54 | __chk_user_ptr(addr); \ | ||
55 | 1; \ | ||
56 | }) | ||
52 | 57 | ||
53 | static inline int __access_ok(const void __user *addr, unsigned long size) | 58 | #define access_ok(type, addr, size) __access_ok(addr, size) |
54 | { | ||
55 | return 1; | ||
56 | } | ||
57 | #define access_ok(type,addr,size) __access_ok(addr,size) | ||
58 | 59 | ||
59 | /* | 60 | /* |
60 | * The exception table consists of pairs of addresses: the first is the | 61 | * The exception table consists of pairs of addresses: the first is the |
diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h index 9208e69245a0..404bdb9671b4 100644 --- a/arch/s390/include/asm/unistd.h +++ b/arch/s390/include/asm/unistd.h | |||
@@ -276,7 +276,8 @@ | |||
276 | #define __NR_open_by_handle_at 336 | 276 | #define __NR_open_by_handle_at 336 |
277 | #define __NR_clock_adjtime 337 | 277 | #define __NR_clock_adjtime 337 |
278 | #define __NR_syncfs 338 | 278 | #define __NR_syncfs 338 |
279 | #define NR_syscalls 339 | 279 | #define __NR_setns 339 |
280 | #define NR_syscalls 340 | ||
280 | 281 | ||
281 | /* | 282 | /* |
282 | * There are some system calls that are not present on 64 bit, some | 283 | * There are some system calls that are not present on 64 bit, some |
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 5ff15dacb571..df3732249baa 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -20,10 +20,10 @@ CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' | |||
20 | 20 | ||
21 | CFLAGS_sysinfo.o += -Iinclude/math-emu -Iarch/s390/math-emu -w | 21 | CFLAGS_sysinfo.o += -Iinclude/math-emu -Iarch/s390/math-emu -w |
22 | 22 | ||
23 | obj-y := bitmap.o traps.o time.o process.o base.o early.o setup.o \ | 23 | obj-y := bitmap.o traps.o time.o process.o base.o early.o setup.o vtime.o \ |
24 | processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ | 24 | processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o \ |
25 | s390_ext.o debug.o irq.o ipl.o dis.o diag.o mem_detect.o \ | 25 | debug.o irq.o ipl.o dis.o diag.o mem_detect.o sclp.o vdso.o \ |
26 | vdso.o vtime.o sysinfo.o nmi.o sclp.o jump_label.o | 26 | sysinfo.o jump_label.o |
27 | 27 | ||
28 | obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) | 28 | obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) |
29 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) | 29 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 1dc96ea08fa8..1f5eb789c3a7 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -1904,3 +1904,9 @@ compat_sys_clock_adjtime_wrapper: | |||
1904 | sys_syncfs_wrapper: | 1904 | sys_syncfs_wrapper: |
1905 | lgfr %r2,%r2 # int | 1905 | lgfr %r2,%r2 # int |
1906 | jg sys_syncfs | 1906 | jg sys_syncfs |
1907 | |||
1908 | .globl sys_setns_wrapper | ||
1909 | sys_setns_wrapper: | ||
1910 | lgfr %r2,%r2 # int | ||
1911 | lgfr %r3,%r3 # int | ||
1912 | jg sys_setns | ||
diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c index 3d4a78fc1adc..1ca3d1d6a86c 100644 --- a/arch/s390/kernel/dis.c +++ b/arch/s390/kernel/dis.c | |||
@@ -30,9 +30,9 @@ | |||
30 | #include <asm/atomic.h> | 30 | #include <asm/atomic.h> |
31 | #include <asm/mathemu.h> | 31 | #include <asm/mathemu.h> |
32 | #include <asm/cpcmd.h> | 32 | #include <asm/cpcmd.h> |
33 | #include <asm/s390_ext.h> | ||
34 | #include <asm/lowcore.h> | 33 | #include <asm/lowcore.h> |
35 | #include <asm/debug.h> | 34 | #include <asm/debug.h> |
35 | #include <asm/irq.h> | ||
36 | 36 | ||
37 | #ifndef CONFIG_64BIT | 37 | #ifndef CONFIG_64BIT |
38 | #define ONELONG "%08lx: " | 38 | #define ONELONG "%08lx: " |
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index e204f9597aaf..e3264f6a9720 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c | |||
@@ -1,19 +1,28 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright IBM Corp. 2004,2010 | 2 | * Copyright IBM Corp. 2004,2011 |
3 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | 3 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>, |
4 | * Thomas Spatzier (tspat@de.ibm.com) | 4 | * Holger Smolinski <Holger.Smolinski@de.ibm.com>, |
5 | * Thomas Spatzier <tspat@de.ibm.com>, | ||
5 | * | 6 | * |
6 | * This file contains interrupt related functions. | 7 | * This file contains interrupt related functions. |
7 | */ | 8 | */ |
8 | 9 | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/kernel_stat.h> | 10 | #include <linux/kernel_stat.h> |
12 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
13 | #include <linux/seq_file.h> | 12 | #include <linux/seq_file.h> |
14 | #include <linux/cpu.h> | ||
15 | #include <linux/proc_fs.h> | 13 | #include <linux/proc_fs.h> |
16 | #include <linux/profile.h> | 14 | #include <linux/profile.h> |
15 | #include <linux/module.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/ftrace.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/cpu.h> | ||
21 | #include <asm/irq_regs.h> | ||
22 | #include <asm/cputime.h> | ||
23 | #include <asm/lowcore.h> | ||
24 | #include <asm/irq.h> | ||
25 | #include "entry.h" | ||
17 | 26 | ||
18 | struct irq_class { | 27 | struct irq_class { |
19 | char *name; | 28 | char *name; |
@@ -82,8 +91,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
82 | * For compatibilty only. S/390 specific setup of interrupts et al. is done | 91 | * For compatibilty only. S/390 specific setup of interrupts et al. is done |
83 | * much later in init_channel_subsystem(). | 92 | * much later in init_channel_subsystem(). |
84 | */ | 93 | */ |
85 | void __init | 94 | void __init init_IRQ(void) |
86 | init_IRQ(void) | ||
87 | { | 95 | { |
88 | /* nothing... */ | 96 | /* nothing... */ |
89 | } | 97 | } |
@@ -134,3 +142,116 @@ void init_irq_proc(void) | |||
134 | create_prof_cpu_mask(root_irq_dir); | 142 | create_prof_cpu_mask(root_irq_dir); |
135 | } | 143 | } |
136 | #endif | 144 | #endif |
145 | |||
146 | /* | ||
147 | * ext_int_hash[index] is the start of the list for all external interrupts | ||
148 | * that hash to this index. With the current set of external interrupts | ||
149 | * (0x1202 external call, 0x1004 cpu timer, 0x2401 hwc console, 0x4000 | ||
150 | * iucv and 0x2603 pfault) this is always the first element. | ||
151 | */ | ||
152 | |||
153 | struct ext_int_info { | ||
154 | struct ext_int_info *next; | ||
155 | ext_int_handler_t handler; | ||
156 | u16 code; | ||
157 | }; | ||
158 | |||
159 | static struct ext_int_info *ext_int_hash[256]; | ||
160 | |||
161 | static inline int ext_hash(u16 code) | ||
162 | { | ||
163 | return (code + (code >> 9)) & 0xff; | ||
164 | } | ||
165 | |||
166 | int register_external_interrupt(u16 code, ext_int_handler_t handler) | ||
167 | { | ||
168 | struct ext_int_info *p; | ||
169 | int index; | ||
170 | |||
171 | p = kmalloc(sizeof(*p), GFP_ATOMIC); | ||
172 | if (!p) | ||
173 | return -ENOMEM; | ||
174 | p->code = code; | ||
175 | p->handler = handler; | ||
176 | index = ext_hash(code); | ||
177 | p->next = ext_int_hash[index]; | ||
178 | ext_int_hash[index] = p; | ||
179 | return 0; | ||
180 | } | ||
181 | EXPORT_SYMBOL(register_external_interrupt); | ||
182 | |||
183 | int unregister_external_interrupt(u16 code, ext_int_handler_t handler) | ||
184 | { | ||
185 | struct ext_int_info *p, *q; | ||
186 | int index; | ||
187 | |||
188 | index = ext_hash(code); | ||
189 | q = NULL; | ||
190 | p = ext_int_hash[index]; | ||
191 | while (p) { | ||
192 | if (p->code == code && p->handler == handler) | ||
193 | break; | ||
194 | q = p; | ||
195 | p = p->next; | ||
196 | } | ||
197 | if (!p) | ||
198 | return -ENOENT; | ||
199 | if (q) | ||
200 | q->next = p->next; | ||
201 | else | ||
202 | ext_int_hash[index] = p->next; | ||
203 | kfree(p); | ||
204 | return 0; | ||
205 | } | ||
206 | EXPORT_SYMBOL(unregister_external_interrupt); | ||
207 | |||
208 | void __irq_entry do_extint(struct pt_regs *regs, unsigned int ext_int_code, | ||
209 | unsigned int param32, unsigned long param64) | ||
210 | { | ||
211 | struct pt_regs *old_regs; | ||
212 | unsigned short code; | ||
213 | struct ext_int_info *p; | ||
214 | int index; | ||
215 | |||
216 | code = (unsigned short) ext_int_code; | ||
217 | old_regs = set_irq_regs(regs); | ||
218 | s390_idle_check(regs, S390_lowcore.int_clock, | ||
219 | S390_lowcore.async_enter_timer); | ||
220 | irq_enter(); | ||
221 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) | ||
222 | /* Serve timer interrupts first. */ | ||
223 | clock_comparator_work(); | ||
224 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; | ||
225 | if (code != 0x1004) | ||
226 | __get_cpu_var(s390_idle).nohz_delay = 1; | ||
227 | index = ext_hash(code); | ||
228 | for (p = ext_int_hash[index]; p; p = p->next) { | ||
229 | if (likely(p->code == code)) | ||
230 | p->handler(ext_int_code, param32, param64); | ||
231 | } | ||
232 | irq_exit(); | ||
233 | set_irq_regs(old_regs); | ||
234 | } | ||
235 | |||
236 | static DEFINE_SPINLOCK(sc_irq_lock); | ||
237 | static int sc_irq_refcount; | ||
238 | |||
239 | void service_subclass_irq_register(void) | ||
240 | { | ||
241 | spin_lock(&sc_irq_lock); | ||
242 | if (!sc_irq_refcount) | ||
243 | ctl_set_bit(0, 9); | ||
244 | sc_irq_refcount++; | ||
245 | spin_unlock(&sc_irq_lock); | ||
246 | } | ||
247 | EXPORT_SYMBOL(service_subclass_irq_register); | ||
248 | |||
249 | void service_subclass_irq_unregister(void) | ||
250 | { | ||
251 | spin_lock(&sc_irq_lock); | ||
252 | sc_irq_refcount--; | ||
253 | if (!sc_irq_refcount) | ||
254 | ctl_clear_bit(0, 9); | ||
255 | spin_unlock(&sc_irq_lock); | ||
256 | } | ||
257 | EXPORT_SYMBOL(service_subclass_irq_unregister); | ||
diff --git a/arch/s390/kernel/s390_ext.c b/arch/s390/kernel/s390_ext.c deleted file mode 100644 index 185029919c4d..000000000000 --- a/arch/s390/kernel/s390_ext.c +++ /dev/null | |||
@@ -1,108 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright IBM Corp. 1999,2010 | ||
3 | * Author(s): Holger Smolinski <Holger.Smolinski@de.ibm.com>, | ||
4 | * Martin Schwidefsky <schwidefsky@de.ibm.com>, | ||
5 | */ | ||
6 | |||
7 | #include <linux/kernel_stat.h> | ||
8 | #include <linux/interrupt.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/ftrace.h> | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <asm/s390_ext.h> | ||
15 | #include <asm/irq_regs.h> | ||
16 | #include <asm/cputime.h> | ||
17 | #include <asm/lowcore.h> | ||
18 | #include <asm/irq.h> | ||
19 | #include "entry.h" | ||
20 | |||
21 | struct ext_int_info { | ||
22 | struct ext_int_info *next; | ||
23 | ext_int_handler_t handler; | ||
24 | __u16 code; | ||
25 | }; | ||
26 | |||
27 | /* | ||
28 | * ext_int_hash[index] is the start of the list for all external interrupts | ||
29 | * that hash to this index. With the current set of external interrupts | ||
30 | * (0x1202 external call, 0x1004 cpu timer, 0x2401 hwc console, 0x4000 | ||
31 | * iucv and 0x2603 pfault) this is always the first element. | ||
32 | */ | ||
33 | static struct ext_int_info *ext_int_hash[256]; | ||
34 | |||
35 | static inline int ext_hash(__u16 code) | ||
36 | { | ||
37 | return (code + (code >> 9)) & 0xff; | ||
38 | } | ||
39 | |||
40 | int register_external_interrupt(__u16 code, ext_int_handler_t handler) | ||
41 | { | ||
42 | struct ext_int_info *p; | ||
43 | int index; | ||
44 | |||
45 | p = kmalloc(sizeof(*p), GFP_ATOMIC); | ||
46 | if (!p) | ||
47 | return -ENOMEM; | ||
48 | p->code = code; | ||
49 | p->handler = handler; | ||
50 | index = ext_hash(code); | ||
51 | p->next = ext_int_hash[index]; | ||
52 | ext_int_hash[index] = p; | ||
53 | return 0; | ||
54 | } | ||
55 | EXPORT_SYMBOL(register_external_interrupt); | ||
56 | |||
57 | int unregister_external_interrupt(__u16 code, ext_int_handler_t handler) | ||
58 | { | ||
59 | struct ext_int_info *p, *q; | ||
60 | int index; | ||
61 | |||
62 | index = ext_hash(code); | ||
63 | q = NULL; | ||
64 | p = ext_int_hash[index]; | ||
65 | while (p) { | ||
66 | if (p->code == code && p->handler == handler) | ||
67 | break; | ||
68 | q = p; | ||
69 | p = p->next; | ||
70 | } | ||
71 | if (!p) | ||
72 | return -ENOENT; | ||
73 | if (q) | ||
74 | q->next = p->next; | ||
75 | else | ||
76 | ext_int_hash[index] = p->next; | ||
77 | kfree(p); | ||
78 | return 0; | ||
79 | } | ||
80 | EXPORT_SYMBOL(unregister_external_interrupt); | ||
81 | |||
82 | void __irq_entry do_extint(struct pt_regs *regs, unsigned int ext_int_code, | ||
83 | unsigned int param32, unsigned long param64) | ||
84 | { | ||
85 | struct pt_regs *old_regs; | ||
86 | unsigned short code; | ||
87 | struct ext_int_info *p; | ||
88 | int index; | ||
89 | |||
90 | code = (unsigned short) ext_int_code; | ||
91 | old_regs = set_irq_regs(regs); | ||
92 | s390_idle_check(regs, S390_lowcore.int_clock, | ||
93 | S390_lowcore.async_enter_timer); | ||
94 | irq_enter(); | ||
95 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) | ||
96 | /* Serve timer interrupts first. */ | ||
97 | clock_comparator_work(); | ||
98 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; | ||
99 | if (code != 0x1004) | ||
100 | __get_cpu_var(s390_idle).nohz_delay = 1; | ||
101 | index = ext_hash(code); | ||
102 | for (p = ext_int_hash[index]; p; p = p->next) { | ||
103 | if (likely(p->code == code)) | ||
104 | p->handler(ext_int_code, param32, param64); | ||
105 | } | ||
106 | irq_exit(); | ||
107 | set_irq_regs(old_regs); | ||
108 | } | ||
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index f8e85ecbc459..52420d2785b3 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -44,7 +44,6 @@ | |||
44 | #include <asm/sigp.h> | 44 | #include <asm/sigp.h> |
45 | #include <asm/pgalloc.h> | 45 | #include <asm/pgalloc.h> |
46 | #include <asm/irq.h> | 46 | #include <asm/irq.h> |
47 | #include <asm/s390_ext.h> | ||
48 | #include <asm/cpcmd.h> | 47 | #include <asm/cpcmd.h> |
49 | #include <asm/tlbflush.h> | 48 | #include <asm/tlbflush.h> |
50 | #include <asm/timer.h> | 49 | #include <asm/timer.h> |
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 9c65fd4ddce0..6ee39ef8fe4a 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S | |||
@@ -347,3 +347,4 @@ SYSCALL(sys_name_to_handle_at,sys_name_to_handle_at,sys_name_to_handle_at_wrappe | |||
347 | SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at_wrapper) | 347 | SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at_wrapper) |
348 | SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) | 348 | SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) |
349 | SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper) | 349 | SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper) |
350 | SYSCALL(sys_setns,sys_setns,sys_setns_wrapper) | ||
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index a59557f1fb5f..dff933065ab6 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -41,7 +41,6 @@ | |||
41 | #include <linux/kprobes.h> | 41 | #include <linux/kprobes.h> |
42 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> |
43 | #include <asm/delay.h> | 43 | #include <asm/delay.h> |
44 | #include <asm/s390_ext.h> | ||
45 | #include <asm/div64.h> | 44 | #include <asm/div64.h> |
46 | #include <asm/vdso.h> | 45 | #include <asm/vdso.h> |
47 | #include <asm/irq.h> | 46 | #include <asm/irq.h> |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 2eafb8c7a746..0cd340b72632 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/smp.h> | 17 | #include <linux/smp.h> |
18 | #include <linux/cpuset.h> | 18 | #include <linux/cpuset.h> |
19 | #include <asm/delay.h> | 19 | #include <asm/delay.h> |
20 | #include <asm/s390_ext.h> | ||
21 | 20 | ||
22 | #define PTF_HORIZONTAL (0UL) | 21 | #define PTF_HORIZONTAL (0UL) |
23 | #define PTF_VERTICAL (1UL) | 22 | #define PTF_VERTICAL (1UL) |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index b5a4a739b477..a65d2e82f61d 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -39,7 +39,6 @@ | |||
39 | #include <asm/atomic.h> | 39 | #include <asm/atomic.h> |
40 | #include <asm/mathemu.h> | 40 | #include <asm/mathemu.h> |
41 | #include <asm/cpcmd.h> | 41 | #include <asm/cpcmd.h> |
42 | #include <asm/s390_ext.h> | ||
43 | #include <asm/lowcore.h> | 42 | #include <asm/lowcore.h> |
44 | #include <asm/debug.h> | 43 | #include <asm/debug.h> |
45 | #include "entry.h" | 44 | #include "entry.h" |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 5e8ead4b4aba..2d6228f60cd6 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -22,10 +22,10 @@ | |||
22 | #include <linux/cpu.h> | 22 | #include <linux/cpu.h> |
23 | #include <linux/kprobes.h> | 23 | #include <linux/kprobes.h> |
24 | 24 | ||
25 | #include <asm/s390_ext.h> | ||
26 | #include <asm/timer.h> | 25 | #include <asm/timer.h> |
27 | #include <asm/irq_regs.h> | 26 | #include <asm/irq_regs.h> |
28 | #include <asm/cputime.h> | 27 | #include <asm/cputime.h> |
28 | #include <asm/irq.h> | ||
29 | 29 | ||
30 | static DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer); | 30 | static DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer); |
31 | 31 | ||
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index 0f53110e1d09..a65229d91c92 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/irqflags.h> | 13 | #include <linux/irqflags.h> |
14 | #include <linux/interrupt.h> | 14 | #include <linux/interrupt.h> |
15 | #include <asm/div64.h> | ||
15 | 16 | ||
16 | void __delay(unsigned long loops) | 17 | void __delay(unsigned long loops) |
17 | { | 18 | { |
@@ -116,3 +117,17 @@ void udelay_simple(unsigned long long usecs) | |||
116 | while (get_clock() < end) | 117 | while (get_clock() < end) |
117 | cpu_relax(); | 118 | cpu_relax(); |
118 | } | 119 | } |
120 | |||
121 | void __ndelay(unsigned long long nsecs) | ||
122 | { | ||
123 | u64 end; | ||
124 | |||
125 | nsecs <<= 9; | ||
126 | do_div(nsecs, 125); | ||
127 | end = get_clock() + nsecs; | ||
128 | if (nsecs & ~0xfffUL) | ||
129 | __udelay(nsecs >> 12); | ||
130 | while (get_clock() < end) | ||
131 | barrier(); | ||
132 | } | ||
133 | EXPORT_SYMBOL(__ndelay); | ||
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index a0f9e730f26a..fe103e891e7a 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <asm/asm-offsets.h> | 34 | #include <asm/asm-offsets.h> |
35 | #include <asm/system.h> | 35 | #include <asm/system.h> |
36 | #include <asm/pgtable.h> | 36 | #include <asm/pgtable.h> |
37 | #include <asm/s390_ext.h> | 37 | #include <asm/irq.h> |
38 | #include <asm/mmu_context.h> | 38 | #include <asm/mmu_context.h> |
39 | #include <asm/compat.h> | 39 | #include <asm/compat.h> |
40 | #include "../kernel/entry.h" | 40 | #include "../kernel/entry.h" |
@@ -245,9 +245,12 @@ static noinline void do_fault_error(struct pt_regs *regs, long int_code, | |||
245 | do_no_context(regs, int_code, trans_exc_code); | 245 | do_no_context(regs, int_code, trans_exc_code); |
246 | break; | 246 | break; |
247 | default: /* fault & VM_FAULT_ERROR */ | 247 | default: /* fault & VM_FAULT_ERROR */ |
248 | if (fault & VM_FAULT_OOM) | 248 | if (fault & VM_FAULT_OOM) { |
249 | pagefault_out_of_memory(); | 249 | if (!(regs->psw.mask & PSW_MASK_PSTATE)) |
250 | else if (fault & VM_FAULT_SIGBUS) { | 250 | do_no_context(regs, int_code, trans_exc_code); |
251 | else | ||
252 | pagefault_out_of_memory(); | ||
253 | } else if (fault & VM_FAULT_SIGBUS) { | ||
251 | /* Kernel mode? Handle exceptions or die */ | 254 | /* Kernel mode? Handle exceptions or die */ |
252 | if (!(regs->psw.mask & PSW_MASK_PSTATE)) | 255 | if (!(regs->psw.mask & PSW_MASK_PSTATE)) |
253 | do_no_context(regs, int_code, trans_exc_code); | 256 | do_no_context(regs, int_code, trans_exc_code); |
@@ -277,7 +280,8 @@ static inline int do_exception(struct pt_regs *regs, int access, | |||
277 | struct mm_struct *mm; | 280 | struct mm_struct *mm; |
278 | struct vm_area_struct *vma; | 281 | struct vm_area_struct *vma; |
279 | unsigned long address; | 282 | unsigned long address; |
280 | int fault, write; | 283 | unsigned int flags; |
284 | int fault; | ||
281 | 285 | ||
282 | if (notify_page_fault(regs)) | 286 | if (notify_page_fault(regs)) |
283 | return 0; | 287 | return 0; |
@@ -296,6 +300,10 @@ static inline int do_exception(struct pt_regs *regs, int access, | |||
296 | 300 | ||
297 | address = trans_exc_code & __FAIL_ADDR_MASK; | 301 | address = trans_exc_code & __FAIL_ADDR_MASK; |
298 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, 0, regs, address); | 302 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, 0, regs, address); |
303 | flags = FAULT_FLAG_ALLOW_RETRY; | ||
304 | if (access == VM_WRITE || (trans_exc_code & store_indication) == 0x400) | ||
305 | flags |= FAULT_FLAG_WRITE; | ||
306 | retry: | ||
299 | down_read(&mm->mmap_sem); | 307 | down_read(&mm->mmap_sem); |
300 | 308 | ||
301 | fault = VM_FAULT_BADMAP; | 309 | fault = VM_FAULT_BADMAP; |
@@ -325,21 +333,31 @@ static inline int do_exception(struct pt_regs *regs, int access, | |||
325 | * make sure we exit gracefully rather than endlessly redo | 333 | * make sure we exit gracefully rather than endlessly redo |
326 | * the fault. | 334 | * the fault. |
327 | */ | 335 | */ |
328 | write = (access == VM_WRITE || | 336 | fault = handle_mm_fault(mm, vma, address, flags); |
329 | (trans_exc_code & store_indication) == 0x400) ? | ||
330 | FAULT_FLAG_WRITE : 0; | ||
331 | fault = handle_mm_fault(mm, vma, address, write); | ||
332 | if (unlikely(fault & VM_FAULT_ERROR)) | 337 | if (unlikely(fault & VM_FAULT_ERROR)) |
333 | goto out_up; | 338 | goto out_up; |
334 | 339 | ||
335 | if (fault & VM_FAULT_MAJOR) { | 340 | /* |
336 | tsk->maj_flt++; | 341 | * Major/minor page fault accounting is only done on the |
337 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, 0, | 342 | * initial attempt. If we go through a retry, it is extremely |
338 | regs, address); | 343 | * likely that the page will be found in page cache at that point. |
339 | } else { | 344 | */ |
340 | tsk->min_flt++; | 345 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
341 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, 0, | 346 | if (fault & VM_FAULT_MAJOR) { |
342 | regs, address); | 347 | tsk->maj_flt++; |
348 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, 0, | ||
349 | regs, address); | ||
350 | } else { | ||
351 | tsk->min_flt++; | ||
352 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, 0, | ||
353 | regs, address); | ||
354 | } | ||
355 | if (fault & VM_FAULT_RETRY) { | ||
356 | /* Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk | ||
357 | * of starvation. */ | ||
358 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
359 | goto retry; | ||
360 | } | ||
343 | } | 361 | } |
344 | /* | 362 | /* |
345 | * The instruction that caused the program check will | 363 | * The instruction that caused the program check will |
@@ -429,10 +447,9 @@ int __handle_fault(unsigned long uaddr, unsigned long pgm_int_code, int write) | |||
429 | access = write ? VM_WRITE : VM_READ; | 447 | access = write ? VM_WRITE : VM_READ; |
430 | fault = do_exception(®s, access, uaddr | 2); | 448 | fault = do_exception(®s, access, uaddr | 2); |
431 | if (unlikely(fault)) { | 449 | if (unlikely(fault)) { |
432 | if (fault & VM_FAULT_OOM) { | 450 | if (fault & VM_FAULT_OOM) |
433 | pagefault_out_of_memory(); | 451 | return -EFAULT; |
434 | fault = 0; | 452 | else if (fault & VM_FAULT_SIGBUS) |
435 | } else if (fault & VM_FAULT_SIGBUS) | ||
436 | do_sigbus(®s, pgm_int_code, uaddr); | 453 | do_sigbus(®s, pgm_int_code, uaddr); |
437 | } | 454 | } |
438 | return fault ? -EFAULT : 0; | 455 | return fault ? -EFAULT : 0; |
@@ -485,7 +502,6 @@ int pfault_init(void) | |||
485 | "2:\n" | 502 | "2:\n" |
486 | EX_TABLE(0b,1b) | 503 | EX_TABLE(0b,1b) |
487 | : "=d" (rc) : "a" (&refbk), "m" (refbk) : "cc"); | 504 | : "=d" (rc) : "a" (&refbk), "m" (refbk) : "cc"); |
488 | __ctl_set_bit(0, 9); | ||
489 | return rc; | 505 | return rc; |
490 | } | 506 | } |
491 | 507 | ||
@@ -500,7 +516,6 @@ void pfault_fini(void) | |||
500 | 516 | ||
501 | if (!MACHINE_IS_VM || pfault_disable) | 517 | if (!MACHINE_IS_VM || pfault_disable) |
502 | return; | 518 | return; |
503 | __ctl_clear_bit(0,9); | ||
504 | asm volatile( | 519 | asm volatile( |
505 | " diag %0,0,0x258\n" | 520 | " diag %0,0,0x258\n" |
506 | "0:\n" | 521 | "0:\n" |
@@ -615,6 +630,7 @@ static int __init pfault_irq_init(void) | |||
615 | rc = pfault_init() == 0 ? 0 : -EOPNOTSUPP; | 630 | rc = pfault_init() == 0 ? 0 : -EOPNOTSUPP; |
616 | if (rc) | 631 | if (rc) |
617 | goto out_pfault; | 632 | goto out_pfault; |
633 | service_subclass_irq_register(); | ||
618 | hotcpu_notifier(pfault_cpu_notify, 0); | 634 | hotcpu_notifier(pfault_cpu_notify, 0); |
619 | return 0; | 635 | return 0; |
620 | 636 | ||
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index dfefc2171691..59b663109d90 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -119,9 +119,7 @@ void __init paging_init(void) | |||
119 | sparse_memory_present_with_active_regions(MAX_NUMNODES); | 119 | sparse_memory_present_with_active_regions(MAX_NUMNODES); |
120 | sparse_init(); | 120 | sparse_init(); |
121 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 121 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); |
122 | #ifdef CONFIG_ZONE_DMA | ||
123 | max_zone_pfns[ZONE_DMA] = PFN_DOWN(MAX_DMA_ADDRESS); | 122 | max_zone_pfns[ZONE_DMA] = PFN_DOWN(MAX_DMA_ADDRESS); |
124 | #endif | ||
125 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; | 123 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; |
126 | free_area_init_nodes(max_zone_pfns); | 124 | free_area_init_nodes(max_zone_pfns); |
127 | fault_init(); | 125 | fault_init(); |
diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c index 71a4b0d34be0..51e5cd9b906a 100644 --- a/arch/s390/mm/maccess.c +++ b/arch/s390/mm/maccess.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * using the stura instruction. | 19 | * using the stura instruction. |
20 | * Returns the number of bytes copied or -EFAULT. | 20 | * Returns the number of bytes copied or -EFAULT. |
21 | */ | 21 | */ |
22 | static long probe_kernel_write_odd(void *dst, void *src, size_t size) | 22 | static long probe_kernel_write_odd(void *dst, const void *src, size_t size) |
23 | { | 23 | { |
24 | unsigned long count, aligned; | 24 | unsigned long count, aligned; |
25 | int offset, mask; | 25 | int offset, mask; |
@@ -45,7 +45,7 @@ static long probe_kernel_write_odd(void *dst, void *src, size_t size) | |||
45 | return rc ? rc : count; | 45 | return rc ? rc : count; |
46 | } | 46 | } |
47 | 47 | ||
48 | long probe_kernel_write(void *dst, void *src, size_t size) | 48 | long probe_kernel_write(void *dst, const void *src, size_t size) |
49 | { | 49 | { |
50 | long copied = 0; | 50 | long copied = 0; |
51 | 51 | ||
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 14c6fae6fe6b..b09763fe5da1 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -71,12 +71,15 @@ static void rcu_table_freelist_callback(struct rcu_head *head) | |||
71 | 71 | ||
72 | void rcu_table_freelist_finish(void) | 72 | void rcu_table_freelist_finish(void) |
73 | { | 73 | { |
74 | struct rcu_table_freelist *batch = __get_cpu_var(rcu_table_freelist); | 74 | struct rcu_table_freelist **batchp = &get_cpu_var(rcu_table_freelist); |
75 | struct rcu_table_freelist *batch = *batchp; | ||
75 | 76 | ||
76 | if (!batch) | 77 | if (!batch) |
77 | return; | 78 | goto out; |
78 | call_rcu(&batch->rcu, rcu_table_freelist_callback); | 79 | call_rcu(&batch->rcu, rcu_table_freelist_callback); |
79 | __get_cpu_var(rcu_table_freelist) = NULL; | 80 | *batchp = NULL; |
81 | out: | ||
82 | put_cpu_var(rcu_table_freelist); | ||
80 | } | 83 | } |
81 | 84 | ||
82 | static void smp_sync(void *arg) | 85 | static void smp_sync(void *arg) |
@@ -141,20 +144,23 @@ void crst_table_free_rcu(struct mm_struct *mm, unsigned long *table) | |||
141 | { | 144 | { |
142 | struct rcu_table_freelist *batch; | 145 | struct rcu_table_freelist *batch; |
143 | 146 | ||
147 | preempt_disable(); | ||
144 | if (atomic_read(&mm->mm_users) < 2 && | 148 | if (atomic_read(&mm->mm_users) < 2 && |
145 | cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { | 149 | cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { |
146 | crst_table_free(mm, table); | 150 | crst_table_free(mm, table); |
147 | return; | 151 | goto out; |
148 | } | 152 | } |
149 | batch = rcu_table_freelist_get(mm); | 153 | batch = rcu_table_freelist_get(mm); |
150 | if (!batch) { | 154 | if (!batch) { |
151 | smp_call_function(smp_sync, NULL, 1); | 155 | smp_call_function(smp_sync, NULL, 1); |
152 | crst_table_free(mm, table); | 156 | crst_table_free(mm, table); |
153 | return; | 157 | goto out; |
154 | } | 158 | } |
155 | batch->table[--batch->crst_index] = table; | 159 | batch->table[--batch->crst_index] = table; |
156 | if (batch->pgt_index >= batch->crst_index) | 160 | if (batch->pgt_index >= batch->crst_index) |
157 | rcu_table_freelist_finish(); | 161 | rcu_table_freelist_finish(); |
162 | out: | ||
163 | preempt_enable(); | ||
158 | } | 164 | } |
159 | 165 | ||
160 | #ifdef CONFIG_64BIT | 166 | #ifdef CONFIG_64BIT |
@@ -323,16 +329,17 @@ void page_table_free_rcu(struct mm_struct *mm, unsigned long *table) | |||
323 | struct page *page; | 329 | struct page *page; |
324 | unsigned long bits; | 330 | unsigned long bits; |
325 | 331 | ||
332 | preempt_disable(); | ||
326 | if (atomic_read(&mm->mm_users) < 2 && | 333 | if (atomic_read(&mm->mm_users) < 2 && |
327 | cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { | 334 | cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { |
328 | page_table_free(mm, table); | 335 | page_table_free(mm, table); |
329 | return; | 336 | goto out; |
330 | } | 337 | } |
331 | batch = rcu_table_freelist_get(mm); | 338 | batch = rcu_table_freelist_get(mm); |
332 | if (!batch) { | 339 | if (!batch) { |
333 | smp_call_function(smp_sync, NULL, 1); | 340 | smp_call_function(smp_sync, NULL, 1); |
334 | page_table_free(mm, table); | 341 | page_table_free(mm, table); |
335 | return; | 342 | goto out; |
336 | } | 343 | } |
337 | bits = (mm->context.has_pgste) ? 3UL : 1UL; | 344 | bits = (mm->context.has_pgste) ? 3UL : 1UL; |
338 | bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long); | 345 | bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long); |
@@ -345,6 +352,8 @@ void page_table_free_rcu(struct mm_struct *mm, unsigned long *table) | |||
345 | batch->table[batch->pgt_index++] = table; | 352 | batch->table[batch->pgt_index++] = table; |
346 | if (batch->pgt_index >= batch->crst_index) | 353 | if (batch->pgt_index >= batch->crst_index) |
347 | rcu_table_freelist_finish(); | 354 | rcu_table_freelist_finish(); |
355 | out: | ||
356 | preempt_enable(); | ||
348 | } | 357 | } |
349 | 358 | ||
350 | /* | 359 | /* |
diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c index 053caa0fd276..4552ce40c81a 100644 --- a/arch/s390/oprofile/hwsampler.c +++ b/arch/s390/oprofile/hwsampler.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/oprofile.h> | 19 | #include <linux/oprofile.h> |
20 | 20 | ||
21 | #include <asm/lowcore.h> | 21 | #include <asm/lowcore.h> |
22 | #include <asm/s390_ext.h> | 22 | #include <asm/irq.h> |
23 | 23 | ||
24 | #include "hwsampler.h" | 24 | #include "hwsampler.h" |
25 | 25 | ||
@@ -580,7 +580,7 @@ static int hws_cpu_callback(struct notifier_block *nfb, | |||
580 | { | 580 | { |
581 | /* We do not have sampler space available for all possible CPUs. | 581 | /* We do not have sampler space available for all possible CPUs. |
582 | All CPUs should be online when hw sampling is activated. */ | 582 | All CPUs should be online when hw sampling is activated. */ |
583 | return NOTIFY_BAD; | 583 | return (hws_state <= HWS_DEALLOCATED) ? NOTIFY_OK : NOTIFY_BAD; |
584 | } | 584 | } |
585 | 585 | ||
586 | static struct notifier_block hws_cpu_notifier = { | 586 | static struct notifier_block hws_cpu_notifier = { |
diff --git a/arch/score/Kconfig b/arch/score/Kconfig index e73bc781cc14..288add8d168f 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig | |||
@@ -43,9 +43,6 @@ config NO_DMA | |||
43 | config RWSEM_GENERIC_SPINLOCK | 43 | config RWSEM_GENERIC_SPINLOCK |
44 | def_bool y | 44 | def_bool y |
45 | 45 | ||
46 | config GENERIC_FIND_NEXT_BIT | ||
47 | def_bool y | ||
48 | |||
49 | config GENERIC_HWEIGHT | 46 | config GENERIC_HWEIGHT |
50 | def_bool y | 47 | def_bool y |
51 | 48 | ||
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index b44e37753b9a..f03338c2f088 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -71,12 +71,6 @@ config GENERIC_CSUM | |||
71 | def_bool y | 71 | def_bool y |
72 | depends on SUPERH64 | 72 | depends on SUPERH64 |
73 | 73 | ||
74 | config GENERIC_FIND_NEXT_BIT | ||
75 | def_bool y | ||
76 | |||
77 | config GENERIC_FIND_BIT_LE | ||
78 | def_bool y | ||
79 | |||
80 | config GENERIC_HWEIGHT | 74 | config GENERIC_HWEIGHT |
81 | def_bool y | 75 | def_bool y |
82 | 76 | ||
@@ -167,7 +161,7 @@ config ARCH_HAS_CPU_IDLE_WAIT | |||
167 | 161 | ||
168 | config NO_IOPORT | 162 | config NO_IOPORT |
169 | def_bool !PCI | 163 | def_bool !PCI |
170 | depends on !SH_CAYMAN && !SH_SH4202_MICRODEV | 164 | depends on !SH_CAYMAN && !SH_SH4202_MICRODEV && !SH_SHMIN |
171 | 165 | ||
172 | config IO_TRAPPED | 166 | config IO_TRAPPED |
173 | bool | 167 | bool |
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 618bd566cf53..969421f64a15 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c | |||
@@ -359,37 +359,31 @@ static struct soc_camera_link camera_link = { | |||
359 | .priv = &camera_info, | 359 | .priv = &camera_info, |
360 | }; | 360 | }; |
361 | 361 | ||
362 | static void dummy_release(struct device *dev) | 362 | static struct platform_device *camera_device; |
363 | |||
364 | static void ap325rxa_camera_release(struct device *dev) | ||
363 | { | 365 | { |
366 | soc_camera_platform_release(&camera_device); | ||
364 | } | 367 | } |
365 | 368 | ||
366 | static struct platform_device camera_device = { | ||
367 | .name = "soc_camera_platform", | ||
368 | .dev = { | ||
369 | .platform_data = &camera_info, | ||
370 | .release = dummy_release, | ||
371 | }, | ||
372 | }; | ||
373 | |||
374 | static int ap325rxa_camera_add(struct soc_camera_link *icl, | 369 | static int ap325rxa_camera_add(struct soc_camera_link *icl, |
375 | struct device *dev) | 370 | struct device *dev) |
376 | { | 371 | { |
377 | if (icl != &camera_link || camera_probe() <= 0) | 372 | int ret = soc_camera_platform_add(icl, dev, &camera_device, &camera_link, |
378 | return -ENODEV; | 373 | ap325rxa_camera_release, 0); |
374 | if (ret < 0) | ||
375 | return ret; | ||
379 | 376 | ||
380 | camera_info.dev = dev; | 377 | ret = camera_probe(); |
378 | if (ret < 0) | ||
379 | soc_camera_platform_del(icl, camera_device, &camera_link); | ||
381 | 380 | ||
382 | return platform_device_register(&camera_device); | 381 | return ret; |
383 | } | 382 | } |
384 | 383 | ||
385 | static void ap325rxa_camera_del(struct soc_camera_link *icl) | 384 | static void ap325rxa_camera_del(struct soc_camera_link *icl) |
386 | { | 385 | { |
387 | if (icl != &camera_link) | 386 | soc_camera_platform_del(icl, camera_device, &camera_link); |
388 | return; | ||
389 | |||
390 | platform_device_unregister(&camera_device); | ||
391 | memset(&camera_device.dev.kobj, 0, | ||
392 | sizeof(camera_device.dev.kobj)); | ||
393 | } | 387 | } |
394 | #endif /* CONFIG_I2C */ | 388 | #endif /* CONFIG_I2C */ |
395 | 389 | ||
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index bb13d0e1b964..3a32741cc0ac 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
@@ -885,6 +885,9 @@ static struct platform_device sh_mmcif_device = { | |||
885 | }, | 885 | }, |
886 | .num_resources = ARRAY_SIZE(sh_mmcif_resources), | 886 | .num_resources = ARRAY_SIZE(sh_mmcif_resources), |
887 | .resource = sh_mmcif_resources, | 887 | .resource = sh_mmcif_resources, |
888 | .archdata = { | ||
889 | .hwblk_id = HWBLK_MMC, | ||
890 | }, | ||
888 | }; | 891 | }; |
889 | #endif | 892 | #endif |
890 | 893 | ||
diff --git a/arch/sh/configs/apsh4ad0a_defconfig b/arch/sh/configs/apsh4ad0a_defconfig index 77ec0e7b8ddf..e7583484cc07 100644 --- a/arch/sh/configs/apsh4ad0a_defconfig +++ b/arch/sh/configs/apsh4ad0a_defconfig | |||
@@ -7,7 +7,6 @@ CONFIG_IKCONFIG=y | |||
7 | CONFIG_IKCONFIG_PROC=y | 7 | CONFIG_IKCONFIG_PROC=y |
8 | CONFIG_LOG_BUF_SHIFT=14 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
9 | CONFIG_CGROUPS=y | 9 | CONFIG_CGROUPS=y |
10 | CONFIG_CGROUP_NS=y | ||
11 | CONFIG_CGROUP_FREEZER=y | 10 | CONFIG_CGROUP_FREEZER=y |
12 | CONFIG_CGROUP_DEVICE=y | 11 | CONFIG_CGROUP_DEVICE=y |
13 | CONFIG_CGROUP_CPUACCT=y | 12 | CONFIG_CGROUP_CPUACCT=y |
diff --git a/arch/sh/configs/sdk7786_defconfig b/arch/sh/configs/sdk7786_defconfig index c41650572d79..8a7dd7b59c5c 100644 --- a/arch/sh/configs/sdk7786_defconfig +++ b/arch/sh/configs/sdk7786_defconfig | |||
@@ -12,7 +12,6 @@ CONFIG_IKCONFIG=y | |||
12 | CONFIG_IKCONFIG_PROC=y | 12 | CONFIG_IKCONFIG_PROC=y |
13 | CONFIG_CGROUPS=y | 13 | CONFIG_CGROUPS=y |
14 | CONFIG_CGROUP_DEBUG=y | 14 | CONFIG_CGROUP_DEBUG=y |
15 | CONFIG_CGROUP_NS=y | ||
16 | CONFIG_CGROUP_FREEZER=y | 15 | CONFIG_CGROUP_FREEZER=y |
17 | CONFIG_CGROUP_DEVICE=y | 16 | CONFIG_CGROUP_DEVICE=y |
18 | CONFIG_CPUSETS=y | 17 | CONFIG_CPUSETS=y |
diff --git a/arch/sh/configs/se7206_defconfig b/arch/sh/configs/se7206_defconfig index a468ff227fc6..72c3fad7383f 100644 --- a/arch/sh/configs/se7206_defconfig +++ b/arch/sh/configs/se7206_defconfig | |||
@@ -8,7 +8,6 @@ CONFIG_RCU_TRACE=y | |||
8 | CONFIG_LOG_BUF_SHIFT=14 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
9 | CONFIG_CGROUPS=y | 9 | CONFIG_CGROUPS=y |
10 | CONFIG_CGROUP_DEBUG=y | 10 | CONFIG_CGROUP_DEBUG=y |
11 | CONFIG_CGROUP_NS=y | ||
12 | CONFIG_CGROUP_DEVICE=y | 11 | CONFIG_CGROUP_DEVICE=y |
13 | CONFIG_CGROUP_CPUACCT=y | 12 | CONFIG_CGROUP_CPUACCT=y |
14 | CONFIG_RESOURCE_COUNTERS=y | 13 | CONFIG_RESOURCE_COUNTERS=y |
diff --git a/arch/sh/configs/shx3_defconfig b/arch/sh/configs/shx3_defconfig index 3f92d37c6374..6bb413036892 100644 --- a/arch/sh/configs/shx3_defconfig +++ b/arch/sh/configs/shx3_defconfig | |||
@@ -9,7 +9,6 @@ CONFIG_IKCONFIG=y | |||
9 | CONFIG_IKCONFIG_PROC=y | 9 | CONFIG_IKCONFIG_PROC=y |
10 | CONFIG_LOG_BUF_SHIFT=14 | 10 | CONFIG_LOG_BUF_SHIFT=14 |
11 | CONFIG_CGROUPS=y | 11 | CONFIG_CGROUPS=y |
12 | CONFIG_CGROUP_NS=y | ||
13 | CONFIG_CGROUP_FREEZER=y | 12 | CONFIG_CGROUP_FREEZER=y |
14 | CONFIG_CGROUP_DEVICE=y | 13 | CONFIG_CGROUP_DEVICE=y |
15 | CONFIG_CGROUP_CPUACCT=y | 14 | CONFIG_CGROUP_CPUACCT=y |
diff --git a/arch/sh/configs/urquell_defconfig b/arch/sh/configs/urquell_defconfig index 7b3daec6fefe..8bfa4d056d7a 100644 --- a/arch/sh/configs/urquell_defconfig +++ b/arch/sh/configs/urquell_defconfig | |||
@@ -9,7 +9,6 @@ CONFIG_IKCONFIG_PROC=y | |||
9 | CONFIG_LOG_BUF_SHIFT=14 | 9 | CONFIG_LOG_BUF_SHIFT=14 |
10 | CONFIG_CGROUPS=y | 10 | CONFIG_CGROUPS=y |
11 | CONFIG_CGROUP_DEBUG=y | 11 | CONFIG_CGROUP_DEBUG=y |
12 | CONFIG_CGROUP_NS=y | ||
13 | CONFIG_CGROUP_FREEZER=y | 12 | CONFIG_CGROUP_FREEZER=y |
14 | CONFIG_CGROUP_DEVICE=y | 13 | CONFIG_CGROUP_DEVICE=y |
15 | CONFIG_CPUSETS=y | 14 | CONFIG_CPUSETS=y |
diff --git a/arch/sh/include/asm/kgdb.h b/arch/sh/include/asm/kgdb.h index 4235e228d921..f3613952d1ae 100644 --- a/arch/sh/include/asm/kgdb.h +++ b/arch/sh/include/asm/kgdb.h | |||
@@ -34,5 +34,6 @@ static inline void arch_kgdb_breakpoint(void) | |||
34 | 34 | ||
35 | #define CACHE_FLUSH_IS_SAFE 1 | 35 | #define CACHE_FLUSH_IS_SAFE 1 |
36 | #define BREAK_INSTR_SIZE 2 | 36 | #define BREAK_INSTR_SIZE 2 |
37 | #define GDB_ADJUSTS_BREAK_OFFSET | ||
37 | 38 | ||
38 | #endif /* __ASM_SH_KGDB_H */ | 39 | #endif /* __ASM_SH_KGDB_H */ |
diff --git a/arch/sh/include/asm/pgtable.h b/arch/sh/include/asm/pgtable.h index db85916b9e95..9210e93a92c3 100644 --- a/arch/sh/include/asm/pgtable.h +++ b/arch/sh/include/asm/pgtable.h | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/pgtable-2level.h> | 18 | #include <asm/pgtable-2level.h> |
19 | #endif | 19 | #endif |
20 | #include <asm/page.h> | 20 | #include <asm/page.h> |
21 | #include <asm/mmu.h> | ||
21 | 22 | ||
22 | #ifndef __ASSEMBLY__ | 23 | #ifndef __ASSEMBLY__ |
23 | #include <asm/addrspace.h> | 24 | #include <asm/addrspace.h> |
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index de167d3a1a80..88bd6be168a9 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
@@ -40,9 +40,10 @@ | |||
40 | #include <asm/system.h> | 40 | #include <asm/system.h> |
41 | 41 | ||
42 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) | 42 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) |
43 | #define user_stack_pointer(_regs) ((unsigned long)(_regs)->regs[15]) | ||
44 | #define kernel_stack_pointer(_regs) ((unsigned long)(_regs)->regs[15]) | 43 | #define kernel_stack_pointer(_regs) ((unsigned long)(_regs)->regs[15]) |
45 | #define instruction_pointer(regs) ((unsigned long)(regs)->pc) | 44 | |
45 | #define GET_FP(regs) ((regs)->regs[14]) | ||
46 | #define GET_USP(regs) ((regs)->regs[15]) | ||
46 | 47 | ||
47 | extern void show_regs(struct pt_regs *); | 48 | extern void show_regs(struct pt_regs *); |
48 | 49 | ||
@@ -132,13 +133,16 @@ extern void ptrace_triggered(struct perf_event *bp, int nmi, | |||
132 | 133 | ||
133 | static inline unsigned long profile_pc(struct pt_regs *regs) | 134 | static inline unsigned long profile_pc(struct pt_regs *regs) |
134 | { | 135 | { |
135 | unsigned long pc = instruction_pointer(regs); | 136 | unsigned long pc = regs->pc; |
136 | 137 | ||
137 | if (virt_addr_uncached(pc)) | 138 | if (virt_addr_uncached(pc)) |
138 | return CAC_ADDR(pc); | 139 | return CAC_ADDR(pc); |
139 | 140 | ||
140 | return pc; | 141 | return pc; |
141 | } | 142 | } |
143 | #define profile_pc profile_pc | ||
144 | |||
145 | #include <asm-generic/ptrace.h> | ||
142 | #endif /* __KERNEL__ */ | 146 | #endif /* __KERNEL__ */ |
143 | 147 | ||
144 | #endif /* __ASM_SH_PTRACE_H */ | 148 | #endif /* __ASM_SH_PTRACE_H */ |
diff --git a/arch/sh/include/asm/suspend.h b/arch/sh/include/asm/suspend.h index 64eb41a063e8..e14567a7e9a1 100644 --- a/arch/sh/include/asm/suspend.h +++ b/arch/sh/include/asm/suspend.h | |||
@@ -3,7 +3,6 @@ | |||
3 | 3 | ||
4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ |
5 | #include <linux/notifier.h> | 5 | #include <linux/notifier.h> |
6 | static inline int arch_prepare_suspend(void) { return 0; } | ||
7 | 6 | ||
8 | #include <asm/ptrace.h> | 7 | #include <asm/ptrace.h> |
9 | 8 | ||
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h index 6c308d8b9a50..ec88bfcdf7ce 100644 --- a/arch/sh/include/asm/tlb.h +++ b/arch/sh/include/asm/tlb.h | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/pagemap.h> | 9 | #include <linux/pagemap.h> |
10 | 10 | ||
11 | #ifdef CONFIG_MMU | 11 | #ifdef CONFIG_MMU |
12 | #include <linux/swap.h> | ||
12 | #include <asm/pgalloc.h> | 13 | #include <asm/pgalloc.h> |
13 | #include <asm/tlbflush.h> | 14 | #include <asm/tlbflush.h> |
14 | #include <asm/mmu_context.h> | 15 | #include <asm/mmu_context.h> |
diff --git a/arch/sh/include/asm/unistd_32.h b/arch/sh/include/asm/unistd_32.h index bb7d2702c2c9..3432008d2888 100644 --- a/arch/sh/include/asm/unistd_32.h +++ b/arch/sh/include/asm/unistd_32.h | |||
@@ -374,8 +374,9 @@ | |||
374 | #define __NR_clock_adjtime 361 | 374 | #define __NR_clock_adjtime 361 |
375 | #define __NR_syncfs 362 | 375 | #define __NR_syncfs 362 |
376 | #define __NR_sendmmsg 363 | 376 | #define __NR_sendmmsg 363 |
377 | #define __NR_setns 364 | ||
377 | 378 | ||
378 | #define NR_syscalls 364 | 379 | #define NR_syscalls 365 |
379 | 380 | ||
380 | #ifdef __KERNEL__ | 381 | #ifdef __KERNEL__ |
381 | 382 | ||
diff --git a/arch/sh/include/asm/unistd_64.h b/arch/sh/include/asm/unistd_64.h index 46327cea1e5c..ec9898665f23 100644 --- a/arch/sh/include/asm/unistd_64.h +++ b/arch/sh/include/asm/unistd_64.h | |||
@@ -395,10 +395,11 @@ | |||
395 | #define __NR_clock_adjtime 372 | 395 | #define __NR_clock_adjtime 372 |
396 | #define __NR_syncfs 373 | 396 | #define __NR_syncfs 373 |
397 | #define __NR_sendmmsg 374 | 397 | #define __NR_sendmmsg 374 |
398 | #define __NR_setns 375 | ||
398 | 399 | ||
399 | #ifdef __KERNEL__ | 400 | #ifdef __KERNEL__ |
400 | 401 | ||
401 | #define NR_syscalls 375 | 402 | #define NR_syscalls 376 |
402 | 403 | ||
403 | #define __ARCH_WANT_IPC_PARSE_VERSION | 404 | #define __ARCH_WANT_IPC_PARSE_VERSION |
404 | #define __ARCH_WANT_OLD_READDIR | 405 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7722.h b/arch/sh/include/cpu-sh4/cpu/sh7722.h index 7a5b8a331b4a..bd0622788d64 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7722.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7722.h | |||
@@ -236,6 +236,7 @@ enum { | |||
236 | }; | 236 | }; |
237 | 237 | ||
238 | enum { | 238 | enum { |
239 | SHDMA_SLAVE_INVALID, | ||
239 | SHDMA_SLAVE_SCIF0_TX, | 240 | SHDMA_SLAVE_SCIF0_TX, |
240 | SHDMA_SLAVE_SCIF0_RX, | 241 | SHDMA_SLAVE_SCIF0_RX, |
241 | SHDMA_SLAVE_SCIF1_TX, | 242 | SHDMA_SLAVE_SCIF1_TX, |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7724.h b/arch/sh/include/cpu-sh4/cpu/sh7724.h index 7eb435999426..3daef8ecbc63 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7724.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7724.h | |||
@@ -285,6 +285,7 @@ enum { | |||
285 | }; | 285 | }; |
286 | 286 | ||
287 | enum { | 287 | enum { |
288 | SHDMA_SLAVE_INVALID, | ||
288 | SHDMA_SLAVE_SCIF0_TX, | 289 | SHDMA_SLAVE_SCIF0_TX, |
289 | SHDMA_SLAVE_SCIF0_RX, | 290 | SHDMA_SLAVE_SCIF0_RX, |
290 | SHDMA_SLAVE_SCIF1_TX, | 291 | SHDMA_SLAVE_SCIF1_TX, |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7757.h b/arch/sh/include/cpu-sh4/cpu/sh7757.h index 05b8196c7753..41f9f8b9db73 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7757.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7757.h | |||
@@ -252,6 +252,7 @@ enum { | |||
252 | }; | 252 | }; |
253 | 253 | ||
254 | enum { | 254 | enum { |
255 | SHDMA_SLAVE_INVALID, | ||
255 | SHDMA_SLAVE_SDHI_TX, | 256 | SHDMA_SLAVE_SDHI_TX, |
256 | SHDMA_SLAVE_SDHI_RX, | 257 | SHDMA_SLAVE_SDHI_RX, |
257 | SHDMA_SLAVE_MMCIF_TX, | 258 | SHDMA_SLAVE_MMCIF_TX, |
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c index 762a13984bbd..b473f0c06fbc 100644 --- a/arch/sh/kernel/process_32.c +++ b/arch/sh/kernel/process_32.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
22 | #include <linux/ftrace.h> | 22 | #include <linux/ftrace.h> |
23 | #include <linux/hw_breakpoint.h> | 23 | #include <linux/hw_breakpoint.h> |
24 | #include <linux/prefetch.h> | ||
24 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
25 | #include <asm/mmu_context.h> | 26 | #include <asm/mmu_context.h> |
26 | #include <asm/system.h> | 27 | #include <asm/system.h> |
diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index 7c486f3e3a3c..39b051de4c7c 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S | |||
@@ -381,3 +381,4 @@ ENTRY(sys_call_table) | |||
381 | .long sys_clock_adjtime | 381 | .long sys_clock_adjtime |
382 | .long sys_syncfs | 382 | .long sys_syncfs |
383 | .long sys_sendmmsg | 383 | .long sys_sendmmsg |
384 | .long sys_setns | ||
diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index ba1a737afe80..089c4d825d08 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S | |||
@@ -401,3 +401,4 @@ sys_call_table: | |||
401 | .long sys_clock_adjtime | 401 | .long sys_clock_adjtime |
402 | .long sys_syncfs | 402 | .long sys_syncfs |
403 | .long sys_sendmmsg | 403 | .long sys_sendmmsg |
404 | .long sys_setns /* 375 */ | ||
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index 40733a952402..f251b5f27652 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
@@ -82,7 +82,7 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
82 | void *addr; | 82 | void *addr; |
83 | 83 | ||
84 | addr = __in_29bit_mode() ? | 84 | addr = __in_29bit_mode() ? |
85 | (void *)P1SEGADDR((unsigned long)vaddr) : vaddr; | 85 | (void *)CAC_ADDR((unsigned long)vaddr) : vaddr; |
86 | 86 | ||
87 | switch (direction) { | 87 | switch (direction) { |
88 | case DMA_FROM_DEVICE: /* invalidate only */ | 88 | case DMA_FROM_DEVICE: /* invalidate only */ |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 63a027c9ada5..af32e17fa170 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -190,14 +190,6 @@ config RWSEM_XCHGADD_ALGORITHM | |||
190 | bool | 190 | bool |
191 | default y if SPARC64 | 191 | default y if SPARC64 |
192 | 192 | ||
193 | config GENERIC_FIND_NEXT_BIT | ||
194 | bool | ||
195 | default y | ||
196 | |||
197 | config GENERIC_FIND_BIT_LE | ||
198 | bool | ||
199 | default y | ||
200 | |||
201 | config GENERIC_HWEIGHT | 193 | config GENERIC_HWEIGHT |
202 | bool | 194 | bool |
203 | default y if !ULTRA_HAS_POPULATION_COUNT | 195 | default y if !ULTRA_HAS_POPULATION_COUNT |
diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h index c5387ed0add8..6260d5deeabc 100644 --- a/arch/sparc/include/asm/unistd.h +++ b/arch/sparc/include/asm/unistd.h | |||
@@ -405,8 +405,9 @@ | |||
405 | #define __NR_clock_adjtime 334 | 405 | #define __NR_clock_adjtime 334 |
406 | #define __NR_syncfs 335 | 406 | #define __NR_syncfs 335 |
407 | #define __NR_sendmmsg 336 | 407 | #define __NR_sendmmsg 336 |
408 | #define __NR_setns 337 | ||
408 | 409 | ||
409 | #define NR_syscalls 337 | 410 | #define NR_syscalls 338 |
410 | 411 | ||
411 | #ifdef __32bit_syscall_numbers__ | 412 | #ifdef __32bit_syscall_numbers__ |
412 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, | 413 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, |
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 332c83ff7701..6e492d59f6b1 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S | |||
@@ -84,4 +84,4 @@ sys_call_table: | |||
84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv | 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv |
85 | /*325*/ .long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init | 85 | /*325*/ .long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init |
86 | /*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime | 86 | /*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime |
87 | /*335*/ .long sys_syncfs, sys_sendmmsg | 87 | /*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns |
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 43887ca0be0e..f566518483b5 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
@@ -85,7 +85,7 @@ sys_call_table32: | |||
85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, compat_sys_preadv | 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, compat_sys_preadv |
86 | .word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init | 86 | .word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init |
87 | /*330*/ .word sys32_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime | 87 | /*330*/ .word sys32_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime |
88 | .word sys_syncfs, compat_sys_sendmmsg | 88 | .word sys_syncfs, compat_sys_sendmmsg, sys_setns |
89 | 89 | ||
90 | #endif /* CONFIG_COMPAT */ | 90 | #endif /* CONFIG_COMPAT */ |
91 | 91 | ||
@@ -162,4 +162,4 @@ sys_call_table: | |||
162 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv | 162 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv |
163 | .word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init | 163 | .word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init |
164 | /*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime | 164 | /*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime |
165 | .word sys_syncfs, sys_sendmmsg | 165 | .word sys_syncfs, sys_sendmmsg, sys_setns |
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 635e1bfb1c5d..0249b8b4db54 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
@@ -5,13 +5,13 @@ config TILE | |||
5 | def_bool y | 5 | def_bool y |
6 | select HAVE_KVM if !TILEGX | 6 | select HAVE_KVM if !TILEGX |
7 | select GENERIC_FIND_FIRST_BIT | 7 | select GENERIC_FIND_FIRST_BIT |
8 | select GENERIC_FIND_NEXT_BIT | ||
9 | select USE_GENERIC_SMP_HELPERS | 8 | select USE_GENERIC_SMP_HELPERS |
10 | select CC_OPTIMIZE_FOR_SIZE | 9 | select CC_OPTIMIZE_FOR_SIZE |
11 | select HAVE_GENERIC_HARDIRQS | 10 | select HAVE_GENERIC_HARDIRQS |
12 | select GENERIC_IRQ_PROBE | 11 | select GENERIC_IRQ_PROBE |
13 | select GENERIC_PENDING_IRQ if SMP | 12 | select GENERIC_PENDING_IRQ if SMP |
14 | select GENERIC_IRQ_SHOW | 13 | select GENERIC_IRQ_SHOW |
14 | select SYS_HYPERVISOR | ||
15 | 15 | ||
16 | # FIXME: investigate whether we need/want these options. | 16 | # FIXME: investigate whether we need/want these options. |
17 | # select HAVE_IOREMAP_PROT | 17 | # select HAVE_IOREMAP_PROT |
diff --git a/arch/tile/include/asm/hardwall.h b/arch/tile/include/asm/hardwall.h index 0bed3ec7b42c..2ac422848c7d 100644 --- a/arch/tile/include/asm/hardwall.h +++ b/arch/tile/include/asm/hardwall.h | |||
@@ -40,6 +40,10 @@ | |||
40 | #define HARDWALL_DEACTIVATE \ | 40 | #define HARDWALL_DEACTIVATE \ |
41 | _IO(HARDWALL_IOCTL_BASE, _HARDWALL_DEACTIVATE) | 41 | _IO(HARDWALL_IOCTL_BASE, _HARDWALL_DEACTIVATE) |
42 | 42 | ||
43 | #define _HARDWALL_GET_ID 4 | ||
44 | #define HARDWALL_GET_ID \ | ||
45 | _IO(HARDWALL_IOCTL_BASE, _HARDWALL_GET_ID) | ||
46 | |||
43 | #ifndef __KERNEL__ | 47 | #ifndef __KERNEL__ |
44 | 48 | ||
45 | /* This is the canonical name expected by userspace. */ | 49 | /* This is the canonical name expected by userspace. */ |
@@ -47,9 +51,14 @@ | |||
47 | 51 | ||
48 | #else | 52 | #else |
49 | 53 | ||
50 | /* Hook for /proc/tile/hardwall. */ | 54 | /* /proc hooks for hardwall. */ |
51 | struct seq_file; | 55 | struct proc_dir_entry; |
52 | int proc_tile_hardwall_show(struct seq_file *sf, void *v); | 56 | #ifdef CONFIG_HARDWALL |
57 | void proc_tile_hardwall_init(struct proc_dir_entry *root); | ||
58 | int proc_pid_hardwall(struct task_struct *task, char *buffer); | ||
59 | #else | ||
60 | static inline void proc_tile_hardwall_init(struct proc_dir_entry *root) {} | ||
61 | #endif | ||
53 | 62 | ||
54 | #endif | 63 | #endif |
55 | 64 | ||
diff --git a/arch/tile/kernel/Makefile b/arch/tile/kernel/Makefile index b4c8e8ec45dc..b4dbc057baad 100644 --- a/arch/tile/kernel/Makefile +++ b/arch/tile/kernel/Makefile | |||
@@ -5,7 +5,7 @@ | |||
5 | extra-y := vmlinux.lds head_$(BITS).o | 5 | extra-y := vmlinux.lds head_$(BITS).o |
6 | obj-y := backtrace.o entry.o init_task.o irq.o messaging.o \ | 6 | obj-y := backtrace.o entry.o init_task.o irq.o messaging.o \ |
7 | pci-dma.o proc.o process.o ptrace.o reboot.o \ | 7 | pci-dma.o proc.o process.o ptrace.o reboot.o \ |
8 | setup.o signal.o single_step.o stack.o sys.o time.o traps.o \ | 8 | setup.o signal.o single_step.o stack.o sys.o sysfs.o time.o traps.o \ |
9 | intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o | 9 | intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o |
10 | 10 | ||
11 | obj-$(CONFIG_HARDWALL) += hardwall.o | 11 | obj-$(CONFIG_HARDWALL) += hardwall.o |
diff --git a/arch/tile/kernel/hardwall.c b/arch/tile/kernel/hardwall.c index 3bddef710de4..8c41891aab34 100644 --- a/arch/tile/kernel/hardwall.c +++ b/arch/tile/kernel/hardwall.c | |||
@@ -40,16 +40,25 @@ | |||
40 | struct hardwall_info { | 40 | struct hardwall_info { |
41 | struct list_head list; /* "rectangles" list */ | 41 | struct list_head list; /* "rectangles" list */ |
42 | struct list_head task_head; /* head of tasks in this hardwall */ | 42 | struct list_head task_head; /* head of tasks in this hardwall */ |
43 | struct cpumask cpumask; /* cpus in the rectangle */ | ||
43 | int ulhc_x; /* upper left hand corner x coord */ | 44 | int ulhc_x; /* upper left hand corner x coord */ |
44 | int ulhc_y; /* upper left hand corner y coord */ | 45 | int ulhc_y; /* upper left hand corner y coord */ |
45 | int width; /* rectangle width */ | 46 | int width; /* rectangle width */ |
46 | int height; /* rectangle height */ | 47 | int height; /* rectangle height */ |
48 | int id; /* integer id for this hardwall */ | ||
47 | int teardown_in_progress; /* are we tearing this one down? */ | 49 | int teardown_in_progress; /* are we tearing this one down? */ |
48 | }; | 50 | }; |
49 | 51 | ||
50 | /* Currently allocated hardwall rectangles */ | 52 | /* Currently allocated hardwall rectangles */ |
51 | static LIST_HEAD(rectangles); | 53 | static LIST_HEAD(rectangles); |
52 | 54 | ||
55 | /* /proc/tile/hardwall */ | ||
56 | static struct proc_dir_entry *hardwall_proc_dir; | ||
57 | |||
58 | /* Functions to manage files in /proc/tile/hardwall. */ | ||
59 | static void hardwall_add_proc(struct hardwall_info *rect); | ||
60 | static void hardwall_remove_proc(struct hardwall_info *rect); | ||
61 | |||
53 | /* | 62 | /* |
54 | * Guard changes to the hardwall data structures. | 63 | * Guard changes to the hardwall data structures. |
55 | * This could be finer grained (e.g. one lock for the list of hardwall | 64 | * This could be finer grained (e.g. one lock for the list of hardwall |
@@ -105,6 +114,8 @@ static int setup_rectangle(struct hardwall_info *r, struct cpumask *mask) | |||
105 | r->ulhc_y = cpu_y(ulhc); | 114 | r->ulhc_y = cpu_y(ulhc); |
106 | r->width = cpu_x(lrhc) - r->ulhc_x + 1; | 115 | r->width = cpu_x(lrhc) - r->ulhc_x + 1; |
107 | r->height = cpu_y(lrhc) - r->ulhc_y + 1; | 116 | r->height = cpu_y(lrhc) - r->ulhc_y + 1; |
117 | cpumask_copy(&r->cpumask, mask); | ||
118 | r->id = ulhc; /* The ulhc cpu id can be the hardwall id. */ | ||
108 | 119 | ||
109 | /* Width and height must be positive */ | 120 | /* Width and height must be positive */ |
110 | if (r->width <= 0 || r->height <= 0) | 121 | if (r->width <= 0 || r->height <= 0) |
@@ -388,6 +399,9 @@ static struct hardwall_info *hardwall_create( | |||
388 | /* Set up appropriate hardwalling on all affected cpus. */ | 399 | /* Set up appropriate hardwalling on all affected cpus. */ |
389 | hardwall_setup(rect); | 400 | hardwall_setup(rect); |
390 | 401 | ||
402 | /* Create a /proc/tile/hardwall entry. */ | ||
403 | hardwall_add_proc(rect); | ||
404 | |||
391 | return rect; | 405 | return rect; |
392 | } | 406 | } |
393 | 407 | ||
@@ -645,6 +659,9 @@ static void hardwall_destroy(struct hardwall_info *rect) | |||
645 | /* Restart switch and disable firewall. */ | 659 | /* Restart switch and disable firewall. */ |
646 | on_each_cpu_mask(&mask, restart_udn_switch, NULL, 1); | 660 | on_each_cpu_mask(&mask, restart_udn_switch, NULL, 1); |
647 | 661 | ||
662 | /* Remove the /proc/tile/hardwall entry. */ | ||
663 | hardwall_remove_proc(rect); | ||
664 | |||
648 | /* Now free the rectangle from the list. */ | 665 | /* Now free the rectangle from the list. */ |
649 | spin_lock_irqsave(&hardwall_lock, flags); | 666 | spin_lock_irqsave(&hardwall_lock, flags); |
650 | BUG_ON(!list_empty(&rect->task_head)); | 667 | BUG_ON(!list_empty(&rect->task_head)); |
@@ -654,35 +671,57 @@ static void hardwall_destroy(struct hardwall_info *rect) | |||
654 | } | 671 | } |
655 | 672 | ||
656 | 673 | ||
657 | /* | 674 | static int hardwall_proc_show(struct seq_file *sf, void *v) |
658 | * Dump hardwall state via /proc; initialized in arch/tile/sys/proc.c. | ||
659 | */ | ||
660 | int proc_tile_hardwall_show(struct seq_file *sf, void *v) | ||
661 | { | 675 | { |
662 | struct hardwall_info *r; | 676 | struct hardwall_info *rect = sf->private; |
677 | char buf[256]; | ||
663 | 678 | ||
664 | if (udn_disabled) { | 679 | int rc = cpulist_scnprintf(buf, sizeof(buf), &rect->cpumask); |
665 | seq_printf(sf, "%dx%d 0,0 pids:\n", smp_width, smp_height); | 680 | buf[rc++] = '\n'; |
666 | return 0; | 681 | seq_write(sf, buf, rc); |
667 | } | ||
668 | |||
669 | spin_lock_irq(&hardwall_lock); | ||
670 | list_for_each_entry(r, &rectangles, list) { | ||
671 | struct task_struct *p; | ||
672 | seq_printf(sf, "%dx%d %d,%d pids:", | ||
673 | r->width, r->height, r->ulhc_x, r->ulhc_y); | ||
674 | list_for_each_entry(p, &r->task_head, thread.hardwall_list) { | ||
675 | unsigned int cpu = cpumask_first(&p->cpus_allowed); | ||
676 | unsigned int x = cpu % smp_width; | ||
677 | unsigned int y = cpu / smp_width; | ||
678 | seq_printf(sf, " %d@%d,%d", p->pid, x, y); | ||
679 | } | ||
680 | seq_printf(sf, "\n"); | ||
681 | } | ||
682 | spin_unlock_irq(&hardwall_lock); | ||
683 | return 0; | 682 | return 0; |
684 | } | 683 | } |
685 | 684 | ||
685 | static int hardwall_proc_open(struct inode *inode, | ||
686 | struct file *file) | ||
687 | { | ||
688 | return single_open(file, hardwall_proc_show, PDE(inode)->data); | ||
689 | } | ||
690 | |||
691 | static const struct file_operations hardwall_proc_fops = { | ||
692 | .open = hardwall_proc_open, | ||
693 | .read = seq_read, | ||
694 | .llseek = seq_lseek, | ||
695 | .release = single_release, | ||
696 | }; | ||
697 | |||
698 | static void hardwall_add_proc(struct hardwall_info *rect) | ||
699 | { | ||
700 | char buf[64]; | ||
701 | snprintf(buf, sizeof(buf), "%d", rect->id); | ||
702 | proc_create_data(buf, 0444, hardwall_proc_dir, | ||
703 | &hardwall_proc_fops, rect); | ||
704 | } | ||
705 | |||
706 | static void hardwall_remove_proc(struct hardwall_info *rect) | ||
707 | { | ||
708 | char buf[64]; | ||
709 | snprintf(buf, sizeof(buf), "%d", rect->id); | ||
710 | remove_proc_entry(buf, hardwall_proc_dir); | ||
711 | } | ||
712 | |||
713 | int proc_pid_hardwall(struct task_struct *task, char *buffer) | ||
714 | { | ||
715 | struct hardwall_info *rect = task->thread.hardwall; | ||
716 | return rect ? sprintf(buffer, "%d\n", rect->id) : 0; | ||
717 | } | ||
718 | |||
719 | void proc_tile_hardwall_init(struct proc_dir_entry *root) | ||
720 | { | ||
721 | if (!udn_disabled) | ||
722 | hardwall_proc_dir = proc_mkdir("hardwall", root); | ||
723 | } | ||
724 | |||
686 | 725 | ||
687 | /* | 726 | /* |
688 | * Character device support via ioctl/close. | 727 | * Character device support via ioctl/close. |
@@ -716,6 +755,9 @@ static long hardwall_ioctl(struct file *file, unsigned int a, unsigned long b) | |||
716 | return -EINVAL; | 755 | return -EINVAL; |
717 | return hardwall_deactivate(current); | 756 | return hardwall_deactivate(current); |
718 | 757 | ||
758 | case _HARDWALL_GET_ID: | ||
759 | return rect ? rect->id : -EINVAL; | ||
760 | |||
719 | default: | 761 | default: |
720 | return -EINVAL; | 762 | return -EINVAL; |
721 | } | 763 | } |
diff --git a/arch/tile/kernel/proc.c b/arch/tile/kernel/proc.c index 2e02c41ddf3b..62d820833c68 100644 --- a/arch/tile/kernel/proc.c +++ b/arch/tile/kernel/proc.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/processor.h> | 27 | #include <asm/processor.h> |
28 | #include <asm/sections.h> | 28 | #include <asm/sections.h> |
29 | #include <asm/homecache.h> | 29 | #include <asm/homecache.h> |
30 | #include <asm/hardwall.h> | ||
30 | #include <arch/chip.h> | 31 | #include <arch/chip.h> |
31 | 32 | ||
32 | 33 | ||
@@ -88,3 +89,75 @@ const struct seq_operations cpuinfo_op = { | |||
88 | .stop = c_stop, | 89 | .stop = c_stop, |
89 | .show = show_cpuinfo, | 90 | .show = show_cpuinfo, |
90 | }; | 91 | }; |
92 | |||
93 | /* | ||
94 | * Support /proc/tile directory | ||
95 | */ | ||
96 | |||
97 | static int __init proc_tile_init(void) | ||
98 | { | ||
99 | struct proc_dir_entry *root = proc_mkdir("tile", NULL); | ||
100 | if (root == NULL) | ||
101 | return 0; | ||
102 | |||
103 | proc_tile_hardwall_init(root); | ||
104 | |||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | arch_initcall(proc_tile_init); | ||
109 | |||
110 | /* | ||
111 | * Support /proc/sys/tile directory | ||
112 | */ | ||
113 | |||
114 | #ifndef __tilegx__ /* FIXME: GX: no support for unaligned access yet */ | ||
115 | static ctl_table unaligned_subtable[] = { | ||
116 | { | ||
117 | .procname = "enabled", | ||
118 | .data = &unaligned_fixup, | ||
119 | .maxlen = sizeof(int), | ||
120 | .mode = 0644, | ||
121 | .proc_handler = &proc_dointvec | ||
122 | }, | ||
123 | { | ||
124 | .procname = "printk", | ||
125 | .data = &unaligned_printk, | ||
126 | .maxlen = sizeof(int), | ||
127 | .mode = 0644, | ||
128 | .proc_handler = &proc_dointvec | ||
129 | }, | ||
130 | { | ||
131 | .procname = "count", | ||
132 | .data = &unaligned_fixup_count, | ||
133 | .maxlen = sizeof(int), | ||
134 | .mode = 0644, | ||
135 | .proc_handler = &proc_dointvec | ||
136 | }, | ||
137 | {} | ||
138 | }; | ||
139 | |||
140 | static ctl_table unaligned_table[] = { | ||
141 | { | ||
142 | .procname = "unaligned_fixup", | ||
143 | .mode = 0555, | ||
144 | .child = unaligned_subtable | ||
145 | }, | ||
146 | {} | ||
147 | }; | ||
148 | #endif | ||
149 | |||
150 | static struct ctl_path tile_path[] = { | ||
151 | { .procname = "tile" }, | ||
152 | { } | ||
153 | }; | ||
154 | |||
155 | static int __init proc_sys_tile_init(void) | ||
156 | { | ||
157 | #ifndef __tilegx__ /* FIXME: GX: no support for unaligned access yet */ | ||
158 | register_sysctl_paths(tile_path, unaligned_table); | ||
159 | #endif | ||
160 | return 0; | ||
161 | } | ||
162 | |||
163 | arch_initcall(proc_sys_tile_init); | ||
diff --git a/arch/tile/kernel/sysfs.c b/arch/tile/kernel/sysfs.c new file mode 100644 index 000000000000..b671a86f4515 --- /dev/null +++ b/arch/tile/kernel/sysfs.c | |||
@@ -0,0 +1,185 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Tilera Corporation. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation, version 2. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, but | ||
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
11 | * NON INFRINGEMENT. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * /sys entry support. | ||
15 | */ | ||
16 | |||
17 | #include <linux/sysdev.h> | ||
18 | #include <linux/cpu.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/smp.h> | ||
21 | #include <hv/hypervisor.h> | ||
22 | |||
23 | /* Return a string queried from the hypervisor, truncated to page size. */ | ||
24 | static ssize_t get_hv_confstr(char *page, int query) | ||
25 | { | ||
26 | ssize_t n = hv_confstr(query, (unsigned long)page, PAGE_SIZE - 1); | ||
27 | n = n < 0 ? 0 : min(n, (ssize_t)PAGE_SIZE - 1) - 1; | ||
28 | if (n) | ||
29 | page[n++] = '\n'; | ||
30 | page[n] = '\0'; | ||
31 | return n; | ||
32 | } | ||
33 | |||
34 | static ssize_t chip_width_show(struct sysdev_class *dev, | ||
35 | struct sysdev_class_attribute *attr, | ||
36 | char *page) | ||
37 | { | ||
38 | return sprintf(page, "%u\n", smp_width); | ||
39 | } | ||
40 | static SYSDEV_CLASS_ATTR(chip_width, 0444, chip_width_show, NULL); | ||
41 | |||
42 | static ssize_t chip_height_show(struct sysdev_class *dev, | ||
43 | struct sysdev_class_attribute *attr, | ||
44 | char *page) | ||
45 | { | ||
46 | return sprintf(page, "%u\n", smp_height); | ||
47 | } | ||
48 | static SYSDEV_CLASS_ATTR(chip_height, 0444, chip_height_show, NULL); | ||
49 | |||
50 | static ssize_t chip_serial_show(struct sysdev_class *dev, | ||
51 | struct sysdev_class_attribute *attr, | ||
52 | char *page) | ||
53 | { | ||
54 | return get_hv_confstr(page, HV_CONFSTR_CHIP_SERIAL_NUM); | ||
55 | } | ||
56 | static SYSDEV_CLASS_ATTR(chip_serial, 0444, chip_serial_show, NULL); | ||
57 | |||
58 | static ssize_t chip_revision_show(struct sysdev_class *dev, | ||
59 | struct sysdev_class_attribute *attr, | ||
60 | char *page) | ||
61 | { | ||
62 | return get_hv_confstr(page, HV_CONFSTR_CHIP_REV); | ||
63 | } | ||
64 | static SYSDEV_CLASS_ATTR(chip_revision, 0444, chip_revision_show, NULL); | ||
65 | |||
66 | |||
67 | static ssize_t type_show(struct sysdev_class *dev, | ||
68 | struct sysdev_class_attribute *attr, | ||
69 | char *page) | ||
70 | { | ||
71 | return sprintf(page, "tilera\n"); | ||
72 | } | ||
73 | static SYSDEV_CLASS_ATTR(type, 0444, type_show, NULL); | ||
74 | |||
75 | #define HV_CONF_ATTR(name, conf) \ | ||
76 | static ssize_t name ## _show(struct sysdev_class *dev, \ | ||
77 | struct sysdev_class_attribute *attr, \ | ||
78 | char *page) \ | ||
79 | { \ | ||
80 | return get_hv_confstr(page, conf); \ | ||
81 | } \ | ||
82 | static SYSDEV_CLASS_ATTR(name, 0444, name ## _show, NULL); | ||
83 | |||
84 | HV_CONF_ATTR(version, HV_CONFSTR_HV_SW_VER) | ||
85 | HV_CONF_ATTR(config_version, HV_CONFSTR_HV_CONFIG_VER) | ||
86 | |||
87 | HV_CONF_ATTR(board_part, HV_CONFSTR_BOARD_PART_NUM) | ||
88 | HV_CONF_ATTR(board_serial, HV_CONFSTR_BOARD_SERIAL_NUM) | ||
89 | HV_CONF_ATTR(board_revision, HV_CONFSTR_BOARD_REV) | ||
90 | HV_CONF_ATTR(board_description, HV_CONFSTR_BOARD_DESC) | ||
91 | HV_CONF_ATTR(mezz_part, HV_CONFSTR_MEZZ_PART_NUM) | ||
92 | HV_CONF_ATTR(mezz_serial, HV_CONFSTR_MEZZ_SERIAL_NUM) | ||
93 | HV_CONF_ATTR(mezz_revision, HV_CONFSTR_MEZZ_REV) | ||
94 | HV_CONF_ATTR(mezz_description, HV_CONFSTR_MEZZ_DESC) | ||
95 | HV_CONF_ATTR(switch_control, HV_CONFSTR_SWITCH_CONTROL) | ||
96 | |||
97 | static struct attribute *board_attrs[] = { | ||
98 | &attr_board_part.attr, | ||
99 | &attr_board_serial.attr, | ||
100 | &attr_board_revision.attr, | ||
101 | &attr_board_description.attr, | ||
102 | &attr_mezz_part.attr, | ||
103 | &attr_mezz_serial.attr, | ||
104 | &attr_mezz_revision.attr, | ||
105 | &attr_mezz_description.attr, | ||
106 | &attr_switch_control.attr, | ||
107 | NULL | ||
108 | }; | ||
109 | |||
110 | static struct attribute_group board_attr_group = { | ||
111 | .name = "board", | ||
112 | .attrs = board_attrs, | ||
113 | }; | ||
114 | |||
115 | |||
116 | static struct bin_attribute hvconfig_bin; | ||
117 | |||
118 | static ssize_t | ||
119 | hvconfig_bin_read(struct file *filp, struct kobject *kobj, | ||
120 | struct bin_attribute *bin_attr, | ||
121 | char *buf, loff_t off, size_t count) | ||
122 | { | ||
123 | static size_t size; | ||
124 | |||
125 | /* Lazily learn the true size (minus the trailing NUL). */ | ||
126 | if (size == 0) | ||
127 | size = hv_confstr(HV_CONFSTR_HV_CONFIG, 0, 0) - 1; | ||
128 | |||
129 | /* Check and adjust input parameters. */ | ||
130 | if (off > size) | ||
131 | return -EINVAL; | ||
132 | if (count > size - off) | ||
133 | count = size - off; | ||
134 | |||
135 | if (count) { | ||
136 | /* Get a copy of the hvc and copy out the relevant portion. */ | ||
137 | char *hvc; | ||
138 | |||
139 | size = off + count; | ||
140 | hvc = kmalloc(size, GFP_KERNEL); | ||
141 | if (hvc == NULL) | ||
142 | return -ENOMEM; | ||
143 | hv_confstr(HV_CONFSTR_HV_CONFIG, (unsigned long)hvc, size); | ||
144 | memcpy(buf, hvc + off, count); | ||
145 | kfree(hvc); | ||
146 | } | ||
147 | |||
148 | return count; | ||
149 | } | ||
150 | |||
151 | static int __init create_sysfs_entries(void) | ||
152 | { | ||
153 | struct sysdev_class *cls = &cpu_sysdev_class; | ||
154 | int err = 0; | ||
155 | |||
156 | #define create_cpu_attr(name) \ | ||
157 | if (!err) \ | ||
158 | err = sysfs_create_file(&cls->kset.kobj, &attr_##name.attr); | ||
159 | create_cpu_attr(chip_width); | ||
160 | create_cpu_attr(chip_height); | ||
161 | create_cpu_attr(chip_serial); | ||
162 | create_cpu_attr(chip_revision); | ||
163 | |||
164 | #define create_hv_attr(name) \ | ||
165 | if (!err) \ | ||
166 | err = sysfs_create_file(hypervisor_kobj, &attr_##name.attr); | ||
167 | create_hv_attr(type); | ||
168 | create_hv_attr(version); | ||
169 | create_hv_attr(config_version); | ||
170 | |||
171 | if (!err) | ||
172 | err = sysfs_create_group(hypervisor_kobj, &board_attr_group); | ||
173 | |||
174 | if (!err) { | ||
175 | sysfs_bin_attr_init(&hvconfig_bin); | ||
176 | hvconfig_bin.attr.name = "hvconfig"; | ||
177 | hvconfig_bin.attr.mode = S_IRUGO; | ||
178 | hvconfig_bin.read = hvconfig_bin_read; | ||
179 | hvconfig_bin.size = PAGE_SIZE; | ||
180 | err = sysfs_create_bin_file(hypervisor_kobj, &hvconfig_bin); | ||
181 | } | ||
182 | |||
183 | return err; | ||
184 | } | ||
185 | subsys_initcall(create_sysfs_entries); | ||
diff --git a/arch/um/Kconfig.x86 b/arch/um/Kconfig.x86 index 795ea8e869f4..8aae429a56e2 100644 --- a/arch/um/Kconfig.x86 +++ b/arch/um/Kconfig.x86 | |||
@@ -15,7 +15,6 @@ endmenu | |||
15 | config UML_X86 | 15 | config UML_X86 |
16 | def_bool y | 16 | def_bool y |
17 | select GENERIC_FIND_FIRST_BIT | 17 | select GENERIC_FIND_FIRST_BIT |
18 | select GENERIC_FIND_NEXT_BIT | ||
19 | 18 | ||
20 | config 64BIT | 19 | config 64BIT |
21 | bool | 20 | bool |
diff --git a/arch/unicore32/include/asm/suspend.h b/arch/unicore32/include/asm/suspend.h index 88a9c0f32b21..65bad75c7e96 100644 --- a/arch/unicore32/include/asm/suspend.h +++ b/arch/unicore32/include/asm/suspend.h | |||
@@ -14,7 +14,6 @@ | |||
14 | #define __UNICORE_SUSPEND_H__ | 14 | #define __UNICORE_SUSPEND_H__ |
15 | 15 | ||
16 | #ifndef __ASSEMBLY__ | 16 | #ifndef __ASSEMBLY__ |
17 | static inline int arch_prepare_suspend(void) { return 0; } | ||
18 | 17 | ||
19 | #include <asm/ptrace.h> | 18 | #include <asm/ptrace.h> |
20 | 19 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 483775f42d2a..da349723d411 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -64,7 +64,6 @@ config X86 | |||
64 | select HAVE_GENERIC_HARDIRQS | 64 | select HAVE_GENERIC_HARDIRQS |
65 | select HAVE_SPARSE_IRQ | 65 | select HAVE_SPARSE_IRQ |
66 | select GENERIC_FIND_FIRST_BIT | 66 | select GENERIC_FIND_FIRST_BIT |
67 | select GENERIC_FIND_NEXT_BIT | ||
68 | select GENERIC_IRQ_PROBE | 67 | select GENERIC_IRQ_PROBE |
69 | select GENERIC_PENDING_IRQ if SMP | 68 | select GENERIC_PENDING_IRQ if SMP |
70 | select GENERIC_IRQ_SHOW | 69 | select GENERIC_IRQ_SHOW |
diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig index 6f9872658dd2..2bf18059fbea 100644 --- a/arch/x86/configs/i386_defconfig +++ b/arch/x86/configs/i386_defconfig | |||
@@ -10,7 +10,6 @@ CONFIG_TASK_IO_ACCOUNTING=y | |||
10 | CONFIG_AUDIT=y | 10 | CONFIG_AUDIT=y |
11 | CONFIG_LOG_BUF_SHIFT=18 | 11 | CONFIG_LOG_BUF_SHIFT=18 |
12 | CONFIG_CGROUPS=y | 12 | CONFIG_CGROUPS=y |
13 | CONFIG_CGROUP_NS=y | ||
14 | CONFIG_CGROUP_FREEZER=y | 13 | CONFIG_CGROUP_FREEZER=y |
15 | CONFIG_CPUSETS=y | 14 | CONFIG_CPUSETS=y |
16 | CONFIG_CGROUP_CPUACCT=y | 15 | CONFIG_CGROUP_CPUACCT=y |
diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig index ee01a9d5d4f0..22a0dc8e51dd 100644 --- a/arch/x86/configs/x86_64_defconfig +++ b/arch/x86/configs/x86_64_defconfig | |||
@@ -11,7 +11,6 @@ CONFIG_TASK_IO_ACCOUNTING=y | |||
11 | CONFIG_AUDIT=y | 11 | CONFIG_AUDIT=y |
12 | CONFIG_LOG_BUF_SHIFT=18 | 12 | CONFIG_LOG_BUF_SHIFT=18 |
13 | CONFIG_CGROUPS=y | 13 | CONFIG_CGROUPS=y |
14 | CONFIG_CGROUP_NS=y | ||
15 | CONFIG_CGROUP_FREEZER=y | 14 | CONFIG_CGROUP_FREEZER=y |
16 | CONFIG_CPUSETS=y | 15 | CONFIG_CPUSETS=y |
17 | CONFIG_CGROUP_CPUACCT=y | 16 | CONFIG_CGROUP_CPUACCT=y |
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 95f5826be458..c1870dddd322 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -849,4 +849,5 @@ ia32_sys_call_table: | |||
849 | .quad compat_sys_clock_adjtime | 849 | .quad compat_sys_clock_adjtime |
850 | .quad sys_syncfs | 850 | .quad sys_syncfs |
851 | .quad compat_sys_sendmmsg /* 345 */ | 851 | .quad compat_sys_sendmmsg /* 345 */ |
852 | .quad sys_setns | ||
852 | ia32_syscall_end: | 853 | ia32_syscall_end: |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 416d865eae39..610001d385dd 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
@@ -139,7 +139,7 @@ static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate) | |||
139 | boot_cpu_data.x86_model <= 0x05 && | 139 | boot_cpu_data.x86_model <= 0x05 && |
140 | boot_cpu_data.x86_mask < 0x0A) | 140 | boot_cpu_data.x86_mask < 0x0A) |
141 | return 1; | 141 | return 1; |
142 | else if (c1e_detected) | 142 | else if (amd_e400_c1e_detected) |
143 | return 1; | 143 | return 1; |
144 | else | 144 | else |
145 | return max_cstate; | 145 | return max_cstate; |
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 5dc6acc98dbd..71cc3800712c 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -125,7 +125,7 @@ | |||
125 | #define X86_FEATURE_OSXSAVE (4*32+27) /* "" XSAVE enabled in the OS */ | 125 | #define X86_FEATURE_OSXSAVE (4*32+27) /* "" XSAVE enabled in the OS */ |
126 | #define X86_FEATURE_AVX (4*32+28) /* Advanced Vector Extensions */ | 126 | #define X86_FEATURE_AVX (4*32+28) /* Advanced Vector Extensions */ |
127 | #define X86_FEATURE_F16C (4*32+29) /* 16-bit fp conversions */ | 127 | #define X86_FEATURE_F16C (4*32+29) /* 16-bit fp conversions */ |
128 | #define X86_FEATURE_RDRND (4*32+30) /* The RDRAND instruction */ | 128 | #define X86_FEATURE_RDRAND (4*32+30) /* The RDRAND instruction */ |
129 | #define X86_FEATURE_HYPERVISOR (4*32+31) /* Running on a hypervisor */ | 129 | #define X86_FEATURE_HYPERVISOR (4*32+31) /* Running on a hypervisor */ |
130 | 130 | ||
131 | /* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */ | 131 | /* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */ |
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h index 617bd56b3070..7b439d9aea2a 100644 --- a/arch/x86/include/asm/desc.h +++ b/arch/x86/include/asm/desc.h | |||
@@ -4,30 +4,33 @@ | |||
4 | #include <asm/desc_defs.h> | 4 | #include <asm/desc_defs.h> |
5 | #include <asm/ldt.h> | 5 | #include <asm/ldt.h> |
6 | #include <asm/mmu.h> | 6 | #include <asm/mmu.h> |
7 | |||
7 | #include <linux/smp.h> | 8 | #include <linux/smp.h> |
8 | 9 | ||
9 | static inline void fill_ldt(struct desc_struct *desc, | 10 | static inline void fill_ldt(struct desc_struct *desc, const struct user_desc *info) |
10 | const struct user_desc *info) | 11 | { |
11 | { | 12 | desc->limit0 = info->limit & 0x0ffff; |
12 | desc->limit0 = info->limit & 0x0ffff; | 13 | |
13 | desc->base0 = info->base_addr & 0x0000ffff; | 14 | desc->base0 = (info->base_addr & 0x0000ffff); |
14 | 15 | desc->base1 = (info->base_addr & 0x00ff0000) >> 16; | |
15 | desc->base1 = (info->base_addr & 0x00ff0000) >> 16; | 16 | |
16 | desc->type = (info->read_exec_only ^ 1) << 1; | 17 | desc->type = (info->read_exec_only ^ 1) << 1; |
17 | desc->type |= info->contents << 2; | 18 | desc->type |= info->contents << 2; |
18 | desc->s = 1; | 19 | |
19 | desc->dpl = 0x3; | 20 | desc->s = 1; |
20 | desc->p = info->seg_not_present ^ 1; | 21 | desc->dpl = 0x3; |
21 | desc->limit = (info->limit & 0xf0000) >> 16; | 22 | desc->p = info->seg_not_present ^ 1; |
22 | desc->avl = info->useable; | 23 | desc->limit = (info->limit & 0xf0000) >> 16; |
23 | desc->d = info->seg_32bit; | 24 | desc->avl = info->useable; |
24 | desc->g = info->limit_in_pages; | 25 | desc->d = info->seg_32bit; |
25 | desc->base2 = (info->base_addr & 0xff000000) >> 24; | 26 | desc->g = info->limit_in_pages; |
27 | |||
28 | desc->base2 = (info->base_addr & 0xff000000) >> 24; | ||
26 | /* | 29 | /* |
27 | * Don't allow setting of the lm bit. It is useless anyway | 30 | * Don't allow setting of the lm bit. It is useless anyway |
28 | * because 64bit system calls require __USER_CS: | 31 | * because 64bit system calls require __USER_CS: |
29 | */ | 32 | */ |
30 | desc->l = 0; | 33 | desc->l = 0; |
31 | } | 34 | } |
32 | 35 | ||
33 | extern struct desc_ptr idt_descr; | 36 | extern struct desc_ptr idt_descr; |
@@ -36,6 +39,7 @@ extern gate_desc idt_table[]; | |||
36 | struct gdt_page { | 39 | struct gdt_page { |
37 | struct desc_struct gdt[GDT_ENTRIES]; | 40 | struct desc_struct gdt[GDT_ENTRIES]; |
38 | } __attribute__((aligned(PAGE_SIZE))); | 41 | } __attribute__((aligned(PAGE_SIZE))); |
42 | |||
39 | DECLARE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page); | 43 | DECLARE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page); |
40 | 44 | ||
41 | static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu) | 45 | static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu) |
@@ -48,16 +52,16 @@ static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu) | |||
48 | static inline void pack_gate(gate_desc *gate, unsigned type, unsigned long func, | 52 | static inline void pack_gate(gate_desc *gate, unsigned type, unsigned long func, |
49 | unsigned dpl, unsigned ist, unsigned seg) | 53 | unsigned dpl, unsigned ist, unsigned seg) |
50 | { | 54 | { |
51 | gate->offset_low = PTR_LOW(func); | 55 | gate->offset_low = PTR_LOW(func); |
52 | gate->segment = __KERNEL_CS; | 56 | gate->segment = __KERNEL_CS; |
53 | gate->ist = ist; | 57 | gate->ist = ist; |
54 | gate->p = 1; | 58 | gate->p = 1; |
55 | gate->dpl = dpl; | 59 | gate->dpl = dpl; |
56 | gate->zero0 = 0; | 60 | gate->zero0 = 0; |
57 | gate->zero1 = 0; | 61 | gate->zero1 = 0; |
58 | gate->type = type; | 62 | gate->type = type; |
59 | gate->offset_middle = PTR_MIDDLE(func); | 63 | gate->offset_middle = PTR_MIDDLE(func); |
60 | gate->offset_high = PTR_HIGH(func); | 64 | gate->offset_high = PTR_HIGH(func); |
61 | } | 65 | } |
62 | 66 | ||
63 | #else | 67 | #else |
@@ -66,8 +70,7 @@ static inline void pack_gate(gate_desc *gate, unsigned char type, | |||
66 | unsigned short seg) | 70 | unsigned short seg) |
67 | { | 71 | { |
68 | gate->a = (seg << 16) | (base & 0xffff); | 72 | gate->a = (seg << 16) | (base & 0xffff); |
69 | gate->b = (base & 0xffff0000) | | 73 | gate->b = (base & 0xffff0000) | (((0x80 | type | (dpl << 5)) & 0xff) << 8); |
70 | (((0x80 | type | (dpl << 5)) & 0xff) << 8); | ||
71 | } | 74 | } |
72 | 75 | ||
73 | #endif | 76 | #endif |
@@ -75,31 +78,29 @@ static inline void pack_gate(gate_desc *gate, unsigned char type, | |||
75 | static inline int desc_empty(const void *ptr) | 78 | static inline int desc_empty(const void *ptr) |
76 | { | 79 | { |
77 | const u32 *desc = ptr; | 80 | const u32 *desc = ptr; |
81 | |||
78 | return !(desc[0] | desc[1]); | 82 | return !(desc[0] | desc[1]); |
79 | } | 83 | } |
80 | 84 | ||
81 | #ifdef CONFIG_PARAVIRT | 85 | #ifdef CONFIG_PARAVIRT |
82 | #include <asm/paravirt.h> | 86 | #include <asm/paravirt.h> |
83 | #else | 87 | #else |
84 | #define load_TR_desc() native_load_tr_desc() | 88 | #define load_TR_desc() native_load_tr_desc() |
85 | #define load_gdt(dtr) native_load_gdt(dtr) | 89 | #define load_gdt(dtr) native_load_gdt(dtr) |
86 | #define load_idt(dtr) native_load_idt(dtr) | 90 | #define load_idt(dtr) native_load_idt(dtr) |
87 | #define load_tr(tr) asm volatile("ltr %0"::"m" (tr)) | 91 | #define load_tr(tr) asm volatile("ltr %0"::"m" (tr)) |
88 | #define load_ldt(ldt) asm volatile("lldt %0"::"m" (ldt)) | 92 | #define load_ldt(ldt) asm volatile("lldt %0"::"m" (ldt)) |
89 | 93 | ||
90 | #define store_gdt(dtr) native_store_gdt(dtr) | 94 | #define store_gdt(dtr) native_store_gdt(dtr) |
91 | #define store_idt(dtr) native_store_idt(dtr) | 95 | #define store_idt(dtr) native_store_idt(dtr) |
92 | #define store_tr(tr) (tr = native_store_tr()) | 96 | #define store_tr(tr) (tr = native_store_tr()) |
93 | 97 | ||
94 | #define load_TLS(t, cpu) native_load_tls(t, cpu) | 98 | #define load_TLS(t, cpu) native_load_tls(t, cpu) |
95 | #define set_ldt native_set_ldt | 99 | #define set_ldt native_set_ldt |
96 | 100 | ||
97 | #define write_ldt_entry(dt, entry, desc) \ | 101 | #define write_ldt_entry(dt, entry, desc) native_write_ldt_entry(dt, entry, desc) |
98 | native_write_ldt_entry(dt, entry, desc) | 102 | #define write_gdt_entry(dt, entry, desc, type) native_write_gdt_entry(dt, entry, desc, type) |
99 | #define write_gdt_entry(dt, entry, desc, type) \ | 103 | #define write_idt_entry(dt, entry, g) native_write_idt_entry(dt, entry, g) |
100 | native_write_gdt_entry(dt, entry, desc, type) | ||
101 | #define write_idt_entry(dt, entry, g) \ | ||
102 | native_write_idt_entry(dt, entry, g) | ||
103 | 104 | ||
104 | static inline void paravirt_alloc_ldt(struct desc_struct *ldt, unsigned entries) | 105 | static inline void paravirt_alloc_ldt(struct desc_struct *ldt, unsigned entries) |
105 | { | 106 | { |
@@ -112,33 +113,27 @@ static inline void paravirt_free_ldt(struct desc_struct *ldt, unsigned entries) | |||
112 | 113 | ||
113 | #define store_ldt(ldt) asm("sldt %0" : "=m"(ldt)) | 114 | #define store_ldt(ldt) asm("sldt %0" : "=m"(ldt)) |
114 | 115 | ||
115 | static inline void native_write_idt_entry(gate_desc *idt, int entry, | 116 | static inline void native_write_idt_entry(gate_desc *idt, int entry, const gate_desc *gate) |
116 | const gate_desc *gate) | ||
117 | { | 117 | { |
118 | memcpy(&idt[entry], gate, sizeof(*gate)); | 118 | memcpy(&idt[entry], gate, sizeof(*gate)); |
119 | } | 119 | } |
120 | 120 | ||
121 | static inline void native_write_ldt_entry(struct desc_struct *ldt, int entry, | 121 | static inline void native_write_ldt_entry(struct desc_struct *ldt, int entry, const void *desc) |
122 | const void *desc) | ||
123 | { | 122 | { |
124 | memcpy(&ldt[entry], desc, 8); | 123 | memcpy(&ldt[entry], desc, 8); |
125 | } | 124 | } |
126 | 125 | ||
127 | static inline void native_write_gdt_entry(struct desc_struct *gdt, int entry, | 126 | static inline void |
128 | const void *desc, int type) | 127 | native_write_gdt_entry(struct desc_struct *gdt, int entry, const void *desc, int type) |
129 | { | 128 | { |
130 | unsigned int size; | 129 | unsigned int size; |
130 | |||
131 | switch (type) { | 131 | switch (type) { |
132 | case DESC_TSS: | 132 | case DESC_TSS: size = sizeof(tss_desc); break; |
133 | size = sizeof(tss_desc); | 133 | case DESC_LDT: size = sizeof(ldt_desc); break; |
134 | break; | 134 | default: size = sizeof(*gdt); break; |
135 | case DESC_LDT: | ||
136 | size = sizeof(ldt_desc); | ||
137 | break; | ||
138 | default: | ||
139 | size = sizeof(struct desc_struct); | ||
140 | break; | ||
141 | } | 135 | } |
136 | |||
142 | memcpy(&gdt[entry], desc, size); | 137 | memcpy(&gdt[entry], desc, size); |
143 | } | 138 | } |
144 | 139 | ||
@@ -154,20 +149,21 @@ static inline void pack_descriptor(struct desc_struct *desc, unsigned long base, | |||
154 | } | 149 | } |
155 | 150 | ||
156 | 151 | ||
157 | static inline void set_tssldt_descriptor(void *d, unsigned long addr, | 152 | static inline void set_tssldt_descriptor(void *d, unsigned long addr, unsigned type, unsigned size) |
158 | unsigned type, unsigned size) | ||
159 | { | 153 | { |
160 | #ifdef CONFIG_X86_64 | 154 | #ifdef CONFIG_X86_64 |
161 | struct ldttss_desc64 *desc = d; | 155 | struct ldttss_desc64 *desc = d; |
156 | |||
162 | memset(desc, 0, sizeof(*desc)); | 157 | memset(desc, 0, sizeof(*desc)); |
163 | desc->limit0 = size & 0xFFFF; | 158 | |
164 | desc->base0 = PTR_LOW(addr); | 159 | desc->limit0 = size & 0xFFFF; |
165 | desc->base1 = PTR_MIDDLE(addr) & 0xFF; | 160 | desc->base0 = PTR_LOW(addr); |
166 | desc->type = type; | 161 | desc->base1 = PTR_MIDDLE(addr) & 0xFF; |
167 | desc->p = 1; | 162 | desc->type = type; |
168 | desc->limit1 = (size >> 16) & 0xF; | 163 | desc->p = 1; |
169 | desc->base2 = (PTR_MIDDLE(addr) >> 8) & 0xFF; | 164 | desc->limit1 = (size >> 16) & 0xF; |
170 | desc->base3 = PTR_HIGH(addr); | 165 | desc->base2 = (PTR_MIDDLE(addr) >> 8) & 0xFF; |
166 | desc->base3 = PTR_HIGH(addr); | ||
171 | #else | 167 | #else |
172 | pack_descriptor((struct desc_struct *)d, addr, size, 0x80 | type, 0); | 168 | pack_descriptor((struct desc_struct *)d, addr, size, 0x80 | type, 0); |
173 | #endif | 169 | #endif |
@@ -237,14 +233,16 @@ static inline void native_store_idt(struct desc_ptr *dtr) | |||
237 | static inline unsigned long native_store_tr(void) | 233 | static inline unsigned long native_store_tr(void) |
238 | { | 234 | { |
239 | unsigned long tr; | 235 | unsigned long tr; |
236 | |||
240 | asm volatile("str %0":"=r" (tr)); | 237 | asm volatile("str %0":"=r" (tr)); |
238 | |||
241 | return tr; | 239 | return tr; |
242 | } | 240 | } |
243 | 241 | ||
244 | static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | 242 | static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) |
245 | { | 243 | { |
246 | unsigned int i; | ||
247 | struct desc_struct *gdt = get_cpu_gdt_table(cpu); | 244 | struct desc_struct *gdt = get_cpu_gdt_table(cpu); |
245 | unsigned int i; | ||
248 | 246 | ||
249 | for (i = 0; i < GDT_ENTRY_TLS_ENTRIES; i++) | 247 | for (i = 0; i < GDT_ENTRY_TLS_ENTRIES; i++) |
250 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; | 248 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; |
@@ -313,6 +311,7 @@ static inline void _set_gate(int gate, unsigned type, void *addr, | |||
313 | unsigned dpl, unsigned ist, unsigned seg) | 311 | unsigned dpl, unsigned ist, unsigned seg) |
314 | { | 312 | { |
315 | gate_desc s; | 313 | gate_desc s; |
314 | |||
316 | pack_gate(&s, type, (unsigned long)addr, dpl, ist, seg); | 315 | pack_gate(&s, type, (unsigned long)addr, dpl, ist, seg); |
317 | /* | 316 | /* |
318 | * does not need to be atomic because it is only done once at | 317 | * does not need to be atomic because it is only done once at |
@@ -343,8 +342,9 @@ static inline void alloc_system_vector(int vector) | |||
343 | set_bit(vector, used_vectors); | 342 | set_bit(vector, used_vectors); |
344 | if (first_system_vector > vector) | 343 | if (first_system_vector > vector) |
345 | first_system_vector = vector; | 344 | first_system_vector = vector; |
346 | } else | 345 | } else { |
347 | BUG(); | 346 | BUG(); |
347 | } | ||
348 | } | 348 | } |
349 | 349 | ||
350 | static inline void alloc_intr_gate(unsigned int n, void *addr) | 350 | static inline void alloc_intr_gate(unsigned int n, void *addr) |
diff --git a/arch/x86/include/asm/idle.h b/arch/x86/include/asm/idle.h index 38d87379e270..f49253d75710 100644 --- a/arch/x86/include/asm/idle.h +++ b/arch/x86/include/asm/idle.h | |||
@@ -16,6 +16,6 @@ static inline void enter_idle(void) { } | |||
16 | static inline void exit_idle(void) { } | 16 | static inline void exit_idle(void) { } |
17 | #endif /* CONFIG_X86_64 */ | 17 | #endif /* CONFIG_X86_64 */ |
18 | 18 | ||
19 | void c1e_remove_cpu(int cpu); | 19 | void amd_e400_remove_cpu(int cpu); |
20 | 20 | ||
21 | #endif /* _ASM_X86_IDLE_H */ | 21 | #endif /* _ASM_X86_IDLE_H */ |
diff --git a/arch/x86/include/asm/kgdb.h b/arch/x86/include/asm/kgdb.h index 396f5b5fc4d7..77e95f54570a 100644 --- a/arch/x86/include/asm/kgdb.h +++ b/arch/x86/include/asm/kgdb.h | |||
@@ -77,6 +77,7 @@ static inline void arch_kgdb_breakpoint(void) | |||
77 | } | 77 | } |
78 | #define BREAK_INSTR_SIZE 1 | 78 | #define BREAK_INSTR_SIZE 1 |
79 | #define CACHE_FLUSH_IS_SAFE 1 | 79 | #define CACHE_FLUSH_IS_SAFE 1 |
80 | #define GDB_ADJUSTS_BREAK_OFFSET | ||
80 | 81 | ||
81 | extern int kgdb_ll_trap(int cmd, const char *str, | 82 | extern int kgdb_ll_trap(int cmd, const char *str, |
82 | struct pt_regs *regs, long err, int trap, int sig); | 83 | struct pt_regs *regs, long err, int trap, int sig); |
diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h index aeff3e89b222..5f55e6962769 100644 --- a/arch/x86/include/asm/mmu.h +++ b/arch/x86/include/asm/mmu.h | |||
@@ -11,14 +11,14 @@ | |||
11 | typedef struct { | 11 | typedef struct { |
12 | void *ldt; | 12 | void *ldt; |
13 | int size; | 13 | int size; |
14 | struct mutex lock; | ||
15 | void *vdso; | ||
16 | 14 | ||
17 | #ifdef CONFIG_X86_64 | 15 | #ifdef CONFIG_X86_64 |
18 | /* True if mm supports a task running in 32 bit compatibility mode. */ | 16 | /* True if mm supports a task running in 32 bit compatibility mode. */ |
19 | unsigned short ia32_compat; | 17 | unsigned short ia32_compat; |
20 | #endif | 18 | #endif |
21 | 19 | ||
20 | struct mutex lock; | ||
21 | void *vdso; | ||
22 | } mm_context_t; | 22 | } mm_context_t; |
23 | 23 | ||
24 | #ifdef CONFIG_SMP | 24 | #ifdef CONFIG_SMP |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 4c25ab48257b..219371546afd 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -754,10 +754,10 @@ static inline void __sti_mwait(unsigned long eax, unsigned long ecx) | |||
754 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); | 754 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); |
755 | 755 | ||
756 | extern void select_idle_routine(const struct cpuinfo_x86 *c); | 756 | extern void select_idle_routine(const struct cpuinfo_x86 *c); |
757 | extern void init_c1e_mask(void); | 757 | extern void init_amd_e400_c1e_mask(void); |
758 | 758 | ||
759 | extern unsigned long boot_option_idle_override; | 759 | extern unsigned long boot_option_idle_override; |
760 | extern bool c1e_detected; | 760 | extern bool amd_e400_c1e_detected; |
761 | 761 | ||
762 | enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_NOMWAIT, | 762 | enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_NOMWAIT, |
763 | IDLE_POLL, IDLE_FORCE_MWAIT}; | 763 | IDLE_POLL, IDLE_FORCE_MWAIT}; |
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 1babf8adecdf..94e7618fcac8 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
@@ -136,6 +136,7 @@ struct cpuinfo_x86; | |||
136 | struct task_struct; | 136 | struct task_struct; |
137 | 137 | ||
138 | extern unsigned long profile_pc(struct pt_regs *regs); | 138 | extern unsigned long profile_pc(struct pt_regs *regs); |
139 | #define profile_pc profile_pc | ||
139 | 140 | ||
140 | extern unsigned long | 141 | extern unsigned long |
141 | convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); | 142 | convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); |
@@ -202,20 +203,11 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) | |||
202 | #endif | 203 | #endif |
203 | } | 204 | } |
204 | 205 | ||
205 | static inline unsigned long instruction_pointer(struct pt_regs *regs) | 206 | #define GET_IP(regs) ((regs)->ip) |
206 | { | 207 | #define GET_FP(regs) ((regs)->bp) |
207 | return regs->ip; | 208 | #define GET_USP(regs) ((regs)->sp) |
208 | } | ||
209 | |||
210 | static inline unsigned long frame_pointer(struct pt_regs *regs) | ||
211 | { | ||
212 | return regs->bp; | ||
213 | } | ||
214 | 209 | ||
215 | static inline unsigned long user_stack_pointer(struct pt_regs *regs) | 210 | #include <asm-generic/ptrace.h> |
216 | { | ||
217 | return regs->sp; | ||
218 | } | ||
219 | 211 | ||
220 | /* Query offset/name of register from its name/offset */ | 212 | /* Query offset/name of register from its name/offset */ |
221 | extern int regs_query_register_offset(const char *name); | 213 | extern int regs_query_register_offset(const char *name); |
diff --git a/arch/x86/include/asm/suspend_32.h b/arch/x86/include/asm/suspend_32.h index fd921c3a6841..487055c8c1aa 100644 --- a/arch/x86/include/asm/suspend_32.h +++ b/arch/x86/include/asm/suspend_32.h | |||
@@ -9,8 +9,6 @@ | |||
9 | #include <asm/desc.h> | 9 | #include <asm/desc.h> |
10 | #include <asm/i387.h> | 10 | #include <asm/i387.h> |
11 | 11 | ||
12 | static inline int arch_prepare_suspend(void) { return 0; } | ||
13 | |||
14 | /* image of the saved processor state */ | 12 | /* image of the saved processor state */ |
15 | struct saved_context { | 13 | struct saved_context { |
16 | u16 es, fs, gs, ss; | 14 | u16 es, fs, gs, ss; |
diff --git a/arch/x86/include/asm/suspend_64.h b/arch/x86/include/asm/suspend_64.h index 8d942afae681..09b0bf104156 100644 --- a/arch/x86/include/asm/suspend_64.h +++ b/arch/x86/include/asm/suspend_64.h | |||
@@ -9,11 +9,6 @@ | |||
9 | #include <asm/desc.h> | 9 | #include <asm/desc.h> |
10 | #include <asm/i387.h> | 10 | #include <asm/i387.h> |
11 | 11 | ||
12 | static inline int arch_prepare_suspend(void) | ||
13 | { | ||
14 | return 0; | ||
15 | } | ||
16 | |||
17 | /* | 12 | /* |
18 | * Image of the saved processor state, used by the low level ACPI suspend to | 13 | * Image of the saved processor state, used by the low level ACPI suspend to |
19 | * RAM code and by the low level hibernation code. | 14 | * RAM code and by the low level hibernation code. |
diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 83e2efd181e2..9db5583b6d38 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h | |||
@@ -51,6 +51,10 @@ extern int unsynchronized_tsc(void); | |||
51 | extern int check_tsc_unstable(void); | 51 | extern int check_tsc_unstable(void); |
52 | extern unsigned long native_calibrate_tsc(void); | 52 | extern unsigned long native_calibrate_tsc(void); |
53 | 53 | ||
54 | #ifdef CONFIG_X86_64 | ||
55 | extern cycles_t vread_tsc(void); | ||
56 | #endif | ||
57 | |||
54 | /* | 58 | /* |
55 | * Boot-time check whether the TSCs are synchronized across | 59 | * Boot-time check whether the TSCs are synchronized across |
56 | * all CPUs/cores: | 60 | * all CPUs/cores: |
diff --git a/arch/x86/include/asm/unistd_32.h b/arch/x86/include/asm/unistd_32.h index fb6a625c99bf..593485b38ab3 100644 --- a/arch/x86/include/asm/unistd_32.h +++ b/arch/x86/include/asm/unistd_32.h | |||
@@ -351,10 +351,11 @@ | |||
351 | #define __NR_clock_adjtime 343 | 351 | #define __NR_clock_adjtime 343 |
352 | #define __NR_syncfs 344 | 352 | #define __NR_syncfs 344 |
353 | #define __NR_sendmmsg 345 | 353 | #define __NR_sendmmsg 345 |
354 | #define __NR_setns 346 | ||
354 | 355 | ||
355 | #ifdef __KERNEL__ | 356 | #ifdef __KERNEL__ |
356 | 357 | ||
357 | #define NR_syscalls 346 | 358 | #define NR_syscalls 347 |
358 | 359 | ||
359 | #define __ARCH_WANT_IPC_PARSE_VERSION | 360 | #define __ARCH_WANT_IPC_PARSE_VERSION |
360 | #define __ARCH_WANT_OLD_READDIR | 361 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/x86/include/asm/unistd_64.h b/arch/x86/include/asm/unistd_64.h index 79f90eb15aad..705bf139288c 100644 --- a/arch/x86/include/asm/unistd_64.h +++ b/arch/x86/include/asm/unistd_64.h | |||
@@ -679,6 +679,8 @@ __SYSCALL(__NR_clock_adjtime, sys_clock_adjtime) | |||
679 | __SYSCALL(__NR_syncfs, sys_syncfs) | 679 | __SYSCALL(__NR_syncfs, sys_syncfs) |
680 | #define __NR_sendmmsg 307 | 680 | #define __NR_sendmmsg 307 |
681 | __SYSCALL(__NR_sendmmsg, sys_sendmmsg) | 681 | __SYSCALL(__NR_sendmmsg, sys_sendmmsg) |
682 | #define __NR_setns 308 | ||
683 | __SYSCALL(__NR_setns, sys_setns) | ||
682 | 684 | ||
683 | #ifndef __NO_STUBS | 685 | #ifndef __NO_STUBS |
684 | #define __ARCH_WANT_OLD_READDIR | 686 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h index 130f1eeee5fe..a291c40efd43 100644 --- a/arch/x86/include/asm/uv/uv_bau.h +++ b/arch/x86/include/asm/uv/uv_bau.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * SGI UV Broadcast Assist Unit definitions | 6 | * SGI UV Broadcast Assist Unit definitions |
7 | * | 7 | * |
8 | * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2008-2011 Silicon Graphics, Inc. All rights reserved. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #ifndef _ASM_X86_UV_UV_BAU_H | 11 | #ifndef _ASM_X86_UV_UV_BAU_H |
@@ -35,17 +35,20 @@ | |||
35 | 35 | ||
36 | #define MAX_CPUS_PER_UVHUB 64 | 36 | #define MAX_CPUS_PER_UVHUB 64 |
37 | #define MAX_CPUS_PER_SOCKET 32 | 37 | #define MAX_CPUS_PER_SOCKET 32 |
38 | #define UV_ADP_SIZE 64 /* hardware-provided max. */ | 38 | #define ADP_SZ 64 /* hardware-provided max. */ |
39 | #define UV_CPUS_PER_ACT_STATUS 32 /* hardware-provided max. */ | 39 | #define UV_CPUS_PER_AS 32 /* hardware-provided max. */ |
40 | #define UV_ITEMS_PER_DESCRIPTOR 8 | 40 | #define ITEMS_PER_DESC 8 |
41 | /* the 'throttle' to prevent the hardware stay-busy bug */ | 41 | /* the 'throttle' to prevent the hardware stay-busy bug */ |
42 | #define MAX_BAU_CONCURRENT 3 | 42 | #define MAX_BAU_CONCURRENT 3 |
43 | #define UV_ACT_STATUS_MASK 0x3 | 43 | #define UV_ACT_STATUS_MASK 0x3 |
44 | #define UV_ACT_STATUS_SIZE 2 | 44 | #define UV_ACT_STATUS_SIZE 2 |
45 | #define UV_DISTRIBUTION_SIZE 256 | 45 | #define UV_DISTRIBUTION_SIZE 256 |
46 | #define UV_SW_ACK_NPENDING 8 | 46 | #define UV_SW_ACK_NPENDING 8 |
47 | #define UV_NET_ENDPOINT_INTD 0x38 | 47 | #define UV1_NET_ENDPOINT_INTD 0x38 |
48 | #define UV_DESC_BASE_PNODE_SHIFT 49 | 48 | #define UV2_NET_ENDPOINT_INTD 0x28 |
49 | #define UV_NET_ENDPOINT_INTD (is_uv1_hub() ? \ | ||
50 | UV1_NET_ENDPOINT_INTD : UV2_NET_ENDPOINT_INTD) | ||
51 | #define UV_DESC_PSHIFT 49 | ||
49 | #define UV_PAYLOADQ_PNODE_SHIFT 49 | 52 | #define UV_PAYLOADQ_PNODE_SHIFT 49 |
50 | #define UV_PTC_BASENAME "sgi_uv/ptc_statistics" | 53 | #define UV_PTC_BASENAME "sgi_uv/ptc_statistics" |
51 | #define UV_BAU_BASENAME "sgi_uv/bau_tunables" | 54 | #define UV_BAU_BASENAME "sgi_uv/bau_tunables" |
@@ -53,29 +56,64 @@ | |||
53 | #define UV_BAU_TUNABLES_FILE "bau_tunables" | 56 | #define UV_BAU_TUNABLES_FILE "bau_tunables" |
54 | #define WHITESPACE " \t\n" | 57 | #define WHITESPACE " \t\n" |
55 | #define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask)) | 58 | #define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask)) |
56 | #define UV_ENABLE_INTD_SOFT_ACK_MODE_SHIFT 15 | 59 | #define cpubit_isset(cpu, bau_local_cpumask) \ |
57 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHIFT 16 | 60 | test_bit((cpu), (bau_local_cpumask).bits) |
58 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD 0x0000000009UL | 61 | |
59 | /* [19:16] SOFT_ACK timeout period 19: 1 is urgency 7 17:16 1 is multiplier */ | 62 | /* [19:16] SOFT_ACK timeout period 19: 1 is urgency 7 17:16 1 is multiplier */ |
60 | #define BAU_MISC_CONTROL_MULT_MASK 3 | 63 | /* |
64 | * UV2: Bit 19 selects between | ||
65 | * (0): 10 microsecond timebase and | ||
66 | * (1): 80 microseconds | ||
67 | * we're using 655us, similar to UV1: 65 units of 10us | ||
68 | */ | ||
69 | #define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL) | ||
70 | #define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (65*10UL) | ||
71 | |||
72 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD (is_uv1_hub() ? \ | ||
73 | UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD : \ | ||
74 | UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD) | ||
61 | 75 | ||
62 | #define UVH_AGING_PRESCALE_SEL 0x000000b000UL | 76 | #define BAU_MISC_CONTROL_MULT_MASK 3 |
77 | |||
78 | #define UVH_AGING_PRESCALE_SEL 0x000000b000UL | ||
63 | /* [30:28] URGENCY_7 an index into a table of times */ | 79 | /* [30:28] URGENCY_7 an index into a table of times */ |
64 | #define BAU_URGENCY_7_SHIFT 28 | 80 | #define BAU_URGENCY_7_SHIFT 28 |
65 | #define BAU_URGENCY_7_MASK 7 | 81 | #define BAU_URGENCY_7_MASK 7 |
66 | 82 | ||
67 | #define UVH_TRANSACTION_TIMEOUT 0x000000b200UL | 83 | #define UVH_TRANSACTION_TIMEOUT 0x000000b200UL |
68 | /* [45:40] BAU - BAU transaction timeout select - a multiplier */ | 84 | /* [45:40] BAU - BAU transaction timeout select - a multiplier */ |
69 | #define BAU_TRANS_SHIFT 40 | 85 | #define BAU_TRANS_SHIFT 40 |
70 | #define BAU_TRANS_MASK 0x3f | 86 | #define BAU_TRANS_MASK 0x3f |
87 | |||
88 | /* | ||
89 | * shorten some awkward names | ||
90 | */ | ||
91 | #define AS_PUSH_SHIFT UVH_LB_BAU_SB_ACTIVATION_CONTROL_PUSH_SHFT | ||
92 | #define SOFTACK_MSHIFT UVH_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT | ||
93 | #define SOFTACK_PSHIFT UVH_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT | ||
94 | #define SOFTACK_TIMEOUT_PERIOD UV_INTD_SOFT_ACK_TIMEOUT_PERIOD | ||
95 | #define write_gmmr uv_write_global_mmr64 | ||
96 | #define write_lmmr uv_write_local_mmr | ||
97 | #define read_lmmr uv_read_local_mmr | ||
98 | #define read_gmmr uv_read_global_mmr64 | ||
71 | 99 | ||
72 | /* | 100 | /* |
73 | * bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1 | 101 | * bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1 |
74 | */ | 102 | */ |
75 | #define DESC_STATUS_IDLE 0 | 103 | #define DS_IDLE 0 |
76 | #define DESC_STATUS_ACTIVE 1 | 104 | #define DS_ACTIVE 1 |
77 | #define DESC_STATUS_DESTINATION_TIMEOUT 2 | 105 | #define DS_DESTINATION_TIMEOUT 2 |
78 | #define DESC_STATUS_SOURCE_TIMEOUT 3 | 106 | #define DS_SOURCE_TIMEOUT 3 |
107 | /* | ||
108 | * bits put together from HRP_LB_BAU_SB_ACTIVATION_STATUS_0/1/2 | ||
109 | * values 1 and 5 will not occur | ||
110 | */ | ||
111 | #define UV2H_DESC_IDLE 0 | ||
112 | #define UV2H_DESC_DEST_TIMEOUT 2 | ||
113 | #define UV2H_DESC_DEST_STRONG_NACK 3 | ||
114 | #define UV2H_DESC_BUSY 4 | ||
115 | #define UV2H_DESC_SOURCE_TIMEOUT 6 | ||
116 | #define UV2H_DESC_DEST_PUT_ERR 7 | ||
79 | 117 | ||
80 | /* | 118 | /* |
81 | * delay for 'plugged' timeout retries, in microseconds | 119 | * delay for 'plugged' timeout retries, in microseconds |
@@ -86,15 +124,24 @@ | |||
86 | * threshholds at which to use IPI to free resources | 124 | * threshholds at which to use IPI to free resources |
87 | */ | 125 | */ |
88 | /* after this # consecutive 'plugged' timeouts, use IPI to release resources */ | 126 | /* after this # consecutive 'plugged' timeouts, use IPI to release resources */ |
89 | #define PLUGSB4RESET 100 | 127 | #define PLUGSB4RESET 100 |
90 | /* after this many consecutive timeouts, use IPI to release resources */ | 128 | /* after this many consecutive timeouts, use IPI to release resources */ |
91 | #define TIMEOUTSB4RESET 1 | 129 | #define TIMEOUTSB4RESET 1 |
92 | /* at this number uses of IPI to release resources, giveup the request */ | 130 | /* at this number uses of IPI to release resources, giveup the request */ |
93 | #define IPI_RESET_LIMIT 1 | 131 | #define IPI_RESET_LIMIT 1 |
94 | /* after this # consecutive successes, bump up the throttle if it was lowered */ | 132 | /* after this # consecutive successes, bump up the throttle if it was lowered */ |
95 | #define COMPLETE_THRESHOLD 5 | 133 | #define COMPLETE_THRESHOLD 5 |
134 | |||
135 | #define UV_LB_SUBNODEID 0x10 | ||
96 | 136 | ||
97 | #define UV_LB_SUBNODEID 0x10 | 137 | /* these two are the same for UV1 and UV2: */ |
138 | #define UV_SA_SHFT UVH_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT | ||
139 | #define UV_SA_MASK UVH_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_MASK | ||
140 | /* 4 bits of software ack period */ | ||
141 | #define UV2_ACK_MASK 0x7UL | ||
142 | #define UV2_ACK_UNITS_SHFT 3 | ||
143 | #define UV2_LEG_SHFT UV2H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_SHFT | ||
144 | #define UV2_EXT_SHFT UV2H_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_SHFT | ||
98 | 145 | ||
99 | /* | 146 | /* |
100 | * number of entries in the destination side payload queue | 147 | * number of entries in the destination side payload queue |
@@ -115,9 +162,16 @@ | |||
115 | /* | 162 | /* |
116 | * tuning the action when the numalink network is extremely delayed | 163 | * tuning the action when the numalink network is extremely delayed |
117 | */ | 164 | */ |
118 | #define CONGESTED_RESPONSE_US 1000 /* 'long' response time, in microseconds */ | 165 | #define CONGESTED_RESPONSE_US 1000 /* 'long' response time, in |
119 | #define CONGESTED_REPS 10 /* long delays averaged over this many broadcasts */ | 166 | microseconds */ |
120 | #define CONGESTED_PERIOD 30 /* time for the bau to be disabled, in seconds */ | 167 | #define CONGESTED_REPS 10 /* long delays averaged over |
168 | this many broadcasts */ | ||
169 | #define CONGESTED_PERIOD 30 /* time for the bau to be | ||
170 | disabled, in seconds */ | ||
171 | /* see msg_type: */ | ||
172 | #define MSG_NOOP 0 | ||
173 | #define MSG_REGULAR 1 | ||
174 | #define MSG_RETRY 2 | ||
121 | 175 | ||
122 | /* | 176 | /* |
123 | * Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor) | 177 | * Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor) |
@@ -129,8 +183,8 @@ | |||
129 | * 'base_dest_nasid' field of the header corresponds to the | 183 | * 'base_dest_nasid' field of the header corresponds to the |
130 | * destination nodeID associated with that specified bit. | 184 | * destination nodeID associated with that specified bit. |
131 | */ | 185 | */ |
132 | struct bau_target_uvhubmask { | 186 | struct bau_targ_hubmask { |
133 | unsigned long bits[BITS_TO_LONGS(UV_DISTRIBUTION_SIZE)]; | 187 | unsigned long bits[BITS_TO_LONGS(UV_DISTRIBUTION_SIZE)]; |
134 | }; | 188 | }; |
135 | 189 | ||
136 | /* | 190 | /* |
@@ -139,7 +193,7 @@ struct bau_target_uvhubmask { | |||
139 | * enough bits for max. cpu's per uvhub) | 193 | * enough bits for max. cpu's per uvhub) |
140 | */ | 194 | */ |
141 | struct bau_local_cpumask { | 195 | struct bau_local_cpumask { |
142 | unsigned long bits; | 196 | unsigned long bits; |
143 | }; | 197 | }; |
144 | 198 | ||
145 | /* | 199 | /* |
@@ -160,14 +214,14 @@ struct bau_local_cpumask { | |||
160 | * The payload is software-defined for INTD transactions | 214 | * The payload is software-defined for INTD transactions |
161 | */ | 215 | */ |
162 | struct bau_msg_payload { | 216 | struct bau_msg_payload { |
163 | unsigned long address; /* signifies a page or all TLB's | 217 | unsigned long address; /* signifies a page or all |
164 | of the cpu */ | 218 | TLB's of the cpu */ |
165 | /* 64 bits */ | 219 | /* 64 bits */ |
166 | unsigned short sending_cpu; /* filled in by sender */ | 220 | unsigned short sending_cpu; /* filled in by sender */ |
167 | /* 16 bits */ | 221 | /* 16 bits */ |
168 | unsigned short acknowledge_count;/* filled in by destination */ | 222 | unsigned short acknowledge_count; /* filled in by destination */ |
169 | /* 16 bits */ | 223 | /* 16 bits */ |
170 | unsigned int reserved1:32; /* not usable */ | 224 | unsigned int reserved1:32; /* not usable */ |
171 | }; | 225 | }; |
172 | 226 | ||
173 | 227 | ||
@@ -176,93 +230,96 @@ struct bau_msg_payload { | |||
176 | * see table 4.2.3.0.1 in broacast_assist spec. | 230 | * see table 4.2.3.0.1 in broacast_assist spec. |
177 | */ | 231 | */ |
178 | struct bau_msg_header { | 232 | struct bau_msg_header { |
179 | unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ | 233 | unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ |
180 | /* bits 5:0 */ | 234 | /* bits 5:0 */ |
181 | unsigned int base_dest_nasid:15; /* nasid of the */ | 235 | unsigned int base_dest_nasid:15; /* nasid of the first bit */ |
182 | /* bits 20:6 */ /* first bit in uvhub map */ | 236 | /* bits 20:6 */ /* in uvhub map */ |
183 | unsigned int command:8; /* message type */ | 237 | unsigned int command:8; /* message type */ |
184 | /* bits 28:21 */ | 238 | /* bits 28:21 */ |
185 | /* 0x38: SN3net EndPoint Message */ | 239 | /* 0x38: SN3net EndPoint Message */ |
186 | unsigned int rsvd_1:3; /* must be zero */ | 240 | unsigned int rsvd_1:3; /* must be zero */ |
187 | /* bits 31:29 */ | 241 | /* bits 31:29 */ |
188 | /* int will align on 32 bits */ | 242 | /* int will align on 32 bits */ |
189 | unsigned int rsvd_2:9; /* must be zero */ | 243 | unsigned int rsvd_2:9; /* must be zero */ |
190 | /* bits 40:32 */ | 244 | /* bits 40:32 */ |
191 | /* Suppl_A is 56-41 */ | 245 | /* Suppl_A is 56-41 */ |
192 | unsigned int sequence:16;/* message sequence number */ | 246 | unsigned int sequence:16; /* message sequence number */ |
193 | /* bits 56:41 */ /* becomes bytes 16-17 of msg */ | 247 | /* bits 56:41 */ /* becomes bytes 16-17 of msg */ |
194 | /* Address field (96:57) is never used as an | 248 | /* Address field (96:57) is |
195 | address (these are address bits 42:3) */ | 249 | never used as an address |
196 | 250 | (these are address bits | |
197 | unsigned int rsvd_3:1; /* must be zero */ | 251 | 42:3) */ |
252 | |||
253 | unsigned int rsvd_3:1; /* must be zero */ | ||
198 | /* bit 57 */ | 254 | /* bit 57 */ |
199 | /* address bits 27:4 are payload */ | 255 | /* address bits 27:4 are payload */ |
200 | /* these next 24 (58-81) bits become bytes 12-14 of msg */ | 256 | /* these next 24 (58-81) bits become bytes 12-14 of msg */ |
201 | |||
202 | /* bits 65:58 land in byte 12 */ | 257 | /* bits 65:58 land in byte 12 */ |
203 | unsigned int replied_to:1;/* sent as 0 by the source to byte 12 */ | 258 | unsigned int replied_to:1; /* sent as 0 by the source to |
259 | byte 12 */ | ||
204 | /* bit 58 */ | 260 | /* bit 58 */ |
205 | unsigned int msg_type:3; /* software type of the message*/ | 261 | unsigned int msg_type:3; /* software type of the |
262 | message */ | ||
206 | /* bits 61:59 */ | 263 | /* bits 61:59 */ |
207 | unsigned int canceled:1; /* message canceled, resource to be freed*/ | 264 | unsigned int canceled:1; /* message canceled, resource |
265 | is to be freed*/ | ||
208 | /* bit 62 */ | 266 | /* bit 62 */ |
209 | unsigned int payload_1a:1;/* not currently used */ | 267 | unsigned int payload_1a:1; /* not currently used */ |
210 | /* bit 63 */ | 268 | /* bit 63 */ |
211 | unsigned int payload_1b:2;/* not currently used */ | 269 | unsigned int payload_1b:2; /* not currently used */ |
212 | /* bits 65:64 */ | 270 | /* bits 65:64 */ |
213 | 271 | ||
214 | /* bits 73:66 land in byte 13 */ | 272 | /* bits 73:66 land in byte 13 */ |
215 | unsigned int payload_1ca:6;/* not currently used */ | 273 | unsigned int payload_1ca:6; /* not currently used */ |
216 | /* bits 71:66 */ | 274 | /* bits 71:66 */ |
217 | unsigned int payload_1c:2;/* not currently used */ | 275 | unsigned int payload_1c:2; /* not currently used */ |
218 | /* bits 73:72 */ | 276 | /* bits 73:72 */ |
219 | 277 | ||
220 | /* bits 81:74 land in byte 14 */ | 278 | /* bits 81:74 land in byte 14 */ |
221 | unsigned int payload_1d:6;/* not currently used */ | 279 | unsigned int payload_1d:6; /* not currently used */ |
222 | /* bits 79:74 */ | 280 | /* bits 79:74 */ |
223 | unsigned int payload_1e:2;/* not currently used */ | 281 | unsigned int payload_1e:2; /* not currently used */ |
224 | /* bits 81:80 */ | 282 | /* bits 81:80 */ |
225 | 283 | ||
226 | unsigned int rsvd_4:7; /* must be zero */ | 284 | unsigned int rsvd_4:7; /* must be zero */ |
227 | /* bits 88:82 */ | 285 | /* bits 88:82 */ |
228 | unsigned int sw_ack_flag:1;/* software acknowledge flag */ | 286 | unsigned int swack_flag:1; /* software acknowledge flag */ |
229 | /* bit 89 */ | 287 | /* bit 89 */ |
230 | /* INTD trasactions at destination are to | 288 | /* INTD trasactions at |
231 | wait for software acknowledge */ | 289 | destination are to wait for |
232 | unsigned int rsvd_5:6; /* must be zero */ | 290 | software acknowledge */ |
291 | unsigned int rsvd_5:6; /* must be zero */ | ||
233 | /* bits 95:90 */ | 292 | /* bits 95:90 */ |
234 | unsigned int rsvd_6:5; /* must be zero */ | 293 | unsigned int rsvd_6:5; /* must be zero */ |
235 | /* bits 100:96 */ | 294 | /* bits 100:96 */ |
236 | unsigned int int_both:1;/* if 1, interrupt both sockets on the uvhub */ | 295 | unsigned int int_both:1; /* if 1, interrupt both sockets |
296 | on the uvhub */ | ||
237 | /* bit 101*/ | 297 | /* bit 101*/ |
238 | unsigned int fairness:3;/* usually zero */ | 298 | unsigned int fairness:3; /* usually zero */ |
239 | /* bits 104:102 */ | 299 | /* bits 104:102 */ |
240 | unsigned int multilevel:1; /* multi-level multicast format */ | 300 | unsigned int multilevel:1; /* multi-level multicast |
301 | format */ | ||
241 | /* bit 105 */ | 302 | /* bit 105 */ |
242 | /* 0 for TLB: endpoint multi-unicast messages */ | 303 | /* 0 for TLB: endpoint multi-unicast messages */ |
243 | unsigned int chaining:1;/* next descriptor is part of this activation*/ | 304 | unsigned int chaining:1; /* next descriptor is part of |
305 | this activation*/ | ||
244 | /* bit 106 */ | 306 | /* bit 106 */ |
245 | unsigned int rsvd_7:21; /* must be zero */ | 307 | unsigned int rsvd_7:21; /* must be zero */ |
246 | /* bits 127:107 */ | 308 | /* bits 127:107 */ |
247 | }; | 309 | }; |
248 | 310 | ||
249 | /* see msg_type: */ | ||
250 | #define MSG_NOOP 0 | ||
251 | #define MSG_REGULAR 1 | ||
252 | #define MSG_RETRY 2 | ||
253 | |||
254 | /* | 311 | /* |
255 | * The activation descriptor: | 312 | * The activation descriptor: |
256 | * The format of the message to send, plus all accompanying control | 313 | * The format of the message to send, plus all accompanying control |
257 | * Should be 64 bytes | 314 | * Should be 64 bytes |
258 | */ | 315 | */ |
259 | struct bau_desc { | 316 | struct bau_desc { |
260 | struct bau_target_uvhubmask distribution; | 317 | struct bau_targ_hubmask distribution; |
261 | /* | 318 | /* |
262 | * message template, consisting of header and payload: | 319 | * message template, consisting of header and payload: |
263 | */ | 320 | */ |
264 | struct bau_msg_header header; | 321 | struct bau_msg_header header; |
265 | struct bau_msg_payload payload; | 322 | struct bau_msg_payload payload; |
266 | }; | 323 | }; |
267 | /* | 324 | /* |
268 | * -payload-- ---------header------ | 325 | * -payload-- ---------header------ |
@@ -281,59 +338,51 @@ struct bau_desc { | |||
281 | * are 32 bytes (2 micropackets) (256 bits) in length, but contain only 17 | 338 | * are 32 bytes (2 micropackets) (256 bits) in length, but contain only 17 |
282 | * bytes of usable data, including the sw ack vector in byte 15 (bits 127:120) | 339 | * bytes of usable data, including the sw ack vector in byte 15 (bits 127:120) |
283 | * (12 bytes come from bau_msg_payload, 3 from payload_1, 2 from | 340 | * (12 bytes come from bau_msg_payload, 3 from payload_1, 2 from |
284 | * sw_ack_vector and payload_2) | 341 | * swack_vec and payload_2) |
285 | * "Enabling Software Acknowledgment mode (see Section 4.3.3 Software | 342 | * "Enabling Software Acknowledgment mode (see Section 4.3.3 Software |
286 | * Acknowledge Processing) also selects 32 byte (17 bytes usable) payload | 343 | * Acknowledge Processing) also selects 32 byte (17 bytes usable) payload |
287 | * operation." | 344 | * operation." |
288 | */ | 345 | */ |
289 | struct bau_payload_queue_entry { | 346 | struct bau_pq_entry { |
290 | unsigned long address; /* signifies a page or all TLB's | 347 | unsigned long address; /* signifies a page or all TLB's |
291 | of the cpu */ | 348 | of the cpu */ |
292 | /* 64 bits, bytes 0-7 */ | 349 | /* 64 bits, bytes 0-7 */ |
293 | 350 | unsigned short sending_cpu; /* cpu that sent the message */ | |
294 | unsigned short sending_cpu; /* cpu that sent the message */ | ||
295 | /* 16 bits, bytes 8-9 */ | 351 | /* 16 bits, bytes 8-9 */ |
296 | 352 | unsigned short acknowledge_count; /* filled in by destination */ | |
297 | unsigned short acknowledge_count; /* filled in by destination */ | ||
298 | /* 16 bits, bytes 10-11 */ | 353 | /* 16 bits, bytes 10-11 */ |
299 | |||
300 | /* these next 3 bytes come from bits 58-81 of the message header */ | 354 | /* these next 3 bytes come from bits 58-81 of the message header */ |
301 | unsigned short replied_to:1; /* sent as 0 by the source */ | 355 | unsigned short replied_to:1; /* sent as 0 by the source */ |
302 | unsigned short msg_type:3; /* software message type */ | 356 | unsigned short msg_type:3; /* software message type */ |
303 | unsigned short canceled:1; /* sent as 0 by the source */ | 357 | unsigned short canceled:1; /* sent as 0 by the source */ |
304 | unsigned short unused1:3; /* not currently using */ | 358 | unsigned short unused1:3; /* not currently using */ |
305 | /* byte 12 */ | 359 | /* byte 12 */ |
306 | 360 | unsigned char unused2a; /* not currently using */ | |
307 | unsigned char unused2a; /* not currently using */ | ||
308 | /* byte 13 */ | 361 | /* byte 13 */ |
309 | unsigned char unused2; /* not currently using */ | 362 | unsigned char unused2; /* not currently using */ |
310 | /* byte 14 */ | 363 | /* byte 14 */ |
311 | 364 | unsigned char swack_vec; /* filled in by the hardware */ | |
312 | unsigned char sw_ack_vector; /* filled in by the hardware */ | ||
313 | /* byte 15 (bits 127:120) */ | 365 | /* byte 15 (bits 127:120) */ |
314 | 366 | unsigned short sequence; /* message sequence number */ | |
315 | unsigned short sequence; /* message sequence number */ | ||
316 | /* bytes 16-17 */ | 367 | /* bytes 16-17 */ |
317 | unsigned char unused4[2]; /* not currently using bytes 18-19 */ | 368 | unsigned char unused4[2]; /* not currently using bytes 18-19 */ |
318 | /* bytes 18-19 */ | 369 | /* bytes 18-19 */ |
319 | 370 | int number_of_cpus; /* filled in at destination */ | |
320 | int number_of_cpus; /* filled in at destination */ | ||
321 | /* 32 bits, bytes 20-23 (aligned) */ | 371 | /* 32 bits, bytes 20-23 (aligned) */ |
322 | 372 | unsigned char unused5[8]; /* not using */ | |
323 | unsigned char unused5[8]; /* not using */ | ||
324 | /* bytes 24-31 */ | 373 | /* bytes 24-31 */ |
325 | }; | 374 | }; |
326 | 375 | ||
327 | struct msg_desc { | 376 | struct msg_desc { |
328 | struct bau_payload_queue_entry *msg; | 377 | struct bau_pq_entry *msg; |
329 | int msg_slot; | 378 | int msg_slot; |
330 | int sw_ack_slot; | 379 | int swack_slot; |
331 | struct bau_payload_queue_entry *va_queue_first; | 380 | struct bau_pq_entry *queue_first; |
332 | struct bau_payload_queue_entry *va_queue_last; | 381 | struct bau_pq_entry *queue_last; |
333 | }; | 382 | }; |
334 | 383 | ||
335 | struct reset_args { | 384 | struct reset_args { |
336 | int sender; | 385 | int sender; |
337 | }; | 386 | }; |
338 | 387 | ||
339 | /* | 388 | /* |
@@ -341,112 +390,226 @@ struct reset_args { | |||
341 | */ | 390 | */ |
342 | struct ptc_stats { | 391 | struct ptc_stats { |
343 | /* sender statistics */ | 392 | /* sender statistics */ |
344 | unsigned long s_giveup; /* number of fall backs to IPI-style flushes */ | 393 | unsigned long s_giveup; /* number of fall backs to |
345 | unsigned long s_requestor; /* number of shootdown requests */ | 394 | IPI-style flushes */ |
346 | unsigned long s_stimeout; /* source side timeouts */ | 395 | unsigned long s_requestor; /* number of shootdown |
347 | unsigned long s_dtimeout; /* destination side timeouts */ | 396 | requests */ |
348 | unsigned long s_time; /* time spent in sending side */ | 397 | unsigned long s_stimeout; /* source side timeouts */ |
349 | unsigned long s_retriesok; /* successful retries */ | 398 | unsigned long s_dtimeout; /* destination side timeouts */ |
350 | unsigned long s_ntargcpu; /* total number of cpu's targeted */ | 399 | unsigned long s_time; /* time spent in sending side */ |
351 | unsigned long s_ntargself; /* times the sending cpu was targeted */ | 400 | unsigned long s_retriesok; /* successful retries */ |
352 | unsigned long s_ntarglocals; /* targets of cpus on the local blade */ | 401 | unsigned long s_ntargcpu; /* total number of cpu's |
353 | unsigned long s_ntargremotes; /* targets of cpus on remote blades */ | 402 | targeted */ |
354 | unsigned long s_ntarglocaluvhub; /* targets of the local hub */ | 403 | unsigned long s_ntargself; /* times the sending cpu was |
355 | unsigned long s_ntargremoteuvhub; /* remotes hubs targeted */ | 404 | targeted */ |
356 | unsigned long s_ntarguvhub; /* total number of uvhubs targeted */ | 405 | unsigned long s_ntarglocals; /* targets of cpus on the local |
357 | unsigned long s_ntarguvhub16; /* number of times target hubs >= 16*/ | 406 | blade */ |
358 | unsigned long s_ntarguvhub8; /* number of times target hubs >= 8 */ | 407 | unsigned long s_ntargremotes; /* targets of cpus on remote |
359 | unsigned long s_ntarguvhub4; /* number of times target hubs >= 4 */ | 408 | blades */ |
360 | unsigned long s_ntarguvhub2; /* number of times target hubs >= 2 */ | 409 | unsigned long s_ntarglocaluvhub; /* targets of the local hub */ |
361 | unsigned long s_ntarguvhub1; /* number of times target hubs == 1 */ | 410 | unsigned long s_ntargremoteuvhub; /* remotes hubs targeted */ |
362 | unsigned long s_resets_plug; /* ipi-style resets from plug state */ | 411 | unsigned long s_ntarguvhub; /* total number of uvhubs |
363 | unsigned long s_resets_timeout; /* ipi-style resets from timeouts */ | 412 | targeted */ |
364 | unsigned long s_busy; /* status stayed busy past s/w timer */ | 413 | unsigned long s_ntarguvhub16; /* number of times target |
365 | unsigned long s_throttles; /* waits in throttle */ | 414 | hubs >= 16*/ |
366 | unsigned long s_retry_messages; /* retry broadcasts */ | 415 | unsigned long s_ntarguvhub8; /* number of times target |
367 | unsigned long s_bau_reenabled; /* for bau enable/disable */ | 416 | hubs >= 8 */ |
368 | unsigned long s_bau_disabled; /* for bau enable/disable */ | 417 | unsigned long s_ntarguvhub4; /* number of times target |
418 | hubs >= 4 */ | ||
419 | unsigned long s_ntarguvhub2; /* number of times target | ||
420 | hubs >= 2 */ | ||
421 | unsigned long s_ntarguvhub1; /* number of times target | ||
422 | hubs == 1 */ | ||
423 | unsigned long s_resets_plug; /* ipi-style resets from plug | ||
424 | state */ | ||
425 | unsigned long s_resets_timeout; /* ipi-style resets from | ||
426 | timeouts */ | ||
427 | unsigned long s_busy; /* status stayed busy past | ||
428 | s/w timer */ | ||
429 | unsigned long s_throttles; /* waits in throttle */ | ||
430 | unsigned long s_retry_messages; /* retry broadcasts */ | ||
431 | unsigned long s_bau_reenabled; /* for bau enable/disable */ | ||
432 | unsigned long s_bau_disabled; /* for bau enable/disable */ | ||
369 | /* destination statistics */ | 433 | /* destination statistics */ |
370 | unsigned long d_alltlb; /* times all tlb's on this cpu were flushed */ | 434 | unsigned long d_alltlb; /* times all tlb's on this |
371 | unsigned long d_onetlb; /* times just one tlb on this cpu was flushed */ | 435 | cpu were flushed */ |
372 | unsigned long d_multmsg; /* interrupts with multiple messages */ | 436 | unsigned long d_onetlb; /* times just one tlb on this |
373 | unsigned long d_nomsg; /* interrupts with no message */ | 437 | cpu was flushed */ |
374 | unsigned long d_time; /* time spent on destination side */ | 438 | unsigned long d_multmsg; /* interrupts with multiple |
375 | unsigned long d_requestee; /* number of messages processed */ | 439 | messages */ |
376 | unsigned long d_retries; /* number of retry messages processed */ | 440 | unsigned long d_nomsg; /* interrupts with no message */ |
377 | unsigned long d_canceled; /* number of messages canceled by retries */ | 441 | unsigned long d_time; /* time spent on destination |
378 | unsigned long d_nocanceled; /* retries that found nothing to cancel */ | 442 | side */ |
379 | unsigned long d_resets; /* number of ipi-style requests processed */ | 443 | unsigned long d_requestee; /* number of messages |
380 | unsigned long d_rcanceled; /* number of messages canceled by resets */ | 444 | processed */ |
445 | unsigned long d_retries; /* number of retry messages | ||
446 | processed */ | ||
447 | unsigned long d_canceled; /* number of messages canceled | ||
448 | by retries */ | ||
449 | unsigned long d_nocanceled; /* retries that found nothing | ||
450 | to cancel */ | ||
451 | unsigned long d_resets; /* number of ipi-style requests | ||
452 | processed */ | ||
453 | unsigned long d_rcanceled; /* number of messages canceled | ||
454 | by resets */ | ||
455 | }; | ||
456 | |||
457 | struct tunables { | ||
458 | int *tunp; | ||
459 | int deflt; | ||
381 | }; | 460 | }; |
382 | 461 | ||
383 | struct hub_and_pnode { | 462 | struct hub_and_pnode { |
384 | short uvhub; | 463 | short uvhub; |
385 | short pnode; | 464 | short pnode; |
386 | }; | 465 | }; |
466 | |||
467 | struct socket_desc { | ||
468 | short num_cpus; | ||
469 | short cpu_number[MAX_CPUS_PER_SOCKET]; | ||
470 | }; | ||
471 | |||
472 | struct uvhub_desc { | ||
473 | unsigned short socket_mask; | ||
474 | short num_cpus; | ||
475 | short uvhub; | ||
476 | short pnode; | ||
477 | struct socket_desc socket[2]; | ||
478 | }; | ||
479 | |||
387 | /* | 480 | /* |
388 | * one per-cpu; to locate the software tables | 481 | * one per-cpu; to locate the software tables |
389 | */ | 482 | */ |
390 | struct bau_control { | 483 | struct bau_control { |
391 | struct bau_desc *descriptor_base; | 484 | struct bau_desc *descriptor_base; |
392 | struct bau_payload_queue_entry *va_queue_first; | 485 | struct bau_pq_entry *queue_first; |
393 | struct bau_payload_queue_entry *va_queue_last; | 486 | struct bau_pq_entry *queue_last; |
394 | struct bau_payload_queue_entry *bau_msg_head; | 487 | struct bau_pq_entry *bau_msg_head; |
395 | struct bau_control *uvhub_master; | 488 | struct bau_control *uvhub_master; |
396 | struct bau_control *socket_master; | 489 | struct bau_control *socket_master; |
397 | struct ptc_stats *statp; | 490 | struct ptc_stats *statp; |
398 | unsigned long timeout_interval; | 491 | unsigned long timeout_interval; |
399 | unsigned long set_bau_on_time; | 492 | unsigned long set_bau_on_time; |
400 | atomic_t active_descriptor_count; | 493 | atomic_t active_descriptor_count; |
401 | int plugged_tries; | 494 | int plugged_tries; |
402 | int timeout_tries; | 495 | int timeout_tries; |
403 | int ipi_attempts; | 496 | int ipi_attempts; |
404 | int conseccompletes; | 497 | int conseccompletes; |
405 | int baudisabled; | 498 | int baudisabled; |
406 | int set_bau_off; | 499 | int set_bau_off; |
407 | short cpu; | 500 | short cpu; |
408 | short osnode; | 501 | short osnode; |
409 | short uvhub_cpu; | 502 | short uvhub_cpu; |
410 | short uvhub; | 503 | short uvhub; |
411 | short cpus_in_socket; | 504 | short cpus_in_socket; |
412 | short cpus_in_uvhub; | 505 | short cpus_in_uvhub; |
413 | short partition_base_pnode; | 506 | short partition_base_pnode; |
414 | unsigned short message_number; | 507 | unsigned short message_number; |
415 | unsigned short uvhub_quiesce; | 508 | unsigned short uvhub_quiesce; |
416 | short socket_acknowledge_count[DEST_Q_SIZE]; | 509 | short socket_acknowledge_count[DEST_Q_SIZE]; |
417 | cycles_t send_message; | 510 | cycles_t send_message; |
418 | spinlock_t uvhub_lock; | 511 | spinlock_t uvhub_lock; |
419 | spinlock_t queue_lock; | 512 | spinlock_t queue_lock; |
420 | /* tunables */ | 513 | /* tunables */ |
421 | int max_bau_concurrent; | 514 | int max_concurr; |
422 | int max_bau_concurrent_constant; | 515 | int max_concurr_const; |
423 | int plugged_delay; | 516 | int plugged_delay; |
424 | int plugsb4reset; | 517 | int plugsb4reset; |
425 | int timeoutsb4reset; | 518 | int timeoutsb4reset; |
426 | int ipi_reset_limit; | 519 | int ipi_reset_limit; |
427 | int complete_threshold; | 520 | int complete_threshold; |
428 | int congested_response_us; | 521 | int cong_response_us; |
429 | int congested_reps; | 522 | int cong_reps; |
430 | int congested_period; | 523 | int cong_period; |
431 | cycles_t period_time; | 524 | cycles_t period_time; |
432 | long period_requests; | 525 | long period_requests; |
433 | struct hub_and_pnode *target_hub_and_pnode; | 526 | struct hub_and_pnode *thp; |
434 | }; | 527 | }; |
435 | 528 | ||
436 | static inline int bau_uvhub_isset(int uvhub, struct bau_target_uvhubmask *dstp) | 529 | static unsigned long read_mmr_uv2_status(void) |
530 | { | ||
531 | return read_lmmr(UV2H_LB_BAU_SB_ACTIVATION_STATUS_2); | ||
532 | } | ||
533 | |||
534 | static void write_mmr_data_broadcast(int pnode, unsigned long mmr_image) | ||
535 | { | ||
536 | write_gmmr(pnode, UVH_BAU_DATA_BROADCAST, mmr_image); | ||
537 | } | ||
538 | |||
539 | static void write_mmr_descriptor_base(int pnode, unsigned long mmr_image) | ||
540 | { | ||
541 | write_gmmr(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, mmr_image); | ||
542 | } | ||
543 | |||
544 | static void write_mmr_activation(unsigned long index) | ||
545 | { | ||
546 | write_lmmr(UVH_LB_BAU_SB_ACTIVATION_CONTROL, index); | ||
547 | } | ||
548 | |||
549 | static void write_gmmr_activation(int pnode, unsigned long mmr_image) | ||
550 | { | ||
551 | write_gmmr(pnode, UVH_LB_BAU_SB_ACTIVATION_CONTROL, mmr_image); | ||
552 | } | ||
553 | |||
554 | static void write_mmr_payload_first(int pnode, unsigned long mmr_image) | ||
555 | { | ||
556 | write_gmmr(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, mmr_image); | ||
557 | } | ||
558 | |||
559 | static void write_mmr_payload_tail(int pnode, unsigned long mmr_image) | ||
560 | { | ||
561 | write_gmmr(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL, mmr_image); | ||
562 | } | ||
563 | |||
564 | static void write_mmr_payload_last(int pnode, unsigned long mmr_image) | ||
565 | { | ||
566 | write_gmmr(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST, mmr_image); | ||
567 | } | ||
568 | |||
569 | static void write_mmr_misc_control(int pnode, unsigned long mmr_image) | ||
570 | { | ||
571 | write_gmmr(pnode, UVH_LB_BAU_MISC_CONTROL, mmr_image); | ||
572 | } | ||
573 | |||
574 | static unsigned long read_mmr_misc_control(int pnode) | ||
575 | { | ||
576 | return read_gmmr(pnode, UVH_LB_BAU_MISC_CONTROL); | ||
577 | } | ||
578 | |||
579 | static void write_mmr_sw_ack(unsigned long mr) | ||
580 | { | ||
581 | uv_write_local_mmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr); | ||
582 | } | ||
583 | |||
584 | static unsigned long read_mmr_sw_ack(void) | ||
585 | { | ||
586 | return read_lmmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); | ||
587 | } | ||
588 | |||
589 | static unsigned long read_gmmr_sw_ack(int pnode) | ||
590 | { | ||
591 | return read_gmmr(pnode, UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); | ||
592 | } | ||
593 | |||
594 | static void write_mmr_data_config(int pnode, unsigned long mr) | ||
595 | { | ||
596 | uv_write_global_mmr64(pnode, UVH_BAU_DATA_CONFIG, mr); | ||
597 | } | ||
598 | |||
599 | static inline int bau_uvhub_isset(int uvhub, struct bau_targ_hubmask *dstp) | ||
437 | { | 600 | { |
438 | return constant_test_bit(uvhub, &dstp->bits[0]); | 601 | return constant_test_bit(uvhub, &dstp->bits[0]); |
439 | } | 602 | } |
440 | static inline void bau_uvhub_set(int pnode, struct bau_target_uvhubmask *dstp) | 603 | static inline void bau_uvhub_set(int pnode, struct bau_targ_hubmask *dstp) |
441 | { | 604 | { |
442 | __set_bit(pnode, &dstp->bits[0]); | 605 | __set_bit(pnode, &dstp->bits[0]); |
443 | } | 606 | } |
444 | static inline void bau_uvhubs_clear(struct bau_target_uvhubmask *dstp, | 607 | static inline void bau_uvhubs_clear(struct bau_targ_hubmask *dstp, |
445 | int nbits) | 608 | int nbits) |
446 | { | 609 | { |
447 | bitmap_zero(&dstp->bits[0], nbits); | 610 | bitmap_zero(&dstp->bits[0], nbits); |
448 | } | 611 | } |
449 | static inline int bau_uvhub_weight(struct bau_target_uvhubmask *dstp) | 612 | static inline int bau_uvhub_weight(struct bau_targ_hubmask *dstp) |
450 | { | 613 | { |
451 | return bitmap_weight((unsigned long *)&dstp->bits[0], | 614 | return bitmap_weight((unsigned long *)&dstp->bits[0], |
452 | UV_DISTRIBUTION_SIZE); | 615 | UV_DISTRIBUTION_SIZE); |
@@ -457,9 +620,6 @@ static inline void bau_cpubits_clear(struct bau_local_cpumask *dstp, int nbits) | |||
457 | bitmap_zero(&dstp->bits, nbits); | 620 | bitmap_zero(&dstp->bits, nbits); |
458 | } | 621 | } |
459 | 622 | ||
460 | #define cpubit_isset(cpu, bau_local_cpumask) \ | ||
461 | test_bit((cpu), (bau_local_cpumask).bits) | ||
462 | |||
463 | extern void uv_bau_message_intr1(void); | 623 | extern void uv_bau_message_intr1(void); |
464 | extern void uv_bau_timeout_intr1(void); | 624 | extern void uv_bau_timeout_intr1(void); |
465 | 625 | ||
@@ -467,7 +627,7 @@ struct atomic_short { | |||
467 | short counter; | 627 | short counter; |
468 | }; | 628 | }; |
469 | 629 | ||
470 | /** | 630 | /* |
471 | * atomic_read_short - read a short atomic variable | 631 | * atomic_read_short - read a short atomic variable |
472 | * @v: pointer of type atomic_short | 632 | * @v: pointer of type atomic_short |
473 | * | 633 | * |
@@ -478,14 +638,14 @@ static inline int atomic_read_short(const struct atomic_short *v) | |||
478 | return v->counter; | 638 | return v->counter; |
479 | } | 639 | } |
480 | 640 | ||
481 | /** | 641 | /* |
482 | * atomic_add_short_return - add and return a short int | 642 | * atom_asr - add and return a short int |
483 | * @i: short value to add | 643 | * @i: short value to add |
484 | * @v: pointer of type atomic_short | 644 | * @v: pointer of type atomic_short |
485 | * | 645 | * |
486 | * Atomically adds @i to @v and returns @i + @v | 646 | * Atomically adds @i to @v and returns @i + @v |
487 | */ | 647 | */ |
488 | static inline int atomic_add_short_return(short i, struct atomic_short *v) | 648 | static inline int atom_asr(short i, struct atomic_short *v) |
489 | { | 649 | { |
490 | short __i = i; | 650 | short __i = i; |
491 | asm volatile(LOCK_PREFIX "xaddw %0, %1" | 651 | asm volatile(LOCK_PREFIX "xaddw %0, %1" |
@@ -494,4 +654,26 @@ static inline int atomic_add_short_return(short i, struct atomic_short *v) | |||
494 | return i + __i; | 654 | return i + __i; |
495 | } | 655 | } |
496 | 656 | ||
657 | /* | ||
658 | * conditionally add 1 to *v, unless *v is >= u | ||
659 | * return 0 if we cannot add 1 to *v because it is >= u | ||
660 | * return 1 if we can add 1 to *v because it is < u | ||
661 | * the add is atomic | ||
662 | * | ||
663 | * This is close to atomic_add_unless(), but this allows the 'u' value | ||
664 | * to be lowered below the current 'v'. atomic_add_unless can only stop | ||
665 | * on equal. | ||
666 | */ | ||
667 | static inline int atomic_inc_unless_ge(spinlock_t *lock, atomic_t *v, int u) | ||
668 | { | ||
669 | spin_lock(lock); | ||
670 | if (atomic_read(v) >= u) { | ||
671 | spin_unlock(lock); | ||
672 | return 0; | ||
673 | } | ||
674 | atomic_inc(v); | ||
675 | spin_unlock(lock); | ||
676 | return 1; | ||
677 | } | ||
678 | |||
497 | #endif /* _ASM_X86_UV_UV_BAU_H */ | 679 | #endif /* _ASM_X86_UV_UV_BAU_H */ |
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 4298002d0c83..f26544a15214 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
@@ -77,8 +77,9 @@ | |||
77 | * | 77 | * |
78 | * 1111110000000000 | 78 | * 1111110000000000 |
79 | * 5432109876543210 | 79 | * 5432109876543210 |
80 | * pppppppppplc0cch Nehalem-EX | 80 | * pppppppppplc0cch Nehalem-EX (12 bits in hdw reg) |
81 | * ppppppppplcc0cch Westmere-EX | 81 | * ppppppppplcc0cch Westmere-EX (12 bits in hdw reg) |
82 | * pppppppppppcccch SandyBridge (15 bits in hdw reg) | ||
82 | * sssssssssss | 83 | * sssssssssss |
83 | * | 84 | * |
84 | * p = pnode bits | 85 | * p = pnode bits |
@@ -87,7 +88,7 @@ | |||
87 | * h = hyperthread | 88 | * h = hyperthread |
88 | * s = bits that are in the SOCKET_ID CSR | 89 | * s = bits that are in the SOCKET_ID CSR |
89 | * | 90 | * |
90 | * Note: Processor only supports 12 bits in the APICID register. The ACPI | 91 | * Note: Processor may support fewer bits in the APICID register. The ACPI |
91 | * tables hold all 16 bits. Software needs to be aware of this. | 92 | * tables hold all 16 bits. Software needs to be aware of this. |
92 | * | 93 | * |
93 | * Unless otherwise specified, all references to APICID refer to | 94 | * Unless otherwise specified, all references to APICID refer to |
@@ -138,6 +139,8 @@ struct uv_hub_info_s { | |||
138 | unsigned long global_mmr_base; | 139 | unsigned long global_mmr_base; |
139 | unsigned long gpa_mask; | 140 | unsigned long gpa_mask; |
140 | unsigned int gnode_extra; | 141 | unsigned int gnode_extra; |
142 | unsigned char hub_revision; | ||
143 | unsigned char apic_pnode_shift; | ||
141 | unsigned long gnode_upper; | 144 | unsigned long gnode_upper; |
142 | unsigned long lowmem_remap_top; | 145 | unsigned long lowmem_remap_top; |
143 | unsigned long lowmem_remap_base; | 146 | unsigned long lowmem_remap_base; |
@@ -149,13 +152,31 @@ struct uv_hub_info_s { | |||
149 | unsigned char m_val; | 152 | unsigned char m_val; |
150 | unsigned char n_val; | 153 | unsigned char n_val; |
151 | struct uv_scir_s scir; | 154 | struct uv_scir_s scir; |
152 | unsigned char apic_pnode_shift; | ||
153 | }; | 155 | }; |
154 | 156 | ||
155 | DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); | 157 | DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); |
156 | #define uv_hub_info (&__get_cpu_var(__uv_hub_info)) | 158 | #define uv_hub_info (&__get_cpu_var(__uv_hub_info)) |
157 | #define uv_cpu_hub_info(cpu) (&per_cpu(__uv_hub_info, cpu)) | 159 | #define uv_cpu_hub_info(cpu) (&per_cpu(__uv_hub_info, cpu)) |
158 | 160 | ||
161 | /* | ||
162 | * Hub revisions less than UV2_HUB_REVISION_BASE are UV1 hubs. All UV2 | ||
163 | * hubs have revision numbers greater than or equal to UV2_HUB_REVISION_BASE. | ||
164 | * This is a software convention - NOT the hardware revision numbers in | ||
165 | * the hub chip. | ||
166 | */ | ||
167 | #define UV1_HUB_REVISION_BASE 1 | ||
168 | #define UV2_HUB_REVISION_BASE 3 | ||
169 | |||
170 | static inline int is_uv1_hub(void) | ||
171 | { | ||
172 | return uv_hub_info->hub_revision < UV2_HUB_REVISION_BASE; | ||
173 | } | ||
174 | |||
175 | static inline int is_uv2_hub(void) | ||
176 | { | ||
177 | return uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE; | ||
178 | } | ||
179 | |||
159 | union uvh_apicid { | 180 | union uvh_apicid { |
160 | unsigned long v; | 181 | unsigned long v; |
161 | struct uvh_apicid_s { | 182 | struct uvh_apicid_s { |
@@ -180,11 +201,25 @@ union uvh_apicid { | |||
180 | #define UV_PNODE_TO_GNODE(p) ((p) |uv_hub_info->gnode_extra) | 201 | #define UV_PNODE_TO_GNODE(p) ((p) |uv_hub_info->gnode_extra) |
181 | #define UV_PNODE_TO_NASID(p) (UV_PNODE_TO_GNODE(p) << 1) | 202 | #define UV_PNODE_TO_NASID(p) (UV_PNODE_TO_GNODE(p) << 1) |
182 | 203 | ||
183 | #define UV_LOCAL_MMR_BASE 0xf4000000UL | 204 | #define UV1_LOCAL_MMR_BASE 0xf4000000UL |
184 | #define UV_GLOBAL_MMR32_BASE 0xf8000000UL | 205 | #define UV1_GLOBAL_MMR32_BASE 0xf8000000UL |
206 | #define UV1_LOCAL_MMR_SIZE (64UL * 1024 * 1024) | ||
207 | #define UV1_GLOBAL_MMR32_SIZE (64UL * 1024 * 1024) | ||
208 | |||
209 | #define UV2_LOCAL_MMR_BASE 0xfa000000UL | ||
210 | #define UV2_GLOBAL_MMR32_BASE 0xfc000000UL | ||
211 | #define UV2_LOCAL_MMR_SIZE (32UL * 1024 * 1024) | ||
212 | #define UV2_GLOBAL_MMR32_SIZE (32UL * 1024 * 1024) | ||
213 | |||
214 | #define UV_LOCAL_MMR_BASE (is_uv1_hub() ? UV1_LOCAL_MMR_BASE \ | ||
215 | : UV2_LOCAL_MMR_BASE) | ||
216 | #define UV_GLOBAL_MMR32_BASE (is_uv1_hub() ? UV1_GLOBAL_MMR32_BASE \ | ||
217 | : UV2_GLOBAL_MMR32_BASE) | ||
218 | #define UV_LOCAL_MMR_SIZE (is_uv1_hub() ? UV1_LOCAL_MMR_SIZE : \ | ||
219 | UV2_LOCAL_MMR_SIZE) | ||
220 | #define UV_GLOBAL_MMR32_SIZE (is_uv1_hub() ? UV1_GLOBAL_MMR32_SIZE :\ | ||
221 | UV2_GLOBAL_MMR32_SIZE) | ||
185 | #define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base) | 222 | #define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base) |
186 | #define UV_LOCAL_MMR_SIZE (64UL * 1024 * 1024) | ||
187 | #define UV_GLOBAL_MMR32_SIZE (64UL * 1024 * 1024) | ||
188 | 223 | ||
189 | #define UV_GLOBAL_GRU_MMR_BASE 0x4000000 | 224 | #define UV_GLOBAL_GRU_MMR_BASE 0x4000000 |
190 | 225 | ||
@@ -301,6 +336,17 @@ static inline int uv_apicid_to_pnode(int apicid) | |||
301 | } | 336 | } |
302 | 337 | ||
303 | /* | 338 | /* |
339 | * Convert an apicid to the socket number on the blade | ||
340 | */ | ||
341 | static inline int uv_apicid_to_socket(int apicid) | ||
342 | { | ||
343 | if (is_uv1_hub()) | ||
344 | return (apicid >> (uv_hub_info->apic_pnode_shift - 1)) & 1; | ||
345 | else | ||
346 | return 0; | ||
347 | } | ||
348 | |||
349 | /* | ||
304 | * Access global MMRs using the low memory MMR32 space. This region supports | 350 | * Access global MMRs using the low memory MMR32 space. This region supports |
305 | * faster MMR access but not all MMRs are accessible in this space. | 351 | * faster MMR access but not all MMRs are accessible in this space. |
306 | */ | 352 | */ |
@@ -519,14 +565,13 @@ static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) | |||
519 | 565 | ||
520 | /* | 566 | /* |
521 | * Get the minimum revision number of the hub chips within the partition. | 567 | * Get the minimum revision number of the hub chips within the partition. |
522 | * 1 - initial rev 1.0 silicon | 568 | * 1 - UV1 rev 1.0 initial silicon |
523 | * 2 - rev 2.0 production silicon | 569 | * 2 - UV1 rev 2.0 production silicon |
570 | * 3 - UV2 rev 1.0 initial silicon | ||
524 | */ | 571 | */ |
525 | static inline int uv_get_min_hub_revision_id(void) | 572 | static inline int uv_get_min_hub_revision_id(void) |
526 | { | 573 | { |
527 | extern int uv_min_hub_revision_id; | 574 | return uv_hub_info->hub_revision; |
528 | |||
529 | return uv_min_hub_revision_id; | ||
530 | } | 575 | } |
531 | 576 | ||
532 | #endif /* CONFIG_X86_64 */ | 577 | #endif /* CONFIG_X86_64 */ |
diff --git a/arch/x86/include/asm/uv/uv_mmrs.h b/arch/x86/include/asm/uv/uv_mmrs.h index f5bb64a823d7..4be52c863448 100644 --- a/arch/x86/include/asm/uv/uv_mmrs.h +++ b/arch/x86/include/asm/uv/uv_mmrs.h | |||
@@ -11,13 +11,64 @@ | |||
11 | #ifndef _ASM_X86_UV_UV_MMRS_H | 11 | #ifndef _ASM_X86_UV_UV_MMRS_H |
12 | #define _ASM_X86_UV_UV_MMRS_H | 12 | #define _ASM_X86_UV_UV_MMRS_H |
13 | 13 | ||
14 | /* | ||
15 | * This file contains MMR definitions for both UV1 & UV2 hubs. | ||
16 | * | ||
17 | * In general, MMR addresses and structures are identical on both hubs. | ||
18 | * These MMRs are identified as: | ||
19 | * #define UVH_xxx <address> | ||
20 | * union uvh_xxx { | ||
21 | * unsigned long v; | ||
22 | * struct uvh_int_cmpd_s { | ||
23 | * } s; | ||
24 | * }; | ||
25 | * | ||
26 | * If the MMR exists on both hub type but has different addresses or | ||
27 | * contents, the MMR definition is similar to: | ||
28 | * #define UV1H_xxx <uv1 address> | ||
29 | * #define UV2H_xxx <uv2address> | ||
30 | * #define UVH_xxx (is_uv1_hub() ? UV1H_xxx : UV2H_xxx) | ||
31 | * union uvh_xxx { | ||
32 | * unsigned long v; | ||
33 | * struct uv1h_int_cmpd_s { (Common fields only) | ||
34 | * } s; | ||
35 | * struct uv1h_int_cmpd_s { (Full UV1 definition) | ||
36 | * } s1; | ||
37 | * struct uv2h_int_cmpd_s { (Full UV2 definition) | ||
38 | * } s2; | ||
39 | * }; | ||
40 | * | ||
41 | * Only essential difference are enumerated. For example, if the address is | ||
42 | * the same for both UV1 & UV2, only a single #define is generated. Likewise, | ||
43 | * if the contents is the same for both hubs, only the "s" structure is | ||
44 | * generated. | ||
45 | * | ||
46 | * If the MMR exists on ONLY 1 type of hub, no generic definition is | ||
47 | * generated: | ||
48 | * #define UVnH_xxx <uvn address> | ||
49 | * union uvnh_xxx { | ||
50 | * unsigned long v; | ||
51 | * struct uvh_int_cmpd_s { | ||
52 | * } sn; | ||
53 | * }; | ||
54 | */ | ||
55 | |||
14 | #define UV_MMR_ENABLE (1UL << 63) | 56 | #define UV_MMR_ENABLE (1UL << 63) |
15 | 57 | ||
58 | #define UV1_HUB_PART_NUMBER 0x88a5 | ||
59 | #define UV2_HUB_PART_NUMBER 0x8eb8 | ||
60 | |||
61 | /* Compat: if this #define is present, UV headers support UV2 */ | ||
62 | #define UV2_HUB_IS_SUPPORTED 1 | ||
63 | |||
64 | /* KABI compat: if this #define is present, KABI hacks are present */ | ||
65 | #define UV2_HUB_KABI_HACKS 1 | ||
66 | |||
16 | /* ========================================================================= */ | 67 | /* ========================================================================= */ |
17 | /* UVH_BAU_DATA_BROADCAST */ | 68 | /* UVH_BAU_DATA_BROADCAST */ |
18 | /* ========================================================================= */ | 69 | /* ========================================================================= */ |
19 | #define UVH_BAU_DATA_BROADCAST 0x61688UL | 70 | #define UVH_BAU_DATA_BROADCAST 0x61688UL |
20 | #define UVH_BAU_DATA_BROADCAST_32 0x0440 | 71 | #define UVH_BAU_DATA_BROADCAST_32 0x440 |
21 | 72 | ||
22 | #define UVH_BAU_DATA_BROADCAST_ENABLE_SHFT 0 | 73 | #define UVH_BAU_DATA_BROADCAST_ENABLE_SHFT 0 |
23 | #define UVH_BAU_DATA_BROADCAST_ENABLE_MASK 0x0000000000000001UL | 74 | #define UVH_BAU_DATA_BROADCAST_ENABLE_MASK 0x0000000000000001UL |
@@ -34,7 +85,7 @@ union uvh_bau_data_broadcast_u { | |||
34 | /* UVH_BAU_DATA_CONFIG */ | 85 | /* UVH_BAU_DATA_CONFIG */ |
35 | /* ========================================================================= */ | 86 | /* ========================================================================= */ |
36 | #define UVH_BAU_DATA_CONFIG 0x61680UL | 87 | #define UVH_BAU_DATA_CONFIG 0x61680UL |
37 | #define UVH_BAU_DATA_CONFIG_32 0x0438 | 88 | #define UVH_BAU_DATA_CONFIG_32 0x438 |
38 | 89 | ||
39 | #define UVH_BAU_DATA_CONFIG_VECTOR_SHFT 0 | 90 | #define UVH_BAU_DATA_CONFIG_VECTOR_SHFT 0 |
40 | #define UVH_BAU_DATA_CONFIG_VECTOR_MASK 0x00000000000000ffUL | 91 | #define UVH_BAU_DATA_CONFIG_VECTOR_MASK 0x00000000000000ffUL |
@@ -73,125 +124,245 @@ union uvh_bau_data_config_u { | |||
73 | /* UVH_EVENT_OCCURRED0 */ | 124 | /* UVH_EVENT_OCCURRED0 */ |
74 | /* ========================================================================= */ | 125 | /* ========================================================================= */ |
75 | #define UVH_EVENT_OCCURRED0 0x70000UL | 126 | #define UVH_EVENT_OCCURRED0 0x70000UL |
76 | #define UVH_EVENT_OCCURRED0_32 0x005e8 | 127 | #define UVH_EVENT_OCCURRED0_32 0x5e8 |
77 | 128 | ||
78 | #define UVH_EVENT_OCCURRED0_LB_HCERR_SHFT 0 | 129 | #define UV1H_EVENT_OCCURRED0_LB_HCERR_SHFT 0 |
79 | #define UVH_EVENT_OCCURRED0_LB_HCERR_MASK 0x0000000000000001UL | 130 | #define UV1H_EVENT_OCCURRED0_LB_HCERR_MASK 0x0000000000000001UL |
80 | #define UVH_EVENT_OCCURRED0_GR0_HCERR_SHFT 1 | 131 | #define UV1H_EVENT_OCCURRED0_GR0_HCERR_SHFT 1 |
81 | #define UVH_EVENT_OCCURRED0_GR0_HCERR_MASK 0x0000000000000002UL | 132 | #define UV1H_EVENT_OCCURRED0_GR0_HCERR_MASK 0x0000000000000002UL |
82 | #define UVH_EVENT_OCCURRED0_GR1_HCERR_SHFT 2 | 133 | #define UV1H_EVENT_OCCURRED0_GR1_HCERR_SHFT 2 |
83 | #define UVH_EVENT_OCCURRED0_GR1_HCERR_MASK 0x0000000000000004UL | 134 | #define UV1H_EVENT_OCCURRED0_GR1_HCERR_MASK 0x0000000000000004UL |
84 | #define UVH_EVENT_OCCURRED0_LH_HCERR_SHFT 3 | 135 | #define UV1H_EVENT_OCCURRED0_LH_HCERR_SHFT 3 |
85 | #define UVH_EVENT_OCCURRED0_LH_HCERR_MASK 0x0000000000000008UL | 136 | #define UV1H_EVENT_OCCURRED0_LH_HCERR_MASK 0x0000000000000008UL |
86 | #define UVH_EVENT_OCCURRED0_RH_HCERR_SHFT 4 | 137 | #define UV1H_EVENT_OCCURRED0_RH_HCERR_SHFT 4 |
87 | #define UVH_EVENT_OCCURRED0_RH_HCERR_MASK 0x0000000000000010UL | 138 | #define UV1H_EVENT_OCCURRED0_RH_HCERR_MASK 0x0000000000000010UL |
88 | #define UVH_EVENT_OCCURRED0_XN_HCERR_SHFT 5 | 139 | #define UV1H_EVENT_OCCURRED0_XN_HCERR_SHFT 5 |
89 | #define UVH_EVENT_OCCURRED0_XN_HCERR_MASK 0x0000000000000020UL | 140 | #define UV1H_EVENT_OCCURRED0_XN_HCERR_MASK 0x0000000000000020UL |
90 | #define UVH_EVENT_OCCURRED0_SI_HCERR_SHFT 6 | 141 | #define UV1H_EVENT_OCCURRED0_SI_HCERR_SHFT 6 |
91 | #define UVH_EVENT_OCCURRED0_SI_HCERR_MASK 0x0000000000000040UL | 142 | #define UV1H_EVENT_OCCURRED0_SI_HCERR_MASK 0x0000000000000040UL |
92 | #define UVH_EVENT_OCCURRED0_LB_AOERR0_SHFT 7 | 143 | #define UV1H_EVENT_OCCURRED0_LB_AOERR0_SHFT 7 |
93 | #define UVH_EVENT_OCCURRED0_LB_AOERR0_MASK 0x0000000000000080UL | 144 | #define UV1H_EVENT_OCCURRED0_LB_AOERR0_MASK 0x0000000000000080UL |
94 | #define UVH_EVENT_OCCURRED0_GR0_AOERR0_SHFT 8 | 145 | #define UV1H_EVENT_OCCURRED0_GR0_AOERR0_SHFT 8 |
95 | #define UVH_EVENT_OCCURRED0_GR0_AOERR0_MASK 0x0000000000000100UL | 146 | #define UV1H_EVENT_OCCURRED0_GR0_AOERR0_MASK 0x0000000000000100UL |
96 | #define UVH_EVENT_OCCURRED0_GR1_AOERR0_SHFT 9 | 147 | #define UV1H_EVENT_OCCURRED0_GR1_AOERR0_SHFT 9 |
97 | #define UVH_EVENT_OCCURRED0_GR1_AOERR0_MASK 0x0000000000000200UL | 148 | #define UV1H_EVENT_OCCURRED0_GR1_AOERR0_MASK 0x0000000000000200UL |
98 | #define UVH_EVENT_OCCURRED0_LH_AOERR0_SHFT 10 | 149 | #define UV1H_EVENT_OCCURRED0_LH_AOERR0_SHFT 10 |
99 | #define UVH_EVENT_OCCURRED0_LH_AOERR0_MASK 0x0000000000000400UL | 150 | #define UV1H_EVENT_OCCURRED0_LH_AOERR0_MASK 0x0000000000000400UL |
100 | #define UVH_EVENT_OCCURRED0_RH_AOERR0_SHFT 11 | 151 | #define UV1H_EVENT_OCCURRED0_RH_AOERR0_SHFT 11 |
101 | #define UVH_EVENT_OCCURRED0_RH_AOERR0_MASK 0x0000000000000800UL | 152 | #define UV1H_EVENT_OCCURRED0_RH_AOERR0_MASK 0x0000000000000800UL |
102 | #define UVH_EVENT_OCCURRED0_XN_AOERR0_SHFT 12 | 153 | #define UV1H_EVENT_OCCURRED0_XN_AOERR0_SHFT 12 |
103 | #define UVH_EVENT_OCCURRED0_XN_AOERR0_MASK 0x0000000000001000UL | 154 | #define UV1H_EVENT_OCCURRED0_XN_AOERR0_MASK 0x0000000000001000UL |
104 | #define UVH_EVENT_OCCURRED0_SI_AOERR0_SHFT 13 | 155 | #define UV1H_EVENT_OCCURRED0_SI_AOERR0_SHFT 13 |
105 | #define UVH_EVENT_OCCURRED0_SI_AOERR0_MASK 0x0000000000002000UL | 156 | #define UV1H_EVENT_OCCURRED0_SI_AOERR0_MASK 0x0000000000002000UL |
106 | #define UVH_EVENT_OCCURRED0_LB_AOERR1_SHFT 14 | 157 | #define UV1H_EVENT_OCCURRED0_LB_AOERR1_SHFT 14 |
107 | #define UVH_EVENT_OCCURRED0_LB_AOERR1_MASK 0x0000000000004000UL | 158 | #define UV1H_EVENT_OCCURRED0_LB_AOERR1_MASK 0x0000000000004000UL |
108 | #define UVH_EVENT_OCCURRED0_GR0_AOERR1_SHFT 15 | 159 | #define UV1H_EVENT_OCCURRED0_GR0_AOERR1_SHFT 15 |
109 | #define UVH_EVENT_OCCURRED0_GR0_AOERR1_MASK 0x0000000000008000UL | 160 | #define UV1H_EVENT_OCCURRED0_GR0_AOERR1_MASK 0x0000000000008000UL |
110 | #define UVH_EVENT_OCCURRED0_GR1_AOERR1_SHFT 16 | 161 | #define UV1H_EVENT_OCCURRED0_GR1_AOERR1_SHFT 16 |
111 | #define UVH_EVENT_OCCURRED0_GR1_AOERR1_MASK 0x0000000000010000UL | 162 | #define UV1H_EVENT_OCCURRED0_GR1_AOERR1_MASK 0x0000000000010000UL |
112 | #define UVH_EVENT_OCCURRED0_LH_AOERR1_SHFT 17 | 163 | #define UV1H_EVENT_OCCURRED0_LH_AOERR1_SHFT 17 |
113 | #define UVH_EVENT_OCCURRED0_LH_AOERR1_MASK 0x0000000000020000UL | 164 | #define UV1H_EVENT_OCCURRED0_LH_AOERR1_MASK 0x0000000000020000UL |
114 | #define UVH_EVENT_OCCURRED0_RH_AOERR1_SHFT 18 | 165 | #define UV1H_EVENT_OCCURRED0_RH_AOERR1_SHFT 18 |
115 | #define UVH_EVENT_OCCURRED0_RH_AOERR1_MASK 0x0000000000040000UL | 166 | #define UV1H_EVENT_OCCURRED0_RH_AOERR1_MASK 0x0000000000040000UL |
116 | #define UVH_EVENT_OCCURRED0_XN_AOERR1_SHFT 19 | 167 | #define UV1H_EVENT_OCCURRED0_XN_AOERR1_SHFT 19 |
117 | #define UVH_EVENT_OCCURRED0_XN_AOERR1_MASK 0x0000000000080000UL | 168 | #define UV1H_EVENT_OCCURRED0_XN_AOERR1_MASK 0x0000000000080000UL |
118 | #define UVH_EVENT_OCCURRED0_SI_AOERR1_SHFT 20 | 169 | #define UV1H_EVENT_OCCURRED0_SI_AOERR1_SHFT 20 |
119 | #define UVH_EVENT_OCCURRED0_SI_AOERR1_MASK 0x0000000000100000UL | 170 | #define UV1H_EVENT_OCCURRED0_SI_AOERR1_MASK 0x0000000000100000UL |
120 | #define UVH_EVENT_OCCURRED0_RH_VPI_INT_SHFT 21 | 171 | #define UV1H_EVENT_OCCURRED0_RH_VPI_INT_SHFT 21 |
121 | #define UVH_EVENT_OCCURRED0_RH_VPI_INT_MASK 0x0000000000200000UL | 172 | #define UV1H_EVENT_OCCURRED0_RH_VPI_INT_MASK 0x0000000000200000UL |
122 | #define UVH_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_SHFT 22 | 173 | #define UV1H_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_SHFT 22 |
123 | #define UVH_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_MASK 0x0000000000400000UL | 174 | #define UV1H_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_MASK 0x0000000000400000UL |
124 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_0_SHFT 23 | 175 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_0_SHFT 23 |
125 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_0_MASK 0x0000000000800000UL | 176 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_0_MASK 0x0000000000800000UL |
126 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_1_SHFT 24 | 177 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_1_SHFT 24 |
127 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_1_MASK 0x0000000001000000UL | 178 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_1_MASK 0x0000000001000000UL |
128 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_2_SHFT 25 | 179 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_2_SHFT 25 |
129 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_2_MASK 0x0000000002000000UL | 180 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_2_MASK 0x0000000002000000UL |
130 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_3_SHFT 26 | 181 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_3_SHFT 26 |
131 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_3_MASK 0x0000000004000000UL | 182 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_3_MASK 0x0000000004000000UL |
132 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_4_SHFT 27 | 183 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_4_SHFT 27 |
133 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_4_MASK 0x0000000008000000UL | 184 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_4_MASK 0x0000000008000000UL |
134 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_5_SHFT 28 | 185 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_5_SHFT 28 |
135 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_5_MASK 0x0000000010000000UL | 186 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_5_MASK 0x0000000010000000UL |
136 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_6_SHFT 29 | 187 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_6_SHFT 29 |
137 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_6_MASK 0x0000000020000000UL | 188 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_6_MASK 0x0000000020000000UL |
138 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_7_SHFT 30 | 189 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_7_SHFT 30 |
139 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_7_MASK 0x0000000040000000UL | 190 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_7_MASK 0x0000000040000000UL |
140 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_8_SHFT 31 | 191 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_8_SHFT 31 |
141 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_8_MASK 0x0000000080000000UL | 192 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_8_MASK 0x0000000080000000UL |
142 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_9_SHFT 32 | 193 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_9_SHFT 32 |
143 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_9_MASK 0x0000000100000000UL | 194 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_9_MASK 0x0000000100000000UL |
144 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_10_SHFT 33 | 195 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_10_SHFT 33 |
145 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_10_MASK 0x0000000200000000UL | 196 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_10_MASK 0x0000000200000000UL |
146 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_11_SHFT 34 | 197 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_11_SHFT 34 |
147 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_11_MASK 0x0000000400000000UL | 198 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_11_MASK 0x0000000400000000UL |
148 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_12_SHFT 35 | 199 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_12_SHFT 35 |
149 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_12_MASK 0x0000000800000000UL | 200 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_12_MASK 0x0000000800000000UL |
150 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_13_SHFT 36 | 201 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_13_SHFT 36 |
151 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_13_MASK 0x0000001000000000UL | 202 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_13_MASK 0x0000001000000000UL |
152 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_14_SHFT 37 | 203 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_14_SHFT 37 |
153 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_14_MASK 0x0000002000000000UL | 204 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_14_MASK 0x0000002000000000UL |
154 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_15_SHFT 38 | 205 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_15_SHFT 38 |
155 | #define UVH_EVENT_OCCURRED0_LB_IRQ_INT_15_MASK 0x0000004000000000UL | 206 | #define UV1H_EVENT_OCCURRED0_LB_IRQ_INT_15_MASK 0x0000004000000000UL |
156 | #define UVH_EVENT_OCCURRED0_L1_NMI_INT_SHFT 39 | 207 | #define UV1H_EVENT_OCCURRED0_L1_NMI_INT_SHFT 39 |
157 | #define UVH_EVENT_OCCURRED0_L1_NMI_INT_MASK 0x0000008000000000UL | 208 | #define UV1H_EVENT_OCCURRED0_L1_NMI_INT_MASK 0x0000008000000000UL |
158 | #define UVH_EVENT_OCCURRED0_STOP_CLOCK_SHFT 40 | 209 | #define UV1H_EVENT_OCCURRED0_STOP_CLOCK_SHFT 40 |
159 | #define UVH_EVENT_OCCURRED0_STOP_CLOCK_MASK 0x0000010000000000UL | 210 | #define UV1H_EVENT_OCCURRED0_STOP_CLOCK_MASK 0x0000010000000000UL |
160 | #define UVH_EVENT_OCCURRED0_ASIC_TO_L1_SHFT 41 | 211 | #define UV1H_EVENT_OCCURRED0_ASIC_TO_L1_SHFT 41 |
161 | #define UVH_EVENT_OCCURRED0_ASIC_TO_L1_MASK 0x0000020000000000UL | 212 | #define UV1H_EVENT_OCCURRED0_ASIC_TO_L1_MASK 0x0000020000000000UL |
162 | #define UVH_EVENT_OCCURRED0_L1_TO_ASIC_SHFT 42 | 213 | #define UV1H_EVENT_OCCURRED0_L1_TO_ASIC_SHFT 42 |
163 | #define UVH_EVENT_OCCURRED0_L1_TO_ASIC_MASK 0x0000040000000000UL | 214 | #define UV1H_EVENT_OCCURRED0_L1_TO_ASIC_MASK 0x0000040000000000UL |
164 | #define UVH_EVENT_OCCURRED0_LTC_INT_SHFT 43 | 215 | #define UV1H_EVENT_OCCURRED0_LTC_INT_SHFT 43 |
165 | #define UVH_EVENT_OCCURRED0_LTC_INT_MASK 0x0000080000000000UL | 216 | #define UV1H_EVENT_OCCURRED0_LTC_INT_MASK 0x0000080000000000UL |
166 | #define UVH_EVENT_OCCURRED0_LA_SEQ_TRIGGER_SHFT 44 | 217 | #define UV1H_EVENT_OCCURRED0_LA_SEQ_TRIGGER_SHFT 44 |
167 | #define UVH_EVENT_OCCURRED0_LA_SEQ_TRIGGER_MASK 0x0000100000000000UL | 218 | #define UV1H_EVENT_OCCURRED0_LA_SEQ_TRIGGER_MASK 0x0000100000000000UL |
168 | #define UVH_EVENT_OCCURRED0_IPI_INT_SHFT 45 | 219 | #define UV1H_EVENT_OCCURRED0_IPI_INT_SHFT 45 |
169 | #define UVH_EVENT_OCCURRED0_IPI_INT_MASK 0x0000200000000000UL | 220 | #define UV1H_EVENT_OCCURRED0_IPI_INT_MASK 0x0000200000000000UL |
170 | #define UVH_EVENT_OCCURRED0_EXTIO_INT0_SHFT 46 | 221 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT0_SHFT 46 |
171 | #define UVH_EVENT_OCCURRED0_EXTIO_INT0_MASK 0x0000400000000000UL | 222 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT0_MASK 0x0000400000000000UL |
172 | #define UVH_EVENT_OCCURRED0_EXTIO_INT1_SHFT 47 | 223 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT1_SHFT 47 |
173 | #define UVH_EVENT_OCCURRED0_EXTIO_INT1_MASK 0x0000800000000000UL | 224 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT1_MASK 0x0000800000000000UL |
174 | #define UVH_EVENT_OCCURRED0_EXTIO_INT2_SHFT 48 | 225 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT2_SHFT 48 |
175 | #define UVH_EVENT_OCCURRED0_EXTIO_INT2_MASK 0x0001000000000000UL | 226 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT2_MASK 0x0001000000000000UL |
176 | #define UVH_EVENT_OCCURRED0_EXTIO_INT3_SHFT 49 | 227 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT3_SHFT 49 |
177 | #define UVH_EVENT_OCCURRED0_EXTIO_INT3_MASK 0x0002000000000000UL | 228 | #define UV1H_EVENT_OCCURRED0_EXTIO_INT3_MASK 0x0002000000000000UL |
178 | #define UVH_EVENT_OCCURRED0_PROFILE_INT_SHFT 50 | 229 | #define UV1H_EVENT_OCCURRED0_PROFILE_INT_SHFT 50 |
179 | #define UVH_EVENT_OCCURRED0_PROFILE_INT_MASK 0x0004000000000000UL | 230 | #define UV1H_EVENT_OCCURRED0_PROFILE_INT_MASK 0x0004000000000000UL |
180 | #define UVH_EVENT_OCCURRED0_RTC0_SHFT 51 | 231 | #define UV1H_EVENT_OCCURRED0_RTC0_SHFT 51 |
181 | #define UVH_EVENT_OCCURRED0_RTC0_MASK 0x0008000000000000UL | 232 | #define UV1H_EVENT_OCCURRED0_RTC0_MASK 0x0008000000000000UL |
182 | #define UVH_EVENT_OCCURRED0_RTC1_SHFT 52 | 233 | #define UV1H_EVENT_OCCURRED0_RTC1_SHFT 52 |
183 | #define UVH_EVENT_OCCURRED0_RTC1_MASK 0x0010000000000000UL | 234 | #define UV1H_EVENT_OCCURRED0_RTC1_MASK 0x0010000000000000UL |
184 | #define UVH_EVENT_OCCURRED0_RTC2_SHFT 53 | 235 | #define UV1H_EVENT_OCCURRED0_RTC2_SHFT 53 |
185 | #define UVH_EVENT_OCCURRED0_RTC2_MASK 0x0020000000000000UL | 236 | #define UV1H_EVENT_OCCURRED0_RTC2_MASK 0x0020000000000000UL |
186 | #define UVH_EVENT_OCCURRED0_RTC3_SHFT 54 | 237 | #define UV1H_EVENT_OCCURRED0_RTC3_SHFT 54 |
187 | #define UVH_EVENT_OCCURRED0_RTC3_MASK 0x0040000000000000UL | 238 | #define UV1H_EVENT_OCCURRED0_RTC3_MASK 0x0040000000000000UL |
188 | #define UVH_EVENT_OCCURRED0_BAU_DATA_SHFT 55 | 239 | #define UV1H_EVENT_OCCURRED0_BAU_DATA_SHFT 55 |
189 | #define UVH_EVENT_OCCURRED0_BAU_DATA_MASK 0x0080000000000000UL | 240 | #define UV1H_EVENT_OCCURRED0_BAU_DATA_MASK 0x0080000000000000UL |
190 | #define UVH_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_SHFT 56 | 241 | #define UV1H_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_SHFT 56 |
191 | #define UVH_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_MASK 0x0100000000000000UL | 242 | #define UV1H_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_MASK 0x0100000000000000UL |
243 | |||
244 | #define UV2H_EVENT_OCCURRED0_LB_HCERR_SHFT 0 | ||
245 | #define UV2H_EVENT_OCCURRED0_LB_HCERR_MASK 0x0000000000000001UL | ||
246 | #define UV2H_EVENT_OCCURRED0_QP_HCERR_SHFT 1 | ||
247 | #define UV2H_EVENT_OCCURRED0_QP_HCERR_MASK 0x0000000000000002UL | ||
248 | #define UV2H_EVENT_OCCURRED0_RH_HCERR_SHFT 2 | ||
249 | #define UV2H_EVENT_OCCURRED0_RH_HCERR_MASK 0x0000000000000004UL | ||
250 | #define UV2H_EVENT_OCCURRED0_LH0_HCERR_SHFT 3 | ||
251 | #define UV2H_EVENT_OCCURRED0_LH0_HCERR_MASK 0x0000000000000008UL | ||
252 | #define UV2H_EVENT_OCCURRED0_LH1_HCERR_SHFT 4 | ||
253 | #define UV2H_EVENT_OCCURRED0_LH1_HCERR_MASK 0x0000000000000010UL | ||
254 | #define UV2H_EVENT_OCCURRED0_GR0_HCERR_SHFT 5 | ||
255 | #define UV2H_EVENT_OCCURRED0_GR0_HCERR_MASK 0x0000000000000020UL | ||
256 | #define UV2H_EVENT_OCCURRED0_GR1_HCERR_SHFT 6 | ||
257 | #define UV2H_EVENT_OCCURRED0_GR1_HCERR_MASK 0x0000000000000040UL | ||
258 | #define UV2H_EVENT_OCCURRED0_NI0_HCERR_SHFT 7 | ||
259 | #define UV2H_EVENT_OCCURRED0_NI0_HCERR_MASK 0x0000000000000080UL | ||
260 | #define UV2H_EVENT_OCCURRED0_NI1_HCERR_SHFT 8 | ||
261 | #define UV2H_EVENT_OCCURRED0_NI1_HCERR_MASK 0x0000000000000100UL | ||
262 | #define UV2H_EVENT_OCCURRED0_LB_AOERR0_SHFT 9 | ||
263 | #define UV2H_EVENT_OCCURRED0_LB_AOERR0_MASK 0x0000000000000200UL | ||
264 | #define UV2H_EVENT_OCCURRED0_QP_AOERR0_SHFT 10 | ||
265 | #define UV2H_EVENT_OCCURRED0_QP_AOERR0_MASK 0x0000000000000400UL | ||
266 | #define UV2H_EVENT_OCCURRED0_RH_AOERR0_SHFT 11 | ||
267 | #define UV2H_EVENT_OCCURRED0_RH_AOERR0_MASK 0x0000000000000800UL | ||
268 | #define UV2H_EVENT_OCCURRED0_LH0_AOERR0_SHFT 12 | ||
269 | #define UV2H_EVENT_OCCURRED0_LH0_AOERR0_MASK 0x0000000000001000UL | ||
270 | #define UV2H_EVENT_OCCURRED0_LH1_AOERR0_SHFT 13 | ||
271 | #define UV2H_EVENT_OCCURRED0_LH1_AOERR0_MASK 0x0000000000002000UL | ||
272 | #define UV2H_EVENT_OCCURRED0_GR0_AOERR0_SHFT 14 | ||
273 | #define UV2H_EVENT_OCCURRED0_GR0_AOERR0_MASK 0x0000000000004000UL | ||
274 | #define UV2H_EVENT_OCCURRED0_GR1_AOERR0_SHFT 15 | ||
275 | #define UV2H_EVENT_OCCURRED0_GR1_AOERR0_MASK 0x0000000000008000UL | ||
276 | #define UV2H_EVENT_OCCURRED0_XB_AOERR0_SHFT 16 | ||
277 | #define UV2H_EVENT_OCCURRED0_XB_AOERR0_MASK 0x0000000000010000UL | ||
278 | #define UV2H_EVENT_OCCURRED0_RT_AOERR0_SHFT 17 | ||
279 | #define UV2H_EVENT_OCCURRED0_RT_AOERR0_MASK 0x0000000000020000UL | ||
280 | #define UV2H_EVENT_OCCURRED0_NI0_AOERR0_SHFT 18 | ||
281 | #define UV2H_EVENT_OCCURRED0_NI0_AOERR0_MASK 0x0000000000040000UL | ||
282 | #define UV2H_EVENT_OCCURRED0_NI1_AOERR0_SHFT 19 | ||
283 | #define UV2H_EVENT_OCCURRED0_NI1_AOERR0_MASK 0x0000000000080000UL | ||
284 | #define UV2H_EVENT_OCCURRED0_LB_AOERR1_SHFT 20 | ||
285 | #define UV2H_EVENT_OCCURRED0_LB_AOERR1_MASK 0x0000000000100000UL | ||
286 | #define UV2H_EVENT_OCCURRED0_QP_AOERR1_SHFT 21 | ||
287 | #define UV2H_EVENT_OCCURRED0_QP_AOERR1_MASK 0x0000000000200000UL | ||
288 | #define UV2H_EVENT_OCCURRED0_RH_AOERR1_SHFT 22 | ||
289 | #define UV2H_EVENT_OCCURRED0_RH_AOERR1_MASK 0x0000000000400000UL | ||
290 | #define UV2H_EVENT_OCCURRED0_LH0_AOERR1_SHFT 23 | ||
291 | #define UV2H_EVENT_OCCURRED0_LH0_AOERR1_MASK 0x0000000000800000UL | ||
292 | #define UV2H_EVENT_OCCURRED0_LH1_AOERR1_SHFT 24 | ||
293 | #define UV2H_EVENT_OCCURRED0_LH1_AOERR1_MASK 0x0000000001000000UL | ||
294 | #define UV2H_EVENT_OCCURRED0_GR0_AOERR1_SHFT 25 | ||
295 | #define UV2H_EVENT_OCCURRED0_GR0_AOERR1_MASK 0x0000000002000000UL | ||
296 | #define UV2H_EVENT_OCCURRED0_GR1_AOERR1_SHFT 26 | ||
297 | #define UV2H_EVENT_OCCURRED0_GR1_AOERR1_MASK 0x0000000004000000UL | ||
298 | #define UV2H_EVENT_OCCURRED0_XB_AOERR1_SHFT 27 | ||
299 | #define UV2H_EVENT_OCCURRED0_XB_AOERR1_MASK 0x0000000008000000UL | ||
300 | #define UV2H_EVENT_OCCURRED0_RT_AOERR1_SHFT 28 | ||
301 | #define UV2H_EVENT_OCCURRED0_RT_AOERR1_MASK 0x0000000010000000UL | ||
302 | #define UV2H_EVENT_OCCURRED0_NI0_AOERR1_SHFT 29 | ||
303 | #define UV2H_EVENT_OCCURRED0_NI0_AOERR1_MASK 0x0000000020000000UL | ||
304 | #define UV2H_EVENT_OCCURRED0_NI1_AOERR1_SHFT 30 | ||
305 | #define UV2H_EVENT_OCCURRED0_NI1_AOERR1_MASK 0x0000000040000000UL | ||
306 | #define UV2H_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_SHFT 31 | ||
307 | #define UV2H_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_MASK 0x0000000080000000UL | ||
308 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_0_SHFT 32 | ||
309 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_0_MASK 0x0000000100000000UL | ||
310 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_1_SHFT 33 | ||
311 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_1_MASK 0x0000000200000000UL | ||
312 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_2_SHFT 34 | ||
313 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_2_MASK 0x0000000400000000UL | ||
314 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_3_SHFT 35 | ||
315 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_3_MASK 0x0000000800000000UL | ||
316 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_4_SHFT 36 | ||
317 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_4_MASK 0x0000001000000000UL | ||
318 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_5_SHFT 37 | ||
319 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_5_MASK 0x0000002000000000UL | ||
320 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_6_SHFT 38 | ||
321 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_6_MASK 0x0000004000000000UL | ||
322 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_7_SHFT 39 | ||
323 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_7_MASK 0x0000008000000000UL | ||
324 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_8_SHFT 40 | ||
325 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_8_MASK 0x0000010000000000UL | ||
326 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_9_SHFT 41 | ||
327 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_9_MASK 0x0000020000000000UL | ||
328 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_10_SHFT 42 | ||
329 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_10_MASK 0x0000040000000000UL | ||
330 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_11_SHFT 43 | ||
331 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_11_MASK 0x0000080000000000UL | ||
332 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_12_SHFT 44 | ||
333 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_12_MASK 0x0000100000000000UL | ||
334 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_13_SHFT 45 | ||
335 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_13_MASK 0x0000200000000000UL | ||
336 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_14_SHFT 46 | ||
337 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_14_MASK 0x0000400000000000UL | ||
338 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_15_SHFT 47 | ||
339 | #define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_15_MASK 0x0000800000000000UL | ||
340 | #define UV2H_EVENT_OCCURRED0_L1_NMI_INT_SHFT 48 | ||
341 | #define UV2H_EVENT_OCCURRED0_L1_NMI_INT_MASK 0x0001000000000000UL | ||
342 | #define UV2H_EVENT_OCCURRED0_STOP_CLOCK_SHFT 49 | ||
343 | #define UV2H_EVENT_OCCURRED0_STOP_CLOCK_MASK 0x0002000000000000UL | ||
344 | #define UV2H_EVENT_OCCURRED0_ASIC_TO_L1_SHFT 50 | ||
345 | #define UV2H_EVENT_OCCURRED0_ASIC_TO_L1_MASK 0x0004000000000000UL | ||
346 | #define UV2H_EVENT_OCCURRED0_L1_TO_ASIC_SHFT 51 | ||
347 | #define UV2H_EVENT_OCCURRED0_L1_TO_ASIC_MASK 0x0008000000000000UL | ||
348 | #define UV2H_EVENT_OCCURRED0_LA_SEQ_TRIGGER_SHFT 52 | ||
349 | #define UV2H_EVENT_OCCURRED0_LA_SEQ_TRIGGER_MASK 0x0010000000000000UL | ||
350 | #define UV2H_EVENT_OCCURRED0_IPI_INT_SHFT 53 | ||
351 | #define UV2H_EVENT_OCCURRED0_IPI_INT_MASK 0x0020000000000000UL | ||
352 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT0_SHFT 54 | ||
353 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT0_MASK 0x0040000000000000UL | ||
354 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT1_SHFT 55 | ||
355 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT1_MASK 0x0080000000000000UL | ||
356 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT2_SHFT 56 | ||
357 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT2_MASK 0x0100000000000000UL | ||
358 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT3_SHFT 57 | ||
359 | #define UV2H_EVENT_OCCURRED0_EXTIO_INT3_MASK 0x0200000000000000UL | ||
360 | #define UV2H_EVENT_OCCURRED0_PROFILE_INT_SHFT 58 | ||
361 | #define UV2H_EVENT_OCCURRED0_PROFILE_INT_MASK 0x0400000000000000UL | ||
362 | |||
192 | union uvh_event_occurred0_u { | 363 | union uvh_event_occurred0_u { |
193 | unsigned long v; | 364 | unsigned long v; |
194 | struct uvh_event_occurred0_s { | 365 | struct uv1h_event_occurred0_s { |
195 | unsigned long lb_hcerr : 1; /* RW, W1C */ | 366 | unsigned long lb_hcerr : 1; /* RW, W1C */ |
196 | unsigned long gr0_hcerr : 1; /* RW, W1C */ | 367 | unsigned long gr0_hcerr : 1; /* RW, W1C */ |
197 | unsigned long gr1_hcerr : 1; /* RW, W1C */ | 368 | unsigned long gr1_hcerr : 1; /* RW, W1C */ |
@@ -250,14 +421,76 @@ union uvh_event_occurred0_u { | |||
250 | unsigned long bau_data : 1; /* RW, W1C */ | 421 | unsigned long bau_data : 1; /* RW, W1C */ |
251 | unsigned long power_management_req : 1; /* RW, W1C */ | 422 | unsigned long power_management_req : 1; /* RW, W1C */ |
252 | unsigned long rsvd_57_63 : 7; /* */ | 423 | unsigned long rsvd_57_63 : 7; /* */ |
253 | } s; | 424 | } s1; |
425 | struct uv2h_event_occurred0_s { | ||
426 | unsigned long lb_hcerr : 1; /* RW */ | ||
427 | unsigned long qp_hcerr : 1; /* RW */ | ||
428 | unsigned long rh_hcerr : 1; /* RW */ | ||
429 | unsigned long lh0_hcerr : 1; /* RW */ | ||
430 | unsigned long lh1_hcerr : 1; /* RW */ | ||
431 | unsigned long gr0_hcerr : 1; /* RW */ | ||
432 | unsigned long gr1_hcerr : 1; /* RW */ | ||
433 | unsigned long ni0_hcerr : 1; /* RW */ | ||
434 | unsigned long ni1_hcerr : 1; /* RW */ | ||
435 | unsigned long lb_aoerr0 : 1; /* RW */ | ||
436 | unsigned long qp_aoerr0 : 1; /* RW */ | ||
437 | unsigned long rh_aoerr0 : 1; /* RW */ | ||
438 | unsigned long lh0_aoerr0 : 1; /* RW */ | ||
439 | unsigned long lh1_aoerr0 : 1; /* RW */ | ||
440 | unsigned long gr0_aoerr0 : 1; /* RW */ | ||
441 | unsigned long gr1_aoerr0 : 1; /* RW */ | ||
442 | unsigned long xb_aoerr0 : 1; /* RW */ | ||
443 | unsigned long rt_aoerr0 : 1; /* RW */ | ||
444 | unsigned long ni0_aoerr0 : 1; /* RW */ | ||
445 | unsigned long ni1_aoerr0 : 1; /* RW */ | ||
446 | unsigned long lb_aoerr1 : 1; /* RW */ | ||
447 | unsigned long qp_aoerr1 : 1; /* RW */ | ||
448 | unsigned long rh_aoerr1 : 1; /* RW */ | ||
449 | unsigned long lh0_aoerr1 : 1; /* RW */ | ||
450 | unsigned long lh1_aoerr1 : 1; /* RW */ | ||
451 | unsigned long gr0_aoerr1 : 1; /* RW */ | ||
452 | unsigned long gr1_aoerr1 : 1; /* RW */ | ||
453 | unsigned long xb_aoerr1 : 1; /* RW */ | ||
454 | unsigned long rt_aoerr1 : 1; /* RW */ | ||
455 | unsigned long ni0_aoerr1 : 1; /* RW */ | ||
456 | unsigned long ni1_aoerr1 : 1; /* RW */ | ||
457 | unsigned long system_shutdown_int : 1; /* RW */ | ||
458 | unsigned long lb_irq_int_0 : 1; /* RW */ | ||
459 | unsigned long lb_irq_int_1 : 1; /* RW */ | ||
460 | unsigned long lb_irq_int_2 : 1; /* RW */ | ||
461 | unsigned long lb_irq_int_3 : 1; /* RW */ | ||
462 | unsigned long lb_irq_int_4 : 1; /* RW */ | ||
463 | unsigned long lb_irq_int_5 : 1; /* RW */ | ||
464 | unsigned long lb_irq_int_6 : 1; /* RW */ | ||
465 | unsigned long lb_irq_int_7 : 1; /* RW */ | ||
466 | unsigned long lb_irq_int_8 : 1; /* RW */ | ||
467 | unsigned long lb_irq_int_9 : 1; /* RW */ | ||
468 | unsigned long lb_irq_int_10 : 1; /* RW */ | ||
469 | unsigned long lb_irq_int_11 : 1; /* RW */ | ||
470 | unsigned long lb_irq_int_12 : 1; /* RW */ | ||
471 | unsigned long lb_irq_int_13 : 1; /* RW */ | ||
472 | unsigned long lb_irq_int_14 : 1; /* RW */ | ||
473 | unsigned long lb_irq_int_15 : 1; /* RW */ | ||
474 | unsigned long l1_nmi_int : 1; /* RW */ | ||
475 | unsigned long stop_clock : 1; /* RW */ | ||
476 | unsigned long asic_to_l1 : 1; /* RW */ | ||
477 | unsigned long l1_to_asic : 1; /* RW */ | ||
478 | unsigned long la_seq_trigger : 1; /* RW */ | ||
479 | unsigned long ipi_int : 1; /* RW */ | ||
480 | unsigned long extio_int0 : 1; /* RW */ | ||
481 | unsigned long extio_int1 : 1; /* RW */ | ||
482 | unsigned long extio_int2 : 1; /* RW */ | ||
483 | unsigned long extio_int3 : 1; /* RW */ | ||
484 | unsigned long profile_int : 1; /* RW */ | ||
485 | unsigned long rsvd_59_63 : 5; /* */ | ||
486 | } s2; | ||
254 | }; | 487 | }; |
255 | 488 | ||
256 | /* ========================================================================= */ | 489 | /* ========================================================================= */ |
257 | /* UVH_EVENT_OCCURRED0_ALIAS */ | 490 | /* UVH_EVENT_OCCURRED0_ALIAS */ |
258 | /* ========================================================================= */ | 491 | /* ========================================================================= */ |
259 | #define UVH_EVENT_OCCURRED0_ALIAS 0x0000000000070008UL | 492 | #define UVH_EVENT_OCCURRED0_ALIAS 0x0000000000070008UL |
260 | #define UVH_EVENT_OCCURRED0_ALIAS_32 0x005f0 | 493 | #define UVH_EVENT_OCCURRED0_ALIAS_32 0x5f0 |
261 | 494 | ||
262 | /* ========================================================================= */ | 495 | /* ========================================================================= */ |
263 | /* UVH_GR0_TLB_INT0_CONFIG */ | 496 | /* UVH_GR0_TLB_INT0_CONFIG */ |
@@ -432,8 +665,16 @@ union uvh_int_cmpb_u { | |||
432 | /* ========================================================================= */ | 665 | /* ========================================================================= */ |
433 | #define UVH_INT_CMPC 0x22100UL | 666 | #define UVH_INT_CMPC 0x22100UL |
434 | 667 | ||
435 | #define UVH_INT_CMPC_REAL_TIME_CMPC_SHFT 0 | 668 | #define UV1H_INT_CMPC_REAL_TIME_CMPC_SHFT 0 |
436 | #define UVH_INT_CMPC_REAL_TIME_CMPC_MASK 0x00ffffffffffffffUL | 669 | #define UV2H_INT_CMPC_REAL_TIME_CMPC_SHFT 0 |
670 | #define UVH_INT_CMPC_REAL_TIME_CMPC_SHFT (is_uv1_hub() ? \ | ||
671 | UV1H_INT_CMPC_REAL_TIME_CMPC_SHFT : \ | ||
672 | UV2H_INT_CMPC_REAL_TIME_CMPC_SHFT) | ||
673 | #define UV1H_INT_CMPC_REAL_TIME_CMPC_MASK 0xffffffffffffffUL | ||
674 | #define UV2H_INT_CMPC_REAL_TIME_CMPC_MASK 0xffffffffffffffUL | ||
675 | #define UVH_INT_CMPC_REAL_TIME_CMPC_MASK (is_uv1_hub() ? \ | ||
676 | UV1H_INT_CMPC_REAL_TIME_CMPC_MASK : \ | ||
677 | UV2H_INT_CMPC_REAL_TIME_CMPC_MASK) | ||
437 | 678 | ||
438 | union uvh_int_cmpc_u { | 679 | union uvh_int_cmpc_u { |
439 | unsigned long v; | 680 | unsigned long v; |
@@ -448,8 +689,16 @@ union uvh_int_cmpc_u { | |||
448 | /* ========================================================================= */ | 689 | /* ========================================================================= */ |
449 | #define UVH_INT_CMPD 0x22180UL | 690 | #define UVH_INT_CMPD 0x22180UL |
450 | 691 | ||
451 | #define UVH_INT_CMPD_REAL_TIME_CMPD_SHFT 0 | 692 | #define UV1H_INT_CMPD_REAL_TIME_CMPD_SHFT 0 |
452 | #define UVH_INT_CMPD_REAL_TIME_CMPD_MASK 0x00ffffffffffffffUL | 693 | #define UV2H_INT_CMPD_REAL_TIME_CMPD_SHFT 0 |
694 | #define UVH_INT_CMPD_REAL_TIME_CMPD_SHFT (is_uv1_hub() ? \ | ||
695 | UV1H_INT_CMPD_REAL_TIME_CMPD_SHFT : \ | ||
696 | UV2H_INT_CMPD_REAL_TIME_CMPD_SHFT) | ||
697 | #define UV1H_INT_CMPD_REAL_TIME_CMPD_MASK 0xffffffffffffffUL | ||
698 | #define UV2H_INT_CMPD_REAL_TIME_CMPD_MASK 0xffffffffffffffUL | ||
699 | #define UVH_INT_CMPD_REAL_TIME_CMPD_MASK (is_uv1_hub() ? \ | ||
700 | UV1H_INT_CMPD_REAL_TIME_CMPD_MASK : \ | ||
701 | UV2H_INT_CMPD_REAL_TIME_CMPD_MASK) | ||
453 | 702 | ||
454 | union uvh_int_cmpd_u { | 703 | union uvh_int_cmpd_u { |
455 | unsigned long v; | 704 | unsigned long v; |
@@ -463,7 +712,7 @@ union uvh_int_cmpd_u { | |||
463 | /* UVH_IPI_INT */ | 712 | /* UVH_IPI_INT */ |
464 | /* ========================================================================= */ | 713 | /* ========================================================================= */ |
465 | #define UVH_IPI_INT 0x60500UL | 714 | #define UVH_IPI_INT 0x60500UL |
466 | #define UVH_IPI_INT_32 0x0348 | 715 | #define UVH_IPI_INT_32 0x348 |
467 | 716 | ||
468 | #define UVH_IPI_INT_VECTOR_SHFT 0 | 717 | #define UVH_IPI_INT_VECTOR_SHFT 0 |
469 | #define UVH_IPI_INT_VECTOR_MASK 0x00000000000000ffUL | 718 | #define UVH_IPI_INT_VECTOR_MASK 0x00000000000000ffUL |
@@ -493,7 +742,7 @@ union uvh_ipi_int_u { | |||
493 | /* UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST */ | 742 | /* UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST */ |
494 | /* ========================================================================= */ | 743 | /* ========================================================================= */ |
495 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST 0x320050UL | 744 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST 0x320050UL |
496 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_32 0x009c0 | 745 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_32 0x9c0 |
497 | 746 | ||
498 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_ADDRESS_SHFT 4 | 747 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_ADDRESS_SHFT 4 |
499 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_ADDRESS_MASK 0x000007fffffffff0UL | 748 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_ADDRESS_MASK 0x000007fffffffff0UL |
@@ -515,7 +764,7 @@ union uvh_lb_bau_intd_payload_queue_first_u { | |||
515 | /* UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST */ | 764 | /* UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST */ |
516 | /* ========================================================================= */ | 765 | /* ========================================================================= */ |
517 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST 0x320060UL | 766 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST 0x320060UL |
518 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_32 0x009c8 | 767 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_32 0x9c8 |
519 | 768 | ||
520 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_ADDRESS_SHFT 4 | 769 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_ADDRESS_SHFT 4 |
521 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_ADDRESS_MASK 0x000007fffffffff0UL | 770 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_ADDRESS_MASK 0x000007fffffffff0UL |
@@ -533,7 +782,7 @@ union uvh_lb_bau_intd_payload_queue_last_u { | |||
533 | /* UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL */ | 782 | /* UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL */ |
534 | /* ========================================================================= */ | 783 | /* ========================================================================= */ |
535 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL 0x320070UL | 784 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL 0x320070UL |
536 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_32 0x009d0 | 785 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_32 0x9d0 |
537 | 786 | ||
538 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_ADDRESS_SHFT 4 | 787 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_ADDRESS_SHFT 4 |
539 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_ADDRESS_MASK 0x000007fffffffff0UL | 788 | #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_ADDRESS_MASK 0x000007fffffffff0UL |
@@ -551,7 +800,7 @@ union uvh_lb_bau_intd_payload_queue_tail_u { | |||
551 | /* UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE */ | 800 | /* UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE */ |
552 | /* ========================================================================= */ | 801 | /* ========================================================================= */ |
553 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE 0x320080UL | 802 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE 0x320080UL |
554 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_32 0x0a68 | 803 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_32 0xa68 |
555 | 804 | ||
556 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_PENDING_0_SHFT 0 | 805 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_PENDING_0_SHFT 0 |
557 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_PENDING_0_MASK 0x0000000000000001UL | 806 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_PENDING_0_MASK 0x0000000000000001UL |
@@ -585,6 +834,7 @@ union uvh_lb_bau_intd_payload_queue_tail_u { | |||
585 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_TIMEOUT_6_MASK 0x0000000000004000UL | 834 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_TIMEOUT_6_MASK 0x0000000000004000UL |
586 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_TIMEOUT_7_SHFT 15 | 835 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_TIMEOUT_7_SHFT 15 |
587 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_TIMEOUT_7_MASK 0x0000000000008000UL | 836 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_TIMEOUT_7_MASK 0x0000000000008000UL |
837 | |||
588 | union uvh_lb_bau_intd_software_acknowledge_u { | 838 | union uvh_lb_bau_intd_software_acknowledge_u { |
589 | unsigned long v; | 839 | unsigned long v; |
590 | struct uvh_lb_bau_intd_software_acknowledge_s { | 840 | struct uvh_lb_bau_intd_software_acknowledge_s { |
@@ -612,13 +862,13 @@ union uvh_lb_bau_intd_software_acknowledge_u { | |||
612 | /* UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS */ | 862 | /* UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS */ |
613 | /* ========================================================================= */ | 863 | /* ========================================================================= */ |
614 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS 0x0000000000320088UL | 864 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS 0x0000000000320088UL |
615 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS_32 0x0a70 | 865 | #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS_32 0xa70 |
616 | 866 | ||
617 | /* ========================================================================= */ | 867 | /* ========================================================================= */ |
618 | /* UVH_LB_BAU_MISC_CONTROL */ | 868 | /* UVH_LB_BAU_MISC_CONTROL */ |
619 | /* ========================================================================= */ | 869 | /* ========================================================================= */ |
620 | #define UVH_LB_BAU_MISC_CONTROL 0x320170UL | 870 | #define UVH_LB_BAU_MISC_CONTROL 0x320170UL |
621 | #define UVH_LB_BAU_MISC_CONTROL_32 0x00a10 | 871 | #define UVH_LB_BAU_MISC_CONTROL_32 0xa10 |
622 | 872 | ||
623 | #define UVH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT 0 | 873 | #define UVH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT 0 |
624 | #define UVH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_MASK 0x00000000000000ffUL | 874 | #define UVH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_MASK 0x00000000000000ffUL |
@@ -628,8 +878,8 @@ union uvh_lb_bau_intd_software_acknowledge_u { | |||
628 | #define UVH_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_MASK 0x0000000000000200UL | 878 | #define UVH_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_MASK 0x0000000000000200UL |
629 | #define UVH_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_SHFT 10 | 879 | #define UVH_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_SHFT 10 |
630 | #define UVH_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_MASK 0x0000000000000400UL | 880 | #define UVH_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_MASK 0x0000000000000400UL |
631 | #define UVH_LB_BAU_MISC_CONTROL_CSI_AGENT_PRESENCE_VECTOR_SHFT 11 | 881 | #define UVH_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_SHFT 11 |
632 | #define UVH_LB_BAU_MISC_CONTROL_CSI_AGENT_PRESENCE_VECTOR_MASK 0x0000000000003800UL | 882 | #define UVH_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_MASK 0x0000000000003800UL |
633 | #define UVH_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_SHFT 14 | 883 | #define UVH_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_SHFT 14 |
634 | #define UVH_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_MASK 0x0000000000004000UL | 884 | #define UVH_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_MASK 0x0000000000004000UL |
635 | #define UVH_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT 15 | 885 | #define UVH_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT 15 |
@@ -650,8 +900,86 @@ union uvh_lb_bau_intd_software_acknowledge_u { | |||
650 | #define UVH_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_MASK 0x0000000008000000UL | 900 | #define UVH_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_MASK 0x0000000008000000UL |
651 | #define UVH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_SHFT 28 | 901 | #define UVH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_SHFT 28 |
652 | #define UVH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL | 902 | #define UVH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL |
653 | #define UVH_LB_BAU_MISC_CONTROL_FUN_SHFT 48 | 903 | |
654 | #define UVH_LB_BAU_MISC_CONTROL_FUN_MASK 0xffff000000000000UL | 904 | #define UV1H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT 0 |
905 | #define UV1H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_MASK 0x00000000000000ffUL | ||
906 | #define UV1H_LB_BAU_MISC_CONTROL_APIC_MODE_SHFT 8 | ||
907 | #define UV1H_LB_BAU_MISC_CONTROL_APIC_MODE_MASK 0x0000000000000100UL | ||
908 | #define UV1H_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_SHFT 9 | ||
909 | #define UV1H_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_MASK 0x0000000000000200UL | ||
910 | #define UV1H_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_SHFT 10 | ||
911 | #define UV1H_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_MASK 0x0000000000000400UL | ||
912 | #define UV1H_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_SHFT 11 | ||
913 | #define UV1H_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_MASK 0x0000000000003800UL | ||
914 | #define UV1H_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_SHFT 14 | ||
915 | #define UV1H_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_MASK 0x0000000000004000UL | ||
916 | #define UV1H_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT 15 | ||
917 | #define UV1H_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_MASK 0x0000000000008000UL | ||
918 | #define UV1H_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT 16 | ||
919 | #define UV1H_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_MASK 0x00000000000f0000UL | ||
920 | #define UV1H_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_SHFT 20 | ||
921 | #define UV1H_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_MASK 0x0000000000100000UL | ||
922 | #define UV1H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_SHFT 21 | ||
923 | #define UV1H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_MASK 0x0000000000200000UL | ||
924 | #define UV1H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_SHFT 22 | ||
925 | #define UV1H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_MASK 0x0000000000400000UL | ||
926 | #define UV1H_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_SHFT 23 | ||
927 | #define UV1H_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_MASK 0x0000000000800000UL | ||
928 | #define UV1H_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_SHFT 24 | ||
929 | #define UV1H_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000007000000UL | ||
930 | #define UV1H_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_SHFT 27 | ||
931 | #define UV1H_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_MASK 0x0000000008000000UL | ||
932 | #define UV1H_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_SHFT 28 | ||
933 | #define UV1H_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL | ||
934 | #define UV1H_LB_BAU_MISC_CONTROL_FUN_SHFT 48 | ||
935 | #define UV1H_LB_BAU_MISC_CONTROL_FUN_MASK 0xffff000000000000UL | ||
936 | |||
937 | #define UV2H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT 0 | ||
938 | #define UV2H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_MASK 0x00000000000000ffUL | ||
939 | #define UV2H_LB_BAU_MISC_CONTROL_APIC_MODE_SHFT 8 | ||
940 | #define UV2H_LB_BAU_MISC_CONTROL_APIC_MODE_MASK 0x0000000000000100UL | ||
941 | #define UV2H_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_SHFT 9 | ||
942 | #define UV2H_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_MASK 0x0000000000000200UL | ||
943 | #define UV2H_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_SHFT 10 | ||
944 | #define UV2H_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_MASK 0x0000000000000400UL | ||
945 | #define UV2H_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_SHFT 11 | ||
946 | #define UV2H_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_MASK 0x0000000000003800UL | ||
947 | #define UV2H_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_SHFT 14 | ||
948 | #define UV2H_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_MASK 0x0000000000004000UL | ||
949 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT 15 | ||
950 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_MASK 0x0000000000008000UL | ||
951 | #define UV2H_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT 16 | ||
952 | #define UV2H_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_MASK 0x00000000000f0000UL | ||
953 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_SHFT 20 | ||
954 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_MASK 0x0000000000100000UL | ||
955 | #define UV2H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_SHFT 21 | ||
956 | #define UV2H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_MASK 0x0000000000200000UL | ||
957 | #define UV2H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_SHFT 22 | ||
958 | #define UV2H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_MASK 0x0000000000400000UL | ||
959 | #define UV2H_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_SHFT 23 | ||
960 | #define UV2H_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_MASK 0x0000000000800000UL | ||
961 | #define UV2H_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_SHFT 24 | ||
962 | #define UV2H_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000007000000UL | ||
963 | #define UV2H_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_SHFT 27 | ||
964 | #define UV2H_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_MASK 0x0000000008000000UL | ||
965 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_SHFT 28 | ||
966 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL | ||
967 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_AUTOMATIC_APIC_MODE_SELECTION_SHFT 29 | ||
968 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_AUTOMATIC_APIC_MODE_SELECTION_MASK 0x0000000020000000UL | ||
969 | #define UV2H_LB_BAU_MISC_CONTROL_APIC_MODE_STATUS_SHFT 30 | ||
970 | #define UV2H_LB_BAU_MISC_CONTROL_APIC_MODE_STATUS_MASK 0x0000000040000000UL | ||
971 | #define UV2H_LB_BAU_MISC_CONTROL_SUPPRESS_INTERRUPTS_TO_SELF_SHFT 31 | ||
972 | #define UV2H_LB_BAU_MISC_CONTROL_SUPPRESS_INTERRUPTS_TO_SELF_MASK 0x0000000080000000UL | ||
973 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_LOCK_BASED_SYSTEM_FLUSH_SHFT 32 | ||
974 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_LOCK_BASED_SYSTEM_FLUSH_MASK 0x0000000100000000UL | ||
975 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_SHFT 33 | ||
976 | #define UV2H_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_MASK 0x0000000200000000UL | ||
977 | #define UV2H_LB_BAU_MISC_CONTROL_SUPPRESS_INT_PRIO_UDT_TO_SELF_SHFT 34 | ||
978 | #define UV2H_LB_BAU_MISC_CONTROL_SUPPRESS_INT_PRIO_UDT_TO_SELF_MASK 0x0000000400000000UL | ||
979 | #define UV2H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_SHFT 35 | ||
980 | #define UV2H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_MASK 0x0000000800000000UL | ||
981 | #define UV2H_LB_BAU_MISC_CONTROL_FUN_SHFT 48 | ||
982 | #define UV2H_LB_BAU_MISC_CONTROL_FUN_MASK 0xffff000000000000UL | ||
655 | 983 | ||
656 | union uvh_lb_bau_misc_control_u { | 984 | union uvh_lb_bau_misc_control_u { |
657 | unsigned long v; | 985 | unsigned long v; |
@@ -660,7 +988,25 @@ union uvh_lb_bau_misc_control_u { | |||
660 | unsigned long apic_mode : 1; /* RW */ | 988 | unsigned long apic_mode : 1; /* RW */ |
661 | unsigned long force_broadcast : 1; /* RW */ | 989 | unsigned long force_broadcast : 1; /* RW */ |
662 | unsigned long force_lock_nop : 1; /* RW */ | 990 | unsigned long force_lock_nop : 1; /* RW */ |
663 | unsigned long csi_agent_presence_vector : 3; /* RW */ | 991 | unsigned long qpi_agent_presence_vector : 3; /* RW */ |
992 | unsigned long descriptor_fetch_mode : 1; /* RW */ | ||
993 | unsigned long enable_intd_soft_ack_mode : 1; /* RW */ | ||
994 | unsigned long intd_soft_ack_timeout_period : 4; /* RW */ | ||
995 | unsigned long enable_dual_mapping_mode : 1; /* RW */ | ||
996 | unsigned long vga_io_port_decode_enable : 1; /* RW */ | ||
997 | unsigned long vga_io_port_16_bit_decode : 1; /* RW */ | ||
998 | unsigned long suppress_dest_registration : 1; /* RW */ | ||
999 | unsigned long programmed_initial_priority : 3; /* RW */ | ||
1000 | unsigned long use_incoming_priority : 1; /* RW */ | ||
1001 | unsigned long enable_programmed_initial_priority : 1; /* RW */ | ||
1002 | unsigned long rsvd_29_63 : 35; | ||
1003 | } s; | ||
1004 | struct uv1h_lb_bau_misc_control_s { | ||
1005 | unsigned long rejection_delay : 8; /* RW */ | ||
1006 | unsigned long apic_mode : 1; /* RW */ | ||
1007 | unsigned long force_broadcast : 1; /* RW */ | ||
1008 | unsigned long force_lock_nop : 1; /* RW */ | ||
1009 | unsigned long qpi_agent_presence_vector : 3; /* RW */ | ||
664 | unsigned long descriptor_fetch_mode : 1; /* RW */ | 1010 | unsigned long descriptor_fetch_mode : 1; /* RW */ |
665 | unsigned long enable_intd_soft_ack_mode : 1; /* RW */ | 1011 | unsigned long enable_intd_soft_ack_mode : 1; /* RW */ |
666 | unsigned long intd_soft_ack_timeout_period : 4; /* RW */ | 1012 | unsigned long intd_soft_ack_timeout_period : 4; /* RW */ |
@@ -673,14 +1019,40 @@ union uvh_lb_bau_misc_control_u { | |||
673 | unsigned long enable_programmed_initial_priority : 1; /* RW */ | 1019 | unsigned long enable_programmed_initial_priority : 1; /* RW */ |
674 | unsigned long rsvd_29_47 : 19; /* */ | 1020 | unsigned long rsvd_29_47 : 19; /* */ |
675 | unsigned long fun : 16; /* RW */ | 1021 | unsigned long fun : 16; /* RW */ |
676 | } s; | 1022 | } s1; |
1023 | struct uv2h_lb_bau_misc_control_s { | ||
1024 | unsigned long rejection_delay : 8; /* RW */ | ||
1025 | unsigned long apic_mode : 1; /* RW */ | ||
1026 | unsigned long force_broadcast : 1; /* RW */ | ||
1027 | unsigned long force_lock_nop : 1; /* RW */ | ||
1028 | unsigned long qpi_agent_presence_vector : 3; /* RW */ | ||
1029 | unsigned long descriptor_fetch_mode : 1; /* RW */ | ||
1030 | unsigned long enable_intd_soft_ack_mode : 1; /* RW */ | ||
1031 | unsigned long intd_soft_ack_timeout_period : 4; /* RW */ | ||
1032 | unsigned long enable_dual_mapping_mode : 1; /* RW */ | ||
1033 | unsigned long vga_io_port_decode_enable : 1; /* RW */ | ||
1034 | unsigned long vga_io_port_16_bit_decode : 1; /* RW */ | ||
1035 | unsigned long suppress_dest_registration : 1; /* RW */ | ||
1036 | unsigned long programmed_initial_priority : 3; /* RW */ | ||
1037 | unsigned long use_incoming_priority : 1; /* RW */ | ||
1038 | unsigned long enable_programmed_initial_priority : 1; /* RW */ | ||
1039 | unsigned long enable_automatic_apic_mode_selection : 1; /* RW */ | ||
1040 | unsigned long apic_mode_status : 1; /* RO */ | ||
1041 | unsigned long suppress_interrupts_to_self : 1; /* RW */ | ||
1042 | unsigned long enable_lock_based_system_flush : 1; /* RW */ | ||
1043 | unsigned long enable_extended_sb_status : 1; /* RW */ | ||
1044 | unsigned long suppress_int_prio_udt_to_self : 1; /* RW */ | ||
1045 | unsigned long use_legacy_descriptor_formats : 1; /* RW */ | ||
1046 | unsigned long rsvd_36_47 : 12; /* */ | ||
1047 | unsigned long fun : 16; /* RW */ | ||
1048 | } s2; | ||
677 | }; | 1049 | }; |
678 | 1050 | ||
679 | /* ========================================================================= */ | 1051 | /* ========================================================================= */ |
680 | /* UVH_LB_BAU_SB_ACTIVATION_CONTROL */ | 1052 | /* UVH_LB_BAU_SB_ACTIVATION_CONTROL */ |
681 | /* ========================================================================= */ | 1053 | /* ========================================================================= */ |
682 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL 0x320020UL | 1054 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL 0x320020UL |
683 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_32 0x009a8 | 1055 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_32 0x9a8 |
684 | 1056 | ||
685 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_INDEX_SHFT 0 | 1057 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_INDEX_SHFT 0 |
686 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_INDEX_MASK 0x000000000000003fUL | 1058 | #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_INDEX_MASK 0x000000000000003fUL |
@@ -703,7 +1075,7 @@ union uvh_lb_bau_sb_activation_control_u { | |||
703 | /* UVH_LB_BAU_SB_ACTIVATION_STATUS_0 */ | 1075 | /* UVH_LB_BAU_SB_ACTIVATION_STATUS_0 */ |
704 | /* ========================================================================= */ | 1076 | /* ========================================================================= */ |
705 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0 0x320030UL | 1077 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0 0x320030UL |
706 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_32 0x009b0 | 1078 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_32 0x9b0 |
707 | 1079 | ||
708 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_STATUS_SHFT 0 | 1080 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_STATUS_SHFT 0 |
709 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_STATUS_MASK 0xffffffffffffffffUL | 1081 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_STATUS_MASK 0xffffffffffffffffUL |
@@ -719,7 +1091,7 @@ union uvh_lb_bau_sb_activation_status_0_u { | |||
719 | /* UVH_LB_BAU_SB_ACTIVATION_STATUS_1 */ | 1091 | /* UVH_LB_BAU_SB_ACTIVATION_STATUS_1 */ |
720 | /* ========================================================================= */ | 1092 | /* ========================================================================= */ |
721 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1 0x320040UL | 1093 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1 0x320040UL |
722 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_32 0x009b8 | 1094 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_32 0x9b8 |
723 | 1095 | ||
724 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_STATUS_SHFT 0 | 1096 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_STATUS_SHFT 0 |
725 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_STATUS_MASK 0xffffffffffffffffUL | 1097 | #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_STATUS_MASK 0xffffffffffffffffUL |
@@ -735,7 +1107,7 @@ union uvh_lb_bau_sb_activation_status_1_u { | |||
735 | /* UVH_LB_BAU_SB_DESCRIPTOR_BASE */ | 1107 | /* UVH_LB_BAU_SB_DESCRIPTOR_BASE */ |
736 | /* ========================================================================= */ | 1108 | /* ========================================================================= */ |
737 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE 0x320010UL | 1109 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE 0x320010UL |
738 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_32 0x009a0 | 1110 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_32 0x9a0 |
739 | 1111 | ||
740 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_PAGE_ADDRESS_SHFT 12 | 1112 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_PAGE_ADDRESS_SHFT 12 |
741 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_PAGE_ADDRESS_MASK 0x000007fffffff000UL | 1113 | #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_PAGE_ADDRESS_MASK 0x000007fffffff000UL |
@@ -754,23 +1126,6 @@ union uvh_lb_bau_sb_descriptor_base_u { | |||
754 | }; | 1126 | }; |
755 | 1127 | ||
756 | /* ========================================================================= */ | 1128 | /* ========================================================================= */ |
757 | /* UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK */ | ||
758 | /* ========================================================================= */ | ||
759 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK 0x320130UL | ||
760 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK_32 0x009f0 | ||
761 | |||
762 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK_BIT_ENABLES_SHFT 0 | ||
763 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK_BIT_ENABLES_MASK 0x00000000ffffffffUL | ||
764 | |||
765 | union uvh_lb_target_physical_apic_id_mask_u { | ||
766 | unsigned long v; | ||
767 | struct uvh_lb_target_physical_apic_id_mask_s { | ||
768 | unsigned long bit_enables : 32; /* RW */ | ||
769 | unsigned long rsvd_32_63 : 32; /* */ | ||
770 | } s; | ||
771 | }; | ||
772 | |||
773 | /* ========================================================================= */ | ||
774 | /* UVH_NODE_ID */ | 1129 | /* UVH_NODE_ID */ |
775 | /* ========================================================================= */ | 1130 | /* ========================================================================= */ |
776 | #define UVH_NODE_ID 0x0UL | 1131 | #define UVH_NODE_ID 0x0UL |
@@ -785,10 +1140,36 @@ union uvh_lb_target_physical_apic_id_mask_u { | |||
785 | #define UVH_NODE_ID_REVISION_MASK 0x00000000f0000000UL | 1140 | #define UVH_NODE_ID_REVISION_MASK 0x00000000f0000000UL |
786 | #define UVH_NODE_ID_NODE_ID_SHFT 32 | 1141 | #define UVH_NODE_ID_NODE_ID_SHFT 32 |
787 | #define UVH_NODE_ID_NODE_ID_MASK 0x00007fff00000000UL | 1142 | #define UVH_NODE_ID_NODE_ID_MASK 0x00007fff00000000UL |
788 | #define UVH_NODE_ID_NODES_PER_BIT_SHFT 48 | 1143 | |
789 | #define UVH_NODE_ID_NODES_PER_BIT_MASK 0x007f000000000000UL | 1144 | #define UV1H_NODE_ID_FORCE1_SHFT 0 |
790 | #define UVH_NODE_ID_NI_PORT_SHFT 56 | 1145 | #define UV1H_NODE_ID_FORCE1_MASK 0x0000000000000001UL |
791 | #define UVH_NODE_ID_NI_PORT_MASK 0x0f00000000000000UL | 1146 | #define UV1H_NODE_ID_MANUFACTURER_SHFT 1 |
1147 | #define UV1H_NODE_ID_MANUFACTURER_MASK 0x0000000000000ffeUL | ||
1148 | #define UV1H_NODE_ID_PART_NUMBER_SHFT 12 | ||
1149 | #define UV1H_NODE_ID_PART_NUMBER_MASK 0x000000000ffff000UL | ||
1150 | #define UV1H_NODE_ID_REVISION_SHFT 28 | ||
1151 | #define UV1H_NODE_ID_REVISION_MASK 0x00000000f0000000UL | ||
1152 | #define UV1H_NODE_ID_NODE_ID_SHFT 32 | ||
1153 | #define UV1H_NODE_ID_NODE_ID_MASK 0x00007fff00000000UL | ||
1154 | #define UV1H_NODE_ID_NODES_PER_BIT_SHFT 48 | ||
1155 | #define UV1H_NODE_ID_NODES_PER_BIT_MASK 0x007f000000000000UL | ||
1156 | #define UV1H_NODE_ID_NI_PORT_SHFT 56 | ||
1157 | #define UV1H_NODE_ID_NI_PORT_MASK 0x0f00000000000000UL | ||
1158 | |||
1159 | #define UV2H_NODE_ID_FORCE1_SHFT 0 | ||
1160 | #define UV2H_NODE_ID_FORCE1_MASK 0x0000000000000001UL | ||
1161 | #define UV2H_NODE_ID_MANUFACTURER_SHFT 1 | ||
1162 | #define UV2H_NODE_ID_MANUFACTURER_MASK 0x0000000000000ffeUL | ||
1163 | #define UV2H_NODE_ID_PART_NUMBER_SHFT 12 | ||
1164 | #define UV2H_NODE_ID_PART_NUMBER_MASK 0x000000000ffff000UL | ||
1165 | #define UV2H_NODE_ID_REVISION_SHFT 28 | ||
1166 | #define UV2H_NODE_ID_REVISION_MASK 0x00000000f0000000UL | ||
1167 | #define UV2H_NODE_ID_NODE_ID_SHFT 32 | ||
1168 | #define UV2H_NODE_ID_NODE_ID_MASK 0x00007fff00000000UL | ||
1169 | #define UV2H_NODE_ID_NODES_PER_BIT_SHFT 50 | ||
1170 | #define UV2H_NODE_ID_NODES_PER_BIT_MASK 0x01fc000000000000UL | ||
1171 | #define UV2H_NODE_ID_NI_PORT_SHFT 57 | ||
1172 | #define UV2H_NODE_ID_NI_PORT_MASK 0x3e00000000000000UL | ||
792 | 1173 | ||
793 | union uvh_node_id_u { | 1174 | union uvh_node_id_u { |
794 | unsigned long v; | 1175 | unsigned long v; |
@@ -798,12 +1179,31 @@ union uvh_node_id_u { | |||
798 | unsigned long part_number : 16; /* RO */ | 1179 | unsigned long part_number : 16; /* RO */ |
799 | unsigned long revision : 4; /* RO */ | 1180 | unsigned long revision : 4; /* RO */ |
800 | unsigned long node_id : 15; /* RW */ | 1181 | unsigned long node_id : 15; /* RW */ |
1182 | unsigned long rsvd_47_63 : 17; | ||
1183 | } s; | ||
1184 | struct uv1h_node_id_s { | ||
1185 | unsigned long force1 : 1; /* RO */ | ||
1186 | unsigned long manufacturer : 11; /* RO */ | ||
1187 | unsigned long part_number : 16; /* RO */ | ||
1188 | unsigned long revision : 4; /* RO */ | ||
1189 | unsigned long node_id : 15; /* RW */ | ||
801 | unsigned long rsvd_47 : 1; /* */ | 1190 | unsigned long rsvd_47 : 1; /* */ |
802 | unsigned long nodes_per_bit : 7; /* RW */ | 1191 | unsigned long nodes_per_bit : 7; /* RW */ |
803 | unsigned long rsvd_55 : 1; /* */ | 1192 | unsigned long rsvd_55 : 1; /* */ |
804 | unsigned long ni_port : 4; /* RO */ | 1193 | unsigned long ni_port : 4; /* RO */ |
805 | unsigned long rsvd_60_63 : 4; /* */ | 1194 | unsigned long rsvd_60_63 : 4; /* */ |
806 | } s; | 1195 | } s1; |
1196 | struct uv2h_node_id_s { | ||
1197 | unsigned long force1 : 1; /* RO */ | ||
1198 | unsigned long manufacturer : 11; /* RO */ | ||
1199 | unsigned long part_number : 16; /* RO */ | ||
1200 | unsigned long revision : 4; /* RO */ | ||
1201 | unsigned long node_id : 15; /* RW */ | ||
1202 | unsigned long rsvd_47_49 : 3; /* */ | ||
1203 | unsigned long nodes_per_bit : 7; /* RO */ | ||
1204 | unsigned long ni_port : 5; /* RO */ | ||
1205 | unsigned long rsvd_62_63 : 2; /* */ | ||
1206 | } s2; | ||
807 | }; | 1207 | }; |
808 | 1208 | ||
809 | /* ========================================================================= */ | 1209 | /* ========================================================================= */ |
@@ -954,18 +1354,38 @@ union uvh_rh_gam_alias210_redirect_config_2_mmr_u { | |||
954 | #define UVH_RH_GAM_CONFIG_MMR_M_SKT_MASK 0x000000000000003fUL | 1354 | #define UVH_RH_GAM_CONFIG_MMR_M_SKT_MASK 0x000000000000003fUL |
955 | #define UVH_RH_GAM_CONFIG_MMR_N_SKT_SHFT 6 | 1355 | #define UVH_RH_GAM_CONFIG_MMR_N_SKT_SHFT 6 |
956 | #define UVH_RH_GAM_CONFIG_MMR_N_SKT_MASK 0x00000000000003c0UL | 1356 | #define UVH_RH_GAM_CONFIG_MMR_N_SKT_MASK 0x00000000000003c0UL |
957 | #define UVH_RH_GAM_CONFIG_MMR_MMIOL_CFG_SHFT 12 | 1357 | |
958 | #define UVH_RH_GAM_CONFIG_MMR_MMIOL_CFG_MASK 0x0000000000001000UL | 1358 | #define UV1H_RH_GAM_CONFIG_MMR_M_SKT_SHFT 0 |
1359 | #define UV1H_RH_GAM_CONFIG_MMR_M_SKT_MASK 0x000000000000003fUL | ||
1360 | #define UV1H_RH_GAM_CONFIG_MMR_N_SKT_SHFT 6 | ||
1361 | #define UV1H_RH_GAM_CONFIG_MMR_N_SKT_MASK 0x00000000000003c0UL | ||
1362 | #define UV1H_RH_GAM_CONFIG_MMR_MMIOL_CFG_SHFT 12 | ||
1363 | #define UV1H_RH_GAM_CONFIG_MMR_MMIOL_CFG_MASK 0x0000000000001000UL | ||
1364 | |||
1365 | #define UV2H_RH_GAM_CONFIG_MMR_M_SKT_SHFT 0 | ||
1366 | #define UV2H_RH_GAM_CONFIG_MMR_M_SKT_MASK 0x000000000000003fUL | ||
1367 | #define UV2H_RH_GAM_CONFIG_MMR_N_SKT_SHFT 6 | ||
1368 | #define UV2H_RH_GAM_CONFIG_MMR_N_SKT_MASK 0x00000000000003c0UL | ||
959 | 1369 | ||
960 | union uvh_rh_gam_config_mmr_u { | 1370 | union uvh_rh_gam_config_mmr_u { |
961 | unsigned long v; | 1371 | unsigned long v; |
962 | struct uvh_rh_gam_config_mmr_s { | 1372 | struct uvh_rh_gam_config_mmr_s { |
963 | unsigned long m_skt : 6; /* RW */ | 1373 | unsigned long m_skt : 6; /* RW */ |
964 | unsigned long n_skt : 4; /* RW */ | 1374 | unsigned long n_skt : 4; /* RW */ |
1375 | unsigned long rsvd_10_63 : 54; | ||
1376 | } s; | ||
1377 | struct uv1h_rh_gam_config_mmr_s { | ||
1378 | unsigned long m_skt : 6; /* RW */ | ||
1379 | unsigned long n_skt : 4; /* RW */ | ||
965 | unsigned long rsvd_10_11: 2; /* */ | 1380 | unsigned long rsvd_10_11: 2; /* */ |
966 | unsigned long mmiol_cfg : 1; /* RW */ | 1381 | unsigned long mmiol_cfg : 1; /* RW */ |
967 | unsigned long rsvd_13_63: 51; /* */ | 1382 | unsigned long rsvd_13_63: 51; /* */ |
968 | } s; | 1383 | } s1; |
1384 | struct uv2h_rh_gam_config_mmr_s { | ||
1385 | unsigned long m_skt : 6; /* RW */ | ||
1386 | unsigned long n_skt : 4; /* RW */ | ||
1387 | unsigned long rsvd_10_63: 54; /* */ | ||
1388 | } s2; | ||
969 | }; | 1389 | }; |
970 | 1390 | ||
971 | /* ========================================================================= */ | 1391 | /* ========================================================================= */ |
@@ -975,25 +1395,49 @@ union uvh_rh_gam_config_mmr_u { | |||
975 | 1395 | ||
976 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT 28 | 1396 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT 28 |
977 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffff0000000UL | 1397 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffff0000000UL |
978 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_SHFT 48 | 1398 | |
979 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_MASK 0x0001000000000000UL | 1399 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT 28 |
980 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT 52 | 1400 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffff0000000UL |
981 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK 0x00f0000000000000UL | 1401 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_SHFT 48 |
982 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | 1402 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_MASK 0x0001000000000000UL |
983 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | 1403 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT 52 |
1404 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK 0x00f0000000000000UL | ||
1405 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | ||
1406 | #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | ||
1407 | |||
1408 | #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT 28 | ||
1409 | #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffff0000000UL | ||
1410 | #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT 52 | ||
1411 | #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK 0x00f0000000000000UL | ||
1412 | #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | ||
1413 | #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | ||
984 | 1414 | ||
985 | union uvh_rh_gam_gru_overlay_config_mmr_u { | 1415 | union uvh_rh_gam_gru_overlay_config_mmr_u { |
986 | unsigned long v; | 1416 | unsigned long v; |
987 | struct uvh_rh_gam_gru_overlay_config_mmr_s { | 1417 | struct uvh_rh_gam_gru_overlay_config_mmr_s { |
988 | unsigned long rsvd_0_27: 28; /* */ | 1418 | unsigned long rsvd_0_27: 28; /* */ |
989 | unsigned long base : 18; /* RW */ | 1419 | unsigned long base : 18; /* RW */ |
1420 | unsigned long rsvd_46_62 : 17; | ||
1421 | unsigned long enable : 1; /* RW */ | ||
1422 | } s; | ||
1423 | struct uv1h_rh_gam_gru_overlay_config_mmr_s { | ||
1424 | unsigned long rsvd_0_27: 28; /* */ | ||
1425 | unsigned long base : 18; /* RW */ | ||
990 | unsigned long rsvd_46_47: 2; /* */ | 1426 | unsigned long rsvd_46_47: 2; /* */ |
991 | unsigned long gr4 : 1; /* RW */ | 1427 | unsigned long gr4 : 1; /* RW */ |
992 | unsigned long rsvd_49_51: 3; /* */ | 1428 | unsigned long rsvd_49_51: 3; /* */ |
993 | unsigned long n_gru : 4; /* RW */ | 1429 | unsigned long n_gru : 4; /* RW */ |
994 | unsigned long rsvd_56_62: 7; /* */ | 1430 | unsigned long rsvd_56_62: 7; /* */ |
995 | unsigned long enable : 1; /* RW */ | 1431 | unsigned long enable : 1; /* RW */ |
996 | } s; | 1432 | } s1; |
1433 | struct uv2h_rh_gam_gru_overlay_config_mmr_s { | ||
1434 | unsigned long rsvd_0_27: 28; /* */ | ||
1435 | unsigned long base : 18; /* RW */ | ||
1436 | unsigned long rsvd_46_51: 6; /* */ | ||
1437 | unsigned long n_gru : 4; /* RW */ | ||
1438 | unsigned long rsvd_56_62: 7; /* */ | ||
1439 | unsigned long enable : 1; /* RW */ | ||
1440 | } s2; | ||
997 | }; | 1441 | }; |
998 | 1442 | ||
999 | /* ========================================================================= */ | 1443 | /* ========================================================================= */ |
@@ -1001,25 +1445,42 @@ union uvh_rh_gam_gru_overlay_config_mmr_u { | |||
1001 | /* ========================================================================= */ | 1445 | /* ========================================================================= */ |
1002 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR 0x1600030UL | 1446 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR 0x1600030UL |
1003 | 1447 | ||
1004 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT 30 | 1448 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT 30 |
1005 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003fffc0000000UL | 1449 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003fffc0000000UL |
1006 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_SHFT 46 | 1450 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_SHFT 46 |
1007 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_MASK 0x000fc00000000000UL | 1451 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_MASK 0x000fc00000000000UL |
1008 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_SHFT 52 | 1452 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_SHFT 52 |
1009 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_MASK 0x00f0000000000000UL | 1453 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_MASK 0x00f0000000000000UL |
1010 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | 1454 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 |
1011 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | 1455 | #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL |
1456 | |||
1457 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT 27 | ||
1458 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffff8000000UL | ||
1459 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_SHFT 46 | ||
1460 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_MASK 0x000fc00000000000UL | ||
1461 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_SHFT 52 | ||
1462 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_MASK 0x00f0000000000000UL | ||
1463 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | ||
1464 | #define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | ||
1012 | 1465 | ||
1013 | union uvh_rh_gam_mmioh_overlay_config_mmr_u { | 1466 | union uvh_rh_gam_mmioh_overlay_config_mmr_u { |
1014 | unsigned long v; | 1467 | unsigned long v; |
1015 | struct uvh_rh_gam_mmioh_overlay_config_mmr_s { | 1468 | struct uv1h_rh_gam_mmioh_overlay_config_mmr_s { |
1016 | unsigned long rsvd_0_29: 30; /* */ | 1469 | unsigned long rsvd_0_29: 30; /* */ |
1017 | unsigned long base : 16; /* RW */ | 1470 | unsigned long base : 16; /* RW */ |
1018 | unsigned long m_io : 6; /* RW */ | 1471 | unsigned long m_io : 6; /* RW */ |
1019 | unsigned long n_io : 4; /* RW */ | 1472 | unsigned long n_io : 4; /* RW */ |
1020 | unsigned long rsvd_56_62: 7; /* */ | 1473 | unsigned long rsvd_56_62: 7; /* */ |
1021 | unsigned long enable : 1; /* RW */ | 1474 | unsigned long enable : 1; /* RW */ |
1022 | } s; | 1475 | } s1; |
1476 | struct uv2h_rh_gam_mmioh_overlay_config_mmr_s { | ||
1477 | unsigned long rsvd_0_26: 27; /* */ | ||
1478 | unsigned long base : 19; /* RW */ | ||
1479 | unsigned long m_io : 6; /* RW */ | ||
1480 | unsigned long n_io : 4; /* RW */ | ||
1481 | unsigned long rsvd_56_62: 7; /* */ | ||
1482 | unsigned long enable : 1; /* RW */ | ||
1483 | } s2; | ||
1023 | }; | 1484 | }; |
1024 | 1485 | ||
1025 | /* ========================================================================= */ | 1486 | /* ========================================================================= */ |
@@ -1029,20 +1490,40 @@ union uvh_rh_gam_mmioh_overlay_config_mmr_u { | |||
1029 | 1490 | ||
1030 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT 26 | 1491 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT 26 |
1031 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffffc000000UL | 1492 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffffc000000UL |
1032 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_SHFT 46 | 1493 | |
1033 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_MASK 0x0000400000000000UL | 1494 | #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT 26 |
1034 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | 1495 | #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffffc000000UL |
1035 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | 1496 | #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_SHFT 46 |
1497 | #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_MASK 0x0000400000000000UL | ||
1498 | #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | ||
1499 | #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | ||
1500 | |||
1501 | #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT 26 | ||
1502 | #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffffc000000UL | ||
1503 | #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | ||
1504 | #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | ||
1036 | 1505 | ||
1037 | union uvh_rh_gam_mmr_overlay_config_mmr_u { | 1506 | union uvh_rh_gam_mmr_overlay_config_mmr_u { |
1038 | unsigned long v; | 1507 | unsigned long v; |
1039 | struct uvh_rh_gam_mmr_overlay_config_mmr_s { | 1508 | struct uvh_rh_gam_mmr_overlay_config_mmr_s { |
1040 | unsigned long rsvd_0_25: 26; /* */ | 1509 | unsigned long rsvd_0_25: 26; /* */ |
1041 | unsigned long base : 20; /* RW */ | 1510 | unsigned long base : 20; /* RW */ |
1511 | unsigned long rsvd_46_62 : 17; | ||
1512 | unsigned long enable : 1; /* RW */ | ||
1513 | } s; | ||
1514 | struct uv1h_rh_gam_mmr_overlay_config_mmr_s { | ||
1515 | unsigned long rsvd_0_25: 26; /* */ | ||
1516 | unsigned long base : 20; /* RW */ | ||
1042 | unsigned long dual_hub : 1; /* RW */ | 1517 | unsigned long dual_hub : 1; /* RW */ |
1043 | unsigned long rsvd_47_62: 16; /* */ | 1518 | unsigned long rsvd_47_62: 16; /* */ |
1044 | unsigned long enable : 1; /* RW */ | 1519 | unsigned long enable : 1; /* RW */ |
1045 | } s; | 1520 | } s1; |
1521 | struct uv2h_rh_gam_mmr_overlay_config_mmr_s { | ||
1522 | unsigned long rsvd_0_25: 26; /* */ | ||
1523 | unsigned long base : 20; /* RW */ | ||
1524 | unsigned long rsvd_46_62: 17; /* */ | ||
1525 | unsigned long enable : 1; /* RW */ | ||
1526 | } s2; | ||
1046 | }; | 1527 | }; |
1047 | 1528 | ||
1048 | /* ========================================================================= */ | 1529 | /* ========================================================================= */ |
@@ -1103,10 +1584,11 @@ union uvh_rtc1_int_config_u { | |||
1103 | /* UVH_SCRATCH5 */ | 1584 | /* UVH_SCRATCH5 */ |
1104 | /* ========================================================================= */ | 1585 | /* ========================================================================= */ |
1105 | #define UVH_SCRATCH5 0x2d0200UL | 1586 | #define UVH_SCRATCH5 0x2d0200UL |
1106 | #define UVH_SCRATCH5_32 0x00778 | 1587 | #define UVH_SCRATCH5_32 0x778 |
1107 | 1588 | ||
1108 | #define UVH_SCRATCH5_SCRATCH5_SHFT 0 | 1589 | #define UVH_SCRATCH5_SCRATCH5_SHFT 0 |
1109 | #define UVH_SCRATCH5_SCRATCH5_MASK 0xffffffffffffffffUL | 1590 | #define UVH_SCRATCH5_SCRATCH5_MASK 0xffffffffffffffffUL |
1591 | |||
1110 | union uvh_scratch5_u { | 1592 | union uvh_scratch5_u { |
1111 | unsigned long v; | 1593 | unsigned long v; |
1112 | struct uvh_scratch5_s { | 1594 | struct uvh_scratch5_s { |
@@ -1114,4 +1596,154 @@ union uvh_scratch5_u { | |||
1114 | } s; | 1596 | } s; |
1115 | }; | 1597 | }; |
1116 | 1598 | ||
1599 | /* ========================================================================= */ | ||
1600 | /* UV2H_EVENT_OCCURRED2 */ | ||
1601 | /* ========================================================================= */ | ||
1602 | #define UV2H_EVENT_OCCURRED2 0x70100UL | ||
1603 | #define UV2H_EVENT_OCCURRED2_32 0xb68 | ||
1604 | |||
1605 | #define UV2H_EVENT_OCCURRED2_RTC_0_SHFT 0 | ||
1606 | #define UV2H_EVENT_OCCURRED2_RTC_0_MASK 0x0000000000000001UL | ||
1607 | #define UV2H_EVENT_OCCURRED2_RTC_1_SHFT 1 | ||
1608 | #define UV2H_EVENT_OCCURRED2_RTC_1_MASK 0x0000000000000002UL | ||
1609 | #define UV2H_EVENT_OCCURRED2_RTC_2_SHFT 2 | ||
1610 | #define UV2H_EVENT_OCCURRED2_RTC_2_MASK 0x0000000000000004UL | ||
1611 | #define UV2H_EVENT_OCCURRED2_RTC_3_SHFT 3 | ||
1612 | #define UV2H_EVENT_OCCURRED2_RTC_3_MASK 0x0000000000000008UL | ||
1613 | #define UV2H_EVENT_OCCURRED2_RTC_4_SHFT 4 | ||
1614 | #define UV2H_EVENT_OCCURRED2_RTC_4_MASK 0x0000000000000010UL | ||
1615 | #define UV2H_EVENT_OCCURRED2_RTC_5_SHFT 5 | ||
1616 | #define UV2H_EVENT_OCCURRED2_RTC_5_MASK 0x0000000000000020UL | ||
1617 | #define UV2H_EVENT_OCCURRED2_RTC_6_SHFT 6 | ||
1618 | #define UV2H_EVENT_OCCURRED2_RTC_6_MASK 0x0000000000000040UL | ||
1619 | #define UV2H_EVENT_OCCURRED2_RTC_7_SHFT 7 | ||
1620 | #define UV2H_EVENT_OCCURRED2_RTC_7_MASK 0x0000000000000080UL | ||
1621 | #define UV2H_EVENT_OCCURRED2_RTC_8_SHFT 8 | ||
1622 | #define UV2H_EVENT_OCCURRED2_RTC_8_MASK 0x0000000000000100UL | ||
1623 | #define UV2H_EVENT_OCCURRED2_RTC_9_SHFT 9 | ||
1624 | #define UV2H_EVENT_OCCURRED2_RTC_9_MASK 0x0000000000000200UL | ||
1625 | #define UV2H_EVENT_OCCURRED2_RTC_10_SHFT 10 | ||
1626 | #define UV2H_EVENT_OCCURRED2_RTC_10_MASK 0x0000000000000400UL | ||
1627 | #define UV2H_EVENT_OCCURRED2_RTC_11_SHFT 11 | ||
1628 | #define UV2H_EVENT_OCCURRED2_RTC_11_MASK 0x0000000000000800UL | ||
1629 | #define UV2H_EVENT_OCCURRED2_RTC_12_SHFT 12 | ||
1630 | #define UV2H_EVENT_OCCURRED2_RTC_12_MASK 0x0000000000001000UL | ||
1631 | #define UV2H_EVENT_OCCURRED2_RTC_13_SHFT 13 | ||
1632 | #define UV2H_EVENT_OCCURRED2_RTC_13_MASK 0x0000000000002000UL | ||
1633 | #define UV2H_EVENT_OCCURRED2_RTC_14_SHFT 14 | ||
1634 | #define UV2H_EVENT_OCCURRED2_RTC_14_MASK 0x0000000000004000UL | ||
1635 | #define UV2H_EVENT_OCCURRED2_RTC_15_SHFT 15 | ||
1636 | #define UV2H_EVENT_OCCURRED2_RTC_15_MASK 0x0000000000008000UL | ||
1637 | #define UV2H_EVENT_OCCURRED2_RTC_16_SHFT 16 | ||
1638 | #define UV2H_EVENT_OCCURRED2_RTC_16_MASK 0x0000000000010000UL | ||
1639 | #define UV2H_EVENT_OCCURRED2_RTC_17_SHFT 17 | ||
1640 | #define UV2H_EVENT_OCCURRED2_RTC_17_MASK 0x0000000000020000UL | ||
1641 | #define UV2H_EVENT_OCCURRED2_RTC_18_SHFT 18 | ||
1642 | #define UV2H_EVENT_OCCURRED2_RTC_18_MASK 0x0000000000040000UL | ||
1643 | #define UV2H_EVENT_OCCURRED2_RTC_19_SHFT 19 | ||
1644 | #define UV2H_EVENT_OCCURRED2_RTC_19_MASK 0x0000000000080000UL | ||
1645 | #define UV2H_EVENT_OCCURRED2_RTC_20_SHFT 20 | ||
1646 | #define UV2H_EVENT_OCCURRED2_RTC_20_MASK 0x0000000000100000UL | ||
1647 | #define UV2H_EVENT_OCCURRED2_RTC_21_SHFT 21 | ||
1648 | #define UV2H_EVENT_OCCURRED2_RTC_21_MASK 0x0000000000200000UL | ||
1649 | #define UV2H_EVENT_OCCURRED2_RTC_22_SHFT 22 | ||
1650 | #define UV2H_EVENT_OCCURRED2_RTC_22_MASK 0x0000000000400000UL | ||
1651 | #define UV2H_EVENT_OCCURRED2_RTC_23_SHFT 23 | ||
1652 | #define UV2H_EVENT_OCCURRED2_RTC_23_MASK 0x0000000000800000UL | ||
1653 | #define UV2H_EVENT_OCCURRED2_RTC_24_SHFT 24 | ||
1654 | #define UV2H_EVENT_OCCURRED2_RTC_24_MASK 0x0000000001000000UL | ||
1655 | #define UV2H_EVENT_OCCURRED2_RTC_25_SHFT 25 | ||
1656 | #define UV2H_EVENT_OCCURRED2_RTC_25_MASK 0x0000000002000000UL | ||
1657 | #define UV2H_EVENT_OCCURRED2_RTC_26_SHFT 26 | ||
1658 | #define UV2H_EVENT_OCCURRED2_RTC_26_MASK 0x0000000004000000UL | ||
1659 | #define UV2H_EVENT_OCCURRED2_RTC_27_SHFT 27 | ||
1660 | #define UV2H_EVENT_OCCURRED2_RTC_27_MASK 0x0000000008000000UL | ||
1661 | #define UV2H_EVENT_OCCURRED2_RTC_28_SHFT 28 | ||
1662 | #define UV2H_EVENT_OCCURRED2_RTC_28_MASK 0x0000000010000000UL | ||
1663 | #define UV2H_EVENT_OCCURRED2_RTC_29_SHFT 29 | ||
1664 | #define UV2H_EVENT_OCCURRED2_RTC_29_MASK 0x0000000020000000UL | ||
1665 | #define UV2H_EVENT_OCCURRED2_RTC_30_SHFT 30 | ||
1666 | #define UV2H_EVENT_OCCURRED2_RTC_30_MASK 0x0000000040000000UL | ||
1667 | #define UV2H_EVENT_OCCURRED2_RTC_31_SHFT 31 | ||
1668 | #define UV2H_EVENT_OCCURRED2_RTC_31_MASK 0x0000000080000000UL | ||
1669 | |||
1670 | union uv2h_event_occurred2_u { | ||
1671 | unsigned long v; | ||
1672 | struct uv2h_event_occurred2_s { | ||
1673 | unsigned long rtc_0 : 1; /* RW */ | ||
1674 | unsigned long rtc_1 : 1; /* RW */ | ||
1675 | unsigned long rtc_2 : 1; /* RW */ | ||
1676 | unsigned long rtc_3 : 1; /* RW */ | ||
1677 | unsigned long rtc_4 : 1; /* RW */ | ||
1678 | unsigned long rtc_5 : 1; /* RW */ | ||
1679 | unsigned long rtc_6 : 1; /* RW */ | ||
1680 | unsigned long rtc_7 : 1; /* RW */ | ||
1681 | unsigned long rtc_8 : 1; /* RW */ | ||
1682 | unsigned long rtc_9 : 1; /* RW */ | ||
1683 | unsigned long rtc_10 : 1; /* RW */ | ||
1684 | unsigned long rtc_11 : 1; /* RW */ | ||
1685 | unsigned long rtc_12 : 1; /* RW */ | ||
1686 | unsigned long rtc_13 : 1; /* RW */ | ||
1687 | unsigned long rtc_14 : 1; /* RW */ | ||
1688 | unsigned long rtc_15 : 1; /* RW */ | ||
1689 | unsigned long rtc_16 : 1; /* RW */ | ||
1690 | unsigned long rtc_17 : 1; /* RW */ | ||
1691 | unsigned long rtc_18 : 1; /* RW */ | ||
1692 | unsigned long rtc_19 : 1; /* RW */ | ||
1693 | unsigned long rtc_20 : 1; /* RW */ | ||
1694 | unsigned long rtc_21 : 1; /* RW */ | ||
1695 | unsigned long rtc_22 : 1; /* RW */ | ||
1696 | unsigned long rtc_23 : 1; /* RW */ | ||
1697 | unsigned long rtc_24 : 1; /* RW */ | ||
1698 | unsigned long rtc_25 : 1; /* RW */ | ||
1699 | unsigned long rtc_26 : 1; /* RW */ | ||
1700 | unsigned long rtc_27 : 1; /* RW */ | ||
1701 | unsigned long rtc_28 : 1; /* RW */ | ||
1702 | unsigned long rtc_29 : 1; /* RW */ | ||
1703 | unsigned long rtc_30 : 1; /* RW */ | ||
1704 | unsigned long rtc_31 : 1; /* RW */ | ||
1705 | unsigned long rsvd_32_63: 32; /* */ | ||
1706 | } s1; | ||
1707 | }; | ||
1708 | |||
1709 | /* ========================================================================= */ | ||
1710 | /* UV2H_EVENT_OCCURRED2_ALIAS */ | ||
1711 | /* ========================================================================= */ | ||
1712 | #define UV2H_EVENT_OCCURRED2_ALIAS 0x70108UL | ||
1713 | #define UV2H_EVENT_OCCURRED2_ALIAS_32 0xb70 | ||
1714 | |||
1715 | /* ========================================================================= */ | ||
1716 | /* UV2H_LB_BAU_SB_ACTIVATION_STATUS_2 */ | ||
1717 | /* ========================================================================= */ | ||
1718 | #define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2 0x320130UL | ||
1719 | #define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2_32 0x9f0 | ||
1720 | |||
1721 | #define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_SHFT 0 | ||
1722 | #define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_MASK 0xffffffffffffffffUL | ||
1723 | |||
1724 | union uv2h_lb_bau_sb_activation_status_2_u { | ||
1725 | unsigned long v; | ||
1726 | struct uv2h_lb_bau_sb_activation_status_2_s { | ||
1727 | unsigned long aux_error : 64; /* RW */ | ||
1728 | } s1; | ||
1729 | }; | ||
1730 | |||
1731 | /* ========================================================================= */ | ||
1732 | /* UV1H_LB_TARGET_PHYSICAL_APIC_ID_MASK */ | ||
1733 | /* ========================================================================= */ | ||
1734 | #define UV1H_LB_TARGET_PHYSICAL_APIC_ID_MASK 0x320130UL | ||
1735 | #define UV1H_LB_TARGET_PHYSICAL_APIC_ID_MASK_32 0x9f0 | ||
1736 | |||
1737 | #define UV1H_LB_TARGET_PHYSICAL_APIC_ID_MASK_BIT_ENABLES_SHFT 0 | ||
1738 | #define UV1H_LB_TARGET_PHYSICAL_APIC_ID_MASK_BIT_ENABLES_MASK 0x00000000ffffffffUL | ||
1739 | |||
1740 | union uv1h_lb_target_physical_apic_id_mask_u { | ||
1741 | unsigned long v; | ||
1742 | struct uv1h_lb_target_physical_apic_id_mask_s { | ||
1743 | unsigned long bit_enables : 32; /* RW */ | ||
1744 | unsigned long rsvd_32_63 : 32; /* */ | ||
1745 | } s1; | ||
1746 | }; | ||
1747 | |||
1748 | |||
1117 | #endif /* __ASM_UV_MMRS_X86_H__ */ | 1749 | #endif /* __ASM_UV_MMRS_X86_H__ */ |
diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h index 9064052b73de..bb0522850b74 100644 --- a/arch/x86/include/asm/vdso.h +++ b/arch/x86/include/asm/vdso.h | |||
@@ -1,20 +1,6 @@ | |||
1 | #ifndef _ASM_X86_VDSO_H | 1 | #ifndef _ASM_X86_VDSO_H |
2 | #define _ASM_X86_VDSO_H | 2 | #define _ASM_X86_VDSO_H |
3 | 3 | ||
4 | #ifdef CONFIG_X86_64 | ||
5 | extern const char VDSO64_PRELINK[]; | ||
6 | |||
7 | /* | ||
8 | * Given a pointer to the vDSO image, find the pointer to VDSO64_name | ||
9 | * as that symbol is defined in the vDSO sources or linker script. | ||
10 | */ | ||
11 | #define VDSO64_SYMBOL(base, name) \ | ||
12 | ({ \ | ||
13 | extern const char VDSO64_##name[]; \ | ||
14 | (void *)(VDSO64_##name - VDSO64_PRELINK + (unsigned long)(base)); \ | ||
15 | }) | ||
16 | #endif | ||
17 | |||
18 | #if defined CONFIG_X86_32 || defined CONFIG_COMPAT | 4 | #if defined CONFIG_X86_32 || defined CONFIG_COMPAT |
19 | extern const char VDSO32_PRELINK[]; | 5 | extern const char VDSO32_PRELINK[]; |
20 | 6 | ||
diff --git a/arch/x86/include/asm/vgtod.h b/arch/x86/include/asm/vgtod.h index 3d61e204826f..646b4c1ca695 100644 --- a/arch/x86/include/asm/vgtod.h +++ b/arch/x86/include/asm/vgtod.h | |||
@@ -23,8 +23,6 @@ struct vsyscall_gtod_data { | |||
23 | struct timespec wall_to_monotonic; | 23 | struct timespec wall_to_monotonic; |
24 | struct timespec wall_time_coarse; | 24 | struct timespec wall_time_coarse; |
25 | }; | 25 | }; |
26 | extern struct vsyscall_gtod_data __vsyscall_gtod_data | ||
27 | __section_vsyscall_gtod_data; | ||
28 | extern struct vsyscall_gtod_data vsyscall_gtod_data; | 26 | extern struct vsyscall_gtod_data vsyscall_gtod_data; |
29 | 27 | ||
30 | #endif /* _ASM_X86_VGTOD_H */ | 28 | #endif /* _ASM_X86_VGTOD_H */ |
diff --git a/arch/x86/include/asm/vsyscall.h b/arch/x86/include/asm/vsyscall.h index d0983d255fbd..d55597351f6a 100644 --- a/arch/x86/include/asm/vsyscall.h +++ b/arch/x86/include/asm/vsyscall.h | |||
@@ -16,27 +16,19 @@ enum vsyscall_num { | |||
16 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
17 | #include <linux/seqlock.h> | 17 | #include <linux/seqlock.h> |
18 | 18 | ||
19 | #define __section_vgetcpu_mode __attribute__ ((unused, __section__ (".vgetcpu_mode"), aligned(16))) | ||
20 | #define __section_jiffies __attribute__ ((unused, __section__ (".jiffies"), aligned(16))) | ||
21 | |||
22 | /* Definitions for CONFIG_GENERIC_TIME definitions */ | 19 | /* Definitions for CONFIG_GENERIC_TIME definitions */ |
23 | #define __section_vsyscall_gtod_data __attribute__ \ | ||
24 | ((unused, __section__ (".vsyscall_gtod_data"),aligned(16))) | ||
25 | #define __section_vsyscall_clock __attribute__ \ | ||
26 | ((unused, __section__ (".vsyscall_clock"),aligned(16))) | ||
27 | #define __vsyscall_fn \ | 20 | #define __vsyscall_fn \ |
28 | __attribute__ ((unused, __section__(".vsyscall_fn"))) notrace | 21 | __attribute__ ((unused, __section__(".vsyscall_fn"))) notrace |
29 | 22 | ||
30 | #define VGETCPU_RDTSCP 1 | 23 | #define VGETCPU_RDTSCP 1 |
31 | #define VGETCPU_LSL 2 | 24 | #define VGETCPU_LSL 2 |
32 | 25 | ||
33 | extern int __vgetcpu_mode; | ||
34 | extern volatile unsigned long __jiffies; | ||
35 | |||
36 | /* kernel space (writeable) */ | 26 | /* kernel space (writeable) */ |
37 | extern int vgetcpu_mode; | 27 | extern int vgetcpu_mode; |
38 | extern struct timezone sys_tz; | 28 | extern struct timezone sys_tz; |
39 | 29 | ||
30 | #include <asm/vvar.h> | ||
31 | |||
40 | extern void map_vsyscall(void); | 32 | extern void map_vsyscall(void); |
41 | 33 | ||
42 | #endif /* __KERNEL__ */ | 34 | #endif /* __KERNEL__ */ |
diff --git a/arch/x86/include/asm/vvar.h b/arch/x86/include/asm/vvar.h new file mode 100644 index 000000000000..341b3559452b --- /dev/null +++ b/arch/x86/include/asm/vvar.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * vvar.h: Shared vDSO/kernel variable declarations | ||
3 | * Copyright (c) 2011 Andy Lutomirski | ||
4 | * Subject to the GNU General Public License, version 2 | ||
5 | * | ||
6 | * A handful of variables are accessible (read-only) from userspace | ||
7 | * code in the vsyscall page and the vdso. They are declared here. | ||
8 | * Some other file must define them with DEFINE_VVAR. | ||
9 | * | ||
10 | * In normal kernel code, they are used like any other variable. | ||
11 | * In user code, they are accessed through the VVAR macro. | ||
12 | * | ||
13 | * Each of these variables lives in the vsyscall page, and each | ||
14 | * one needs a unique offset within the little piece of the page | ||
15 | * reserved for vvars. Specify that offset in DECLARE_VVAR. | ||
16 | * (There are 896 bytes available. If you mess up, the linker will | ||
17 | * catch it.) | ||
18 | */ | ||
19 | |||
20 | /* Offset of vars within vsyscall page */ | ||
21 | #define VSYSCALL_VARS_OFFSET (3072 + 128) | ||
22 | |||
23 | #if defined(__VVAR_KERNEL_LDS) | ||
24 | |||
25 | /* The kernel linker script defines its own magic to put vvars in the | ||
26 | * right place. | ||
27 | */ | ||
28 | #define DECLARE_VVAR(offset, type, name) \ | ||
29 | EMIT_VVAR(name, VSYSCALL_VARS_OFFSET + offset) | ||
30 | |||
31 | #else | ||
32 | |||
33 | #define DECLARE_VVAR(offset, type, name) \ | ||
34 | static type const * const vvaraddr_ ## name = \ | ||
35 | (void *)(VSYSCALL_START + VSYSCALL_VARS_OFFSET + (offset)); | ||
36 | |||
37 | #define DEFINE_VVAR(type, name) \ | ||
38 | type __vvar_ ## name \ | ||
39 | __attribute__((section(".vsyscall_var_" #name), aligned(16))) | ||
40 | |||
41 | #define VVAR(name) (*vvaraddr_ ## name) | ||
42 | |||
43 | #endif | ||
44 | |||
45 | /* DECLARE_VVAR(offset, type, name) */ | ||
46 | |||
47 | DECLARE_VVAR(0, volatile unsigned long, jiffies) | ||
48 | DECLARE_VVAR(8, int, vgetcpu_mode) | ||
49 | DECLARE_VVAR(128, struct vsyscall_gtod_data, vsyscall_gtod_data) | ||
50 | |||
51 | #undef DECLARE_VVAR | ||
52 | #undef VSYSCALL_VARS_OFFSET | ||
diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h index 8508bfe52296..d240ea950519 100644 --- a/arch/x86/include/asm/xen/hypercall.h +++ b/arch/x86/include/asm/xen/hypercall.h | |||
@@ -447,6 +447,13 @@ HYPERVISOR_hvm_op(int op, void *arg) | |||
447 | return _hypercall2(unsigned long, hvm_op, op, arg); | 447 | return _hypercall2(unsigned long, hvm_op, op, arg); |
448 | } | 448 | } |
449 | 449 | ||
450 | static inline int | ||
451 | HYPERVISOR_tmem_op( | ||
452 | struct tmem_op *op) | ||
453 | { | ||
454 | return _hypercall1(int, tmem_op, op); | ||
455 | } | ||
456 | |||
450 | static inline void | 457 | static inline void |
451 | MULTI_fpu_taskswitch(struct multicall_entry *mcl, int set) | 458 | MULTI_fpu_taskswitch(struct multicall_entry *mcl, int set) |
452 | { | 459 | { |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 250806472a7e..90b06d4daee2 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -24,13 +24,17 @@ endif | |||
24 | nostackp := $(call cc-option, -fno-stack-protector) | 24 | nostackp := $(call cc-option, -fno-stack-protector) |
25 | CFLAGS_vsyscall_64.o := $(PROFILING) -g0 $(nostackp) | 25 | CFLAGS_vsyscall_64.o := $(PROFILING) -g0 $(nostackp) |
26 | CFLAGS_hpet.o := $(nostackp) | 26 | CFLAGS_hpet.o := $(nostackp) |
27 | CFLAGS_tsc.o := $(nostackp) | 27 | CFLAGS_vread_tsc_64.o := $(nostackp) |
28 | CFLAGS_paravirt.o := $(nostackp) | 28 | CFLAGS_paravirt.o := $(nostackp) |
29 | GCOV_PROFILE_vsyscall_64.o := n | 29 | GCOV_PROFILE_vsyscall_64.o := n |
30 | GCOV_PROFILE_hpet.o := n | 30 | GCOV_PROFILE_hpet.o := n |
31 | GCOV_PROFILE_tsc.o := n | 31 | GCOV_PROFILE_tsc.o := n |
32 | GCOV_PROFILE_vread_tsc_64.o := n | ||
32 | GCOV_PROFILE_paravirt.o := n | 33 | GCOV_PROFILE_paravirt.o := n |
33 | 34 | ||
35 | # vread_tsc_64 is hot and should be fully optimized: | ||
36 | CFLAGS_REMOVE_vread_tsc_64.o = -pg -fno-optimize-sibling-calls | ||
37 | |||
34 | obj-y := process_$(BITS).o signal.o entry_$(BITS).o | 38 | obj-y := process_$(BITS).o signal.o entry_$(BITS).o |
35 | obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o | 39 | obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o |
36 | obj-y += time.o ioport.o ldt.o dumpstack.o | 40 | obj-y += time.o ioport.o ldt.o dumpstack.o |
@@ -39,7 +43,7 @@ obj-$(CONFIG_IRQ_WORK) += irq_work.o | |||
39 | obj-y += probe_roms.o | 43 | obj-y += probe_roms.o |
40 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o | 44 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o |
41 | obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o | 45 | obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o |
42 | obj-$(CONFIG_X86_64) += syscall_64.o vsyscall_64.o | 46 | obj-$(CONFIG_X86_64) += syscall_64.o vsyscall_64.o vread_tsc_64.o |
43 | obj-y += bootflag.o e820.o | 47 | obj-y += bootflag.o e820.o |
44 | obj-y += pci-dma.o quirks.o topology.o kdebugfs.o | 48 | obj-y += pci-dma.o quirks.o topology.o kdebugfs.o |
45 | obj-y += alternative.o i8253.o pci-nommu.o hw_breakpoint.o | 49 | obj-y += alternative.o i8253.o pci-nommu.o hw_breakpoint.o |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f450b683dfcf..b511a011b7d0 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -91,6 +91,10 @@ static int __init early_get_pnodeid(void) | |||
91 | m_n_config.v = uv_early_read_mmr(UVH_RH_GAM_CONFIG_MMR); | 91 | m_n_config.v = uv_early_read_mmr(UVH_RH_GAM_CONFIG_MMR); |
92 | uv_min_hub_revision_id = node_id.s.revision; | 92 | uv_min_hub_revision_id = node_id.s.revision; |
93 | 93 | ||
94 | if (node_id.s.part_number == UV2_HUB_PART_NUMBER) | ||
95 | uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1; | ||
96 | |||
97 | uv_hub_info->hub_revision = uv_min_hub_revision_id; | ||
94 | pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1); | 98 | pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1); |
95 | return pnode; | 99 | return pnode; |
96 | } | 100 | } |
@@ -112,17 +116,25 @@ static void __init early_get_apic_pnode_shift(void) | |||
112 | */ | 116 | */ |
113 | static void __init uv_set_apicid_hibit(void) | 117 | static void __init uv_set_apicid_hibit(void) |
114 | { | 118 | { |
115 | union uvh_lb_target_physical_apic_id_mask_u apicid_mask; | 119 | union uv1h_lb_target_physical_apic_id_mask_u apicid_mask; |
116 | 120 | ||
117 | apicid_mask.v = uv_early_read_mmr(UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK); | 121 | if (is_uv1_hub()) { |
118 | uv_apicid_hibits = apicid_mask.s.bit_enables & UV_APICID_HIBIT_MASK; | 122 | apicid_mask.v = |
123 | uv_early_read_mmr(UV1H_LB_TARGET_PHYSICAL_APIC_ID_MASK); | ||
124 | uv_apicid_hibits = | ||
125 | apicid_mask.s1.bit_enables & UV_APICID_HIBIT_MASK; | ||
126 | } | ||
119 | } | 127 | } |
120 | 128 | ||
121 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 129 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
122 | { | 130 | { |
123 | int pnodeid; | 131 | int pnodeid, is_uv1, is_uv2; |
124 | 132 | ||
125 | if (!strcmp(oem_id, "SGI")) { | 133 | is_uv1 = !strcmp(oem_id, "SGI"); |
134 | is_uv2 = !strcmp(oem_id, "SGI2"); | ||
135 | if (is_uv1 || is_uv2) { | ||
136 | uv_hub_info->hub_revision = | ||
137 | is_uv1 ? UV1_HUB_REVISION_BASE : UV2_HUB_REVISION_BASE; | ||
126 | pnodeid = early_get_pnodeid(); | 138 | pnodeid = early_get_pnodeid(); |
127 | early_get_apic_pnode_shift(); | 139 | early_get_apic_pnode_shift(); |
128 | x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range; | 140 | x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range; |
@@ -484,12 +496,19 @@ static __init void map_mmr_high(int max_pnode) | |||
484 | static __init void map_mmioh_high(int max_pnode) | 496 | static __init void map_mmioh_high(int max_pnode) |
485 | { | 497 | { |
486 | union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh; | 498 | union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh; |
487 | int shift = UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT; | 499 | int shift; |
488 | 500 | ||
489 | mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); | 501 | mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); |
490 | if (mmioh.s.enable) | 502 | if (is_uv1_hub() && mmioh.s1.enable) { |
491 | map_high("MMIOH", mmioh.s.base, shift, mmioh.s.m_io, | 503 | shift = UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT; |
504 | map_high("MMIOH", mmioh.s1.base, shift, mmioh.s1.m_io, | ||
505 | max_pnode, map_uc); | ||
506 | } | ||
507 | if (is_uv2_hub() && mmioh.s2.enable) { | ||
508 | shift = UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT; | ||
509 | map_high("MMIOH", mmioh.s2.base, shift, mmioh.s2.m_io, | ||
492 | max_pnode, map_uc); | 510 | max_pnode, map_uc); |
511 | } | ||
493 | } | 512 | } |
494 | 513 | ||
495 | static __init void map_low_mmrs(void) | 514 | static __init void map_low_mmrs(void) |
@@ -736,13 +755,14 @@ void __init uv_system_init(void) | |||
736 | unsigned long mmr_base, present, paddr; | 755 | unsigned long mmr_base, present, paddr; |
737 | unsigned short pnode_mask, pnode_io_mask; | 756 | unsigned short pnode_mask, pnode_io_mask; |
738 | 757 | ||
758 | printk(KERN_INFO "UV: Found %s hub\n", is_uv1_hub() ? "UV1" : "UV2"); | ||
739 | map_low_mmrs(); | 759 | map_low_mmrs(); |
740 | 760 | ||
741 | m_n_config.v = uv_read_local_mmr(UVH_RH_GAM_CONFIG_MMR ); | 761 | m_n_config.v = uv_read_local_mmr(UVH_RH_GAM_CONFIG_MMR ); |
742 | m_val = m_n_config.s.m_skt; | 762 | m_val = m_n_config.s.m_skt; |
743 | n_val = m_n_config.s.n_skt; | 763 | n_val = m_n_config.s.n_skt; |
744 | mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); | 764 | mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); |
745 | n_io = mmioh.s.n_io; | 765 | n_io = is_uv1_hub() ? mmioh.s1.n_io : mmioh.s2.n_io; |
746 | mmr_base = | 766 | mmr_base = |
747 | uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & | 767 | uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & |
748 | ~UV_MMR_ENABLE; | 768 | ~UV_MMR_ENABLE; |
@@ -811,6 +831,8 @@ void __init uv_system_init(void) | |||
811 | */ | 831 | */ |
812 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; | 832 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; |
813 | uv_cpu_hub_info(cpu)->apic_pnode_shift = uvh_apicid.s.pnode_shift; | 833 | uv_cpu_hub_info(cpu)->apic_pnode_shift = uvh_apicid.s.pnode_shift; |
834 | uv_cpu_hub_info(cpu)->hub_revision = uv_hub_info->hub_revision; | ||
835 | |||
814 | pnode = uv_apicid_to_pnode(apicid); | 836 | pnode = uv_apicid_to_pnode(apicid); |
815 | blade = boot_pnode_to_blade(pnode); | 837 | blade = boot_pnode_to_blade(pnode); |
816 | lcpu = uv_blade_info[blade].nr_possible_cpus; | 838 | lcpu = uv_blade_info[blade].nr_possible_cpus; |
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index 3bfa02235965..965a7666c283 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
@@ -361,6 +361,7 @@ struct apm_user { | |||
361 | * idle percentage above which bios idle calls are done | 361 | * idle percentage above which bios idle calls are done |
362 | */ | 362 | */ |
363 | #ifdef CONFIG_APM_CPU_IDLE | 363 | #ifdef CONFIG_APM_CPU_IDLE |
364 | #warning deprecated CONFIG_APM_CPU_IDLE will be deleted in 2012 | ||
364 | #define DEFAULT_IDLE_THRESHOLD 95 | 365 | #define DEFAULT_IDLE_THRESHOLD 95 |
365 | #else | 366 | #else |
366 | #define DEFAULT_IDLE_THRESHOLD 100 | 367 | #define DEFAULT_IDLE_THRESHOLD 100 |
@@ -904,6 +905,7 @@ static void apm_cpu_idle(void) | |||
904 | unsigned int jiffies_since_last_check = jiffies - last_jiffies; | 905 | unsigned int jiffies_since_last_check = jiffies - last_jiffies; |
905 | unsigned int bucket; | 906 | unsigned int bucket; |
906 | 907 | ||
908 | WARN_ONCE(1, "deprecated apm_cpu_idle will be deleted in 2012"); | ||
907 | recalc: | 909 | recalc: |
908 | if (jiffies_since_last_check > IDLE_CALC_LIMIT) { | 910 | if (jiffies_since_last_check > IDLE_CALC_LIMIT) { |
909 | use_apm_idle = 0; | 911 | use_apm_idle = 0; |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 8f5cabb3c5b0..b13ed393dfce 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -612,8 +612,11 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
612 | } | 612 | } |
613 | #endif | 613 | #endif |
614 | 614 | ||
615 | /* As a rule processors have APIC timer running in deep C states */ | 615 | /* |
616 | if (c->x86 > 0xf && !cpu_has_amd_erratum(amd_erratum_400)) | 616 | * Family 0x12 and above processors have APIC timer |
617 | * running in deep C states. | ||
618 | */ | ||
619 | if (c->x86 > 0x11) | ||
617 | set_cpu_cap(c, X86_FEATURE_ARAT); | 620 | set_cpu_cap(c, X86_FEATURE_ARAT); |
618 | 621 | ||
619 | /* | 622 | /* |
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index c39576cb3018..525514cf33c3 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | static int __init no_halt(char *s) | 20 | static int __init no_halt(char *s) |
21 | { | 21 | { |
22 | WARN_ONCE(1, "\"no-hlt\" is deprecated, please use \"idle=poll\"\n"); | ||
22 | boot_cpu_data.hlt_works_ok = 0; | 23 | boot_cpu_data.hlt_works_ok = 0; |
23 | return 1; | 24 | return 1; |
24 | } | 25 | } |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c8b41623377f..22a073d7fbff 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -477,13 +477,6 @@ void __cpuinit detect_ht(struct cpuinfo_x86 *c) | |||
477 | if (smp_num_siblings <= 1) | 477 | if (smp_num_siblings <= 1) |
478 | goto out; | 478 | goto out; |
479 | 479 | ||
480 | if (smp_num_siblings > nr_cpu_ids) { | ||
481 | pr_warning("CPU: Unsupported number of siblings %d", | ||
482 | smp_num_siblings); | ||
483 | smp_num_siblings = 1; | ||
484 | return; | ||
485 | } | ||
486 | |||
487 | index_msb = get_count_order(smp_num_siblings); | 480 | index_msb = get_count_order(smp_num_siblings); |
488 | c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid, index_msb); | 481 | c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid, index_msb); |
489 | 482 | ||
@@ -909,7 +902,7 @@ static void vgetcpu_set_mode(void) | |||
909 | void __init identify_boot_cpu(void) | 902 | void __init identify_boot_cpu(void) |
910 | { | 903 | { |
911 | identify_cpu(&boot_cpu_data); | 904 | identify_cpu(&boot_cpu_data); |
912 | init_c1e_mask(); | 905 | init_amd_e400_c1e_mask(); |
913 | #ifdef CONFIG_X86_32 | 906 | #ifdef CONFIG_X86_32 |
914 | sysenter_setup(); | 907 | sysenter_setup(); |
915 | enable_sep_cpu(); | 908 | enable_sep_cpu(); |
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 0ba15a6cc57e..c9a281f272fd 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
@@ -123,7 +123,7 @@ static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | |||
123 | static atomic_t nmi_running = ATOMIC_INIT(0); | 123 | static atomic_t nmi_running = ATOMIC_INIT(0); |
124 | static int mod_code_status; /* holds return value of text write */ | 124 | static int mod_code_status; /* holds return value of text write */ |
125 | static void *mod_code_ip; /* holds the IP to write to */ | 125 | static void *mod_code_ip; /* holds the IP to write to */ |
126 | static void *mod_code_newcode; /* holds the text to write to the IP */ | 126 | static const void *mod_code_newcode; /* holds the text to write to the IP */ |
127 | 127 | ||
128 | static unsigned nmi_wait_count; | 128 | static unsigned nmi_wait_count; |
129 | static atomic_t nmi_update_count = ATOMIC_INIT(0); | 129 | static atomic_t nmi_update_count = ATOMIC_INIT(0); |
@@ -225,7 +225,7 @@ within(unsigned long addr, unsigned long start, unsigned long end) | |||
225 | } | 225 | } |
226 | 226 | ||
227 | static int | 227 | static int |
228 | do_ftrace_mod_code(unsigned long ip, void *new_code) | 228 | do_ftrace_mod_code(unsigned long ip, const void *new_code) |
229 | { | 229 | { |
230 | /* | 230 | /* |
231 | * On x86_64, kernel text mappings are mapped read-only with | 231 | * On x86_64, kernel text mappings are mapped read-only with |
@@ -266,8 +266,8 @@ static const unsigned char *ftrace_nop_replace(void) | |||
266 | } | 266 | } |
267 | 267 | ||
268 | static int | 268 | static int |
269 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, | 269 | ftrace_modify_code(unsigned long ip, unsigned const char *old_code, |
270 | unsigned char *new_code) | 270 | unsigned const char *new_code) |
271 | { | 271 | { |
272 | unsigned char replaced[MCOUNT_INSN_SIZE]; | 272 | unsigned char replaced[MCOUNT_INSN_SIZE]; |
273 | 273 | ||
@@ -301,7 +301,7 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
301 | int ftrace_make_nop(struct module *mod, | 301 | int ftrace_make_nop(struct module *mod, |
302 | struct dyn_ftrace *rec, unsigned long addr) | 302 | struct dyn_ftrace *rec, unsigned long addr) |
303 | { | 303 | { |
304 | unsigned char *new, *old; | 304 | unsigned const char *new, *old; |
305 | unsigned long ip = rec->ip; | 305 | unsigned long ip = rec->ip; |
306 | 306 | ||
307 | old = ftrace_call_replace(ip, addr); | 307 | old = ftrace_call_replace(ip, addr); |
@@ -312,7 +312,7 @@ int ftrace_make_nop(struct module *mod, | |||
312 | 312 | ||
313 | int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | 313 | int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) |
314 | { | 314 | { |
315 | unsigned char *new, *old; | 315 | unsigned const char *new, *old; |
316 | unsigned long ip = rec->ip; | 316 | unsigned long ip = rec->ip; |
317 | 317 | ||
318 | old = ftrace_nop_replace(); | 318 | old = ftrace_nop_replace(); |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 88a90a977f8e..2e4928d45a2d 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -337,7 +337,9 @@ EXPORT_SYMBOL(boot_option_idle_override); | |||
337 | * Powermanagement idle function, if any.. | 337 | * Powermanagement idle function, if any.. |
338 | */ | 338 | */ |
339 | void (*pm_idle)(void); | 339 | void (*pm_idle)(void); |
340 | #if defined(CONFIG_APM_MODULE) && defined(CONFIG_APM_CPU_IDLE) | ||
340 | EXPORT_SYMBOL(pm_idle); | 341 | EXPORT_SYMBOL(pm_idle); |
342 | #endif | ||
341 | 343 | ||
342 | #ifdef CONFIG_X86_32 | 344 | #ifdef CONFIG_X86_32 |
343 | /* | 345 | /* |
@@ -397,7 +399,7 @@ void default_idle(void) | |||
397 | cpu_relax(); | 399 | cpu_relax(); |
398 | } | 400 | } |
399 | } | 401 | } |
400 | #ifdef CONFIG_APM_MODULE | 402 | #if defined(CONFIG_APM_MODULE) && defined(CONFIG_APM_CPU_IDLE) |
401 | EXPORT_SYMBOL(default_idle); | 403 | EXPORT_SYMBOL(default_idle); |
402 | #endif | 404 | #endif |
403 | 405 | ||
@@ -535,45 +537,45 @@ int mwait_usable(const struct cpuinfo_x86 *c) | |||
535 | return (edx & MWAIT_EDX_C1); | 537 | return (edx & MWAIT_EDX_C1); |
536 | } | 538 | } |
537 | 539 | ||
538 | bool c1e_detected; | 540 | bool amd_e400_c1e_detected; |
539 | EXPORT_SYMBOL(c1e_detected); | 541 | EXPORT_SYMBOL(amd_e400_c1e_detected); |
540 | 542 | ||
541 | static cpumask_var_t c1e_mask; | 543 | static cpumask_var_t amd_e400_c1e_mask; |
542 | 544 | ||
543 | void c1e_remove_cpu(int cpu) | 545 | void amd_e400_remove_cpu(int cpu) |
544 | { | 546 | { |
545 | if (c1e_mask != NULL) | 547 | if (amd_e400_c1e_mask != NULL) |
546 | cpumask_clear_cpu(cpu, c1e_mask); | 548 | cpumask_clear_cpu(cpu, amd_e400_c1e_mask); |
547 | } | 549 | } |
548 | 550 | ||
549 | /* | 551 | /* |
550 | * C1E aware idle routine. We check for C1E active in the interrupt | 552 | * AMD Erratum 400 aware idle routine. We check for C1E active in the interrupt |
551 | * pending message MSR. If we detect C1E, then we handle it the same | 553 | * pending message MSR. If we detect C1E, then we handle it the same |
552 | * way as C3 power states (local apic timer and TSC stop) | 554 | * way as C3 power states (local apic timer and TSC stop) |
553 | */ | 555 | */ |
554 | static void c1e_idle(void) | 556 | static void amd_e400_idle(void) |
555 | { | 557 | { |
556 | if (need_resched()) | 558 | if (need_resched()) |
557 | return; | 559 | return; |
558 | 560 | ||
559 | if (!c1e_detected) { | 561 | if (!amd_e400_c1e_detected) { |
560 | u32 lo, hi; | 562 | u32 lo, hi; |
561 | 563 | ||
562 | rdmsr(MSR_K8_INT_PENDING_MSG, lo, hi); | 564 | rdmsr(MSR_K8_INT_PENDING_MSG, lo, hi); |
563 | 565 | ||
564 | if (lo & K8_INTP_C1E_ACTIVE_MASK) { | 566 | if (lo & K8_INTP_C1E_ACTIVE_MASK) { |
565 | c1e_detected = true; | 567 | amd_e400_c1e_detected = true; |
566 | if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC)) | 568 | if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC)) |
567 | mark_tsc_unstable("TSC halt in AMD C1E"); | 569 | mark_tsc_unstable("TSC halt in AMD C1E"); |
568 | printk(KERN_INFO "System has AMD C1E enabled\n"); | 570 | printk(KERN_INFO "System has AMD C1E enabled\n"); |
569 | } | 571 | } |
570 | } | 572 | } |
571 | 573 | ||
572 | if (c1e_detected) { | 574 | if (amd_e400_c1e_detected) { |
573 | int cpu = smp_processor_id(); | 575 | int cpu = smp_processor_id(); |
574 | 576 | ||
575 | if (!cpumask_test_cpu(cpu, c1e_mask)) { | 577 | if (!cpumask_test_cpu(cpu, amd_e400_c1e_mask)) { |
576 | cpumask_set_cpu(cpu, c1e_mask); | 578 | cpumask_set_cpu(cpu, amd_e400_c1e_mask); |
577 | /* | 579 | /* |
578 | * Force broadcast so ACPI can not interfere. | 580 | * Force broadcast so ACPI can not interfere. |
579 | */ | 581 | */ |
@@ -616,17 +618,17 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) | |||
616 | pm_idle = mwait_idle; | 618 | pm_idle = mwait_idle; |
617 | } else if (cpu_has_amd_erratum(amd_erratum_400)) { | 619 | } else if (cpu_has_amd_erratum(amd_erratum_400)) { |
618 | /* E400: APIC timer interrupt does not wake up CPU from C1e */ | 620 | /* E400: APIC timer interrupt does not wake up CPU from C1e */ |
619 | printk(KERN_INFO "using C1E aware idle routine\n"); | 621 | printk(KERN_INFO "using AMD E400 aware idle routine\n"); |
620 | pm_idle = c1e_idle; | 622 | pm_idle = amd_e400_idle; |
621 | } else | 623 | } else |
622 | pm_idle = default_idle; | 624 | pm_idle = default_idle; |
623 | } | 625 | } |
624 | 626 | ||
625 | void __init init_c1e_mask(void) | 627 | void __init init_amd_e400_c1e_mask(void) |
626 | { | 628 | { |
627 | /* If we're using c1e_idle, we need to allocate c1e_mask. */ | 629 | /* If we're using amd_e400_idle, we need to allocate amd_e400_c1e_mask. */ |
628 | if (pm_idle == c1e_idle) | 630 | if (pm_idle == amd_e400_idle) |
629 | zalloc_cpumask_var(&c1e_mask, GFP_KERNEL); | 631 | zalloc_cpumask_var(&amd_e400_c1e_mask, GFP_KERNEL); |
630 | } | 632 | } |
631 | 633 | ||
632 | static int __init idle_setup(char *str) | 634 | static int __init idle_setup(char *str) |
@@ -640,6 +642,7 @@ static int __init idle_setup(char *str) | |||
640 | boot_option_idle_override = IDLE_POLL; | 642 | boot_option_idle_override = IDLE_POLL; |
641 | } else if (!strcmp(str, "mwait")) { | 643 | } else if (!strcmp(str, "mwait")) { |
642 | boot_option_idle_override = IDLE_FORCE_MWAIT; | 644 | boot_option_idle_override = IDLE_FORCE_MWAIT; |
645 | WARN_ONCE(1, "\"idle=mwait\" will be removed in 2012\n"); | ||
643 | } else if (!strcmp(str, "halt")) { | 646 | } else if (!strcmp(str, "halt")) { |
644 | /* | 647 | /* |
645 | * When the boot option of idle=halt is added, halt is | 648 | * When the boot option of idle=halt is added, halt is |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index a3e5948670c2..afaf38447ef5 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -910,6 +910,13 @@ void __init setup_arch(char **cmdline_p) | |||
910 | memblock.current_limit = get_max_mapped(); | 910 | memblock.current_limit = get_max_mapped(); |
911 | memblock_x86_fill(); | 911 | memblock_x86_fill(); |
912 | 912 | ||
913 | /* | ||
914 | * The EFI specification says that boot service code won't be called | ||
915 | * after ExitBootServices(). This is, in fact, a lie. | ||
916 | */ | ||
917 | if (efi_enabled) | ||
918 | efi_reserve_boot_services(); | ||
919 | |||
913 | /* preallocate 4k for mptable mpc */ | 920 | /* preallocate 4k for mptable mpc */ |
914 | early_reserve_e820_mpc_new(); | 921 | early_reserve_e820_mpc_new(); |
915 | 922 | ||
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index a3c430bdfb60..33a0c11797de 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -1307,7 +1307,7 @@ void play_dead_common(void) | |||
1307 | { | 1307 | { |
1308 | idle_task_exit(); | 1308 | idle_task_exit(); |
1309 | reset_lazy_tlbstate(); | 1309 | reset_lazy_tlbstate(); |
1310 | c1e_remove_cpu(raw_smp_processor_id()); | 1310 | amd_e400_remove_cpu(raw_smp_processor_id()); |
1311 | 1311 | ||
1312 | mb(); | 1312 | mb(); |
1313 | /* Ack it */ | 1313 | /* Ack it */ |
@@ -1332,7 +1332,7 @@ static inline void mwait_play_dead(void) | |||
1332 | void *mwait_ptr; | 1332 | void *mwait_ptr; |
1333 | struct cpuinfo_x86 *c = __this_cpu_ptr(&cpu_info); | 1333 | struct cpuinfo_x86 *c = __this_cpu_ptr(&cpu_info); |
1334 | 1334 | ||
1335 | if (!this_cpu_has(X86_FEATURE_MWAIT) && mwait_usable(c)) | 1335 | if (!(this_cpu_has(X86_FEATURE_MWAIT) && mwait_usable(c))) |
1336 | return; | 1336 | return; |
1337 | if (!this_cpu_has(X86_FEATURE_CLFLSH)) | 1337 | if (!this_cpu_has(X86_FEATURE_CLFLSH)) |
1338 | return; | 1338 | return; |
diff --git a/arch/x86/kernel/syscall_table_32.S b/arch/x86/kernel/syscall_table_32.S index 32cbffb0c494..fbb0a045a1a2 100644 --- a/arch/x86/kernel/syscall_table_32.S +++ b/arch/x86/kernel/syscall_table_32.S | |||
@@ -345,3 +345,4 @@ ENTRY(sys_call_table) | |||
345 | .long sys_clock_adjtime | 345 | .long sys_clock_adjtime |
346 | .long sys_syncfs | 346 | .long sys_syncfs |
347 | .long sys_sendmmsg /* 345 */ | 347 | .long sys_sendmmsg /* 345 */ |
348 | .long sys_setns | ||
diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c index 25a28a245937..00cbb272627f 100644 --- a/arch/x86/kernel/time.c +++ b/arch/x86/kernel/time.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <asm/time.h> | 23 | #include <asm/time.h> |
24 | 24 | ||
25 | #ifdef CONFIG_X86_64 | 25 | #ifdef CONFIG_X86_64 |
26 | volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES; | 26 | DEFINE_VVAR(volatile unsigned long, jiffies) = INITIAL_JIFFIES; |
27 | #endif | 27 | #endif |
28 | 28 | ||
29 | unsigned long profile_pc(struct pt_regs *regs) | 29 | unsigned long profile_pc(struct pt_regs *regs) |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 9335bf7dd2e7..6cc6922262af 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -763,25 +763,6 @@ static cycle_t read_tsc(struct clocksource *cs) | |||
763 | ret : clocksource_tsc.cycle_last; | 763 | ret : clocksource_tsc.cycle_last; |
764 | } | 764 | } |
765 | 765 | ||
766 | #ifdef CONFIG_X86_64 | ||
767 | static cycle_t __vsyscall_fn vread_tsc(void) | ||
768 | { | ||
769 | cycle_t ret; | ||
770 | |||
771 | /* | ||
772 | * Surround the RDTSC by barriers, to make sure it's not | ||
773 | * speculated to outside the seqlock critical section and | ||
774 | * does not cause time warps: | ||
775 | */ | ||
776 | rdtsc_barrier(); | ||
777 | ret = (cycle_t)vget_cycles(); | ||
778 | rdtsc_barrier(); | ||
779 | |||
780 | return ret >= __vsyscall_gtod_data.clock.cycle_last ? | ||
781 | ret : __vsyscall_gtod_data.clock.cycle_last; | ||
782 | } | ||
783 | #endif | ||
784 | |||
785 | static void resume_tsc(struct clocksource *cs) | 766 | static void resume_tsc(struct clocksource *cs) |
786 | { | 767 | { |
787 | clocksource_tsc.cycle_last = 0; | 768 | clocksource_tsc.cycle_last = 0; |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 61682f0ac264..89aed99aafce 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
@@ -161,6 +161,12 @@ SECTIONS | |||
161 | 161 | ||
162 | #define VVIRT_OFFSET (VSYSCALL_ADDR - __vsyscall_0) | 162 | #define VVIRT_OFFSET (VSYSCALL_ADDR - __vsyscall_0) |
163 | #define VVIRT(x) (ADDR(x) - VVIRT_OFFSET) | 163 | #define VVIRT(x) (ADDR(x) - VVIRT_OFFSET) |
164 | #define EMIT_VVAR(x, offset) .vsyscall_var_ ## x \ | ||
165 | ADDR(.vsyscall_0) + offset \ | ||
166 | : AT(VLOAD(.vsyscall_var_ ## x)) { \ | ||
167 | *(.vsyscall_var_ ## x) \ | ||
168 | } \ | ||
169 | x = VVIRT(.vsyscall_var_ ## x); | ||
164 | 170 | ||
165 | . = ALIGN(4096); | 171 | . = ALIGN(4096); |
166 | __vsyscall_0 = .; | 172 | __vsyscall_0 = .; |
@@ -175,18 +181,6 @@ SECTIONS | |||
175 | *(.vsyscall_fn) | 181 | *(.vsyscall_fn) |
176 | } | 182 | } |
177 | 183 | ||
178 | . = ALIGN(L1_CACHE_BYTES); | ||
179 | .vsyscall_gtod_data : AT(VLOAD(.vsyscall_gtod_data)) { | ||
180 | *(.vsyscall_gtod_data) | ||
181 | } | ||
182 | |||
183 | vsyscall_gtod_data = VVIRT(.vsyscall_gtod_data); | ||
184 | .vsyscall_clock : AT(VLOAD(.vsyscall_clock)) { | ||
185 | *(.vsyscall_clock) | ||
186 | } | ||
187 | vsyscall_clock = VVIRT(.vsyscall_clock); | ||
188 | |||
189 | |||
190 | .vsyscall_1 ADDR(.vsyscall_0) + 1024: AT(VLOAD(.vsyscall_1)) { | 184 | .vsyscall_1 ADDR(.vsyscall_0) + 1024: AT(VLOAD(.vsyscall_1)) { |
191 | *(.vsyscall_1) | 185 | *(.vsyscall_1) |
192 | } | 186 | } |
@@ -194,21 +188,14 @@ SECTIONS | |||
194 | *(.vsyscall_2) | 188 | *(.vsyscall_2) |
195 | } | 189 | } |
196 | 190 | ||
197 | .vgetcpu_mode : AT(VLOAD(.vgetcpu_mode)) { | ||
198 | *(.vgetcpu_mode) | ||
199 | } | ||
200 | vgetcpu_mode = VVIRT(.vgetcpu_mode); | ||
201 | |||
202 | . = ALIGN(L1_CACHE_BYTES); | ||
203 | .jiffies : AT(VLOAD(.jiffies)) { | ||
204 | *(.jiffies) | ||
205 | } | ||
206 | jiffies = VVIRT(.jiffies); | ||
207 | |||
208 | .vsyscall_3 ADDR(.vsyscall_0) + 3072: AT(VLOAD(.vsyscall_3)) { | 191 | .vsyscall_3 ADDR(.vsyscall_0) + 3072: AT(VLOAD(.vsyscall_3)) { |
209 | *(.vsyscall_3) | 192 | *(.vsyscall_3) |
210 | } | 193 | } |
211 | 194 | ||
195 | #define __VVAR_KERNEL_LDS | ||
196 | #include <asm/vvar.h> | ||
197 | #undef __VVAR_KERNEL_LDS | ||
198 | |||
212 | . = __vsyscall_0 + PAGE_SIZE; | 199 | . = __vsyscall_0 + PAGE_SIZE; |
213 | 200 | ||
214 | #undef VSYSCALL_ADDR | 201 | #undef VSYSCALL_ADDR |
@@ -216,6 +203,7 @@ SECTIONS | |||
216 | #undef VLOAD | 203 | #undef VLOAD |
217 | #undef VVIRT_OFFSET | 204 | #undef VVIRT_OFFSET |
218 | #undef VVIRT | 205 | #undef VVIRT |
206 | #undef EMIT_VVAR | ||
219 | 207 | ||
220 | #endif /* CONFIG_X86_64 */ | 208 | #endif /* CONFIG_X86_64 */ |
221 | 209 | ||
diff --git a/arch/x86/kernel/vread_tsc_64.c b/arch/x86/kernel/vread_tsc_64.c new file mode 100644 index 000000000000..a81aa9e9894c --- /dev/null +++ b/arch/x86/kernel/vread_tsc_64.c | |||
@@ -0,0 +1,36 @@ | |||
1 | /* This code runs in userspace. */ | ||
2 | |||
3 | #define DISABLE_BRANCH_PROFILING | ||
4 | #include <asm/vgtod.h> | ||
5 | |||
6 | notrace cycle_t __vsyscall_fn vread_tsc(void) | ||
7 | { | ||
8 | cycle_t ret; | ||
9 | u64 last; | ||
10 | |||
11 | /* | ||
12 | * Empirically, a fence (of type that depends on the CPU) | ||
13 | * before rdtsc is enough to ensure that rdtsc is ordered | ||
14 | * with respect to loads. The various CPU manuals are unclear | ||
15 | * as to whether rdtsc can be reordered with later loads, | ||
16 | * but no one has ever seen it happen. | ||
17 | */ | ||
18 | rdtsc_barrier(); | ||
19 | ret = (cycle_t)vget_cycles(); | ||
20 | |||
21 | last = VVAR(vsyscall_gtod_data).clock.cycle_last; | ||
22 | |||
23 | if (likely(ret >= last)) | ||
24 | return ret; | ||
25 | |||
26 | /* | ||
27 | * GCC likes to generate cmov here, but this branch is extremely | ||
28 | * predictable (it's just a funciton of time and the likely is | ||
29 | * very likely) and there's a data dependence, so force GCC | ||
30 | * to generate a branch instead. I don't barrier() because | ||
31 | * we don't actually need a barrier, and if this function | ||
32 | * ever gets inlined it will generate worse code. | ||
33 | */ | ||
34 | asm volatile (""); | ||
35 | return last; | ||
36 | } | ||
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index dcbb28c4b694..3e682184d76c 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -49,17 +49,10 @@ | |||
49 | __attribute__ ((unused, __section__(".vsyscall_" #nr))) notrace | 49 | __attribute__ ((unused, __section__(".vsyscall_" #nr))) notrace |
50 | #define __syscall_clobber "r11","cx","memory" | 50 | #define __syscall_clobber "r11","cx","memory" |
51 | 51 | ||
52 | /* | 52 | DEFINE_VVAR(int, vgetcpu_mode); |
53 | * vsyscall_gtod_data contains data that is : | 53 | DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data) = |
54 | * - readonly from vsyscalls | ||
55 | * - written by timer interrupt or systcl (/proc/sys/kernel/vsyscall64) | ||
56 | * Try to keep this structure as small as possible to avoid cache line ping pongs | ||
57 | */ | ||
58 | int __vgetcpu_mode __section_vgetcpu_mode; | ||
59 | |||
60 | struct vsyscall_gtod_data __vsyscall_gtod_data __section_vsyscall_gtod_data = | ||
61 | { | 54 | { |
62 | .lock = SEQLOCK_UNLOCKED, | 55 | .lock = __SEQLOCK_UNLOCKED(__vsyscall_gtod_data.lock), |
63 | .sysctl_enabled = 1, | 56 | .sysctl_enabled = 1, |
64 | }; | 57 | }; |
65 | 58 | ||
@@ -97,7 +90,7 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm, | |||
97 | */ | 90 | */ |
98 | static __always_inline void do_get_tz(struct timezone * tz) | 91 | static __always_inline void do_get_tz(struct timezone * tz) |
99 | { | 92 | { |
100 | *tz = __vsyscall_gtod_data.sys_tz; | 93 | *tz = VVAR(vsyscall_gtod_data).sys_tz; |
101 | } | 94 | } |
102 | 95 | ||
103 | static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz) | 96 | static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz) |
@@ -126,23 +119,24 @@ static __always_inline void do_vgettimeofday(struct timeval * tv) | |||
126 | unsigned long mult, shift, nsec; | 119 | unsigned long mult, shift, nsec; |
127 | cycle_t (*vread)(void); | 120 | cycle_t (*vread)(void); |
128 | do { | 121 | do { |
129 | seq = read_seqbegin(&__vsyscall_gtod_data.lock); | 122 | seq = read_seqbegin(&VVAR(vsyscall_gtod_data).lock); |
130 | 123 | ||
131 | vread = __vsyscall_gtod_data.clock.vread; | 124 | vread = VVAR(vsyscall_gtod_data).clock.vread; |
132 | if (unlikely(!__vsyscall_gtod_data.sysctl_enabled || !vread)) { | 125 | if (unlikely(!VVAR(vsyscall_gtod_data).sysctl_enabled || |
126 | !vread)) { | ||
133 | gettimeofday(tv,NULL); | 127 | gettimeofday(tv,NULL); |
134 | return; | 128 | return; |
135 | } | 129 | } |
136 | 130 | ||
137 | now = vread(); | 131 | now = vread(); |
138 | base = __vsyscall_gtod_data.clock.cycle_last; | 132 | base = VVAR(vsyscall_gtod_data).clock.cycle_last; |
139 | mask = __vsyscall_gtod_data.clock.mask; | 133 | mask = VVAR(vsyscall_gtod_data).clock.mask; |
140 | mult = __vsyscall_gtod_data.clock.mult; | 134 | mult = VVAR(vsyscall_gtod_data).clock.mult; |
141 | shift = __vsyscall_gtod_data.clock.shift; | 135 | shift = VVAR(vsyscall_gtod_data).clock.shift; |
142 | 136 | ||
143 | tv->tv_sec = __vsyscall_gtod_data.wall_time_sec; | 137 | tv->tv_sec = VVAR(vsyscall_gtod_data).wall_time_sec; |
144 | nsec = __vsyscall_gtod_data.wall_time_nsec; | 138 | nsec = VVAR(vsyscall_gtod_data).wall_time_nsec; |
145 | } while (read_seqretry(&__vsyscall_gtod_data.lock, seq)); | 139 | } while (read_seqretry(&VVAR(vsyscall_gtod_data).lock, seq)); |
146 | 140 | ||
147 | /* calculate interval: */ | 141 | /* calculate interval: */ |
148 | cycle_delta = (now - base) & mask; | 142 | cycle_delta = (now - base) & mask; |
@@ -171,15 +165,15 @@ time_t __vsyscall(1) vtime(time_t *t) | |||
171 | { | 165 | { |
172 | unsigned seq; | 166 | unsigned seq; |
173 | time_t result; | 167 | time_t result; |
174 | if (unlikely(!__vsyscall_gtod_data.sysctl_enabled)) | 168 | if (unlikely(!VVAR(vsyscall_gtod_data).sysctl_enabled)) |
175 | return time_syscall(t); | 169 | return time_syscall(t); |
176 | 170 | ||
177 | do { | 171 | do { |
178 | seq = read_seqbegin(&__vsyscall_gtod_data.lock); | 172 | seq = read_seqbegin(&VVAR(vsyscall_gtod_data).lock); |
179 | 173 | ||
180 | result = __vsyscall_gtod_data.wall_time_sec; | 174 | result = VVAR(vsyscall_gtod_data).wall_time_sec; |
181 | 175 | ||
182 | } while (read_seqretry(&__vsyscall_gtod_data.lock, seq)); | 176 | } while (read_seqretry(&VVAR(vsyscall_gtod_data).lock, seq)); |
183 | 177 | ||
184 | if (t) | 178 | if (t) |
185 | *t = result; | 179 | *t = result; |
@@ -208,9 +202,9 @@ vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) | |||
208 | We do this here because otherwise user space would do it on | 202 | We do this here because otherwise user space would do it on |
209 | its own in a likely inferior way (no access to jiffies). | 203 | its own in a likely inferior way (no access to jiffies). |
210 | If you don't like it pass NULL. */ | 204 | If you don't like it pass NULL. */ |
211 | if (tcache && tcache->blob[0] == (j = __jiffies)) { | 205 | if (tcache && tcache->blob[0] == (j = VVAR(jiffies))) { |
212 | p = tcache->blob[1]; | 206 | p = tcache->blob[1]; |
213 | } else if (__vgetcpu_mode == VGETCPU_RDTSCP) { | 207 | } else if (VVAR(vgetcpu_mode) == VGETCPU_RDTSCP) { |
214 | /* Load per CPU data from RDTSCP */ | 208 | /* Load per CPU data from RDTSCP */ |
215 | native_read_tscp(&p); | 209 | native_read_tscp(&p); |
216 | } else { | 210 | } else { |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index e191c096ab90..db832fd65ecb 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
@@ -993,6 +993,7 @@ static void lguest_time_irq(unsigned int irq, struct irq_desc *desc) | |||
993 | static void lguest_time_init(void) | 993 | static void lguest_time_init(void) |
994 | { | 994 | { |
995 | /* Set up the timer interrupt (0) to go to our simple timer routine */ | 995 | /* Set up the timer interrupt (0) to go to our simple timer routine */ |
996 | lguest_setup_irq(0); | ||
996 | irq_set_handler(0, lguest_time_irq); | 997 | irq_set_handler(0, lguest_time_irq); |
997 | 998 | ||
998 | clocksource_register_hz(&lguest_clock, NSEC_PER_SEC); | 999 | clocksource_register_hz(&lguest_clock, NSEC_PER_SEC); |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index f7a2a054a3c0..2dbf6bf4c7e5 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -823,16 +823,30 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address, | |||
823 | force_sig_info_fault(SIGBUS, code, address, tsk, fault); | 823 | force_sig_info_fault(SIGBUS, code, address, tsk, fault); |
824 | } | 824 | } |
825 | 825 | ||
826 | static noinline void | 826 | static noinline int |
827 | mm_fault_error(struct pt_regs *regs, unsigned long error_code, | 827 | mm_fault_error(struct pt_regs *regs, unsigned long error_code, |
828 | unsigned long address, unsigned int fault) | 828 | unsigned long address, unsigned int fault) |
829 | { | 829 | { |
830 | /* | ||
831 | * Pagefault was interrupted by SIGKILL. We have no reason to | ||
832 | * continue pagefault. | ||
833 | */ | ||
834 | if (fatal_signal_pending(current)) { | ||
835 | if (!(fault & VM_FAULT_RETRY)) | ||
836 | up_read(¤t->mm->mmap_sem); | ||
837 | if (!(error_code & PF_USER)) | ||
838 | no_context(regs, error_code, address); | ||
839 | return 1; | ||
840 | } | ||
841 | if (!(fault & VM_FAULT_ERROR)) | ||
842 | return 0; | ||
843 | |||
830 | if (fault & VM_FAULT_OOM) { | 844 | if (fault & VM_FAULT_OOM) { |
831 | /* Kernel mode? Handle exceptions or die: */ | 845 | /* Kernel mode? Handle exceptions or die: */ |
832 | if (!(error_code & PF_USER)) { | 846 | if (!(error_code & PF_USER)) { |
833 | up_read(¤t->mm->mmap_sem); | 847 | up_read(¤t->mm->mmap_sem); |
834 | no_context(regs, error_code, address); | 848 | no_context(regs, error_code, address); |
835 | return; | 849 | return 1; |
836 | } | 850 | } |
837 | 851 | ||
838 | out_of_memory(regs, error_code, address); | 852 | out_of_memory(regs, error_code, address); |
@@ -843,6 +857,7 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | |||
843 | else | 857 | else |
844 | BUG(); | 858 | BUG(); |
845 | } | 859 | } |
860 | return 1; | ||
846 | } | 861 | } |
847 | 862 | ||
848 | static int spurious_fault_check(unsigned long error_code, pte_t *pte) | 863 | static int spurious_fault_check(unsigned long error_code, pte_t *pte) |
@@ -1133,19 +1148,9 @@ good_area: | |||
1133 | */ | 1148 | */ |
1134 | fault = handle_mm_fault(mm, vma, address, flags); | 1149 | fault = handle_mm_fault(mm, vma, address, flags); |
1135 | 1150 | ||
1136 | if (unlikely(fault & VM_FAULT_ERROR)) { | 1151 | if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { |
1137 | mm_fault_error(regs, error_code, address, fault); | 1152 | if (mm_fault_error(regs, error_code, address, fault)) |
1138 | return; | 1153 | return; |
1139 | } | ||
1140 | |||
1141 | /* | ||
1142 | * Pagefault was interrupted by SIGKILL. We have no reason to | ||
1143 | * continue pagefault. | ||
1144 | */ | ||
1145 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) { | ||
1146 | if (!(error_code & PF_USER)) | ||
1147 | no_context(regs, error_code, address); | ||
1148 | return; | ||
1149 | } | 1154 | } |
1150 | 1155 | ||
1151 | /* | 1156 | /* |
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c index c3b8e24f2b16..9fd8a567fe1e 100644 --- a/arch/x86/oprofile/op_model_amd.c +++ b/arch/x86/oprofile/op_model_amd.c | |||
@@ -316,16 +316,23 @@ static void op_amd_stop_ibs(void) | |||
316 | wrmsrl(MSR_AMD64_IBSOPCTL, 0); | 316 | wrmsrl(MSR_AMD64_IBSOPCTL, 0); |
317 | } | 317 | } |
318 | 318 | ||
319 | static inline int eilvt_is_available(int offset) | 319 | static inline int get_eilvt(int offset) |
320 | { | 320 | { |
321 | /* check if we may assign a vector */ | ||
322 | return !setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_NMI, 1); | 321 | return !setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_NMI, 1); |
323 | } | 322 | } |
324 | 323 | ||
324 | static inline int put_eilvt(int offset) | ||
325 | { | ||
326 | return !setup_APIC_eilvt(offset, 0, 0, 1); | ||
327 | } | ||
328 | |||
325 | static inline int ibs_eilvt_valid(void) | 329 | static inline int ibs_eilvt_valid(void) |
326 | { | 330 | { |
327 | int offset; | 331 | int offset; |
328 | u64 val; | 332 | u64 val; |
333 | int valid = 0; | ||
334 | |||
335 | preempt_disable(); | ||
329 | 336 | ||
330 | rdmsrl(MSR_AMD64_IBSCTL, val); | 337 | rdmsrl(MSR_AMD64_IBSCTL, val); |
331 | offset = val & IBSCTL_LVT_OFFSET_MASK; | 338 | offset = val & IBSCTL_LVT_OFFSET_MASK; |
@@ -333,16 +340,20 @@ static inline int ibs_eilvt_valid(void) | |||
333 | if (!(val & IBSCTL_LVT_OFFSET_VALID)) { | 340 | if (!(val & IBSCTL_LVT_OFFSET_VALID)) { |
334 | pr_err(FW_BUG "cpu %d, invalid IBS interrupt offset %d (MSR%08X=0x%016llx)\n", | 341 | pr_err(FW_BUG "cpu %d, invalid IBS interrupt offset %d (MSR%08X=0x%016llx)\n", |
335 | smp_processor_id(), offset, MSR_AMD64_IBSCTL, val); | 342 | smp_processor_id(), offset, MSR_AMD64_IBSCTL, val); |
336 | return 0; | 343 | goto out; |
337 | } | 344 | } |
338 | 345 | ||
339 | if (!eilvt_is_available(offset)) { | 346 | if (!get_eilvt(offset)) { |
340 | pr_err(FW_BUG "cpu %d, IBS interrupt offset %d not available (MSR%08X=0x%016llx)\n", | 347 | pr_err(FW_BUG "cpu %d, IBS interrupt offset %d not available (MSR%08X=0x%016llx)\n", |
341 | smp_processor_id(), offset, MSR_AMD64_IBSCTL, val); | 348 | smp_processor_id(), offset, MSR_AMD64_IBSCTL, val); |
342 | return 0; | 349 | goto out; |
343 | } | 350 | } |
344 | 351 | ||
345 | return 1; | 352 | valid = 1; |
353 | out: | ||
354 | preempt_enable(); | ||
355 | |||
356 | return valid; | ||
346 | } | 357 | } |
347 | 358 | ||
348 | static inline int get_ibs_offset(void) | 359 | static inline int get_ibs_offset(void) |
@@ -600,67 +611,69 @@ static int setup_ibs_ctl(int ibs_eilvt_off) | |||
600 | 611 | ||
601 | static int force_ibs_eilvt_setup(void) | 612 | static int force_ibs_eilvt_setup(void) |
602 | { | 613 | { |
603 | int i; | 614 | int offset; |
604 | int ret; | 615 | int ret; |
605 | 616 | ||
606 | /* find the next free available EILVT entry */ | 617 | /* |
607 | for (i = 1; i < 4; i++) { | 618 | * find the next free available EILVT entry, skip offset 0, |
608 | if (!eilvt_is_available(i)) | 619 | * pin search to this cpu |
609 | continue; | 620 | */ |
610 | ret = setup_ibs_ctl(i); | 621 | preempt_disable(); |
611 | if (ret) | 622 | for (offset = 1; offset < APIC_EILVT_NR_MAX; offset++) { |
612 | return ret; | 623 | if (get_eilvt(offset)) |
613 | pr_err(FW_BUG "using offset %d for IBS interrupts\n", i); | 624 | break; |
614 | return 0; | ||
615 | } | 625 | } |
626 | preempt_enable(); | ||
616 | 627 | ||
617 | printk(KERN_DEBUG "No EILVT entry available\n"); | 628 | if (offset == APIC_EILVT_NR_MAX) { |
618 | 629 | printk(KERN_DEBUG "No EILVT entry available\n"); | |
619 | return -EBUSY; | 630 | return -EBUSY; |
620 | } | 631 | } |
621 | |||
622 | static int __init_ibs_nmi(void) | ||
623 | { | ||
624 | int ret; | ||
625 | |||
626 | if (ibs_eilvt_valid()) | ||
627 | return 0; | ||
628 | 632 | ||
629 | ret = force_ibs_eilvt_setup(); | 633 | ret = setup_ibs_ctl(offset); |
630 | if (ret) | 634 | if (ret) |
631 | return ret; | 635 | goto out; |
632 | 636 | ||
633 | if (!ibs_eilvt_valid()) | 637 | if (!ibs_eilvt_valid()) { |
634 | return -EFAULT; | 638 | ret = -EFAULT; |
639 | goto out; | ||
640 | } | ||
635 | 641 | ||
642 | pr_err(FW_BUG "using offset %d for IBS interrupts\n", offset); | ||
636 | pr_err(FW_BUG "workaround enabled for IBS LVT offset\n"); | 643 | pr_err(FW_BUG "workaround enabled for IBS LVT offset\n"); |
637 | 644 | ||
638 | return 0; | 645 | return 0; |
646 | out: | ||
647 | preempt_disable(); | ||
648 | put_eilvt(offset); | ||
649 | preempt_enable(); | ||
650 | return ret; | ||
639 | } | 651 | } |
640 | 652 | ||
641 | /* | 653 | /* |
642 | * check and reserve APIC extended interrupt LVT offset for IBS if | 654 | * check and reserve APIC extended interrupt LVT offset for IBS if |
643 | * available | 655 | * available |
644 | * | ||
645 | * init_ibs() preforms implicitly cpu-local operations, so pin this | ||
646 | * thread to its current CPU | ||
647 | */ | 656 | */ |
648 | 657 | ||
649 | static void init_ibs(void) | 658 | static void init_ibs(void) |
650 | { | 659 | { |
651 | preempt_disable(); | ||
652 | |||
653 | ibs_caps = get_ibs_caps(); | 660 | ibs_caps = get_ibs_caps(); |
661 | |||
654 | if (!ibs_caps) | 662 | if (!ibs_caps) |
663 | return; | ||
664 | |||
665 | if (ibs_eilvt_valid()) | ||
655 | goto out; | 666 | goto out; |
656 | 667 | ||
657 | if (__init_ibs_nmi() < 0) | 668 | if (!force_ibs_eilvt_setup()) |
658 | ibs_caps = 0; | 669 | goto out; |
659 | else | 670 | |
660 | printk(KERN_INFO "oprofile: AMD IBS detected (0x%08x)\n", ibs_caps); | 671 | /* Failed to setup ibs */ |
672 | ibs_caps = 0; | ||
673 | return; | ||
661 | 674 | ||
662 | out: | 675 | out: |
663 | preempt_enable(); | 676 | printk(KERN_INFO "oprofile: AMD IBS detected (0x%08x)\n", ibs_caps); |
664 | } | 677 | } |
665 | 678 | ||
666 | static int (*create_arch_files)(struct super_block *sb, struct dentry *root); | 679 | static int (*create_arch_files)(struct super_block *sb, struct dentry *root); |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index b30aa26a8df2..0d3a4fa34560 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
@@ -304,6 +304,40 @@ static void __init print_efi_memmap(void) | |||
304 | } | 304 | } |
305 | #endif /* EFI_DEBUG */ | 305 | #endif /* EFI_DEBUG */ |
306 | 306 | ||
307 | void __init efi_reserve_boot_services(void) | ||
308 | { | ||
309 | void *p; | ||
310 | |||
311 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | ||
312 | efi_memory_desc_t *md = p; | ||
313 | unsigned long long start = md->phys_addr; | ||
314 | unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; | ||
315 | |||
316 | if (md->type != EFI_BOOT_SERVICES_CODE && | ||
317 | md->type != EFI_BOOT_SERVICES_DATA) | ||
318 | continue; | ||
319 | |||
320 | memblock_x86_reserve_range(start, start + size, "EFI Boot"); | ||
321 | } | ||
322 | } | ||
323 | |||
324 | static void __init efi_free_boot_services(void) | ||
325 | { | ||
326 | void *p; | ||
327 | |||
328 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | ||
329 | efi_memory_desc_t *md = p; | ||
330 | unsigned long long start = md->phys_addr; | ||
331 | unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; | ||
332 | |||
333 | if (md->type != EFI_BOOT_SERVICES_CODE && | ||
334 | md->type != EFI_BOOT_SERVICES_DATA) | ||
335 | continue; | ||
336 | |||
337 | free_bootmem_late(start, size); | ||
338 | } | ||
339 | } | ||
340 | |||
307 | void __init efi_init(void) | 341 | void __init efi_init(void) |
308 | { | 342 | { |
309 | efi_config_table_t *config_tables; | 343 | efi_config_table_t *config_tables; |
@@ -536,7 +570,9 @@ void __init efi_enter_virtual_mode(void) | |||
536 | 570 | ||
537 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | 571 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
538 | md = p; | 572 | md = p; |
539 | if (!(md->attribute & EFI_MEMORY_RUNTIME)) | 573 | if (!(md->attribute & EFI_MEMORY_RUNTIME) && |
574 | md->type != EFI_BOOT_SERVICES_CODE && | ||
575 | md->type != EFI_BOOT_SERVICES_DATA) | ||
540 | continue; | 576 | continue; |
541 | 577 | ||
542 | size = md->num_pages << EFI_PAGE_SHIFT; | 578 | size = md->num_pages << EFI_PAGE_SHIFT; |
@@ -593,6 +629,13 @@ void __init efi_enter_virtual_mode(void) | |||
593 | } | 629 | } |
594 | 630 | ||
595 | /* | 631 | /* |
632 | * Thankfully, it does seem that no runtime services other than | ||
633 | * SetVirtualAddressMap() will touch boot services code, so we can | ||
634 | * get rid of it all at this point | ||
635 | */ | ||
636 | efi_free_boot_services(); | ||
637 | |||
638 | /* | ||
596 | * Now that EFI is in virtual mode, update the function | 639 | * Now that EFI is in virtual mode, update the function |
597 | * pointers in the runtime service table to the new virtual addresses. | 640 | * pointers in the runtime service table to the new virtual addresses. |
598 | * | 641 | * |
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 2649426a7905..ac3aa54e2654 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
@@ -49,10 +49,11 @@ static void __init early_code_mapping_set_exec(int executable) | |||
49 | if (!(__supported_pte_mask & _PAGE_NX)) | 49 | if (!(__supported_pte_mask & _PAGE_NX)) |
50 | return; | 50 | return; |
51 | 51 | ||
52 | /* Make EFI runtime service code area executable */ | 52 | /* Make EFI service code area executable */ |
53 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | 53 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
54 | md = p; | 54 | md = p; |
55 | if (md->type == EFI_RUNTIME_SERVICES_CODE) | 55 | if (md->type == EFI_RUNTIME_SERVICES_CODE || |
56 | md->type == EFI_BOOT_SERVICES_CODE) | ||
56 | efi_set_executable(md, executable); | 57 | efi_set_executable(md, executable); |
57 | } | 58 | } |
58 | } | 59 | } |
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index c58e0ea39ef5..68e467f69fec 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SGI UltraViolet TLB flush routines. | 2 | * SGI UltraViolet TLB flush routines. |
3 | * | 3 | * |
4 | * (c) 2008-2010 Cliff Wickman <cpw@sgi.com>, SGI. | 4 | * (c) 2008-2011 Cliff Wickman <cpw@sgi.com>, SGI. |
5 | * | 5 | * |
6 | * This code is released under the GNU General Public License version 2 or | 6 | * This code is released under the GNU General Public License version 2 or |
7 | * later. | 7 | * later. |
@@ -35,6 +35,7 @@ static int timeout_base_ns[] = { | |||
35 | 5242880, | 35 | 5242880, |
36 | 167772160 | 36 | 167772160 |
37 | }; | 37 | }; |
38 | |||
38 | static int timeout_us; | 39 | static int timeout_us; |
39 | static int nobau; | 40 | static int nobau; |
40 | static int baudisabled; | 41 | static int baudisabled; |
@@ -42,20 +43,70 @@ static spinlock_t disable_lock; | |||
42 | static cycles_t congested_cycles; | 43 | static cycles_t congested_cycles; |
43 | 44 | ||
44 | /* tunables: */ | 45 | /* tunables: */ |
45 | static int max_bau_concurrent = MAX_BAU_CONCURRENT; | 46 | static int max_concurr = MAX_BAU_CONCURRENT; |
46 | static int max_bau_concurrent_constant = MAX_BAU_CONCURRENT; | 47 | static int max_concurr_const = MAX_BAU_CONCURRENT; |
47 | static int plugged_delay = PLUGGED_DELAY; | 48 | static int plugged_delay = PLUGGED_DELAY; |
48 | static int plugsb4reset = PLUGSB4RESET; | 49 | static int plugsb4reset = PLUGSB4RESET; |
49 | static int timeoutsb4reset = TIMEOUTSB4RESET; | 50 | static int timeoutsb4reset = TIMEOUTSB4RESET; |
50 | static int ipi_reset_limit = IPI_RESET_LIMIT; | 51 | static int ipi_reset_limit = IPI_RESET_LIMIT; |
51 | static int complete_threshold = COMPLETE_THRESHOLD; | 52 | static int complete_threshold = COMPLETE_THRESHOLD; |
52 | static int congested_response_us = CONGESTED_RESPONSE_US; | 53 | static int congested_respns_us = CONGESTED_RESPONSE_US; |
53 | static int congested_reps = CONGESTED_REPS; | 54 | static int congested_reps = CONGESTED_REPS; |
54 | static int congested_period = CONGESTED_PERIOD; | 55 | static int congested_period = CONGESTED_PERIOD; |
56 | |||
57 | static struct tunables tunables[] = { | ||
58 | {&max_concurr, MAX_BAU_CONCURRENT}, /* must be [0] */ | ||
59 | {&plugged_delay, PLUGGED_DELAY}, | ||
60 | {&plugsb4reset, PLUGSB4RESET}, | ||
61 | {&timeoutsb4reset, TIMEOUTSB4RESET}, | ||
62 | {&ipi_reset_limit, IPI_RESET_LIMIT}, | ||
63 | {&complete_threshold, COMPLETE_THRESHOLD}, | ||
64 | {&congested_respns_us, CONGESTED_RESPONSE_US}, | ||
65 | {&congested_reps, CONGESTED_REPS}, | ||
66 | {&congested_period, CONGESTED_PERIOD} | ||
67 | }; | ||
68 | |||
55 | static struct dentry *tunables_dir; | 69 | static struct dentry *tunables_dir; |
56 | static struct dentry *tunables_file; | 70 | static struct dentry *tunables_file; |
57 | 71 | ||
58 | static int __init setup_nobau(char *arg) | 72 | /* these correspond to the statistics printed by ptc_seq_show() */ |
73 | static char *stat_description[] = { | ||
74 | "sent: number of shootdown messages sent", | ||
75 | "stime: time spent sending messages", | ||
76 | "numuvhubs: number of hubs targeted with shootdown", | ||
77 | "numuvhubs16: number times 16 or more hubs targeted", | ||
78 | "numuvhubs8: number times 8 or more hubs targeted", | ||
79 | "numuvhubs4: number times 4 or more hubs targeted", | ||
80 | "numuvhubs2: number times 2 or more hubs targeted", | ||
81 | "numuvhubs1: number times 1 hub targeted", | ||
82 | "numcpus: number of cpus targeted with shootdown", | ||
83 | "dto: number of destination timeouts", | ||
84 | "retries: destination timeout retries sent", | ||
85 | "rok: : destination timeouts successfully retried", | ||
86 | "resetp: ipi-style resource resets for plugs", | ||
87 | "resett: ipi-style resource resets for timeouts", | ||
88 | "giveup: fall-backs to ipi-style shootdowns", | ||
89 | "sto: number of source timeouts", | ||
90 | "bz: number of stay-busy's", | ||
91 | "throt: number times spun in throttle", | ||
92 | "swack: image of UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE", | ||
93 | "recv: shootdown messages received", | ||
94 | "rtime: time spent processing messages", | ||
95 | "all: shootdown all-tlb messages", | ||
96 | "one: shootdown one-tlb messages", | ||
97 | "mult: interrupts that found multiple messages", | ||
98 | "none: interrupts that found no messages", | ||
99 | "retry: number of retry messages processed", | ||
100 | "canc: number messages canceled by retries", | ||
101 | "nocan: number retries that found nothing to cancel", | ||
102 | "reset: number of ipi-style reset requests processed", | ||
103 | "rcan: number messages canceled by reset requests", | ||
104 | "disable: number times use of the BAU was disabled", | ||
105 | "enable: number times use of the BAU was re-enabled" | ||
106 | }; | ||
107 | |||
108 | static int __init | ||
109 | setup_nobau(char *arg) | ||
59 | { | 110 | { |
60 | nobau = 1; | 111 | nobau = 1; |
61 | return 0; | 112 | return 0; |
@@ -63,7 +114,7 @@ static int __init setup_nobau(char *arg) | |||
63 | early_param("nobau", setup_nobau); | 114 | early_param("nobau", setup_nobau); |
64 | 115 | ||
65 | /* base pnode in this partition */ | 116 | /* base pnode in this partition */ |
66 | static int uv_partition_base_pnode __read_mostly; | 117 | static int uv_base_pnode __read_mostly; |
67 | /* position of pnode (which is nasid>>1): */ | 118 | /* position of pnode (which is nasid>>1): */ |
68 | static int uv_nshift __read_mostly; | 119 | static int uv_nshift __read_mostly; |
69 | static unsigned long uv_mmask __read_mostly; | 120 | static unsigned long uv_mmask __read_mostly; |
@@ -109,60 +160,52 @@ static int __init uvhub_to_first_apicid(int uvhub) | |||
109 | * clear of the Timeout bit (as well) will free the resource. No reply will | 160 | * clear of the Timeout bit (as well) will free the resource. No reply will |
110 | * be sent (the hardware will only do one reply per message). | 161 | * be sent (the hardware will only do one reply per message). |
111 | */ | 162 | */ |
112 | static inline void uv_reply_to_message(struct msg_desc *mdp, | 163 | static void reply_to_message(struct msg_desc *mdp, struct bau_control *bcp) |
113 | struct bau_control *bcp) | ||
114 | { | 164 | { |
115 | unsigned long dw; | 165 | unsigned long dw; |
116 | struct bau_payload_queue_entry *msg; | 166 | struct bau_pq_entry *msg; |
117 | 167 | ||
118 | msg = mdp->msg; | 168 | msg = mdp->msg; |
119 | if (!msg->canceled) { | 169 | if (!msg->canceled) { |
120 | dw = (msg->sw_ack_vector << UV_SW_ACK_NPENDING) | | 170 | dw = (msg->swack_vec << UV_SW_ACK_NPENDING) | msg->swack_vec; |
121 | msg->sw_ack_vector; | 171 | write_mmr_sw_ack(dw); |
122 | uv_write_local_mmr( | ||
123 | UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, dw); | ||
124 | } | 172 | } |
125 | msg->replied_to = 1; | 173 | msg->replied_to = 1; |
126 | msg->sw_ack_vector = 0; | 174 | msg->swack_vec = 0; |
127 | } | 175 | } |
128 | 176 | ||
129 | /* | 177 | /* |
130 | * Process the receipt of a RETRY message | 178 | * Process the receipt of a RETRY message |
131 | */ | 179 | */ |
132 | static inline void uv_bau_process_retry_msg(struct msg_desc *mdp, | 180 | static void bau_process_retry_msg(struct msg_desc *mdp, |
133 | struct bau_control *bcp) | 181 | struct bau_control *bcp) |
134 | { | 182 | { |
135 | int i; | 183 | int i; |
136 | int cancel_count = 0; | 184 | int cancel_count = 0; |
137 | int slot2; | ||
138 | unsigned long msg_res; | 185 | unsigned long msg_res; |
139 | unsigned long mmr = 0; | 186 | unsigned long mmr = 0; |
140 | struct bau_payload_queue_entry *msg; | 187 | struct bau_pq_entry *msg = mdp->msg; |
141 | struct bau_payload_queue_entry *msg2; | 188 | struct bau_pq_entry *msg2; |
142 | struct ptc_stats *stat; | 189 | struct ptc_stats *stat = bcp->statp; |
143 | 190 | ||
144 | msg = mdp->msg; | ||
145 | stat = bcp->statp; | ||
146 | stat->d_retries++; | 191 | stat->d_retries++; |
147 | /* | 192 | /* |
148 | * cancel any message from msg+1 to the retry itself | 193 | * cancel any message from msg+1 to the retry itself |
149 | */ | 194 | */ |
150 | for (msg2 = msg+1, i = 0; i < DEST_Q_SIZE; msg2++, i++) { | 195 | for (msg2 = msg+1, i = 0; i < DEST_Q_SIZE; msg2++, i++) { |
151 | if (msg2 > mdp->va_queue_last) | 196 | if (msg2 > mdp->queue_last) |
152 | msg2 = mdp->va_queue_first; | 197 | msg2 = mdp->queue_first; |
153 | if (msg2 == msg) | 198 | if (msg2 == msg) |
154 | break; | 199 | break; |
155 | 200 | ||
156 | /* same conditions for cancellation as uv_do_reset */ | 201 | /* same conditions for cancellation as do_reset */ |
157 | if ((msg2->replied_to == 0) && (msg2->canceled == 0) && | 202 | if ((msg2->replied_to == 0) && (msg2->canceled == 0) && |
158 | (msg2->sw_ack_vector) && ((msg2->sw_ack_vector & | 203 | (msg2->swack_vec) && ((msg2->swack_vec & |
159 | msg->sw_ack_vector) == 0) && | 204 | msg->swack_vec) == 0) && |
160 | (msg2->sending_cpu == msg->sending_cpu) && | 205 | (msg2->sending_cpu == msg->sending_cpu) && |
161 | (msg2->msg_type != MSG_NOOP)) { | 206 | (msg2->msg_type != MSG_NOOP)) { |
162 | slot2 = msg2 - mdp->va_queue_first; | 207 | mmr = read_mmr_sw_ack(); |
163 | mmr = uv_read_local_mmr | 208 | msg_res = msg2->swack_vec; |
164 | (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); | ||
165 | msg_res = msg2->sw_ack_vector; | ||
166 | /* | 209 | /* |
167 | * This is a message retry; clear the resources held | 210 | * This is a message retry; clear the resources held |
168 | * by the previous message only if they timed out. | 211 | * by the previous message only if they timed out. |
@@ -170,6 +213,7 @@ static inline void uv_bau_process_retry_msg(struct msg_desc *mdp, | |||
170 | * situation to report. | 213 | * situation to report. |
171 | */ | 214 | */ |
172 | if (mmr & (msg_res << UV_SW_ACK_NPENDING)) { | 215 | if (mmr & (msg_res << UV_SW_ACK_NPENDING)) { |
216 | unsigned long mr; | ||
173 | /* | 217 | /* |
174 | * is the resource timed out? | 218 | * is the resource timed out? |
175 | * make everyone ignore the cancelled message. | 219 | * make everyone ignore the cancelled message. |
@@ -177,10 +221,8 @@ static inline void uv_bau_process_retry_msg(struct msg_desc *mdp, | |||
177 | msg2->canceled = 1; | 221 | msg2->canceled = 1; |
178 | stat->d_canceled++; | 222 | stat->d_canceled++; |
179 | cancel_count++; | 223 | cancel_count++; |
180 | uv_write_local_mmr( | 224 | mr = (msg_res << UV_SW_ACK_NPENDING) | msg_res; |
181 | UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, | 225 | write_mmr_sw_ack(mr); |
182 | (msg_res << UV_SW_ACK_NPENDING) | | ||
183 | msg_res); | ||
184 | } | 226 | } |
185 | } | 227 | } |
186 | } | 228 | } |
@@ -192,20 +234,19 @@ static inline void uv_bau_process_retry_msg(struct msg_desc *mdp, | |||
192 | * Do all the things a cpu should do for a TLB shootdown message. | 234 | * Do all the things a cpu should do for a TLB shootdown message. |
193 | * Other cpu's may come here at the same time for this message. | 235 | * Other cpu's may come here at the same time for this message. |
194 | */ | 236 | */ |
195 | static void uv_bau_process_message(struct msg_desc *mdp, | 237 | static void bau_process_message(struct msg_desc *mdp, |
196 | struct bau_control *bcp) | 238 | struct bau_control *bcp) |
197 | { | 239 | { |
198 | int msg_ack_count; | ||
199 | short socket_ack_count = 0; | 240 | short socket_ack_count = 0; |
200 | struct ptc_stats *stat; | 241 | short *sp; |
201 | struct bau_payload_queue_entry *msg; | 242 | struct atomic_short *asp; |
243 | struct ptc_stats *stat = bcp->statp; | ||
244 | struct bau_pq_entry *msg = mdp->msg; | ||
202 | struct bau_control *smaster = bcp->socket_master; | 245 | struct bau_control *smaster = bcp->socket_master; |
203 | 246 | ||
204 | /* | 247 | /* |
205 | * This must be a normal message, or retry of a normal message | 248 | * This must be a normal message, or retry of a normal message |
206 | */ | 249 | */ |
207 | msg = mdp->msg; | ||
208 | stat = bcp->statp; | ||
209 | if (msg->address == TLB_FLUSH_ALL) { | 250 | if (msg->address == TLB_FLUSH_ALL) { |
210 | local_flush_tlb(); | 251 | local_flush_tlb(); |
211 | stat->d_alltlb++; | 252 | stat->d_alltlb++; |
@@ -222,30 +263,32 @@ static void uv_bau_process_message(struct msg_desc *mdp, | |||
222 | * cpu number. | 263 | * cpu number. |
223 | */ | 264 | */ |
224 | if (msg->msg_type == MSG_RETRY && bcp == bcp->uvhub_master) | 265 | if (msg->msg_type == MSG_RETRY && bcp == bcp->uvhub_master) |
225 | uv_bau_process_retry_msg(mdp, bcp); | 266 | bau_process_retry_msg(mdp, bcp); |
226 | 267 | ||
227 | /* | 268 | /* |
228 | * This is a sw_ack message, so we have to reply to it. | 269 | * This is a swack message, so we have to reply to it. |
229 | * Count each responding cpu on the socket. This avoids | 270 | * Count each responding cpu on the socket. This avoids |
230 | * pinging the count's cache line back and forth between | 271 | * pinging the count's cache line back and forth between |
231 | * the sockets. | 272 | * the sockets. |
232 | */ | 273 | */ |
233 | socket_ack_count = atomic_add_short_return(1, (struct atomic_short *) | 274 | sp = &smaster->socket_acknowledge_count[mdp->msg_slot]; |
234 | &smaster->socket_acknowledge_count[mdp->msg_slot]); | 275 | asp = (struct atomic_short *)sp; |
276 | socket_ack_count = atom_asr(1, asp); | ||
235 | if (socket_ack_count == bcp->cpus_in_socket) { | 277 | if (socket_ack_count == bcp->cpus_in_socket) { |
278 | int msg_ack_count; | ||
236 | /* | 279 | /* |
237 | * Both sockets dump their completed count total into | 280 | * Both sockets dump their completed count total into |
238 | * the message's count. | 281 | * the message's count. |
239 | */ | 282 | */ |
240 | smaster->socket_acknowledge_count[mdp->msg_slot] = 0; | 283 | smaster->socket_acknowledge_count[mdp->msg_slot] = 0; |
241 | msg_ack_count = atomic_add_short_return(socket_ack_count, | 284 | asp = (struct atomic_short *)&msg->acknowledge_count; |
242 | (struct atomic_short *)&msg->acknowledge_count); | 285 | msg_ack_count = atom_asr(socket_ack_count, asp); |
243 | 286 | ||
244 | if (msg_ack_count == bcp->cpus_in_uvhub) { | 287 | if (msg_ack_count == bcp->cpus_in_uvhub) { |
245 | /* | 288 | /* |
246 | * All cpus in uvhub saw it; reply | 289 | * All cpus in uvhub saw it; reply |
247 | */ | 290 | */ |
248 | uv_reply_to_message(mdp, bcp); | 291 | reply_to_message(mdp, bcp); |
249 | } | 292 | } |
250 | } | 293 | } |
251 | 294 | ||
@@ -268,62 +311,51 @@ static int uvhub_to_first_cpu(int uvhub) | |||
268 | * Last resort when we get a large number of destination timeouts is | 311 | * Last resort when we get a large number of destination timeouts is |
269 | * to clear resources held by a given cpu. | 312 | * to clear resources held by a given cpu. |
270 | * Do this with IPI so that all messages in the BAU message queue | 313 | * Do this with IPI so that all messages in the BAU message queue |
271 | * can be identified by their nonzero sw_ack_vector field. | 314 | * can be identified by their nonzero swack_vec field. |
272 | * | 315 | * |
273 | * This is entered for a single cpu on the uvhub. | 316 | * This is entered for a single cpu on the uvhub. |
274 | * The sender want's this uvhub to free a specific message's | 317 | * The sender want's this uvhub to free a specific message's |
275 | * sw_ack resources. | 318 | * swack resources. |
276 | */ | 319 | */ |
277 | static void | 320 | static void do_reset(void *ptr) |
278 | uv_do_reset(void *ptr) | ||
279 | { | 321 | { |
280 | int i; | 322 | int i; |
281 | int slot; | 323 | struct bau_control *bcp = &per_cpu(bau_control, smp_processor_id()); |
282 | int count = 0; | 324 | struct reset_args *rap = (struct reset_args *)ptr; |
283 | unsigned long mmr; | 325 | struct bau_pq_entry *msg; |
284 | unsigned long msg_res; | 326 | struct ptc_stats *stat = bcp->statp; |
285 | struct bau_control *bcp; | ||
286 | struct reset_args *rap; | ||
287 | struct bau_payload_queue_entry *msg; | ||
288 | struct ptc_stats *stat; | ||
289 | 327 | ||
290 | bcp = &per_cpu(bau_control, smp_processor_id()); | ||
291 | rap = (struct reset_args *)ptr; | ||
292 | stat = bcp->statp; | ||
293 | stat->d_resets++; | 328 | stat->d_resets++; |
294 | |||
295 | /* | 329 | /* |
296 | * We're looking for the given sender, and | 330 | * We're looking for the given sender, and |
297 | * will free its sw_ack resource. | 331 | * will free its swack resource. |
298 | * If all cpu's finally responded after the timeout, its | 332 | * If all cpu's finally responded after the timeout, its |
299 | * message 'replied_to' was set. | 333 | * message 'replied_to' was set. |
300 | */ | 334 | */ |
301 | for (msg = bcp->va_queue_first, i = 0; i < DEST_Q_SIZE; msg++, i++) { | 335 | for (msg = bcp->queue_first, i = 0; i < DEST_Q_SIZE; msg++, i++) { |
302 | /* uv_do_reset: same conditions for cancellation as | 336 | unsigned long msg_res; |
303 | uv_bau_process_retry_msg() */ | 337 | /* do_reset: same conditions for cancellation as |
338 | bau_process_retry_msg() */ | ||
304 | if ((msg->replied_to == 0) && | 339 | if ((msg->replied_to == 0) && |
305 | (msg->canceled == 0) && | 340 | (msg->canceled == 0) && |
306 | (msg->sending_cpu == rap->sender) && | 341 | (msg->sending_cpu == rap->sender) && |
307 | (msg->sw_ack_vector) && | 342 | (msg->swack_vec) && |
308 | (msg->msg_type != MSG_NOOP)) { | 343 | (msg->msg_type != MSG_NOOP)) { |
344 | unsigned long mmr; | ||
345 | unsigned long mr; | ||
309 | /* | 346 | /* |
310 | * make everyone else ignore this message | 347 | * make everyone else ignore this message |
311 | */ | 348 | */ |
312 | msg->canceled = 1; | 349 | msg->canceled = 1; |
313 | slot = msg - bcp->va_queue_first; | ||
314 | count++; | ||
315 | /* | 350 | /* |
316 | * only reset the resource if it is still pending | 351 | * only reset the resource if it is still pending |
317 | */ | 352 | */ |
318 | mmr = uv_read_local_mmr | 353 | mmr = read_mmr_sw_ack(); |
319 | (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); | 354 | msg_res = msg->swack_vec; |
320 | msg_res = msg->sw_ack_vector; | 355 | mr = (msg_res << UV_SW_ACK_NPENDING) | msg_res; |
321 | if (mmr & msg_res) { | 356 | if (mmr & msg_res) { |
322 | stat->d_rcanceled++; | 357 | stat->d_rcanceled++; |
323 | uv_write_local_mmr( | 358 | write_mmr_sw_ack(mr); |
324 | UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, | ||
325 | (msg_res << UV_SW_ACK_NPENDING) | | ||
326 | msg_res); | ||
327 | } | 359 | } |
328 | } | 360 | } |
329 | } | 361 | } |
@@ -334,39 +366,38 @@ uv_do_reset(void *ptr) | |||
334 | * Use IPI to get all target uvhubs to release resources held by | 366 | * Use IPI to get all target uvhubs to release resources held by |
335 | * a given sending cpu number. | 367 | * a given sending cpu number. |
336 | */ | 368 | */ |
337 | static void uv_reset_with_ipi(struct bau_target_uvhubmask *distribution, | 369 | static void reset_with_ipi(struct bau_targ_hubmask *distribution, int sender) |
338 | int sender) | ||
339 | { | 370 | { |
340 | int uvhub; | 371 | int uvhub; |
341 | int cpu; | 372 | int maskbits; |
342 | cpumask_t mask; | 373 | cpumask_t mask; |
343 | struct reset_args reset_args; | 374 | struct reset_args reset_args; |
344 | 375 | ||
345 | reset_args.sender = sender; | 376 | reset_args.sender = sender; |
346 | |||
347 | cpus_clear(mask); | 377 | cpus_clear(mask); |
348 | /* find a single cpu for each uvhub in this distribution mask */ | 378 | /* find a single cpu for each uvhub in this distribution mask */ |
349 | for (uvhub = 0; | 379 | maskbits = sizeof(struct bau_targ_hubmask) * BITSPERBYTE; |
350 | uvhub < sizeof(struct bau_target_uvhubmask) * BITSPERBYTE; | 380 | for (uvhub = 0; uvhub < maskbits; uvhub++) { |
351 | uvhub++) { | 381 | int cpu; |
352 | if (!bau_uvhub_isset(uvhub, distribution)) | 382 | if (!bau_uvhub_isset(uvhub, distribution)) |
353 | continue; | 383 | continue; |
354 | /* find a cpu for this uvhub */ | 384 | /* find a cpu for this uvhub */ |
355 | cpu = uvhub_to_first_cpu(uvhub); | 385 | cpu = uvhub_to_first_cpu(uvhub); |
356 | cpu_set(cpu, mask); | 386 | cpu_set(cpu, mask); |
357 | } | 387 | } |
358 | /* IPI all cpus; Preemption is already disabled */ | 388 | |
359 | smp_call_function_many(&mask, uv_do_reset, (void *)&reset_args, 1); | 389 | /* IPI all cpus; preemption is already disabled */ |
390 | smp_call_function_many(&mask, do_reset, (void *)&reset_args, 1); | ||
360 | return; | 391 | return; |
361 | } | 392 | } |
362 | 393 | ||
363 | static inline unsigned long | 394 | static inline unsigned long cycles_2_us(unsigned long long cyc) |
364 | cycles_2_us(unsigned long long cyc) | ||
365 | { | 395 | { |
366 | unsigned long long ns; | 396 | unsigned long long ns; |
367 | unsigned long us; | 397 | unsigned long us; |
368 | ns = (cyc * per_cpu(cyc2ns, smp_processor_id())) | 398 | int cpu = smp_processor_id(); |
369 | >> CYC2NS_SCALE_FACTOR; | 399 | |
400 | ns = (cyc * per_cpu(cyc2ns, cpu)) >> CYC2NS_SCALE_FACTOR; | ||
370 | us = ns / 1000; | 401 | us = ns / 1000; |
371 | return us; | 402 | return us; |
372 | } | 403 | } |
@@ -376,56 +407,56 @@ cycles_2_us(unsigned long long cyc) | |||
376 | * leaves uvhub_quiesce set so that no new broadcasts are started by | 407 | * leaves uvhub_quiesce set so that no new broadcasts are started by |
377 | * bau_flush_send_and_wait() | 408 | * bau_flush_send_and_wait() |
378 | */ | 409 | */ |
379 | static inline void | 410 | static inline void quiesce_local_uvhub(struct bau_control *hmaster) |
380 | quiesce_local_uvhub(struct bau_control *hmaster) | ||
381 | { | 411 | { |
382 | atomic_add_short_return(1, (struct atomic_short *) | 412 | atom_asr(1, (struct atomic_short *)&hmaster->uvhub_quiesce); |
383 | &hmaster->uvhub_quiesce); | ||
384 | } | 413 | } |
385 | 414 | ||
386 | /* | 415 | /* |
387 | * mark this quiet-requestor as done | 416 | * mark this quiet-requestor as done |
388 | */ | 417 | */ |
389 | static inline void | 418 | static inline void end_uvhub_quiesce(struct bau_control *hmaster) |
390 | end_uvhub_quiesce(struct bau_control *hmaster) | ||
391 | { | 419 | { |
392 | atomic_add_short_return(-1, (struct atomic_short *) | 420 | atom_asr(-1, (struct atomic_short *)&hmaster->uvhub_quiesce); |
393 | &hmaster->uvhub_quiesce); | 421 | } |
422 | |||
423 | static unsigned long uv1_read_status(unsigned long mmr_offset, int right_shift) | ||
424 | { | ||
425 | unsigned long descriptor_status; | ||
426 | |||
427 | descriptor_status = uv_read_local_mmr(mmr_offset); | ||
428 | descriptor_status >>= right_shift; | ||
429 | descriptor_status &= UV_ACT_STATUS_MASK; | ||
430 | return descriptor_status; | ||
394 | } | 431 | } |
395 | 432 | ||
396 | /* | 433 | /* |
397 | * Wait for completion of a broadcast software ack message | 434 | * Wait for completion of a broadcast software ack message |
398 | * return COMPLETE, RETRY(PLUGGED or TIMEOUT) or GIVEUP | 435 | * return COMPLETE, RETRY(PLUGGED or TIMEOUT) or GIVEUP |
399 | */ | 436 | */ |
400 | static int uv_wait_completion(struct bau_desc *bau_desc, | 437 | static int uv1_wait_completion(struct bau_desc *bau_desc, |
401 | unsigned long mmr_offset, int right_shift, int this_cpu, | 438 | unsigned long mmr_offset, int right_shift, |
402 | struct bau_control *bcp, struct bau_control *smaster, long try) | 439 | struct bau_control *bcp, long try) |
403 | { | 440 | { |
404 | unsigned long descriptor_status; | 441 | unsigned long descriptor_status; |
405 | cycles_t ttime; | 442 | cycles_t ttm; |
406 | struct ptc_stats *stat = bcp->statp; | 443 | struct ptc_stats *stat = bcp->statp; |
407 | struct bau_control *hmaster; | ||
408 | |||
409 | hmaster = bcp->uvhub_master; | ||
410 | 444 | ||
445 | descriptor_status = uv1_read_status(mmr_offset, right_shift); | ||
411 | /* spin on the status MMR, waiting for it to go idle */ | 446 | /* spin on the status MMR, waiting for it to go idle */ |
412 | while ((descriptor_status = (((unsigned long) | 447 | while ((descriptor_status != DS_IDLE)) { |
413 | uv_read_local_mmr(mmr_offset) >> | ||
414 | right_shift) & UV_ACT_STATUS_MASK)) != | ||
415 | DESC_STATUS_IDLE) { | ||
416 | /* | 448 | /* |
417 | * Our software ack messages may be blocked because there are | 449 | * Our software ack messages may be blocked because |
418 | * no swack resources available. As long as none of them | 450 | * there are no swack resources available. As long |
419 | * has timed out hardware will NACK our message and its | 451 | * as none of them has timed out hardware will NACK |
420 | * state will stay IDLE. | 452 | * our message and its state will stay IDLE. |
421 | */ | 453 | */ |
422 | if (descriptor_status == DESC_STATUS_SOURCE_TIMEOUT) { | 454 | if (descriptor_status == DS_SOURCE_TIMEOUT) { |
423 | stat->s_stimeout++; | 455 | stat->s_stimeout++; |
424 | return FLUSH_GIVEUP; | 456 | return FLUSH_GIVEUP; |
425 | } else if (descriptor_status == | 457 | } else if (descriptor_status == DS_DESTINATION_TIMEOUT) { |
426 | DESC_STATUS_DESTINATION_TIMEOUT) { | ||
427 | stat->s_dtimeout++; | 458 | stat->s_dtimeout++; |
428 | ttime = get_cycles(); | 459 | ttm = get_cycles(); |
429 | 460 | ||
430 | /* | 461 | /* |
431 | * Our retries may be blocked by all destination | 462 | * Our retries may be blocked by all destination |
@@ -433,8 +464,7 @@ static int uv_wait_completion(struct bau_desc *bau_desc, | |||
433 | * pending. In that case hardware returns the | 464 | * pending. In that case hardware returns the |
434 | * ERROR that looks like a destination timeout. | 465 | * ERROR that looks like a destination timeout. |
435 | */ | 466 | */ |
436 | if (cycles_2_us(ttime - bcp->send_message) < | 467 | if (cycles_2_us(ttm - bcp->send_message) < timeout_us) { |
437 | timeout_us) { | ||
438 | bcp->conseccompletes = 0; | 468 | bcp->conseccompletes = 0; |
439 | return FLUSH_RETRY_PLUGGED; | 469 | return FLUSH_RETRY_PLUGGED; |
440 | } | 470 | } |
@@ -447,80 +477,160 @@ static int uv_wait_completion(struct bau_desc *bau_desc, | |||
447 | */ | 477 | */ |
448 | cpu_relax(); | 478 | cpu_relax(); |
449 | } | 479 | } |
480 | descriptor_status = uv1_read_status(mmr_offset, right_shift); | ||
450 | } | 481 | } |
451 | bcp->conseccompletes++; | 482 | bcp->conseccompletes++; |
452 | return FLUSH_COMPLETE; | 483 | return FLUSH_COMPLETE; |
453 | } | 484 | } |
454 | 485 | ||
455 | static inline cycles_t | 486 | /* |
456 | sec_2_cycles(unsigned long sec) | 487 | * UV2 has an extra bit of status in the ACTIVATION_STATUS_2 register. |
488 | */ | ||
489 | static unsigned long uv2_read_status(unsigned long offset, int rshft, int cpu) | ||
457 | { | 490 | { |
458 | unsigned long ns; | 491 | unsigned long descriptor_status; |
459 | cycles_t cyc; | 492 | unsigned long descriptor_status2; |
460 | 493 | ||
461 | ns = sec * 1000000000; | 494 | descriptor_status = ((read_lmmr(offset) >> rshft) & UV_ACT_STATUS_MASK); |
462 | cyc = (ns << CYC2NS_SCALE_FACTOR)/(per_cpu(cyc2ns, smp_processor_id())); | 495 | descriptor_status2 = (read_mmr_uv2_status() >> cpu) & 0x1UL; |
463 | return cyc; | 496 | descriptor_status = (descriptor_status << 1) | descriptor_status2; |
497 | return descriptor_status; | ||
498 | } | ||
499 | |||
500 | static int uv2_wait_completion(struct bau_desc *bau_desc, | ||
501 | unsigned long mmr_offset, int right_shift, | ||
502 | struct bau_control *bcp, long try) | ||
503 | { | ||
504 | unsigned long descriptor_stat; | ||
505 | cycles_t ttm; | ||
506 | int cpu = bcp->uvhub_cpu; | ||
507 | struct ptc_stats *stat = bcp->statp; | ||
508 | |||
509 | descriptor_stat = uv2_read_status(mmr_offset, right_shift, cpu); | ||
510 | |||
511 | /* spin on the status MMR, waiting for it to go idle */ | ||
512 | while (descriptor_stat != UV2H_DESC_IDLE) { | ||
513 | /* | ||
514 | * Our software ack messages may be blocked because | ||
515 | * there are no swack resources available. As long | ||
516 | * as none of them has timed out hardware will NACK | ||
517 | * our message and its state will stay IDLE. | ||
518 | */ | ||
519 | if ((descriptor_stat == UV2H_DESC_SOURCE_TIMEOUT) || | ||
520 | (descriptor_stat == UV2H_DESC_DEST_STRONG_NACK) || | ||
521 | (descriptor_stat == UV2H_DESC_DEST_PUT_ERR)) { | ||
522 | stat->s_stimeout++; | ||
523 | return FLUSH_GIVEUP; | ||
524 | } else if (descriptor_stat == UV2H_DESC_DEST_TIMEOUT) { | ||
525 | stat->s_dtimeout++; | ||
526 | ttm = get_cycles(); | ||
527 | /* | ||
528 | * Our retries may be blocked by all destination | ||
529 | * swack resources being consumed, and a timeout | ||
530 | * pending. In that case hardware returns the | ||
531 | * ERROR that looks like a destination timeout. | ||
532 | */ | ||
533 | if (cycles_2_us(ttm - bcp->send_message) < timeout_us) { | ||
534 | bcp->conseccompletes = 0; | ||
535 | return FLUSH_RETRY_PLUGGED; | ||
536 | } | ||
537 | bcp->conseccompletes = 0; | ||
538 | return FLUSH_RETRY_TIMEOUT; | ||
539 | } else { | ||
540 | /* | ||
541 | * descriptor_stat is still BUSY | ||
542 | */ | ||
543 | cpu_relax(); | ||
544 | } | ||
545 | descriptor_stat = uv2_read_status(mmr_offset, right_shift, cpu); | ||
546 | } | ||
547 | bcp->conseccompletes++; | ||
548 | return FLUSH_COMPLETE; | ||
464 | } | 549 | } |
465 | 550 | ||
466 | /* | 551 | /* |
467 | * conditionally add 1 to *v, unless *v is >= u | 552 | * There are 2 status registers; each and array[32] of 2 bits. Set up for |
468 | * return 0 if we cannot add 1 to *v because it is >= u | 553 | * which register to read and position in that register based on cpu in |
469 | * return 1 if we can add 1 to *v because it is < u | 554 | * current hub. |
470 | * the add is atomic | ||
471 | * | ||
472 | * This is close to atomic_add_unless(), but this allows the 'u' value | ||
473 | * to be lowered below the current 'v'. atomic_add_unless can only stop | ||
474 | * on equal. | ||
475 | */ | 555 | */ |
476 | static inline int atomic_inc_unless_ge(spinlock_t *lock, atomic_t *v, int u) | 556 | static int wait_completion(struct bau_desc *bau_desc, |
557 | struct bau_control *bcp, long try) | ||
477 | { | 558 | { |
478 | spin_lock(lock); | 559 | int right_shift; |
479 | if (atomic_read(v) >= u) { | 560 | unsigned long mmr_offset; |
480 | spin_unlock(lock); | 561 | int cpu = bcp->uvhub_cpu; |
481 | return 0; | 562 | |
563 | if (cpu < UV_CPUS_PER_AS) { | ||
564 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0; | ||
565 | right_shift = cpu * UV_ACT_STATUS_SIZE; | ||
566 | } else { | ||
567 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1; | ||
568 | right_shift = ((cpu - UV_CPUS_PER_AS) * UV_ACT_STATUS_SIZE); | ||
482 | } | 569 | } |
483 | atomic_inc(v); | 570 | |
484 | spin_unlock(lock); | 571 | if (is_uv1_hub()) |
485 | return 1; | 572 | return uv1_wait_completion(bau_desc, mmr_offset, right_shift, |
573 | bcp, try); | ||
574 | else | ||
575 | return uv2_wait_completion(bau_desc, mmr_offset, right_shift, | ||
576 | bcp, try); | ||
577 | } | ||
578 | |||
579 | static inline cycles_t sec_2_cycles(unsigned long sec) | ||
580 | { | ||
581 | unsigned long ns; | ||
582 | cycles_t cyc; | ||
583 | |||
584 | ns = sec * 1000000000; | ||
585 | cyc = (ns << CYC2NS_SCALE_FACTOR)/(per_cpu(cyc2ns, smp_processor_id())); | ||
586 | return cyc; | ||
486 | } | 587 | } |
487 | 588 | ||
488 | /* | 589 | /* |
489 | * Our retries are blocked by all destination swack resources being | 590 | * Our retries are blocked by all destination sw ack resources being |
490 | * in use, and a timeout is pending. In that case hardware immediately | 591 | * in use, and a timeout is pending. In that case hardware immediately |
491 | * returns the ERROR that looks like a destination timeout. | 592 | * returns the ERROR that looks like a destination timeout. |
492 | */ | 593 | */ |
493 | static void | 594 | static void destination_plugged(struct bau_desc *bau_desc, |
494 | destination_plugged(struct bau_desc *bau_desc, struct bau_control *bcp, | 595 | struct bau_control *bcp, |
495 | struct bau_control *hmaster, struct ptc_stats *stat) | 596 | struct bau_control *hmaster, struct ptc_stats *stat) |
496 | { | 597 | { |
497 | udelay(bcp->plugged_delay); | 598 | udelay(bcp->plugged_delay); |
498 | bcp->plugged_tries++; | 599 | bcp->plugged_tries++; |
600 | |||
499 | if (bcp->plugged_tries >= bcp->plugsb4reset) { | 601 | if (bcp->plugged_tries >= bcp->plugsb4reset) { |
500 | bcp->plugged_tries = 0; | 602 | bcp->plugged_tries = 0; |
603 | |||
501 | quiesce_local_uvhub(hmaster); | 604 | quiesce_local_uvhub(hmaster); |
605 | |||
502 | spin_lock(&hmaster->queue_lock); | 606 | spin_lock(&hmaster->queue_lock); |
503 | uv_reset_with_ipi(&bau_desc->distribution, bcp->cpu); | 607 | reset_with_ipi(&bau_desc->distribution, bcp->cpu); |
504 | spin_unlock(&hmaster->queue_lock); | 608 | spin_unlock(&hmaster->queue_lock); |
609 | |||
505 | end_uvhub_quiesce(hmaster); | 610 | end_uvhub_quiesce(hmaster); |
611 | |||
506 | bcp->ipi_attempts++; | 612 | bcp->ipi_attempts++; |
507 | stat->s_resets_plug++; | 613 | stat->s_resets_plug++; |
508 | } | 614 | } |
509 | } | 615 | } |
510 | 616 | ||
511 | static void | 617 | static void destination_timeout(struct bau_desc *bau_desc, |
512 | destination_timeout(struct bau_desc *bau_desc, struct bau_control *bcp, | 618 | struct bau_control *bcp, struct bau_control *hmaster, |
513 | struct bau_control *hmaster, struct ptc_stats *stat) | 619 | struct ptc_stats *stat) |
514 | { | 620 | { |
515 | hmaster->max_bau_concurrent = 1; | 621 | hmaster->max_concurr = 1; |
516 | bcp->timeout_tries++; | 622 | bcp->timeout_tries++; |
517 | if (bcp->timeout_tries >= bcp->timeoutsb4reset) { | 623 | if (bcp->timeout_tries >= bcp->timeoutsb4reset) { |
518 | bcp->timeout_tries = 0; | 624 | bcp->timeout_tries = 0; |
625 | |||
519 | quiesce_local_uvhub(hmaster); | 626 | quiesce_local_uvhub(hmaster); |
627 | |||
520 | spin_lock(&hmaster->queue_lock); | 628 | spin_lock(&hmaster->queue_lock); |
521 | uv_reset_with_ipi(&bau_desc->distribution, bcp->cpu); | 629 | reset_with_ipi(&bau_desc->distribution, bcp->cpu); |
522 | spin_unlock(&hmaster->queue_lock); | 630 | spin_unlock(&hmaster->queue_lock); |
631 | |||
523 | end_uvhub_quiesce(hmaster); | 632 | end_uvhub_quiesce(hmaster); |
633 | |||
524 | bcp->ipi_attempts++; | 634 | bcp->ipi_attempts++; |
525 | stat->s_resets_timeout++; | 635 | stat->s_resets_timeout++; |
526 | } | 636 | } |
@@ -530,34 +640,104 @@ destination_timeout(struct bau_desc *bau_desc, struct bau_control *bcp, | |||
530 | * Completions are taking a very long time due to a congested numalink | 640 | * Completions are taking a very long time due to a congested numalink |
531 | * network. | 641 | * network. |
532 | */ | 642 | */ |
533 | static void | 643 | static void disable_for_congestion(struct bau_control *bcp, |
534 | disable_for_congestion(struct bau_control *bcp, struct ptc_stats *stat) | 644 | struct ptc_stats *stat) |
535 | { | 645 | { |
536 | int tcpu; | ||
537 | struct bau_control *tbcp; | ||
538 | |||
539 | /* let only one cpu do this disabling */ | 646 | /* let only one cpu do this disabling */ |
540 | spin_lock(&disable_lock); | 647 | spin_lock(&disable_lock); |
648 | |||
541 | if (!baudisabled && bcp->period_requests && | 649 | if (!baudisabled && bcp->period_requests && |
542 | ((bcp->period_time / bcp->period_requests) > congested_cycles)) { | 650 | ((bcp->period_time / bcp->period_requests) > congested_cycles)) { |
651 | int tcpu; | ||
652 | struct bau_control *tbcp; | ||
543 | /* it becomes this cpu's job to turn on the use of the | 653 | /* it becomes this cpu's job to turn on the use of the |
544 | BAU again */ | 654 | BAU again */ |
545 | baudisabled = 1; | 655 | baudisabled = 1; |
546 | bcp->set_bau_off = 1; | 656 | bcp->set_bau_off = 1; |
547 | bcp->set_bau_on_time = get_cycles() + | 657 | bcp->set_bau_on_time = get_cycles(); |
548 | sec_2_cycles(bcp->congested_period); | 658 | bcp->set_bau_on_time += sec_2_cycles(bcp->cong_period); |
549 | stat->s_bau_disabled++; | 659 | stat->s_bau_disabled++; |
550 | for_each_present_cpu(tcpu) { | 660 | for_each_present_cpu(tcpu) { |
551 | tbcp = &per_cpu(bau_control, tcpu); | 661 | tbcp = &per_cpu(bau_control, tcpu); |
552 | tbcp->baudisabled = 1; | 662 | tbcp->baudisabled = 1; |
553 | } | 663 | } |
554 | } | 664 | } |
665 | |||
555 | spin_unlock(&disable_lock); | 666 | spin_unlock(&disable_lock); |
556 | } | 667 | } |
557 | 668 | ||
558 | /** | 669 | static void count_max_concurr(int stat, struct bau_control *bcp, |
559 | * uv_flush_send_and_wait | 670 | struct bau_control *hmaster) |
560 | * | 671 | { |
672 | bcp->plugged_tries = 0; | ||
673 | bcp->timeout_tries = 0; | ||
674 | if (stat != FLUSH_COMPLETE) | ||
675 | return; | ||
676 | if (bcp->conseccompletes <= bcp->complete_threshold) | ||
677 | return; | ||
678 | if (hmaster->max_concurr >= hmaster->max_concurr_const) | ||
679 | return; | ||
680 | hmaster->max_concurr++; | ||
681 | } | ||
682 | |||
683 | static void record_send_stats(cycles_t time1, cycles_t time2, | ||
684 | struct bau_control *bcp, struct ptc_stats *stat, | ||
685 | int completion_status, int try) | ||
686 | { | ||
687 | cycles_t elapsed; | ||
688 | |||
689 | if (time2 > time1) { | ||
690 | elapsed = time2 - time1; | ||
691 | stat->s_time += elapsed; | ||
692 | |||
693 | if ((completion_status == FLUSH_COMPLETE) && (try == 1)) { | ||
694 | bcp->period_requests++; | ||
695 | bcp->period_time += elapsed; | ||
696 | if ((elapsed > congested_cycles) && | ||
697 | (bcp->period_requests > bcp->cong_reps)) | ||
698 | disable_for_congestion(bcp, stat); | ||
699 | } | ||
700 | } else | ||
701 | stat->s_requestor--; | ||
702 | |||
703 | if (completion_status == FLUSH_COMPLETE && try > 1) | ||
704 | stat->s_retriesok++; | ||
705 | else if (completion_status == FLUSH_GIVEUP) | ||
706 | stat->s_giveup++; | ||
707 | } | ||
708 | |||
709 | /* | ||
710 | * Because of a uv1 hardware bug only a limited number of concurrent | ||
711 | * requests can be made. | ||
712 | */ | ||
713 | static void uv1_throttle(struct bau_control *hmaster, struct ptc_stats *stat) | ||
714 | { | ||
715 | spinlock_t *lock = &hmaster->uvhub_lock; | ||
716 | atomic_t *v; | ||
717 | |||
718 | v = &hmaster->active_descriptor_count; | ||
719 | if (!atomic_inc_unless_ge(lock, v, hmaster->max_concurr)) { | ||
720 | stat->s_throttles++; | ||
721 | do { | ||
722 | cpu_relax(); | ||
723 | } while (!atomic_inc_unless_ge(lock, v, hmaster->max_concurr)); | ||
724 | } | ||
725 | } | ||
726 | |||
727 | /* | ||
728 | * Handle the completion status of a message send. | ||
729 | */ | ||
730 | static void handle_cmplt(int completion_status, struct bau_desc *bau_desc, | ||
731 | struct bau_control *bcp, struct bau_control *hmaster, | ||
732 | struct ptc_stats *stat) | ||
733 | { | ||
734 | if (completion_status == FLUSH_RETRY_PLUGGED) | ||
735 | destination_plugged(bau_desc, bcp, hmaster, stat); | ||
736 | else if (completion_status == FLUSH_RETRY_TIMEOUT) | ||
737 | destination_timeout(bau_desc, bcp, hmaster, stat); | ||
738 | } | ||
739 | |||
740 | /* | ||
561 | * Send a broadcast and wait for it to complete. | 741 | * Send a broadcast and wait for it to complete. |
562 | * | 742 | * |
563 | * The flush_mask contains the cpus the broadcast is to be sent to including | 743 | * The flush_mask contains the cpus the broadcast is to be sent to including |
@@ -568,44 +748,23 @@ disable_for_congestion(struct bau_control *bcp, struct ptc_stats *stat) | |||
568 | * returned to the kernel. | 748 | * returned to the kernel. |
569 | */ | 749 | */ |
570 | int uv_flush_send_and_wait(struct bau_desc *bau_desc, | 750 | int uv_flush_send_and_wait(struct bau_desc *bau_desc, |
571 | struct cpumask *flush_mask, struct bau_control *bcp) | 751 | struct cpumask *flush_mask, struct bau_control *bcp) |
572 | { | 752 | { |
573 | int right_shift; | ||
574 | int completion_status = 0; | ||
575 | int seq_number = 0; | 753 | int seq_number = 0; |
754 | int completion_stat = 0; | ||
576 | long try = 0; | 755 | long try = 0; |
577 | int cpu = bcp->uvhub_cpu; | ||
578 | int this_cpu = bcp->cpu; | ||
579 | unsigned long mmr_offset; | ||
580 | unsigned long index; | 756 | unsigned long index; |
581 | cycles_t time1; | 757 | cycles_t time1; |
582 | cycles_t time2; | 758 | cycles_t time2; |
583 | cycles_t elapsed; | ||
584 | struct ptc_stats *stat = bcp->statp; | 759 | struct ptc_stats *stat = bcp->statp; |
585 | struct bau_control *smaster = bcp->socket_master; | ||
586 | struct bau_control *hmaster = bcp->uvhub_master; | 760 | struct bau_control *hmaster = bcp->uvhub_master; |
587 | 761 | ||
588 | if (!atomic_inc_unless_ge(&hmaster->uvhub_lock, | 762 | if (is_uv1_hub()) |
589 | &hmaster->active_descriptor_count, | 763 | uv1_throttle(hmaster, stat); |
590 | hmaster->max_bau_concurrent)) { | 764 | |
591 | stat->s_throttles++; | ||
592 | do { | ||
593 | cpu_relax(); | ||
594 | } while (!atomic_inc_unless_ge(&hmaster->uvhub_lock, | ||
595 | &hmaster->active_descriptor_count, | ||
596 | hmaster->max_bau_concurrent)); | ||
597 | } | ||
598 | while (hmaster->uvhub_quiesce) | 765 | while (hmaster->uvhub_quiesce) |
599 | cpu_relax(); | 766 | cpu_relax(); |
600 | 767 | ||
601 | if (cpu < UV_CPUS_PER_ACT_STATUS) { | ||
602 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0; | ||
603 | right_shift = cpu * UV_ACT_STATUS_SIZE; | ||
604 | } else { | ||
605 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1; | ||
606 | right_shift = | ||
607 | ((cpu - UV_CPUS_PER_ACT_STATUS) * UV_ACT_STATUS_SIZE); | ||
608 | } | ||
609 | time1 = get_cycles(); | 768 | time1 = get_cycles(); |
610 | do { | 769 | do { |
611 | if (try == 0) { | 770 | if (try == 0) { |
@@ -615,64 +774,134 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc, | |||
615 | bau_desc->header.msg_type = MSG_RETRY; | 774 | bau_desc->header.msg_type = MSG_RETRY; |
616 | stat->s_retry_messages++; | 775 | stat->s_retry_messages++; |
617 | } | 776 | } |
777 | |||
618 | bau_desc->header.sequence = seq_number; | 778 | bau_desc->header.sequence = seq_number; |
619 | index = (1UL << UVH_LB_BAU_SB_ACTIVATION_CONTROL_PUSH_SHFT) | | 779 | index = (1UL << AS_PUSH_SHIFT) | bcp->uvhub_cpu; |
620 | bcp->uvhub_cpu; | ||
621 | bcp->send_message = get_cycles(); | 780 | bcp->send_message = get_cycles(); |
622 | uv_write_local_mmr(UVH_LB_BAU_SB_ACTIVATION_CONTROL, index); | 781 | |
782 | write_mmr_activation(index); | ||
783 | |||
623 | try++; | 784 | try++; |
624 | completion_status = uv_wait_completion(bau_desc, mmr_offset, | 785 | completion_stat = wait_completion(bau_desc, bcp, try); |
625 | right_shift, this_cpu, bcp, smaster, try); | 786 | |
787 | handle_cmplt(completion_stat, bau_desc, bcp, hmaster, stat); | ||
626 | 788 | ||
627 | if (completion_status == FLUSH_RETRY_PLUGGED) { | ||
628 | destination_plugged(bau_desc, bcp, hmaster, stat); | ||
629 | } else if (completion_status == FLUSH_RETRY_TIMEOUT) { | ||
630 | destination_timeout(bau_desc, bcp, hmaster, stat); | ||
631 | } | ||
632 | if (bcp->ipi_attempts >= bcp->ipi_reset_limit) { | 789 | if (bcp->ipi_attempts >= bcp->ipi_reset_limit) { |
633 | bcp->ipi_attempts = 0; | 790 | bcp->ipi_attempts = 0; |
634 | completion_status = FLUSH_GIVEUP; | 791 | completion_stat = FLUSH_GIVEUP; |
635 | break; | 792 | break; |
636 | } | 793 | } |
637 | cpu_relax(); | 794 | cpu_relax(); |
638 | } while ((completion_status == FLUSH_RETRY_PLUGGED) || | 795 | } while ((completion_stat == FLUSH_RETRY_PLUGGED) || |
639 | (completion_status == FLUSH_RETRY_TIMEOUT)); | 796 | (completion_stat == FLUSH_RETRY_TIMEOUT)); |
797 | |||
640 | time2 = get_cycles(); | 798 | time2 = get_cycles(); |
641 | bcp->plugged_tries = 0; | 799 | |
642 | bcp->timeout_tries = 0; | 800 | count_max_concurr(completion_stat, bcp, hmaster); |
643 | if ((completion_status == FLUSH_COMPLETE) && | 801 | |
644 | (bcp->conseccompletes > bcp->complete_threshold) && | ||
645 | (hmaster->max_bau_concurrent < | ||
646 | hmaster->max_bau_concurrent_constant)) | ||
647 | hmaster->max_bau_concurrent++; | ||
648 | while (hmaster->uvhub_quiesce) | 802 | while (hmaster->uvhub_quiesce) |
649 | cpu_relax(); | 803 | cpu_relax(); |
804 | |||
650 | atomic_dec(&hmaster->active_descriptor_count); | 805 | atomic_dec(&hmaster->active_descriptor_count); |
651 | if (time2 > time1) { | 806 | |
652 | elapsed = time2 - time1; | 807 | record_send_stats(time1, time2, bcp, stat, completion_stat, try); |
653 | stat->s_time += elapsed; | 808 | |
654 | if ((completion_status == FLUSH_COMPLETE) && (try == 1)) { | 809 | if (completion_stat == FLUSH_GIVEUP) |
655 | bcp->period_requests++; | 810 | return 1; |
656 | bcp->period_time += elapsed; | 811 | return 0; |
657 | if ((elapsed > congested_cycles) && | 812 | } |
658 | (bcp->period_requests > bcp->congested_reps)) { | 813 | |
659 | disable_for_congestion(bcp, stat); | 814 | /* |
815 | * The BAU is disabled. When the disabled time period has expired, the cpu | ||
816 | * that disabled it must re-enable it. | ||
817 | * Return 0 if it is re-enabled for all cpus. | ||
818 | */ | ||
819 | static int check_enable(struct bau_control *bcp, struct ptc_stats *stat) | ||
820 | { | ||
821 | int tcpu; | ||
822 | struct bau_control *tbcp; | ||
823 | |||
824 | if (bcp->set_bau_off) { | ||
825 | if (get_cycles() >= bcp->set_bau_on_time) { | ||
826 | stat->s_bau_reenabled++; | ||
827 | baudisabled = 0; | ||
828 | for_each_present_cpu(tcpu) { | ||
829 | tbcp = &per_cpu(bau_control, tcpu); | ||
830 | tbcp->baudisabled = 0; | ||
831 | tbcp->period_requests = 0; | ||
832 | tbcp->period_time = 0; | ||
660 | } | 833 | } |
834 | return 0; | ||
661 | } | 835 | } |
836 | } | ||
837 | return -1; | ||
838 | } | ||
839 | |||
840 | static void record_send_statistics(struct ptc_stats *stat, int locals, int hubs, | ||
841 | int remotes, struct bau_desc *bau_desc) | ||
842 | { | ||
843 | stat->s_requestor++; | ||
844 | stat->s_ntargcpu += remotes + locals; | ||
845 | stat->s_ntargremotes += remotes; | ||
846 | stat->s_ntarglocals += locals; | ||
847 | |||
848 | /* uvhub statistics */ | ||
849 | hubs = bau_uvhub_weight(&bau_desc->distribution); | ||
850 | if (locals) { | ||
851 | stat->s_ntarglocaluvhub++; | ||
852 | stat->s_ntargremoteuvhub += (hubs - 1); | ||
662 | } else | 853 | } else |
663 | stat->s_requestor--; | 854 | stat->s_ntargremoteuvhub += hubs; |
664 | if (completion_status == FLUSH_COMPLETE && try > 1) | 855 | |
665 | stat->s_retriesok++; | 856 | stat->s_ntarguvhub += hubs; |
666 | else if (completion_status == FLUSH_GIVEUP) { | 857 | |
667 | stat->s_giveup++; | 858 | if (hubs >= 16) |
668 | return 1; | 859 | stat->s_ntarguvhub16++; |
860 | else if (hubs >= 8) | ||
861 | stat->s_ntarguvhub8++; | ||
862 | else if (hubs >= 4) | ||
863 | stat->s_ntarguvhub4++; | ||
864 | else if (hubs >= 2) | ||
865 | stat->s_ntarguvhub2++; | ||
866 | else | ||
867 | stat->s_ntarguvhub1++; | ||
868 | } | ||
869 | |||
870 | /* | ||
871 | * Translate a cpu mask to the uvhub distribution mask in the BAU | ||
872 | * activation descriptor. | ||
873 | */ | ||
874 | static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp, | ||
875 | struct bau_desc *bau_desc, int *localsp, int *remotesp) | ||
876 | { | ||
877 | int cpu; | ||
878 | int pnode; | ||
879 | int cnt = 0; | ||
880 | struct hub_and_pnode *hpp; | ||
881 | |||
882 | for_each_cpu(cpu, flush_mask) { | ||
883 | /* | ||
884 | * The distribution vector is a bit map of pnodes, relative | ||
885 | * to the partition base pnode (and the partition base nasid | ||
886 | * in the header). | ||
887 | * Translate cpu to pnode and hub using a local memory array. | ||
888 | */ | ||
889 | hpp = &bcp->socket_master->thp[cpu]; | ||
890 | pnode = hpp->pnode - bcp->partition_base_pnode; | ||
891 | bau_uvhub_set(pnode, &bau_desc->distribution); | ||
892 | cnt++; | ||
893 | if (hpp->uvhub == bcp->uvhub) | ||
894 | (*localsp)++; | ||
895 | else | ||
896 | (*remotesp)++; | ||
669 | } | 897 | } |
898 | if (!cnt) | ||
899 | return 1; | ||
670 | return 0; | 900 | return 0; |
671 | } | 901 | } |
672 | 902 | ||
673 | /** | 903 | /* |
674 | * uv_flush_tlb_others - globally purge translation cache of a virtual | 904 | * globally purge translation cache of a virtual address or all TLB's |
675 | * address or all TLB's | ||
676 | * @cpumask: mask of all cpu's in which the address is to be removed | 905 | * @cpumask: mask of all cpu's in which the address is to be removed |
677 | * @mm: mm_struct containing virtual address range | 906 | * @mm: mm_struct containing virtual address range |
678 | * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu) | 907 | * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu) |
@@ -696,20 +925,16 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc, | |||
696 | * done. The returned pointer is valid till preemption is re-enabled. | 925 | * done. The returned pointer is valid till preemption is re-enabled. |
697 | */ | 926 | */ |
698 | const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | 927 | const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, |
699 | struct mm_struct *mm, | 928 | struct mm_struct *mm, unsigned long va, |
700 | unsigned long va, unsigned int cpu) | 929 | unsigned int cpu) |
701 | { | 930 | { |
702 | int locals = 0; | 931 | int locals = 0; |
703 | int remotes = 0; | 932 | int remotes = 0; |
704 | int hubs = 0; | 933 | int hubs = 0; |
705 | int tcpu; | ||
706 | int tpnode; | ||
707 | struct bau_desc *bau_desc; | 934 | struct bau_desc *bau_desc; |
708 | struct cpumask *flush_mask; | 935 | struct cpumask *flush_mask; |
709 | struct ptc_stats *stat; | 936 | struct ptc_stats *stat; |
710 | struct bau_control *bcp; | 937 | struct bau_control *bcp; |
711 | struct bau_control *tbcp; | ||
712 | struct hub_and_pnode *hpp; | ||
713 | 938 | ||
714 | /* kernel was booted 'nobau' */ | 939 | /* kernel was booted 'nobau' */ |
715 | if (nobau) | 940 | if (nobau) |
@@ -720,20 +945,8 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | |||
720 | 945 | ||
721 | /* bau was disabled due to slow response */ | 946 | /* bau was disabled due to slow response */ |
722 | if (bcp->baudisabled) { | 947 | if (bcp->baudisabled) { |
723 | /* the cpu that disabled it must re-enable it */ | 948 | if (check_enable(bcp, stat)) |
724 | if (bcp->set_bau_off) { | 949 | return cpumask; |
725 | if (get_cycles() >= bcp->set_bau_on_time) { | ||
726 | stat->s_bau_reenabled++; | ||
727 | baudisabled = 0; | ||
728 | for_each_present_cpu(tcpu) { | ||
729 | tbcp = &per_cpu(bau_control, tcpu); | ||
730 | tbcp->baudisabled = 0; | ||
731 | tbcp->period_requests = 0; | ||
732 | tbcp->period_time = 0; | ||
733 | } | ||
734 | } | ||
735 | } | ||
736 | return cpumask; | ||
737 | } | 950 | } |
738 | 951 | ||
739 | /* | 952 | /* |
@@ -744,59 +957,20 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | |||
744 | flush_mask = (struct cpumask *)per_cpu(uv_flush_tlb_mask, cpu); | 957 | flush_mask = (struct cpumask *)per_cpu(uv_flush_tlb_mask, cpu); |
745 | /* don't actually do a shootdown of the local cpu */ | 958 | /* don't actually do a shootdown of the local cpu */ |
746 | cpumask_andnot(flush_mask, cpumask, cpumask_of(cpu)); | 959 | cpumask_andnot(flush_mask, cpumask, cpumask_of(cpu)); |
960 | |||
747 | if (cpu_isset(cpu, *cpumask)) | 961 | if (cpu_isset(cpu, *cpumask)) |
748 | stat->s_ntargself++; | 962 | stat->s_ntargself++; |
749 | 963 | ||
750 | bau_desc = bcp->descriptor_base; | 964 | bau_desc = bcp->descriptor_base; |
751 | bau_desc += UV_ITEMS_PER_DESCRIPTOR * bcp->uvhub_cpu; | 965 | bau_desc += ITEMS_PER_DESC * bcp->uvhub_cpu; |
752 | bau_uvhubs_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); | 966 | bau_uvhubs_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); |
753 | 967 | if (set_distrib_bits(flush_mask, bcp, bau_desc, &locals, &remotes)) | |
754 | for_each_cpu(tcpu, flush_mask) { | ||
755 | /* | ||
756 | * The distribution vector is a bit map of pnodes, relative | ||
757 | * to the partition base pnode (and the partition base nasid | ||
758 | * in the header). | ||
759 | * Translate cpu to pnode and hub using an array stored | ||
760 | * in local memory. | ||
761 | */ | ||
762 | hpp = &bcp->socket_master->target_hub_and_pnode[tcpu]; | ||
763 | tpnode = hpp->pnode - bcp->partition_base_pnode; | ||
764 | bau_uvhub_set(tpnode, &bau_desc->distribution); | ||
765 | if (hpp->uvhub == bcp->uvhub) | ||
766 | locals++; | ||
767 | else | ||
768 | remotes++; | ||
769 | } | ||
770 | if ((locals + remotes) == 0) | ||
771 | return NULL; | 968 | return NULL; |
772 | stat->s_requestor++; | ||
773 | stat->s_ntargcpu += remotes + locals; | ||
774 | stat->s_ntargremotes += remotes; | ||
775 | stat->s_ntarglocals += locals; | ||
776 | remotes = bau_uvhub_weight(&bau_desc->distribution); | ||
777 | 969 | ||
778 | /* uvhub statistics */ | 970 | record_send_statistics(stat, locals, hubs, remotes, bau_desc); |
779 | hubs = bau_uvhub_weight(&bau_desc->distribution); | ||
780 | if (locals) { | ||
781 | stat->s_ntarglocaluvhub++; | ||
782 | stat->s_ntargremoteuvhub += (hubs - 1); | ||
783 | } else | ||
784 | stat->s_ntargremoteuvhub += hubs; | ||
785 | stat->s_ntarguvhub += hubs; | ||
786 | if (hubs >= 16) | ||
787 | stat->s_ntarguvhub16++; | ||
788 | else if (hubs >= 8) | ||
789 | stat->s_ntarguvhub8++; | ||
790 | else if (hubs >= 4) | ||
791 | stat->s_ntarguvhub4++; | ||
792 | else if (hubs >= 2) | ||
793 | stat->s_ntarguvhub2++; | ||
794 | else | ||
795 | stat->s_ntarguvhub1++; | ||
796 | 971 | ||
797 | bau_desc->payload.address = va; | 972 | bau_desc->payload.address = va; |
798 | bau_desc->payload.sending_cpu = cpu; | 973 | bau_desc->payload.sending_cpu = cpu; |
799 | |||
800 | /* | 974 | /* |
801 | * uv_flush_send_and_wait returns 0 if all cpu's were messaged, | 975 | * uv_flush_send_and_wait returns 0 if all cpu's were messaged, |
802 | * or 1 if it gave up and the original cpumask should be returned. | 976 | * or 1 if it gave up and the original cpumask should be returned. |
@@ -825,26 +999,31 @@ void uv_bau_message_interrupt(struct pt_regs *regs) | |||
825 | { | 999 | { |
826 | int count = 0; | 1000 | int count = 0; |
827 | cycles_t time_start; | 1001 | cycles_t time_start; |
828 | struct bau_payload_queue_entry *msg; | 1002 | struct bau_pq_entry *msg; |
829 | struct bau_control *bcp; | 1003 | struct bau_control *bcp; |
830 | struct ptc_stats *stat; | 1004 | struct ptc_stats *stat; |
831 | struct msg_desc msgdesc; | 1005 | struct msg_desc msgdesc; |
832 | 1006 | ||
833 | time_start = get_cycles(); | 1007 | time_start = get_cycles(); |
1008 | |||
834 | bcp = &per_cpu(bau_control, smp_processor_id()); | 1009 | bcp = &per_cpu(bau_control, smp_processor_id()); |
835 | stat = bcp->statp; | 1010 | stat = bcp->statp; |
836 | msgdesc.va_queue_first = bcp->va_queue_first; | 1011 | |
837 | msgdesc.va_queue_last = bcp->va_queue_last; | 1012 | msgdesc.queue_first = bcp->queue_first; |
1013 | msgdesc.queue_last = bcp->queue_last; | ||
1014 | |||
838 | msg = bcp->bau_msg_head; | 1015 | msg = bcp->bau_msg_head; |
839 | while (msg->sw_ack_vector) { | 1016 | while (msg->swack_vec) { |
840 | count++; | 1017 | count++; |
841 | msgdesc.msg_slot = msg - msgdesc.va_queue_first; | 1018 | |
842 | msgdesc.sw_ack_slot = ffs(msg->sw_ack_vector) - 1; | 1019 | msgdesc.msg_slot = msg - msgdesc.queue_first; |
1020 | msgdesc.swack_slot = ffs(msg->swack_vec) - 1; | ||
843 | msgdesc.msg = msg; | 1021 | msgdesc.msg = msg; |
844 | uv_bau_process_message(&msgdesc, bcp); | 1022 | bau_process_message(&msgdesc, bcp); |
1023 | |||
845 | msg++; | 1024 | msg++; |
846 | if (msg > msgdesc.va_queue_last) | 1025 | if (msg > msgdesc.queue_last) |
847 | msg = msgdesc.va_queue_first; | 1026 | msg = msgdesc.queue_first; |
848 | bcp->bau_msg_head = msg; | 1027 | bcp->bau_msg_head = msg; |
849 | } | 1028 | } |
850 | stat->d_time += (get_cycles() - time_start); | 1029 | stat->d_time += (get_cycles() - time_start); |
@@ -852,18 +1031,17 @@ void uv_bau_message_interrupt(struct pt_regs *regs) | |||
852 | stat->d_nomsg++; | 1031 | stat->d_nomsg++; |
853 | else if (count > 1) | 1032 | else if (count > 1) |
854 | stat->d_multmsg++; | 1033 | stat->d_multmsg++; |
1034 | |||
855 | ack_APIC_irq(); | 1035 | ack_APIC_irq(); |
856 | } | 1036 | } |
857 | 1037 | ||
858 | /* | 1038 | /* |
859 | * uv_enable_timeouts | 1039 | * Each target uvhub (i.e. a uvhub that has cpu's) needs to have |
860 | * | ||
861 | * Each target uvhub (i.e. a uvhub that has no cpu's) needs to have | ||
862 | * shootdown message timeouts enabled. The timeout does not cause | 1040 | * shootdown message timeouts enabled. The timeout does not cause |
863 | * an interrupt, but causes an error message to be returned to | 1041 | * an interrupt, but causes an error message to be returned to |
864 | * the sender. | 1042 | * the sender. |
865 | */ | 1043 | */ |
866 | static void __init uv_enable_timeouts(void) | 1044 | static void __init enable_timeouts(void) |
867 | { | 1045 | { |
868 | int uvhub; | 1046 | int uvhub; |
869 | int nuvhubs; | 1047 | int nuvhubs; |
@@ -877,47 +1055,44 @@ static void __init uv_enable_timeouts(void) | |||
877 | continue; | 1055 | continue; |
878 | 1056 | ||
879 | pnode = uv_blade_to_pnode(uvhub); | 1057 | pnode = uv_blade_to_pnode(uvhub); |
880 | mmr_image = | 1058 | mmr_image = read_mmr_misc_control(pnode); |
881 | uv_read_global_mmr64(pnode, UVH_LB_BAU_MISC_CONTROL); | ||
882 | /* | 1059 | /* |
883 | * Set the timeout period and then lock it in, in three | 1060 | * Set the timeout period and then lock it in, in three |
884 | * steps; captures and locks in the period. | 1061 | * steps; captures and locks in the period. |
885 | * | 1062 | * |
886 | * To program the period, the SOFT_ACK_MODE must be off. | 1063 | * To program the period, the SOFT_ACK_MODE must be off. |
887 | */ | 1064 | */ |
888 | mmr_image &= ~((unsigned long)1 << | 1065 | mmr_image &= ~(1L << SOFTACK_MSHIFT); |
889 | UVH_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT); | 1066 | write_mmr_misc_control(pnode, mmr_image); |
890 | uv_write_global_mmr64 | ||
891 | (pnode, UVH_LB_BAU_MISC_CONTROL, mmr_image); | ||
892 | /* | 1067 | /* |
893 | * Set the 4-bit period. | 1068 | * Set the 4-bit period. |
894 | */ | 1069 | */ |
895 | mmr_image &= ~((unsigned long)0xf << | 1070 | mmr_image &= ~((unsigned long)0xf << SOFTACK_PSHIFT); |
896 | UVH_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT); | 1071 | mmr_image |= (SOFTACK_TIMEOUT_PERIOD << SOFTACK_PSHIFT); |
897 | mmr_image |= (UV_INTD_SOFT_ACK_TIMEOUT_PERIOD << | 1072 | write_mmr_misc_control(pnode, mmr_image); |
898 | UVH_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT); | ||
899 | uv_write_global_mmr64 | ||
900 | (pnode, UVH_LB_BAU_MISC_CONTROL, mmr_image); | ||
901 | /* | 1073 | /* |
1074 | * UV1: | ||
902 | * Subsequent reversals of the timebase bit (3) cause an | 1075 | * Subsequent reversals of the timebase bit (3) cause an |
903 | * immediate timeout of one or all INTD resources as | 1076 | * immediate timeout of one or all INTD resources as |
904 | * indicated in bits 2:0 (7 causes all of them to timeout). | 1077 | * indicated in bits 2:0 (7 causes all of them to timeout). |
905 | */ | 1078 | */ |
906 | mmr_image |= ((unsigned long)1 << | 1079 | mmr_image |= (1L << SOFTACK_MSHIFT); |
907 | UVH_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT); | 1080 | if (is_uv2_hub()) { |
908 | uv_write_global_mmr64 | 1081 | mmr_image |= (1L << UV2_LEG_SHFT); |
909 | (pnode, UVH_LB_BAU_MISC_CONTROL, mmr_image); | 1082 | mmr_image |= (1L << UV2_EXT_SHFT); |
1083 | } | ||
1084 | write_mmr_misc_control(pnode, mmr_image); | ||
910 | } | 1085 | } |
911 | } | 1086 | } |
912 | 1087 | ||
913 | static void *uv_ptc_seq_start(struct seq_file *file, loff_t *offset) | 1088 | static void *ptc_seq_start(struct seq_file *file, loff_t *offset) |
914 | { | 1089 | { |
915 | if (*offset < num_possible_cpus()) | 1090 | if (*offset < num_possible_cpus()) |
916 | return offset; | 1091 | return offset; |
917 | return NULL; | 1092 | return NULL; |
918 | } | 1093 | } |
919 | 1094 | ||
920 | static void *uv_ptc_seq_next(struct seq_file *file, void *data, loff_t *offset) | 1095 | static void *ptc_seq_next(struct seq_file *file, void *data, loff_t *offset) |
921 | { | 1096 | { |
922 | (*offset)++; | 1097 | (*offset)++; |
923 | if (*offset < num_possible_cpus()) | 1098 | if (*offset < num_possible_cpus()) |
@@ -925,12 +1100,11 @@ static void *uv_ptc_seq_next(struct seq_file *file, void *data, loff_t *offset) | |||
925 | return NULL; | 1100 | return NULL; |
926 | } | 1101 | } |
927 | 1102 | ||
928 | static void uv_ptc_seq_stop(struct seq_file *file, void *data) | 1103 | static void ptc_seq_stop(struct seq_file *file, void *data) |
929 | { | 1104 | { |
930 | } | 1105 | } |
931 | 1106 | ||
932 | static inline unsigned long long | 1107 | static inline unsigned long long usec_2_cycles(unsigned long microsec) |
933 | microsec_2_cycles(unsigned long microsec) | ||
934 | { | 1108 | { |
935 | unsigned long ns; | 1109 | unsigned long ns; |
936 | unsigned long long cyc; | 1110 | unsigned long long cyc; |
@@ -941,29 +1115,27 @@ microsec_2_cycles(unsigned long microsec) | |||
941 | } | 1115 | } |
942 | 1116 | ||
943 | /* | 1117 | /* |
944 | * Display the statistics thru /proc. | 1118 | * Display the statistics thru /proc/sgi_uv/ptc_statistics |
945 | * 'data' points to the cpu number | 1119 | * 'data' points to the cpu number |
1120 | * Note: see the descriptions in stat_description[]. | ||
946 | */ | 1121 | */ |
947 | static int uv_ptc_seq_show(struct seq_file *file, void *data) | 1122 | static int ptc_seq_show(struct seq_file *file, void *data) |
948 | { | 1123 | { |
949 | struct ptc_stats *stat; | 1124 | struct ptc_stats *stat; |
950 | int cpu; | 1125 | int cpu; |
951 | 1126 | ||
952 | cpu = *(loff_t *)data; | 1127 | cpu = *(loff_t *)data; |
953 | |||
954 | if (!cpu) { | 1128 | if (!cpu) { |
955 | seq_printf(file, | 1129 | seq_printf(file, |
956 | "# cpu sent stime self locals remotes ncpus localhub "); | 1130 | "# cpu sent stime self locals remotes ncpus localhub "); |
957 | seq_printf(file, | 1131 | seq_printf(file, |
958 | "remotehub numuvhubs numuvhubs16 numuvhubs8 "); | 1132 | "remotehub numuvhubs numuvhubs16 numuvhubs8 "); |
959 | seq_printf(file, | 1133 | seq_printf(file, |
960 | "numuvhubs4 numuvhubs2 numuvhubs1 dto "); | 1134 | "numuvhubs4 numuvhubs2 numuvhubs1 dto retries rok "); |
961 | seq_printf(file, | ||
962 | "retries rok resetp resett giveup sto bz throt "); | ||
963 | seq_printf(file, | 1135 | seq_printf(file, |
964 | "sw_ack recv rtime all "); | 1136 | "resetp resett giveup sto bz throt swack recv rtime "); |
965 | seq_printf(file, | 1137 | seq_printf(file, |
966 | "one mult none retry canc nocan reset rcan "); | 1138 | "all one mult none retry canc nocan reset rcan "); |
967 | seq_printf(file, | 1139 | seq_printf(file, |
968 | "disable enable\n"); | 1140 | "disable enable\n"); |
969 | } | 1141 | } |
@@ -990,8 +1162,7 @@ static int uv_ptc_seq_show(struct seq_file *file, void *data) | |||
990 | /* destination side statistics */ | 1162 | /* destination side statistics */ |
991 | seq_printf(file, | 1163 | seq_printf(file, |
992 | "%lx %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld ", | 1164 | "%lx %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld ", |
993 | uv_read_global_mmr64(uv_cpu_to_pnode(cpu), | 1165 | read_gmmr_sw_ack(uv_cpu_to_pnode(cpu)), |
994 | UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE), | ||
995 | stat->d_requestee, cycles_2_us(stat->d_time), | 1166 | stat->d_requestee, cycles_2_us(stat->d_time), |
996 | stat->d_alltlb, stat->d_onetlb, stat->d_multmsg, | 1167 | stat->d_alltlb, stat->d_onetlb, stat->d_multmsg, |
997 | stat->d_nomsg, stat->d_retries, stat->d_canceled, | 1168 | stat->d_nomsg, stat->d_retries, stat->d_canceled, |
@@ -1000,7 +1171,6 @@ static int uv_ptc_seq_show(struct seq_file *file, void *data) | |||
1000 | seq_printf(file, "%ld %ld\n", | 1171 | seq_printf(file, "%ld %ld\n", |
1001 | stat->s_bau_disabled, stat->s_bau_reenabled); | 1172 | stat->s_bau_disabled, stat->s_bau_reenabled); |
1002 | } | 1173 | } |
1003 | |||
1004 | return 0; | 1174 | return 0; |
1005 | } | 1175 | } |
1006 | 1176 | ||
@@ -1008,18 +1178,18 @@ static int uv_ptc_seq_show(struct seq_file *file, void *data) | |||
1008 | * Display the tunables thru debugfs | 1178 | * Display the tunables thru debugfs |
1009 | */ | 1179 | */ |
1010 | static ssize_t tunables_read(struct file *file, char __user *userbuf, | 1180 | static ssize_t tunables_read(struct file *file, char __user *userbuf, |
1011 | size_t count, loff_t *ppos) | 1181 | size_t count, loff_t *ppos) |
1012 | { | 1182 | { |
1013 | char *buf; | 1183 | char *buf; |
1014 | int ret; | 1184 | int ret; |
1015 | 1185 | ||
1016 | buf = kasprintf(GFP_KERNEL, "%s %s %s\n%d %d %d %d %d %d %d %d %d\n", | 1186 | buf = kasprintf(GFP_KERNEL, "%s %s %s\n%d %d %d %d %d %d %d %d %d\n", |
1017 | "max_bau_concurrent plugged_delay plugsb4reset", | 1187 | "max_concur plugged_delay plugsb4reset", |
1018 | "timeoutsb4reset ipi_reset_limit complete_threshold", | 1188 | "timeoutsb4reset ipi_reset_limit complete_threshold", |
1019 | "congested_response_us congested_reps congested_period", | 1189 | "congested_response_us congested_reps congested_period", |
1020 | max_bau_concurrent, plugged_delay, plugsb4reset, | 1190 | max_concurr, plugged_delay, plugsb4reset, |
1021 | timeoutsb4reset, ipi_reset_limit, complete_threshold, | 1191 | timeoutsb4reset, ipi_reset_limit, complete_threshold, |
1022 | congested_response_us, congested_reps, congested_period); | 1192 | congested_respns_us, congested_reps, congested_period); |
1023 | 1193 | ||
1024 | if (!buf) | 1194 | if (!buf) |
1025 | return -ENOMEM; | 1195 | return -ENOMEM; |
@@ -1030,13 +1200,16 @@ static ssize_t tunables_read(struct file *file, char __user *userbuf, | |||
1030 | } | 1200 | } |
1031 | 1201 | ||
1032 | /* | 1202 | /* |
1033 | * -1: resetf the statistics | 1203 | * handle a write to /proc/sgi_uv/ptc_statistics |
1204 | * -1: reset the statistics | ||
1034 | * 0: display meaning of the statistics | 1205 | * 0: display meaning of the statistics |
1035 | */ | 1206 | */ |
1036 | static ssize_t uv_ptc_proc_write(struct file *file, const char __user *user, | 1207 | static ssize_t ptc_proc_write(struct file *file, const char __user *user, |
1037 | size_t count, loff_t *data) | 1208 | size_t count, loff_t *data) |
1038 | { | 1209 | { |
1039 | int cpu; | 1210 | int cpu; |
1211 | int i; | ||
1212 | int elements; | ||
1040 | long input_arg; | 1213 | long input_arg; |
1041 | char optstr[64]; | 1214 | char optstr[64]; |
1042 | struct ptc_stats *stat; | 1215 | struct ptc_stats *stat; |
@@ -1046,79 +1219,18 @@ static ssize_t uv_ptc_proc_write(struct file *file, const char __user *user, | |||
1046 | if (copy_from_user(optstr, user, count)) | 1219 | if (copy_from_user(optstr, user, count)) |
1047 | return -EFAULT; | 1220 | return -EFAULT; |
1048 | optstr[count - 1] = '\0'; | 1221 | optstr[count - 1] = '\0'; |
1222 | |||
1049 | if (strict_strtol(optstr, 10, &input_arg) < 0) { | 1223 | if (strict_strtol(optstr, 10, &input_arg) < 0) { |
1050 | printk(KERN_DEBUG "%s is invalid\n", optstr); | 1224 | printk(KERN_DEBUG "%s is invalid\n", optstr); |
1051 | return -EINVAL; | 1225 | return -EINVAL; |
1052 | } | 1226 | } |
1053 | 1227 | ||
1054 | if (input_arg == 0) { | 1228 | if (input_arg == 0) { |
1229 | elements = sizeof(stat_description)/sizeof(*stat_description); | ||
1055 | printk(KERN_DEBUG "# cpu: cpu number\n"); | 1230 | printk(KERN_DEBUG "# cpu: cpu number\n"); |
1056 | printk(KERN_DEBUG "Sender statistics:\n"); | 1231 | printk(KERN_DEBUG "Sender statistics:\n"); |
1057 | printk(KERN_DEBUG | 1232 | for (i = 0; i < elements; i++) |
1058 | "sent: number of shootdown messages sent\n"); | 1233 | printk(KERN_DEBUG "%s\n", stat_description[i]); |
1059 | printk(KERN_DEBUG | ||
1060 | "stime: time spent sending messages\n"); | ||
1061 | printk(KERN_DEBUG | ||
1062 | "numuvhubs: number of hubs targeted with shootdown\n"); | ||
1063 | printk(KERN_DEBUG | ||
1064 | "numuvhubs16: number times 16 or more hubs targeted\n"); | ||
1065 | printk(KERN_DEBUG | ||
1066 | "numuvhubs8: number times 8 or more hubs targeted\n"); | ||
1067 | printk(KERN_DEBUG | ||
1068 | "numuvhubs4: number times 4 or more hubs targeted\n"); | ||
1069 | printk(KERN_DEBUG | ||
1070 | "numuvhubs2: number times 2 or more hubs targeted\n"); | ||
1071 | printk(KERN_DEBUG | ||
1072 | "numuvhubs1: number times 1 hub targeted\n"); | ||
1073 | printk(KERN_DEBUG | ||
1074 | "numcpus: number of cpus targeted with shootdown\n"); | ||
1075 | printk(KERN_DEBUG | ||
1076 | "dto: number of destination timeouts\n"); | ||
1077 | printk(KERN_DEBUG | ||
1078 | "retries: destination timeout retries sent\n"); | ||
1079 | printk(KERN_DEBUG | ||
1080 | "rok: : destination timeouts successfully retried\n"); | ||
1081 | printk(KERN_DEBUG | ||
1082 | "resetp: ipi-style resource resets for plugs\n"); | ||
1083 | printk(KERN_DEBUG | ||
1084 | "resett: ipi-style resource resets for timeouts\n"); | ||
1085 | printk(KERN_DEBUG | ||
1086 | "giveup: fall-backs to ipi-style shootdowns\n"); | ||
1087 | printk(KERN_DEBUG | ||
1088 | "sto: number of source timeouts\n"); | ||
1089 | printk(KERN_DEBUG | ||
1090 | "bz: number of stay-busy's\n"); | ||
1091 | printk(KERN_DEBUG | ||
1092 | "throt: number times spun in throttle\n"); | ||
1093 | printk(KERN_DEBUG "Destination side statistics:\n"); | ||
1094 | printk(KERN_DEBUG | ||
1095 | "sw_ack: image of UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE\n"); | ||
1096 | printk(KERN_DEBUG | ||
1097 | "recv: shootdown messages received\n"); | ||
1098 | printk(KERN_DEBUG | ||
1099 | "rtime: time spent processing messages\n"); | ||
1100 | printk(KERN_DEBUG | ||
1101 | "all: shootdown all-tlb messages\n"); | ||
1102 | printk(KERN_DEBUG | ||
1103 | "one: shootdown one-tlb messages\n"); | ||
1104 | printk(KERN_DEBUG | ||
1105 | "mult: interrupts that found multiple messages\n"); | ||
1106 | printk(KERN_DEBUG | ||
1107 | "none: interrupts that found no messages\n"); | ||
1108 | printk(KERN_DEBUG | ||
1109 | "retry: number of retry messages processed\n"); | ||
1110 | printk(KERN_DEBUG | ||
1111 | "canc: number messages canceled by retries\n"); | ||
1112 | printk(KERN_DEBUG | ||
1113 | "nocan: number retries that found nothing to cancel\n"); | ||
1114 | printk(KERN_DEBUG | ||
1115 | "reset: number of ipi-style reset requests processed\n"); | ||
1116 | printk(KERN_DEBUG | ||
1117 | "rcan: number messages canceled by reset requests\n"); | ||
1118 | printk(KERN_DEBUG | ||
1119 | "disable: number times use of the BAU was disabled\n"); | ||
1120 | printk(KERN_DEBUG | ||
1121 | "enable: number times use of the BAU was re-enabled\n"); | ||
1122 | } else if (input_arg == -1) { | 1234 | } else if (input_arg == -1) { |
1123 | for_each_present_cpu(cpu) { | 1235 | for_each_present_cpu(cpu) { |
1124 | stat = &per_cpu(ptcstats, cpu); | 1236 | stat = &per_cpu(ptcstats, cpu); |
@@ -1145,27 +1257,18 @@ static int local_atoi(const char *name) | |||
1145 | } | 1257 | } |
1146 | 1258 | ||
1147 | /* | 1259 | /* |
1148 | * set the tunables | 1260 | * Parse the values written to /sys/kernel/debug/sgi_uv/bau_tunables. |
1149 | * 0 values reset them to defaults | 1261 | * Zero values reset them to defaults. |
1150 | */ | 1262 | */ |
1151 | static ssize_t tunables_write(struct file *file, const char __user *user, | 1263 | static int parse_tunables_write(struct bau_control *bcp, char *instr, |
1152 | size_t count, loff_t *data) | 1264 | int count) |
1153 | { | 1265 | { |
1154 | int cpu; | ||
1155 | int cnt = 0; | ||
1156 | int val; | ||
1157 | char *p; | 1266 | char *p; |
1158 | char *q; | 1267 | char *q; |
1159 | char instr[64]; | 1268 | int cnt = 0; |
1160 | struct bau_control *bcp; | 1269 | int val; |
1161 | 1270 | int e = sizeof(tunables) / sizeof(*tunables); | |
1162 | if (count == 0 || count > sizeof(instr)-1) | ||
1163 | return -EINVAL; | ||
1164 | if (copy_from_user(instr, user, count)) | ||
1165 | return -EFAULT; | ||
1166 | 1271 | ||
1167 | instr[count] = '\0'; | ||
1168 | /* count the fields */ | ||
1169 | p = instr + strspn(instr, WHITESPACE); | 1272 | p = instr + strspn(instr, WHITESPACE); |
1170 | q = p; | 1273 | q = p; |
1171 | for (; *p; p = q + strspn(q, WHITESPACE)) { | 1274 | for (; *p; p = q + strspn(q, WHITESPACE)) { |
@@ -1174,8 +1277,8 @@ static ssize_t tunables_write(struct file *file, const char __user *user, | |||
1174 | if (q == p) | 1277 | if (q == p) |
1175 | break; | 1278 | break; |
1176 | } | 1279 | } |
1177 | if (cnt != 9) { | 1280 | if (cnt != e) { |
1178 | printk(KERN_INFO "bau tunable error: should be 9 numbers\n"); | 1281 | printk(KERN_INFO "bau tunable error: should be %d values\n", e); |
1179 | return -EINVAL; | 1282 | return -EINVAL; |
1180 | } | 1283 | } |
1181 | 1284 | ||
@@ -1187,97 +1290,80 @@ static ssize_t tunables_write(struct file *file, const char __user *user, | |||
1187 | switch (cnt) { | 1290 | switch (cnt) { |
1188 | case 0: | 1291 | case 0: |
1189 | if (val == 0) { | 1292 | if (val == 0) { |
1190 | max_bau_concurrent = MAX_BAU_CONCURRENT; | 1293 | max_concurr = MAX_BAU_CONCURRENT; |
1191 | max_bau_concurrent_constant = | 1294 | max_concurr_const = MAX_BAU_CONCURRENT; |
1192 | MAX_BAU_CONCURRENT; | ||
1193 | continue; | 1295 | continue; |
1194 | } | 1296 | } |
1195 | bcp = &per_cpu(bau_control, smp_processor_id()); | ||
1196 | if (val < 1 || val > bcp->cpus_in_uvhub) { | 1297 | if (val < 1 || val > bcp->cpus_in_uvhub) { |
1197 | printk(KERN_DEBUG | 1298 | printk(KERN_DEBUG |
1198 | "Error: BAU max concurrent %d is invalid\n", | 1299 | "Error: BAU max concurrent %d is invalid\n", |
1199 | val); | 1300 | val); |
1200 | return -EINVAL; | 1301 | return -EINVAL; |
1201 | } | 1302 | } |
1202 | max_bau_concurrent = val; | 1303 | max_concurr = val; |
1203 | max_bau_concurrent_constant = val; | 1304 | max_concurr_const = val; |
1204 | continue; | ||
1205 | case 1: | ||
1206 | if (val == 0) | ||
1207 | plugged_delay = PLUGGED_DELAY; | ||
1208 | else | ||
1209 | plugged_delay = val; | ||
1210 | continue; | ||
1211 | case 2: | ||
1212 | if (val == 0) | ||
1213 | plugsb4reset = PLUGSB4RESET; | ||
1214 | else | ||
1215 | plugsb4reset = val; | ||
1216 | continue; | ||
1217 | case 3: | ||
1218 | if (val == 0) | ||
1219 | timeoutsb4reset = TIMEOUTSB4RESET; | ||
1220 | else | ||
1221 | timeoutsb4reset = val; | ||
1222 | continue; | ||
1223 | case 4: | ||
1224 | if (val == 0) | ||
1225 | ipi_reset_limit = IPI_RESET_LIMIT; | ||
1226 | else | ||
1227 | ipi_reset_limit = val; | ||
1228 | continue; | ||
1229 | case 5: | ||
1230 | if (val == 0) | ||
1231 | complete_threshold = COMPLETE_THRESHOLD; | ||
1232 | else | ||
1233 | complete_threshold = val; | ||
1234 | continue; | ||
1235 | case 6: | ||
1236 | if (val == 0) | ||
1237 | congested_response_us = CONGESTED_RESPONSE_US; | ||
1238 | else | ||
1239 | congested_response_us = val; | ||
1240 | continue; | ||
1241 | case 7: | ||
1242 | if (val == 0) | ||
1243 | congested_reps = CONGESTED_REPS; | ||
1244 | else | ||
1245 | congested_reps = val; | ||
1246 | continue; | 1305 | continue; |
1247 | case 8: | 1306 | default: |
1248 | if (val == 0) | 1307 | if (val == 0) |
1249 | congested_period = CONGESTED_PERIOD; | 1308 | *tunables[cnt].tunp = tunables[cnt].deflt; |
1250 | else | 1309 | else |
1251 | congested_period = val; | 1310 | *tunables[cnt].tunp = val; |
1252 | continue; | 1311 | continue; |
1253 | } | 1312 | } |
1254 | if (q == p) | 1313 | if (q == p) |
1255 | break; | 1314 | break; |
1256 | } | 1315 | } |
1316 | return 0; | ||
1317 | } | ||
1318 | |||
1319 | /* | ||
1320 | * Handle a write to debugfs. (/sys/kernel/debug/sgi_uv/bau_tunables) | ||
1321 | */ | ||
1322 | static ssize_t tunables_write(struct file *file, const char __user *user, | ||
1323 | size_t count, loff_t *data) | ||
1324 | { | ||
1325 | int cpu; | ||
1326 | int ret; | ||
1327 | char instr[100]; | ||
1328 | struct bau_control *bcp; | ||
1329 | |||
1330 | if (count == 0 || count > sizeof(instr)-1) | ||
1331 | return -EINVAL; | ||
1332 | if (copy_from_user(instr, user, count)) | ||
1333 | return -EFAULT; | ||
1334 | |||
1335 | instr[count] = '\0'; | ||
1336 | |||
1337 | bcp = &per_cpu(bau_control, smp_processor_id()); | ||
1338 | |||
1339 | ret = parse_tunables_write(bcp, instr, count); | ||
1340 | if (ret) | ||
1341 | return ret; | ||
1342 | |||
1257 | for_each_present_cpu(cpu) { | 1343 | for_each_present_cpu(cpu) { |
1258 | bcp = &per_cpu(bau_control, cpu); | 1344 | bcp = &per_cpu(bau_control, cpu); |
1259 | bcp->max_bau_concurrent = max_bau_concurrent; | 1345 | bcp->max_concurr = max_concurr; |
1260 | bcp->max_bau_concurrent_constant = max_bau_concurrent; | 1346 | bcp->max_concurr_const = max_concurr; |
1261 | bcp->plugged_delay = plugged_delay; | 1347 | bcp->plugged_delay = plugged_delay; |
1262 | bcp->plugsb4reset = plugsb4reset; | 1348 | bcp->plugsb4reset = plugsb4reset; |
1263 | bcp->timeoutsb4reset = timeoutsb4reset; | 1349 | bcp->timeoutsb4reset = timeoutsb4reset; |
1264 | bcp->ipi_reset_limit = ipi_reset_limit; | 1350 | bcp->ipi_reset_limit = ipi_reset_limit; |
1265 | bcp->complete_threshold = complete_threshold; | 1351 | bcp->complete_threshold = complete_threshold; |
1266 | bcp->congested_response_us = congested_response_us; | 1352 | bcp->cong_response_us = congested_respns_us; |
1267 | bcp->congested_reps = congested_reps; | 1353 | bcp->cong_reps = congested_reps; |
1268 | bcp->congested_period = congested_period; | 1354 | bcp->cong_period = congested_period; |
1269 | } | 1355 | } |
1270 | return count; | 1356 | return count; |
1271 | } | 1357 | } |
1272 | 1358 | ||
1273 | static const struct seq_operations uv_ptc_seq_ops = { | 1359 | static const struct seq_operations uv_ptc_seq_ops = { |
1274 | .start = uv_ptc_seq_start, | 1360 | .start = ptc_seq_start, |
1275 | .next = uv_ptc_seq_next, | 1361 | .next = ptc_seq_next, |
1276 | .stop = uv_ptc_seq_stop, | 1362 | .stop = ptc_seq_stop, |
1277 | .show = uv_ptc_seq_show | 1363 | .show = ptc_seq_show |
1278 | }; | 1364 | }; |
1279 | 1365 | ||
1280 | static int uv_ptc_proc_open(struct inode *inode, struct file *file) | 1366 | static int ptc_proc_open(struct inode *inode, struct file *file) |
1281 | { | 1367 | { |
1282 | return seq_open(file, &uv_ptc_seq_ops); | 1368 | return seq_open(file, &uv_ptc_seq_ops); |
1283 | } | 1369 | } |
@@ -1288,9 +1374,9 @@ static int tunables_open(struct inode *inode, struct file *file) | |||
1288 | } | 1374 | } |
1289 | 1375 | ||
1290 | static const struct file_operations proc_uv_ptc_operations = { | 1376 | static const struct file_operations proc_uv_ptc_operations = { |
1291 | .open = uv_ptc_proc_open, | 1377 | .open = ptc_proc_open, |
1292 | .read = seq_read, | 1378 | .read = seq_read, |
1293 | .write = uv_ptc_proc_write, | 1379 | .write = ptc_proc_write, |
1294 | .llseek = seq_lseek, | 1380 | .llseek = seq_lseek, |
1295 | .release = seq_release, | 1381 | .release = seq_release, |
1296 | }; | 1382 | }; |
@@ -1324,7 +1410,7 @@ static int __init uv_ptc_init(void) | |||
1324 | return -EINVAL; | 1410 | return -EINVAL; |
1325 | } | 1411 | } |
1326 | tunables_file = debugfs_create_file(UV_BAU_TUNABLES_FILE, 0600, | 1412 | tunables_file = debugfs_create_file(UV_BAU_TUNABLES_FILE, 0600, |
1327 | tunables_dir, NULL, &tunables_fops); | 1413 | tunables_dir, NULL, &tunables_fops); |
1328 | if (!tunables_file) { | 1414 | if (!tunables_file) { |
1329 | printk(KERN_ERR "unable to create debugfs file %s\n", | 1415 | printk(KERN_ERR "unable to create debugfs file %s\n", |
1330 | UV_BAU_TUNABLES_FILE); | 1416 | UV_BAU_TUNABLES_FILE); |
@@ -1336,24 +1422,24 @@ static int __init uv_ptc_init(void) | |||
1336 | /* | 1422 | /* |
1337 | * Initialize the sending side's sending buffers. | 1423 | * Initialize the sending side's sending buffers. |
1338 | */ | 1424 | */ |
1339 | static void | 1425 | static void activation_descriptor_init(int node, int pnode, int base_pnode) |
1340 | uv_activation_descriptor_init(int node, int pnode, int base_pnode) | ||
1341 | { | 1426 | { |
1342 | int i; | 1427 | int i; |
1343 | int cpu; | 1428 | int cpu; |
1344 | unsigned long pa; | 1429 | unsigned long pa; |
1345 | unsigned long m; | 1430 | unsigned long m; |
1346 | unsigned long n; | 1431 | unsigned long n; |
1432 | size_t dsize; | ||
1347 | struct bau_desc *bau_desc; | 1433 | struct bau_desc *bau_desc; |
1348 | struct bau_desc *bd2; | 1434 | struct bau_desc *bd2; |
1349 | struct bau_control *bcp; | 1435 | struct bau_control *bcp; |
1350 | 1436 | ||
1351 | /* | 1437 | /* |
1352 | * each bau_desc is 64 bytes; there are 8 (UV_ITEMS_PER_DESCRIPTOR) | 1438 | * each bau_desc is 64 bytes; there are 8 (ITEMS_PER_DESC) |
1353 | * per cpu; and one per cpu on the uvhub (UV_ADP_SIZE) | 1439 | * per cpu; and one per cpu on the uvhub (ADP_SZ) |
1354 | */ | 1440 | */ |
1355 | bau_desc = kmalloc_node(sizeof(struct bau_desc) * UV_ADP_SIZE | 1441 | dsize = sizeof(struct bau_desc) * ADP_SZ * ITEMS_PER_DESC; |
1356 | * UV_ITEMS_PER_DESCRIPTOR, GFP_KERNEL, node); | 1442 | bau_desc = kmalloc_node(dsize, GFP_KERNEL, node); |
1357 | BUG_ON(!bau_desc); | 1443 | BUG_ON(!bau_desc); |
1358 | 1444 | ||
1359 | pa = uv_gpa(bau_desc); /* need the real nasid*/ | 1445 | pa = uv_gpa(bau_desc); /* need the real nasid*/ |
@@ -1361,27 +1447,25 @@ uv_activation_descriptor_init(int node, int pnode, int base_pnode) | |||
1361 | m = pa & uv_mmask; | 1447 | m = pa & uv_mmask; |
1362 | 1448 | ||
1363 | /* the 14-bit pnode */ | 1449 | /* the 14-bit pnode */ |
1364 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, | 1450 | write_mmr_descriptor_base(pnode, (n << UV_DESC_PSHIFT | m)); |
1365 | (n << UV_DESC_BASE_PNODE_SHIFT | m)); | ||
1366 | /* | 1451 | /* |
1367 | * Initializing all 8 (UV_ITEMS_PER_DESCRIPTOR) descriptors for each | 1452 | * Initializing all 8 (ITEMS_PER_DESC) descriptors for each |
1368 | * cpu even though we only use the first one; one descriptor can | 1453 | * cpu even though we only use the first one; one descriptor can |
1369 | * describe a broadcast to 256 uv hubs. | 1454 | * describe a broadcast to 256 uv hubs. |
1370 | */ | 1455 | */ |
1371 | for (i = 0, bd2 = bau_desc; i < (UV_ADP_SIZE*UV_ITEMS_PER_DESCRIPTOR); | 1456 | for (i = 0, bd2 = bau_desc; i < (ADP_SZ * ITEMS_PER_DESC); i++, bd2++) { |
1372 | i++, bd2++) { | ||
1373 | memset(bd2, 0, sizeof(struct bau_desc)); | 1457 | memset(bd2, 0, sizeof(struct bau_desc)); |
1374 | bd2->header.sw_ack_flag = 1; | 1458 | bd2->header.swack_flag = 1; |
1375 | /* | 1459 | /* |
1376 | * The base_dest_nasid set in the message header is the nasid | 1460 | * The base_dest_nasid set in the message header is the nasid |
1377 | * of the first uvhub in the partition. The bit map will | 1461 | * of the first uvhub in the partition. The bit map will |
1378 | * indicate destination pnode numbers relative to that base. | 1462 | * indicate destination pnode numbers relative to that base. |
1379 | * They may not be consecutive if nasid striding is being used. | 1463 | * They may not be consecutive if nasid striding is being used. |
1380 | */ | 1464 | */ |
1381 | bd2->header.base_dest_nasid = UV_PNODE_TO_NASID(base_pnode); | 1465 | bd2->header.base_dest_nasid = UV_PNODE_TO_NASID(base_pnode); |
1382 | bd2->header.dest_subnodeid = UV_LB_SUBNODEID; | 1466 | bd2->header.dest_subnodeid = UV_LB_SUBNODEID; |
1383 | bd2->header.command = UV_NET_ENDPOINT_INTD; | 1467 | bd2->header.command = UV_NET_ENDPOINT_INTD; |
1384 | bd2->header.int_both = 1; | 1468 | bd2->header.int_both = 1; |
1385 | /* | 1469 | /* |
1386 | * all others need to be set to zero: | 1470 | * all others need to be set to zero: |
1387 | * fairness chaining multilevel count replied_to | 1471 | * fairness chaining multilevel count replied_to |
@@ -1401,57 +1485,55 @@ uv_activation_descriptor_init(int node, int pnode, int base_pnode) | |||
1401 | * - node is first node (kernel memory notion) on the uvhub | 1485 | * - node is first node (kernel memory notion) on the uvhub |
1402 | * - pnode is the uvhub's physical identifier | 1486 | * - pnode is the uvhub's physical identifier |
1403 | */ | 1487 | */ |
1404 | static void | 1488 | static void pq_init(int node, int pnode) |
1405 | uv_payload_queue_init(int node, int pnode) | ||
1406 | { | 1489 | { |
1407 | int pn; | ||
1408 | int cpu; | 1490 | int cpu; |
1491 | size_t plsize; | ||
1409 | char *cp; | 1492 | char *cp; |
1410 | unsigned long pa; | 1493 | void *vp; |
1411 | struct bau_payload_queue_entry *pqp; | 1494 | unsigned long pn; |
1412 | struct bau_payload_queue_entry *pqp_malloc; | 1495 | unsigned long first; |
1496 | unsigned long pn_first; | ||
1497 | unsigned long last; | ||
1498 | struct bau_pq_entry *pqp; | ||
1413 | struct bau_control *bcp; | 1499 | struct bau_control *bcp; |
1414 | 1500 | ||
1415 | pqp = kmalloc_node((DEST_Q_SIZE + 1) | 1501 | plsize = (DEST_Q_SIZE + 1) * sizeof(struct bau_pq_entry); |
1416 | * sizeof(struct bau_payload_queue_entry), | 1502 | vp = kmalloc_node(plsize, GFP_KERNEL, node); |
1417 | GFP_KERNEL, node); | 1503 | pqp = (struct bau_pq_entry *)vp; |
1418 | BUG_ON(!pqp); | 1504 | BUG_ON(!pqp); |
1419 | pqp_malloc = pqp; | ||
1420 | 1505 | ||
1421 | cp = (char *)pqp + 31; | 1506 | cp = (char *)pqp + 31; |
1422 | pqp = (struct bau_payload_queue_entry *)(((unsigned long)cp >> 5) << 5); | 1507 | pqp = (struct bau_pq_entry *)(((unsigned long)cp >> 5) << 5); |
1423 | 1508 | ||
1424 | for_each_present_cpu(cpu) { | 1509 | for_each_present_cpu(cpu) { |
1425 | if (pnode != uv_cpu_to_pnode(cpu)) | 1510 | if (pnode != uv_cpu_to_pnode(cpu)) |
1426 | continue; | 1511 | continue; |
1427 | /* for every cpu on this pnode: */ | 1512 | /* for every cpu on this pnode: */ |
1428 | bcp = &per_cpu(bau_control, cpu); | 1513 | bcp = &per_cpu(bau_control, cpu); |
1429 | bcp->va_queue_first = pqp; | 1514 | bcp->queue_first = pqp; |
1430 | bcp->bau_msg_head = pqp; | 1515 | bcp->bau_msg_head = pqp; |
1431 | bcp->va_queue_last = pqp + (DEST_Q_SIZE - 1); | 1516 | bcp->queue_last = pqp + (DEST_Q_SIZE - 1); |
1432 | } | 1517 | } |
1433 | /* | 1518 | /* |
1434 | * need the pnode of where the memory was really allocated | 1519 | * need the pnode of where the memory was really allocated |
1435 | */ | 1520 | */ |
1436 | pa = uv_gpa(pqp); | 1521 | pn = uv_gpa(pqp) >> uv_nshift; |
1437 | pn = pa >> uv_nshift; | 1522 | first = uv_physnodeaddr(pqp); |
1438 | uv_write_global_mmr64(pnode, | 1523 | pn_first = ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | first; |
1439 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, | 1524 | last = uv_physnodeaddr(pqp + (DEST_Q_SIZE - 1)); |
1440 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | | 1525 | write_mmr_payload_first(pnode, pn_first); |
1441 | uv_physnodeaddr(pqp)); | 1526 | write_mmr_payload_tail(pnode, first); |
1442 | uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL, | 1527 | write_mmr_payload_last(pnode, last); |
1443 | uv_physnodeaddr(pqp)); | 1528 | |
1444 | uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST, | ||
1445 | (unsigned long) | ||
1446 | uv_physnodeaddr(pqp + (DEST_Q_SIZE - 1))); | ||
1447 | /* in effect, all msg_type's are set to MSG_NOOP */ | 1529 | /* in effect, all msg_type's are set to MSG_NOOP */ |
1448 | memset(pqp, 0, sizeof(struct bau_payload_queue_entry) * DEST_Q_SIZE); | 1530 | memset(pqp, 0, sizeof(struct bau_pq_entry) * DEST_Q_SIZE); |
1449 | } | 1531 | } |
1450 | 1532 | ||
1451 | /* | 1533 | /* |
1452 | * Initialization of each UV hub's structures | 1534 | * Initialization of each UV hub's structures |
1453 | */ | 1535 | */ |
1454 | static void __init uv_init_uvhub(int uvhub, int vector, int base_pnode) | 1536 | static void __init init_uvhub(int uvhub, int vector, int base_pnode) |
1455 | { | 1537 | { |
1456 | int node; | 1538 | int node; |
1457 | int pnode; | 1539 | int pnode; |
@@ -1459,24 +1541,24 @@ static void __init uv_init_uvhub(int uvhub, int vector, int base_pnode) | |||
1459 | 1541 | ||
1460 | node = uvhub_to_first_node(uvhub); | 1542 | node = uvhub_to_first_node(uvhub); |
1461 | pnode = uv_blade_to_pnode(uvhub); | 1543 | pnode = uv_blade_to_pnode(uvhub); |
1462 | uv_activation_descriptor_init(node, pnode, base_pnode); | 1544 | |
1463 | uv_payload_queue_init(node, pnode); | 1545 | activation_descriptor_init(node, pnode, base_pnode); |
1546 | |||
1547 | pq_init(node, pnode); | ||
1464 | /* | 1548 | /* |
1465 | * The below initialization can't be in firmware because the | 1549 | * The below initialization can't be in firmware because the |
1466 | * messaging IRQ will be determined by the OS. | 1550 | * messaging IRQ will be determined by the OS. |
1467 | */ | 1551 | */ |
1468 | apicid = uvhub_to_first_apicid(uvhub) | uv_apicid_hibits; | 1552 | apicid = uvhub_to_first_apicid(uvhub) | uv_apicid_hibits; |
1469 | uv_write_global_mmr64(pnode, UVH_BAU_DATA_CONFIG, | 1553 | write_mmr_data_config(pnode, ((apicid << 32) | vector)); |
1470 | ((apicid << 32) | vector)); | ||
1471 | } | 1554 | } |
1472 | 1555 | ||
1473 | /* | 1556 | /* |
1474 | * We will set BAU_MISC_CONTROL with a timeout period. | 1557 | * We will set BAU_MISC_CONTROL with a timeout period. |
1475 | * But the BIOS has set UVH_AGING_PRESCALE_SEL and UVH_TRANSACTION_TIMEOUT. | 1558 | * But the BIOS has set UVH_AGING_PRESCALE_SEL and UVH_TRANSACTION_TIMEOUT. |
1476 | * So the destination timeout period has be be calculated from them. | 1559 | * So the destination timeout period has to be calculated from them. |
1477 | */ | 1560 | */ |
1478 | static int | 1561 | static int calculate_destination_timeout(void) |
1479 | calculate_destination_timeout(void) | ||
1480 | { | 1562 | { |
1481 | unsigned long mmr_image; | 1563 | unsigned long mmr_image; |
1482 | int mult1; | 1564 | int mult1; |
@@ -1486,73 +1568,92 @@ calculate_destination_timeout(void) | |||
1486 | int ret; | 1568 | int ret; |
1487 | unsigned long ts_ns; | 1569 | unsigned long ts_ns; |
1488 | 1570 | ||
1489 | mult1 = UV_INTD_SOFT_ACK_TIMEOUT_PERIOD & BAU_MISC_CONTROL_MULT_MASK; | 1571 | if (is_uv1_hub()) { |
1490 | mmr_image = uv_read_local_mmr(UVH_AGING_PRESCALE_SEL); | 1572 | mult1 = SOFTACK_TIMEOUT_PERIOD & BAU_MISC_CONTROL_MULT_MASK; |
1491 | index = (mmr_image >> BAU_URGENCY_7_SHIFT) & BAU_URGENCY_7_MASK; | 1573 | mmr_image = uv_read_local_mmr(UVH_AGING_PRESCALE_SEL); |
1492 | mmr_image = uv_read_local_mmr(UVH_TRANSACTION_TIMEOUT); | 1574 | index = (mmr_image >> BAU_URGENCY_7_SHIFT) & BAU_URGENCY_7_MASK; |
1493 | mult2 = (mmr_image >> BAU_TRANS_SHIFT) & BAU_TRANS_MASK; | 1575 | mmr_image = uv_read_local_mmr(UVH_TRANSACTION_TIMEOUT); |
1494 | base = timeout_base_ns[index]; | 1576 | mult2 = (mmr_image >> BAU_TRANS_SHIFT) & BAU_TRANS_MASK; |
1495 | ts_ns = base * mult1 * mult2; | 1577 | base = timeout_base_ns[index]; |
1496 | ret = ts_ns / 1000; | 1578 | ts_ns = base * mult1 * mult2; |
1579 | ret = ts_ns / 1000; | ||
1580 | } else { | ||
1581 | /* 4 bits 0/1 for 10/80us, 3 bits of multiplier */ | ||
1582 | mmr_image = uv_read_local_mmr(UVH_AGING_PRESCALE_SEL); | ||
1583 | mmr_image = (mmr_image & UV_SA_MASK) >> UV_SA_SHFT; | ||
1584 | if (mmr_image & (1L << UV2_ACK_UNITS_SHFT)) | ||
1585 | mult1 = 80; | ||
1586 | else | ||
1587 | mult1 = 10; | ||
1588 | base = mmr_image & UV2_ACK_MASK; | ||
1589 | ret = mult1 * base; | ||
1590 | } | ||
1497 | return ret; | 1591 | return ret; |
1498 | } | 1592 | } |
1499 | 1593 | ||
1594 | static void __init init_per_cpu_tunables(void) | ||
1595 | { | ||
1596 | int cpu; | ||
1597 | struct bau_control *bcp; | ||
1598 | |||
1599 | for_each_present_cpu(cpu) { | ||
1600 | bcp = &per_cpu(bau_control, cpu); | ||
1601 | bcp->baudisabled = 0; | ||
1602 | bcp->statp = &per_cpu(ptcstats, cpu); | ||
1603 | /* time interval to catch a hardware stay-busy bug */ | ||
1604 | bcp->timeout_interval = usec_2_cycles(2*timeout_us); | ||
1605 | bcp->max_concurr = max_concurr; | ||
1606 | bcp->max_concurr_const = max_concurr; | ||
1607 | bcp->plugged_delay = plugged_delay; | ||
1608 | bcp->plugsb4reset = plugsb4reset; | ||
1609 | bcp->timeoutsb4reset = timeoutsb4reset; | ||
1610 | bcp->ipi_reset_limit = ipi_reset_limit; | ||
1611 | bcp->complete_threshold = complete_threshold; | ||
1612 | bcp->cong_response_us = congested_respns_us; | ||
1613 | bcp->cong_reps = congested_reps; | ||
1614 | bcp->cong_period = congested_period; | ||
1615 | } | ||
1616 | } | ||
1617 | |||
1500 | /* | 1618 | /* |
1501 | * initialize the bau_control structure for each cpu | 1619 | * Scan all cpus to collect blade and socket summaries. |
1502 | */ | 1620 | */ |
1503 | static int __init uv_init_per_cpu(int nuvhubs, int base_part_pnode) | 1621 | static int __init get_cpu_topology(int base_pnode, |
1622 | struct uvhub_desc *uvhub_descs, | ||
1623 | unsigned char *uvhub_mask) | ||
1504 | { | 1624 | { |
1505 | int i; | ||
1506 | int cpu; | 1625 | int cpu; |
1507 | int tcpu; | ||
1508 | int pnode; | 1626 | int pnode; |
1509 | int uvhub; | 1627 | int uvhub; |
1510 | int have_hmaster; | 1628 | int socket; |
1511 | short socket = 0; | ||
1512 | unsigned short socket_mask; | ||
1513 | unsigned char *uvhub_mask; | ||
1514 | struct bau_control *bcp; | 1629 | struct bau_control *bcp; |
1515 | struct uvhub_desc *bdp; | 1630 | struct uvhub_desc *bdp; |
1516 | struct socket_desc *sdp; | 1631 | struct socket_desc *sdp; |
1517 | struct bau_control *hmaster = NULL; | ||
1518 | struct bau_control *smaster = NULL; | ||
1519 | struct socket_desc { | ||
1520 | short num_cpus; | ||
1521 | short cpu_number[MAX_CPUS_PER_SOCKET]; | ||
1522 | }; | ||
1523 | struct uvhub_desc { | ||
1524 | unsigned short socket_mask; | ||
1525 | short num_cpus; | ||
1526 | short uvhub; | ||
1527 | short pnode; | ||
1528 | struct socket_desc socket[2]; | ||
1529 | }; | ||
1530 | struct uvhub_desc *uvhub_descs; | ||
1531 | |||
1532 | timeout_us = calculate_destination_timeout(); | ||
1533 | 1632 | ||
1534 | uvhub_descs = kmalloc(nuvhubs * sizeof(struct uvhub_desc), GFP_KERNEL); | ||
1535 | memset(uvhub_descs, 0, nuvhubs * sizeof(struct uvhub_desc)); | ||
1536 | uvhub_mask = kzalloc((nuvhubs+7)/8, GFP_KERNEL); | ||
1537 | for_each_present_cpu(cpu) { | 1633 | for_each_present_cpu(cpu) { |
1538 | bcp = &per_cpu(bau_control, cpu); | 1634 | bcp = &per_cpu(bau_control, cpu); |
1635 | |||
1539 | memset(bcp, 0, sizeof(struct bau_control)); | 1636 | memset(bcp, 0, sizeof(struct bau_control)); |
1637 | |||
1540 | pnode = uv_cpu_hub_info(cpu)->pnode; | 1638 | pnode = uv_cpu_hub_info(cpu)->pnode; |
1541 | if ((pnode - base_part_pnode) >= UV_DISTRIBUTION_SIZE) { | 1639 | if ((pnode - base_pnode) >= UV_DISTRIBUTION_SIZE) { |
1542 | printk(KERN_EMERG | 1640 | printk(KERN_EMERG |
1543 | "cpu %d pnode %d-%d beyond %d; BAU disabled\n", | 1641 | "cpu %d pnode %d-%d beyond %d; BAU disabled\n", |
1544 | cpu, pnode, base_part_pnode, | 1642 | cpu, pnode, base_pnode, UV_DISTRIBUTION_SIZE); |
1545 | UV_DISTRIBUTION_SIZE); | ||
1546 | return 1; | 1643 | return 1; |
1547 | } | 1644 | } |
1645 | |||
1548 | bcp->osnode = cpu_to_node(cpu); | 1646 | bcp->osnode = cpu_to_node(cpu); |
1549 | bcp->partition_base_pnode = uv_partition_base_pnode; | 1647 | bcp->partition_base_pnode = base_pnode; |
1648 | |||
1550 | uvhub = uv_cpu_hub_info(cpu)->numa_blade_id; | 1649 | uvhub = uv_cpu_hub_info(cpu)->numa_blade_id; |
1551 | *(uvhub_mask + (uvhub/8)) |= (1 << (uvhub%8)); | 1650 | *(uvhub_mask + (uvhub/8)) |= (1 << (uvhub%8)); |
1552 | bdp = &uvhub_descs[uvhub]; | 1651 | bdp = &uvhub_descs[uvhub]; |
1652 | |||
1553 | bdp->num_cpus++; | 1653 | bdp->num_cpus++; |
1554 | bdp->uvhub = uvhub; | 1654 | bdp->uvhub = uvhub; |
1555 | bdp->pnode = pnode; | 1655 | bdp->pnode = pnode; |
1656 | |||
1556 | /* kludge: 'assuming' one node per socket, and assuming that | 1657 | /* kludge: 'assuming' one node per socket, and assuming that |
1557 | disabling a socket just leaves a gap in node numbers */ | 1658 | disabling a socket just leaves a gap in node numbers */ |
1558 | socket = bcp->osnode & 1; | 1659 | socket = bcp->osnode & 1; |
@@ -1561,84 +1662,129 @@ static int __init uv_init_per_cpu(int nuvhubs, int base_part_pnode) | |||
1561 | sdp->cpu_number[sdp->num_cpus] = cpu; | 1662 | sdp->cpu_number[sdp->num_cpus] = cpu; |
1562 | sdp->num_cpus++; | 1663 | sdp->num_cpus++; |
1563 | if (sdp->num_cpus > MAX_CPUS_PER_SOCKET) { | 1664 | if (sdp->num_cpus > MAX_CPUS_PER_SOCKET) { |
1564 | printk(KERN_EMERG "%d cpus per socket invalid\n", sdp->num_cpus); | 1665 | printk(KERN_EMERG "%d cpus per socket invalid\n", |
1666 | sdp->num_cpus); | ||
1565 | return 1; | 1667 | return 1; |
1566 | } | 1668 | } |
1567 | } | 1669 | } |
1670 | return 0; | ||
1671 | } | ||
1672 | |||
1673 | /* | ||
1674 | * Each socket is to get a local array of pnodes/hubs. | ||
1675 | */ | ||
1676 | static void make_per_cpu_thp(struct bau_control *smaster) | ||
1677 | { | ||
1678 | int cpu; | ||
1679 | size_t hpsz = sizeof(struct hub_and_pnode) * num_possible_cpus(); | ||
1680 | |||
1681 | smaster->thp = kmalloc_node(hpsz, GFP_KERNEL, smaster->osnode); | ||
1682 | memset(smaster->thp, 0, hpsz); | ||
1683 | for_each_present_cpu(cpu) { | ||
1684 | smaster->thp[cpu].pnode = uv_cpu_hub_info(cpu)->pnode; | ||
1685 | smaster->thp[cpu].uvhub = uv_cpu_hub_info(cpu)->numa_blade_id; | ||
1686 | } | ||
1687 | } | ||
1688 | |||
1689 | /* | ||
1690 | * Initialize all the per_cpu information for the cpu's on a given socket, | ||
1691 | * given what has been gathered into the socket_desc struct. | ||
1692 | * And reports the chosen hub and socket masters back to the caller. | ||
1693 | */ | ||
1694 | static int scan_sock(struct socket_desc *sdp, struct uvhub_desc *bdp, | ||
1695 | struct bau_control **smasterp, | ||
1696 | struct bau_control **hmasterp) | ||
1697 | { | ||
1698 | int i; | ||
1699 | int cpu; | ||
1700 | struct bau_control *bcp; | ||
1701 | |||
1702 | for (i = 0; i < sdp->num_cpus; i++) { | ||
1703 | cpu = sdp->cpu_number[i]; | ||
1704 | bcp = &per_cpu(bau_control, cpu); | ||
1705 | bcp->cpu = cpu; | ||
1706 | if (i == 0) { | ||
1707 | *smasterp = bcp; | ||
1708 | if (!(*hmasterp)) | ||
1709 | *hmasterp = bcp; | ||
1710 | } | ||
1711 | bcp->cpus_in_uvhub = bdp->num_cpus; | ||
1712 | bcp->cpus_in_socket = sdp->num_cpus; | ||
1713 | bcp->socket_master = *smasterp; | ||
1714 | bcp->uvhub = bdp->uvhub; | ||
1715 | bcp->uvhub_master = *hmasterp; | ||
1716 | bcp->uvhub_cpu = uv_cpu_hub_info(cpu)->blade_processor_id; | ||
1717 | if (bcp->uvhub_cpu >= MAX_CPUS_PER_UVHUB) { | ||
1718 | printk(KERN_EMERG "%d cpus per uvhub invalid\n", | ||
1719 | bcp->uvhub_cpu); | ||
1720 | return 1; | ||
1721 | } | ||
1722 | } | ||
1723 | return 0; | ||
1724 | } | ||
1725 | |||
1726 | /* | ||
1727 | * Summarize the blade and socket topology into the per_cpu structures. | ||
1728 | */ | ||
1729 | static int __init summarize_uvhub_sockets(int nuvhubs, | ||
1730 | struct uvhub_desc *uvhub_descs, | ||
1731 | unsigned char *uvhub_mask) | ||
1732 | { | ||
1733 | int socket; | ||
1734 | int uvhub; | ||
1735 | unsigned short socket_mask; | ||
1736 | |||
1568 | for (uvhub = 0; uvhub < nuvhubs; uvhub++) { | 1737 | for (uvhub = 0; uvhub < nuvhubs; uvhub++) { |
1738 | struct uvhub_desc *bdp; | ||
1739 | struct bau_control *smaster = NULL; | ||
1740 | struct bau_control *hmaster = NULL; | ||
1741 | |||
1569 | if (!(*(uvhub_mask + (uvhub/8)) & (1 << (uvhub%8)))) | 1742 | if (!(*(uvhub_mask + (uvhub/8)) & (1 << (uvhub%8)))) |
1570 | continue; | 1743 | continue; |
1571 | have_hmaster = 0; | 1744 | |
1572 | bdp = &uvhub_descs[uvhub]; | 1745 | bdp = &uvhub_descs[uvhub]; |
1573 | socket_mask = bdp->socket_mask; | 1746 | socket_mask = bdp->socket_mask; |
1574 | socket = 0; | 1747 | socket = 0; |
1575 | while (socket_mask) { | 1748 | while (socket_mask) { |
1576 | if (!(socket_mask & 1)) | 1749 | struct socket_desc *sdp; |
1577 | goto nextsocket; | 1750 | if ((socket_mask & 1)) { |
1578 | sdp = &bdp->socket[socket]; | 1751 | sdp = &bdp->socket[socket]; |
1579 | for (i = 0; i < sdp->num_cpus; i++) { | 1752 | if (scan_sock(sdp, bdp, &smaster, &hmaster)) |
1580 | cpu = sdp->cpu_number[i]; | ||
1581 | bcp = &per_cpu(bau_control, cpu); | ||
1582 | bcp->cpu = cpu; | ||
1583 | if (i == 0) { | ||
1584 | smaster = bcp; | ||
1585 | if (!have_hmaster) { | ||
1586 | have_hmaster++; | ||
1587 | hmaster = bcp; | ||
1588 | } | ||
1589 | } | ||
1590 | bcp->cpus_in_uvhub = bdp->num_cpus; | ||
1591 | bcp->cpus_in_socket = sdp->num_cpus; | ||
1592 | bcp->socket_master = smaster; | ||
1593 | bcp->uvhub = bdp->uvhub; | ||
1594 | bcp->uvhub_master = hmaster; | ||
1595 | bcp->uvhub_cpu = uv_cpu_hub_info(cpu)-> | ||
1596 | blade_processor_id; | ||
1597 | if (bcp->uvhub_cpu >= MAX_CPUS_PER_UVHUB) { | ||
1598 | printk(KERN_EMERG | ||
1599 | "%d cpus per uvhub invalid\n", | ||
1600 | bcp->uvhub_cpu); | ||
1601 | return 1; | 1753 | return 1; |
1602 | } | ||
1603 | } | 1754 | } |
1604 | nextsocket: | ||
1605 | socket++; | 1755 | socket++; |
1606 | socket_mask = (socket_mask >> 1); | 1756 | socket_mask = (socket_mask >> 1); |
1607 | /* each socket gets a local array of pnodes/hubs */ | 1757 | make_per_cpu_thp(smaster); |
1608 | bcp = smaster; | ||
1609 | bcp->target_hub_and_pnode = kmalloc_node( | ||
1610 | sizeof(struct hub_and_pnode) * | ||
1611 | num_possible_cpus(), GFP_KERNEL, bcp->osnode); | ||
1612 | memset(bcp->target_hub_and_pnode, 0, | ||
1613 | sizeof(struct hub_and_pnode) * | ||
1614 | num_possible_cpus()); | ||
1615 | for_each_present_cpu(tcpu) { | ||
1616 | bcp->target_hub_and_pnode[tcpu].pnode = | ||
1617 | uv_cpu_hub_info(tcpu)->pnode; | ||
1618 | bcp->target_hub_and_pnode[tcpu].uvhub = | ||
1619 | uv_cpu_hub_info(tcpu)->numa_blade_id; | ||
1620 | } | ||
1621 | } | 1758 | } |
1622 | } | 1759 | } |
1760 | return 0; | ||
1761 | } | ||
1762 | |||
1763 | /* | ||
1764 | * initialize the bau_control structure for each cpu | ||
1765 | */ | ||
1766 | static int __init init_per_cpu(int nuvhubs, int base_part_pnode) | ||
1767 | { | ||
1768 | unsigned char *uvhub_mask; | ||
1769 | void *vp; | ||
1770 | struct uvhub_desc *uvhub_descs; | ||
1771 | |||
1772 | timeout_us = calculate_destination_timeout(); | ||
1773 | |||
1774 | vp = kmalloc(nuvhubs * sizeof(struct uvhub_desc), GFP_KERNEL); | ||
1775 | uvhub_descs = (struct uvhub_desc *)vp; | ||
1776 | memset(uvhub_descs, 0, nuvhubs * sizeof(struct uvhub_desc)); | ||
1777 | uvhub_mask = kzalloc((nuvhubs+7)/8, GFP_KERNEL); | ||
1778 | |||
1779 | if (get_cpu_topology(base_part_pnode, uvhub_descs, uvhub_mask)) | ||
1780 | return 1; | ||
1781 | |||
1782 | if (summarize_uvhub_sockets(nuvhubs, uvhub_descs, uvhub_mask)) | ||
1783 | return 1; | ||
1784 | |||
1623 | kfree(uvhub_descs); | 1785 | kfree(uvhub_descs); |
1624 | kfree(uvhub_mask); | 1786 | kfree(uvhub_mask); |
1625 | for_each_present_cpu(cpu) { | 1787 | init_per_cpu_tunables(); |
1626 | bcp = &per_cpu(bau_control, cpu); | ||
1627 | bcp->baudisabled = 0; | ||
1628 | bcp->statp = &per_cpu(ptcstats, cpu); | ||
1629 | /* time interval to catch a hardware stay-busy bug */ | ||
1630 | bcp->timeout_interval = microsec_2_cycles(2*timeout_us); | ||
1631 | bcp->max_bau_concurrent = max_bau_concurrent; | ||
1632 | bcp->max_bau_concurrent_constant = max_bau_concurrent; | ||
1633 | bcp->plugged_delay = plugged_delay; | ||
1634 | bcp->plugsb4reset = plugsb4reset; | ||
1635 | bcp->timeoutsb4reset = timeoutsb4reset; | ||
1636 | bcp->ipi_reset_limit = ipi_reset_limit; | ||
1637 | bcp->complete_threshold = complete_threshold; | ||
1638 | bcp->congested_response_us = congested_response_us; | ||
1639 | bcp->congested_reps = congested_reps; | ||
1640 | bcp->congested_period = congested_period; | ||
1641 | } | ||
1642 | return 0; | 1788 | return 0; |
1643 | } | 1789 | } |
1644 | 1790 | ||
@@ -1651,8 +1797,9 @@ static int __init uv_bau_init(void) | |||
1651 | int pnode; | 1797 | int pnode; |
1652 | int nuvhubs; | 1798 | int nuvhubs; |
1653 | int cur_cpu; | 1799 | int cur_cpu; |
1800 | int cpus; | ||
1654 | int vector; | 1801 | int vector; |
1655 | unsigned long mmr; | 1802 | cpumask_var_t *mask; |
1656 | 1803 | ||
1657 | if (!is_uv_system()) | 1804 | if (!is_uv_system()) |
1658 | return 0; | 1805 | return 0; |
@@ -1660,24 +1807,25 @@ static int __init uv_bau_init(void) | |||
1660 | if (nobau) | 1807 | if (nobau) |
1661 | return 0; | 1808 | return 0; |
1662 | 1809 | ||
1663 | for_each_possible_cpu(cur_cpu) | 1810 | for_each_possible_cpu(cur_cpu) { |
1664 | zalloc_cpumask_var_node(&per_cpu(uv_flush_tlb_mask, cur_cpu), | 1811 | mask = &per_cpu(uv_flush_tlb_mask, cur_cpu); |
1665 | GFP_KERNEL, cpu_to_node(cur_cpu)); | 1812 | zalloc_cpumask_var_node(mask, GFP_KERNEL, cpu_to_node(cur_cpu)); |
1813 | } | ||
1666 | 1814 | ||
1667 | uv_nshift = uv_hub_info->m_val; | 1815 | uv_nshift = uv_hub_info->m_val; |
1668 | uv_mmask = (1UL << uv_hub_info->m_val) - 1; | 1816 | uv_mmask = (1UL << uv_hub_info->m_val) - 1; |
1669 | nuvhubs = uv_num_possible_blades(); | 1817 | nuvhubs = uv_num_possible_blades(); |
1670 | spin_lock_init(&disable_lock); | 1818 | spin_lock_init(&disable_lock); |
1671 | congested_cycles = microsec_2_cycles(congested_response_us); | 1819 | congested_cycles = usec_2_cycles(congested_respns_us); |
1672 | 1820 | ||
1673 | uv_partition_base_pnode = 0x7fffffff; | 1821 | uv_base_pnode = 0x7fffffff; |
1674 | for (uvhub = 0; uvhub < nuvhubs; uvhub++) { | 1822 | for (uvhub = 0; uvhub < nuvhubs; uvhub++) { |
1675 | if (uv_blade_nr_possible_cpus(uvhub) && | 1823 | cpus = uv_blade_nr_possible_cpus(uvhub); |
1676 | (uv_blade_to_pnode(uvhub) < uv_partition_base_pnode)) | 1824 | if (cpus && (uv_blade_to_pnode(uvhub) < uv_base_pnode)) |
1677 | uv_partition_base_pnode = uv_blade_to_pnode(uvhub); | 1825 | uv_base_pnode = uv_blade_to_pnode(uvhub); |
1678 | } | 1826 | } |
1679 | 1827 | ||
1680 | if (uv_init_per_cpu(nuvhubs, uv_partition_base_pnode)) { | 1828 | if (init_per_cpu(nuvhubs, uv_base_pnode)) { |
1681 | nobau = 1; | 1829 | nobau = 1; |
1682 | return 0; | 1830 | return 0; |
1683 | } | 1831 | } |
@@ -1685,21 +1833,21 @@ static int __init uv_bau_init(void) | |||
1685 | vector = UV_BAU_MESSAGE; | 1833 | vector = UV_BAU_MESSAGE; |
1686 | for_each_possible_blade(uvhub) | 1834 | for_each_possible_blade(uvhub) |
1687 | if (uv_blade_nr_possible_cpus(uvhub)) | 1835 | if (uv_blade_nr_possible_cpus(uvhub)) |
1688 | uv_init_uvhub(uvhub, vector, uv_partition_base_pnode); | 1836 | init_uvhub(uvhub, vector, uv_base_pnode); |
1689 | 1837 | ||
1690 | uv_enable_timeouts(); | 1838 | enable_timeouts(); |
1691 | alloc_intr_gate(vector, uv_bau_message_intr1); | 1839 | alloc_intr_gate(vector, uv_bau_message_intr1); |
1692 | 1840 | ||
1693 | for_each_possible_blade(uvhub) { | 1841 | for_each_possible_blade(uvhub) { |
1694 | if (uv_blade_nr_possible_cpus(uvhub)) { | 1842 | if (uv_blade_nr_possible_cpus(uvhub)) { |
1843 | unsigned long val; | ||
1844 | unsigned long mmr; | ||
1695 | pnode = uv_blade_to_pnode(uvhub); | 1845 | pnode = uv_blade_to_pnode(uvhub); |
1696 | /* INIT the bau */ | 1846 | /* INIT the bau */ |
1697 | uv_write_global_mmr64(pnode, | 1847 | val = 1L << 63; |
1698 | UVH_LB_BAU_SB_ACTIVATION_CONTROL, | 1848 | write_gmmr_activation(pnode, val); |
1699 | ((unsigned long)1 << 63)); | ||
1700 | mmr = 1; /* should be 1 to broadcast to both sockets */ | 1849 | mmr = 1; /* should be 1 to broadcast to both sockets */ |
1701 | uv_write_global_mmr64(pnode, UVH_BAU_DATA_BROADCAST, | 1850 | write_mmr_data_broadcast(pnode, mmr); |
1702 | mmr); | ||
1703 | } | 1851 | } |
1704 | } | 1852 | } |
1705 | 1853 | ||
diff --git a/arch/x86/platform/uv/uv_time.c b/arch/x86/platform/uv/uv_time.c index 0eb90184515f..9f29a01ee1b3 100644 --- a/arch/x86/platform/uv/uv_time.c +++ b/arch/x86/platform/uv/uv_time.c | |||
@@ -99,8 +99,12 @@ static void uv_rtc_send_IPI(int cpu) | |||
99 | /* Check for an RTC interrupt pending */ | 99 | /* Check for an RTC interrupt pending */ |
100 | static int uv_intr_pending(int pnode) | 100 | static int uv_intr_pending(int pnode) |
101 | { | 101 | { |
102 | return uv_read_global_mmr64(pnode, UVH_EVENT_OCCURRED0) & | 102 | if (is_uv1_hub()) |
103 | UVH_EVENT_OCCURRED0_RTC1_MASK; | 103 | return uv_read_global_mmr64(pnode, UVH_EVENT_OCCURRED0) & |
104 | UV1H_EVENT_OCCURRED0_RTC1_MASK; | ||
105 | else | ||
106 | return uv_read_global_mmr64(pnode, UV2H_EVENT_OCCURRED2) & | ||
107 | UV2H_EVENT_OCCURRED2_RTC_1_MASK; | ||
104 | } | 108 | } |
105 | 109 | ||
106 | /* Setup interrupt and return non-zero if early expiration occurred. */ | 110 | /* Setup interrupt and return non-zero if early expiration occurred. */ |
@@ -114,8 +118,12 @@ static int uv_setup_intr(int cpu, u64 expires) | |||
114 | UVH_RTC1_INT_CONFIG_M_MASK); | 118 | UVH_RTC1_INT_CONFIG_M_MASK); |
115 | uv_write_global_mmr64(pnode, UVH_INT_CMPB, -1L); | 119 | uv_write_global_mmr64(pnode, UVH_INT_CMPB, -1L); |
116 | 120 | ||
117 | uv_write_global_mmr64(pnode, UVH_EVENT_OCCURRED0_ALIAS, | 121 | if (is_uv1_hub()) |
118 | UVH_EVENT_OCCURRED0_RTC1_MASK); | 122 | uv_write_global_mmr64(pnode, UVH_EVENT_OCCURRED0_ALIAS, |
123 | UV1H_EVENT_OCCURRED0_RTC1_MASK); | ||
124 | else | ||
125 | uv_write_global_mmr64(pnode, UV2H_EVENT_OCCURRED2_ALIAS, | ||
126 | UV2H_EVENT_OCCURRED2_RTC_1_MASK); | ||
119 | 127 | ||
120 | val = (X86_PLATFORM_IPI_VECTOR << UVH_RTC1_INT_CONFIG_VECTOR_SHFT) | | 128 | val = (X86_PLATFORM_IPI_VECTOR << UVH_RTC1_INT_CONFIG_VECTOR_SHFT) | |
121 | ((u64)apicid << UVH_RTC1_INT_CONFIG_APIC_ID_SHFT); | 129 | ((u64)apicid << UVH_RTC1_INT_CONFIG_APIC_ID_SHFT); |
diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile index b6552b189bcd..bef0bc962400 100644 --- a/arch/x86/vdso/Makefile +++ b/arch/x86/vdso/Makefile | |||
@@ -11,7 +11,7 @@ vdso-install-$(VDSO32-y) += $(vdso32-images) | |||
11 | 11 | ||
12 | 12 | ||
13 | # files to link into the vdso | 13 | # files to link into the vdso |
14 | vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o vvar.o | 14 | vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o |
15 | 15 | ||
16 | # files to link into kernel | 16 | # files to link into kernel |
17 | obj-$(VDSO64-y) += vma.o vdso.o | 17 | obj-$(VDSO64-y) += vma.o vdso.o |
@@ -37,11 +37,24 @@ $(obj)/%.so: OBJCOPYFLAGS := -S | |||
37 | $(obj)/%.so: $(obj)/%.so.dbg FORCE | 37 | $(obj)/%.so: $(obj)/%.so.dbg FORCE |
38 | $(call if_changed,objcopy) | 38 | $(call if_changed,objcopy) |
39 | 39 | ||
40 | # | ||
41 | # Don't omit frame pointers for ease of userspace debugging, but do | ||
42 | # optimize sibling calls. | ||
43 | # | ||
40 | CFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \ | 44 | CFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \ |
41 | $(filter -g%,$(KBUILD_CFLAGS)) $(call cc-option, -fno-stack-protector) | 45 | $(filter -g%,$(KBUILD_CFLAGS)) $(call cc-option, -fno-stack-protector) \ |
46 | -fno-omit-frame-pointer -foptimize-sibling-calls | ||
42 | 47 | ||
43 | $(vobjs): KBUILD_CFLAGS += $(CFL) | 48 | $(vobjs): KBUILD_CFLAGS += $(CFL) |
44 | 49 | ||
50 | # | ||
51 | # vDSO code runs in userspace and -pg doesn't help with profiling anyway. | ||
52 | # | ||
53 | CFLAGS_REMOVE_vdso-note.o = -pg | ||
54 | CFLAGS_REMOVE_vclock_gettime.o = -pg | ||
55 | CFLAGS_REMOVE_vgetcpu.o = -pg | ||
56 | CFLAGS_REMOVE_vvar.o = -pg | ||
57 | |||
45 | targets += vdso-syms.lds | 58 | targets += vdso-syms.lds |
46 | obj-$(VDSO64-y) += vdso-syms.lds | 59 | obj-$(VDSO64-y) += vdso-syms.lds |
47 | 60 | ||
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c index ee55754cc3c5..a724905fdae7 100644 --- a/arch/x86/vdso/vclock_gettime.c +++ b/arch/x86/vdso/vclock_gettime.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Copyright 2006 Andi Kleen, SUSE Labs. | 2 | * Copyright 2006 Andi Kleen, SUSE Labs. |
3 | * Subject to the GNU Public License, v.2 | 3 | * Subject to the GNU Public License, v.2 |
4 | * | 4 | * |
5 | * Fast user context implementation of clock_gettime and gettimeofday. | 5 | * Fast user context implementation of clock_gettime, gettimeofday, and time. |
6 | * | 6 | * |
7 | * The code should have no internal unresolved relocations. | 7 | * The code should have no internal unresolved relocations. |
8 | * Check with readelf after changing. | 8 | * Check with readelf after changing. |
@@ -22,9 +22,8 @@ | |||
22 | #include <asm/hpet.h> | 22 | #include <asm/hpet.h> |
23 | #include <asm/unistd.h> | 23 | #include <asm/unistd.h> |
24 | #include <asm/io.h> | 24 | #include <asm/io.h> |
25 | #include "vextern.h" | ||
26 | 25 | ||
27 | #define gtod vdso_vsyscall_gtod_data | 26 | #define gtod (&VVAR(vsyscall_gtod_data)) |
28 | 27 | ||
29 | notrace static long vdso_fallback_gettime(long clock, struct timespec *ts) | 28 | notrace static long vdso_fallback_gettime(long clock, struct timespec *ts) |
30 | { | 29 | { |
@@ -56,22 +55,6 @@ notrace static noinline int do_realtime(struct timespec *ts) | |||
56 | return 0; | 55 | return 0; |
57 | } | 56 | } |
58 | 57 | ||
59 | /* Copy of the version in kernel/time.c which we cannot directly access */ | ||
60 | notrace static void | ||
61 | vset_normalized_timespec(struct timespec *ts, long sec, long nsec) | ||
62 | { | ||
63 | while (nsec >= NSEC_PER_SEC) { | ||
64 | nsec -= NSEC_PER_SEC; | ||
65 | ++sec; | ||
66 | } | ||
67 | while (nsec < 0) { | ||
68 | nsec += NSEC_PER_SEC; | ||
69 | --sec; | ||
70 | } | ||
71 | ts->tv_sec = sec; | ||
72 | ts->tv_nsec = nsec; | ||
73 | } | ||
74 | |||
75 | notrace static noinline int do_monotonic(struct timespec *ts) | 58 | notrace static noinline int do_monotonic(struct timespec *ts) |
76 | { | 59 | { |
77 | unsigned long seq, ns, secs; | 60 | unsigned long seq, ns, secs; |
@@ -82,7 +65,17 @@ notrace static noinline int do_monotonic(struct timespec *ts) | |||
82 | secs += gtod->wall_to_monotonic.tv_sec; | 65 | secs += gtod->wall_to_monotonic.tv_sec; |
83 | ns += gtod->wall_to_monotonic.tv_nsec; | 66 | ns += gtod->wall_to_monotonic.tv_nsec; |
84 | } while (unlikely(read_seqretry(>od->lock, seq))); | 67 | } while (unlikely(read_seqretry(>od->lock, seq))); |
85 | vset_normalized_timespec(ts, secs, ns); | 68 | |
69 | /* wall_time_nsec, vgetns(), and wall_to_monotonic.tv_nsec | ||
70 | * are all guaranteed to be nonnegative. | ||
71 | */ | ||
72 | while (ns >= NSEC_PER_SEC) { | ||
73 | ns -= NSEC_PER_SEC; | ||
74 | ++secs; | ||
75 | } | ||
76 | ts->tv_sec = secs; | ||
77 | ts->tv_nsec = ns; | ||
78 | |||
86 | return 0; | 79 | return 0; |
87 | } | 80 | } |
88 | 81 | ||
@@ -107,7 +100,17 @@ notrace static noinline int do_monotonic_coarse(struct timespec *ts) | |||
107 | secs += gtod->wall_to_monotonic.tv_sec; | 100 | secs += gtod->wall_to_monotonic.tv_sec; |
108 | ns += gtod->wall_to_monotonic.tv_nsec; | 101 | ns += gtod->wall_to_monotonic.tv_nsec; |
109 | } while (unlikely(read_seqretry(>od->lock, seq))); | 102 | } while (unlikely(read_seqretry(>od->lock, seq))); |
110 | vset_normalized_timespec(ts, secs, ns); | 103 | |
104 | /* wall_time_nsec and wall_to_monotonic.tv_nsec are | ||
105 | * guaranteed to be between 0 and NSEC_PER_SEC. | ||
106 | */ | ||
107 | if (ns >= NSEC_PER_SEC) { | ||
108 | ns -= NSEC_PER_SEC; | ||
109 | ++secs; | ||
110 | } | ||
111 | ts->tv_sec = secs; | ||
112 | ts->tv_nsec = ns; | ||
113 | |||
111 | return 0; | 114 | return 0; |
112 | } | 115 | } |
113 | 116 | ||
@@ -157,3 +160,32 @@ notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) | |||
157 | } | 160 | } |
158 | int gettimeofday(struct timeval *, struct timezone *) | 161 | int gettimeofday(struct timeval *, struct timezone *) |
159 | __attribute__((weak, alias("__vdso_gettimeofday"))); | 162 | __attribute__((weak, alias("__vdso_gettimeofday"))); |
163 | |||
164 | /* This will break when the xtime seconds get inaccurate, but that is | ||
165 | * unlikely */ | ||
166 | |||
167 | static __always_inline long time_syscall(long *t) | ||
168 | { | ||
169 | long secs; | ||
170 | asm volatile("syscall" | ||
171 | : "=a" (secs) | ||
172 | : "0" (__NR_time), "D" (t) : "cc", "r11", "cx", "memory"); | ||
173 | return secs; | ||
174 | } | ||
175 | |||
176 | notrace time_t __vdso_time(time_t *t) | ||
177 | { | ||
178 | time_t result; | ||
179 | |||
180 | if (unlikely(!VVAR(vsyscall_gtod_data).sysctl_enabled)) | ||
181 | return time_syscall(t); | ||
182 | |||
183 | /* This is atomic on x86_64 so we don't need any locks. */ | ||
184 | result = ACCESS_ONCE(VVAR(vsyscall_gtod_data).wall_time_sec); | ||
185 | |||
186 | if (t) | ||
187 | *t = result; | ||
188 | return result; | ||
189 | } | ||
190 | int time(time_t *t) | ||
191 | __attribute__((weak, alias("__vdso_time"))); | ||
diff --git a/arch/x86/vdso/vdso.lds.S b/arch/x86/vdso/vdso.lds.S index 4e5dd3b4de7f..b96b2677cad8 100644 --- a/arch/x86/vdso/vdso.lds.S +++ b/arch/x86/vdso/vdso.lds.S | |||
@@ -23,15 +23,10 @@ VERSION { | |||
23 | __vdso_gettimeofday; | 23 | __vdso_gettimeofday; |
24 | getcpu; | 24 | getcpu; |
25 | __vdso_getcpu; | 25 | __vdso_getcpu; |
26 | time; | ||
27 | __vdso_time; | ||
26 | local: *; | 28 | local: *; |
27 | }; | 29 | }; |
28 | } | 30 | } |
29 | 31 | ||
30 | VDSO64_PRELINK = VDSO_PRELINK; | 32 | VDSO64_PRELINK = VDSO_PRELINK; |
31 | |||
32 | /* | ||
33 | * Define VDSO64_x for each VEXTERN(x), for use via VDSO64_SYMBOL. | ||
34 | */ | ||
35 | #define VEXTERN(x) VDSO64_ ## x = vdso_ ## x; | ||
36 | #include "vextern.h" | ||
37 | #undef VEXTERN | ||
diff --git a/arch/x86/vdso/vextern.h b/arch/x86/vdso/vextern.h deleted file mode 100644 index 1683ba2ae3e8..000000000000 --- a/arch/x86/vdso/vextern.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | #ifndef VEXTERN | ||
2 | #include <asm/vsyscall.h> | ||
3 | #define VEXTERN(x) \ | ||
4 | extern typeof(x) *vdso_ ## x __attribute__((visibility("hidden"))); | ||
5 | #endif | ||
6 | |||
7 | #define VMAGIC 0xfeedbabeabcdefabUL | ||
8 | |||
9 | /* Any kernel variables used in the vDSO must be exported in the main | ||
10 | kernel's vmlinux.lds.S/vsyscall.h/proper __section and | ||
11 | put into vextern.h and be referenced as a pointer with vdso prefix. | ||
12 | The main kernel later fills in the values. */ | ||
13 | |||
14 | VEXTERN(jiffies) | ||
15 | VEXTERN(vgetcpu_mode) | ||
16 | VEXTERN(vsyscall_gtod_data) | ||
diff --git a/arch/x86/vdso/vgetcpu.c b/arch/x86/vdso/vgetcpu.c index 9fbc6b20026b..5463ad558573 100644 --- a/arch/x86/vdso/vgetcpu.c +++ b/arch/x86/vdso/vgetcpu.c | |||
@@ -11,14 +11,13 @@ | |||
11 | #include <linux/time.h> | 11 | #include <linux/time.h> |
12 | #include <asm/vsyscall.h> | 12 | #include <asm/vsyscall.h> |
13 | #include <asm/vgtod.h> | 13 | #include <asm/vgtod.h> |
14 | #include "vextern.h" | ||
15 | 14 | ||
16 | notrace long | 15 | notrace long |
17 | __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused) | 16 | __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused) |
18 | { | 17 | { |
19 | unsigned int p; | 18 | unsigned int p; |
20 | 19 | ||
21 | if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) { | 20 | if (VVAR(vgetcpu_mode) == VGETCPU_RDTSCP) { |
22 | /* Load per CPU data from RDTSCP */ | 21 | /* Load per CPU data from RDTSCP */ |
23 | native_read_tscp(&p); | 22 | native_read_tscp(&p); |
24 | } else { | 23 | } else { |
diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c index 4b5d26f108bb..7abd2be0f9b9 100644 --- a/arch/x86/vdso/vma.c +++ b/arch/x86/vdso/vma.c | |||
@@ -15,9 +15,6 @@ | |||
15 | #include <asm/proto.h> | 15 | #include <asm/proto.h> |
16 | #include <asm/vdso.h> | 16 | #include <asm/vdso.h> |
17 | 17 | ||
18 | #include "vextern.h" /* Just for VMAGIC. */ | ||
19 | #undef VEXTERN | ||
20 | |||
21 | unsigned int __read_mostly vdso_enabled = 1; | 18 | unsigned int __read_mostly vdso_enabled = 1; |
22 | 19 | ||
23 | extern char vdso_start[], vdso_end[]; | 20 | extern char vdso_start[], vdso_end[]; |
@@ -26,20 +23,10 @@ extern unsigned short vdso_sync_cpuid; | |||
26 | static struct page **vdso_pages; | 23 | static struct page **vdso_pages; |
27 | static unsigned vdso_size; | 24 | static unsigned vdso_size; |
28 | 25 | ||
29 | static inline void *var_ref(void *p, char *name) | ||
30 | { | ||
31 | if (*(void **)p != (void *)VMAGIC) { | ||
32 | printk("VDSO: variable %s broken\n", name); | ||
33 | vdso_enabled = 0; | ||
34 | } | ||
35 | return p; | ||
36 | } | ||
37 | |||
38 | static int __init init_vdso_vars(void) | 26 | static int __init init_vdso_vars(void) |
39 | { | 27 | { |
40 | int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; | 28 | int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; |
41 | int i; | 29 | int i; |
42 | char *vbase; | ||
43 | 30 | ||
44 | vdso_size = npages << PAGE_SHIFT; | 31 | vdso_size = npages << PAGE_SHIFT; |
45 | vdso_pages = kmalloc(sizeof(struct page *) * npages, GFP_KERNEL); | 32 | vdso_pages = kmalloc(sizeof(struct page *) * npages, GFP_KERNEL); |
@@ -54,20 +41,6 @@ static int __init init_vdso_vars(void) | |||
54 | copy_page(page_address(p), vdso_start + i*PAGE_SIZE); | 41 | copy_page(page_address(p), vdso_start + i*PAGE_SIZE); |
55 | } | 42 | } |
56 | 43 | ||
57 | vbase = vmap(vdso_pages, npages, 0, PAGE_KERNEL); | ||
58 | if (!vbase) | ||
59 | goto oom; | ||
60 | |||
61 | if (memcmp(vbase, "\177ELF", 4)) { | ||
62 | printk("VDSO: I'm broken; not ELF\n"); | ||
63 | vdso_enabled = 0; | ||
64 | } | ||
65 | |||
66 | #define VEXTERN(x) \ | ||
67 | *(typeof(__ ## x) **) var_ref(VDSO64_SYMBOL(vbase, x), #x) = &__ ## x; | ||
68 | #include "vextern.h" | ||
69 | #undef VEXTERN | ||
70 | vunmap(vbase); | ||
71 | return 0; | 44 | return 0; |
72 | 45 | ||
73 | oom: | 46 | oom: |
diff --git a/arch/x86/vdso/vvar.c b/arch/x86/vdso/vvar.c deleted file mode 100644 index 1b7e703684f9..000000000000 --- a/arch/x86/vdso/vvar.c +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | /* Define pointer to external vDSO variables. | ||
2 | These are part of the vDSO. The kernel fills in the real addresses | ||
3 | at boot time. This is done because when the vdso is linked the | ||
4 | kernel isn't yet and we don't know the final addresses. */ | ||
5 | #include <linux/kernel.h> | ||
6 | #include <linux/time.h> | ||
7 | #include <asm/vsyscall.h> | ||
8 | #include <asm/timex.h> | ||
9 | #include <asm/vgtod.h> | ||
10 | |||
11 | #define VEXTERN(x) typeof (__ ## x) *const vdso_ ## x = (void *)VMAGIC; | ||
12 | #include "vextern.h" | ||
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 02d752460371..dc708dcc62f1 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -75,67 +75,12 @@ | |||
75 | #include "mmu.h" | 75 | #include "mmu.h" |
76 | #include "debugfs.h" | 76 | #include "debugfs.h" |
77 | 77 | ||
78 | #define MMU_UPDATE_HISTO 30 | ||
79 | |||
80 | /* | 78 | /* |
81 | * Protects atomic reservation decrease/increase against concurrent increases. | 79 | * Protects atomic reservation decrease/increase against concurrent increases. |
82 | * Also protects non-atomic updates of current_pages and balloon lists. | 80 | * Also protects non-atomic updates of current_pages and balloon lists. |
83 | */ | 81 | */ |
84 | DEFINE_SPINLOCK(xen_reservation_lock); | 82 | DEFINE_SPINLOCK(xen_reservation_lock); |
85 | 83 | ||
86 | #ifdef CONFIG_XEN_DEBUG_FS | ||
87 | |||
88 | static struct { | ||
89 | u32 pgd_update; | ||
90 | u32 pgd_update_pinned; | ||
91 | u32 pgd_update_batched; | ||
92 | |||
93 | u32 pud_update; | ||
94 | u32 pud_update_pinned; | ||
95 | u32 pud_update_batched; | ||
96 | |||
97 | u32 pmd_update; | ||
98 | u32 pmd_update_pinned; | ||
99 | u32 pmd_update_batched; | ||
100 | |||
101 | u32 pte_update; | ||
102 | u32 pte_update_pinned; | ||
103 | u32 pte_update_batched; | ||
104 | |||
105 | u32 mmu_update; | ||
106 | u32 mmu_update_extended; | ||
107 | u32 mmu_update_histo[MMU_UPDATE_HISTO]; | ||
108 | |||
109 | u32 prot_commit; | ||
110 | u32 prot_commit_batched; | ||
111 | |||
112 | u32 set_pte_at; | ||
113 | u32 set_pte_at_batched; | ||
114 | u32 set_pte_at_pinned; | ||
115 | u32 set_pte_at_current; | ||
116 | u32 set_pte_at_kernel; | ||
117 | } mmu_stats; | ||
118 | |||
119 | static u8 zero_stats; | ||
120 | |||
121 | static inline void check_zero(void) | ||
122 | { | ||
123 | if (unlikely(zero_stats)) { | ||
124 | memset(&mmu_stats, 0, sizeof(mmu_stats)); | ||
125 | zero_stats = 0; | ||
126 | } | ||
127 | } | ||
128 | |||
129 | #define ADD_STATS(elem, val) \ | ||
130 | do { check_zero(); mmu_stats.elem += (val); } while(0) | ||
131 | |||
132 | #else /* !CONFIG_XEN_DEBUG_FS */ | ||
133 | |||
134 | #define ADD_STATS(elem, val) do { (void)(val); } while(0) | ||
135 | |||
136 | #endif /* CONFIG_XEN_DEBUG_FS */ | ||
137 | |||
138 | |||
139 | /* | 84 | /* |
140 | * Identity map, in addition to plain kernel map. This needs to be | 85 | * Identity map, in addition to plain kernel map. This needs to be |
141 | * large enough to allocate page table pages to allocate the rest. | 86 | * large enough to allocate page table pages to allocate the rest. |
@@ -243,11 +188,6 @@ static bool xen_page_pinned(void *ptr) | |||
243 | return PagePinned(page); | 188 | return PagePinned(page); |
244 | } | 189 | } |
245 | 190 | ||
246 | static bool xen_iomap_pte(pte_t pte) | ||
247 | { | ||
248 | return pte_flags(pte) & _PAGE_IOMAP; | ||
249 | } | ||
250 | |||
251 | void xen_set_domain_pte(pte_t *ptep, pte_t pteval, unsigned domid) | 191 | void xen_set_domain_pte(pte_t *ptep, pte_t pteval, unsigned domid) |
252 | { | 192 | { |
253 | struct multicall_space mcs; | 193 | struct multicall_space mcs; |
@@ -257,7 +197,7 @@ void xen_set_domain_pte(pte_t *ptep, pte_t pteval, unsigned domid) | |||
257 | u = mcs.args; | 197 | u = mcs.args; |
258 | 198 | ||
259 | /* ptep might be kmapped when using 32-bit HIGHPTE */ | 199 | /* ptep might be kmapped when using 32-bit HIGHPTE */ |
260 | u->ptr = arbitrary_virt_to_machine(ptep).maddr; | 200 | u->ptr = virt_to_machine(ptep).maddr; |
261 | u->val = pte_val_ma(pteval); | 201 | u->val = pte_val_ma(pteval); |
262 | 202 | ||
263 | MULTI_mmu_update(mcs.mc, mcs.args, 1, NULL, domid); | 203 | MULTI_mmu_update(mcs.mc, mcs.args, 1, NULL, domid); |
@@ -266,11 +206,6 @@ void xen_set_domain_pte(pte_t *ptep, pte_t pteval, unsigned domid) | |||
266 | } | 206 | } |
267 | EXPORT_SYMBOL_GPL(xen_set_domain_pte); | 207 | EXPORT_SYMBOL_GPL(xen_set_domain_pte); |
268 | 208 | ||
269 | static void xen_set_iomap_pte(pte_t *ptep, pte_t pteval) | ||
270 | { | ||
271 | xen_set_domain_pte(ptep, pteval, DOMID_IO); | ||
272 | } | ||
273 | |||
274 | static void xen_extend_mmu_update(const struct mmu_update *update) | 209 | static void xen_extend_mmu_update(const struct mmu_update *update) |
275 | { | 210 | { |
276 | struct multicall_space mcs; | 211 | struct multicall_space mcs; |
@@ -279,27 +214,17 @@ static void xen_extend_mmu_update(const struct mmu_update *update) | |||
279 | mcs = xen_mc_extend_args(__HYPERVISOR_mmu_update, sizeof(*u)); | 214 | mcs = xen_mc_extend_args(__HYPERVISOR_mmu_update, sizeof(*u)); |
280 | 215 | ||
281 | if (mcs.mc != NULL) { | 216 | if (mcs.mc != NULL) { |
282 | ADD_STATS(mmu_update_extended, 1); | ||
283 | ADD_STATS(mmu_update_histo[mcs.mc->args[1]], -1); | ||
284 | |||
285 | mcs.mc->args[1]++; | 217 | mcs.mc->args[1]++; |
286 | |||
287 | if (mcs.mc->args[1] < MMU_UPDATE_HISTO) | ||
288 | ADD_STATS(mmu_update_histo[mcs.mc->args[1]], 1); | ||
289 | else | ||
290 | ADD_STATS(mmu_update_histo[0], 1); | ||
291 | } else { | 218 | } else { |
292 | ADD_STATS(mmu_update, 1); | ||
293 | mcs = __xen_mc_entry(sizeof(*u)); | 219 | mcs = __xen_mc_entry(sizeof(*u)); |
294 | MULTI_mmu_update(mcs.mc, mcs.args, 1, NULL, DOMID_SELF); | 220 | MULTI_mmu_update(mcs.mc, mcs.args, 1, NULL, DOMID_SELF); |
295 | ADD_STATS(mmu_update_histo[1], 1); | ||
296 | } | 221 | } |
297 | 222 | ||
298 | u = mcs.args; | 223 | u = mcs.args; |
299 | *u = *update; | 224 | *u = *update; |
300 | } | 225 | } |
301 | 226 | ||
302 | void xen_set_pmd_hyper(pmd_t *ptr, pmd_t val) | 227 | static void xen_set_pmd_hyper(pmd_t *ptr, pmd_t val) |
303 | { | 228 | { |
304 | struct mmu_update u; | 229 | struct mmu_update u; |
305 | 230 | ||
@@ -312,17 +237,13 @@ void xen_set_pmd_hyper(pmd_t *ptr, pmd_t val) | |||
312 | u.val = pmd_val_ma(val); | 237 | u.val = pmd_val_ma(val); |
313 | xen_extend_mmu_update(&u); | 238 | xen_extend_mmu_update(&u); |
314 | 239 | ||
315 | ADD_STATS(pmd_update_batched, paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU); | ||
316 | |||
317 | xen_mc_issue(PARAVIRT_LAZY_MMU); | 240 | xen_mc_issue(PARAVIRT_LAZY_MMU); |
318 | 241 | ||
319 | preempt_enable(); | 242 | preempt_enable(); |
320 | } | 243 | } |
321 | 244 | ||
322 | void xen_set_pmd(pmd_t *ptr, pmd_t val) | 245 | static void xen_set_pmd(pmd_t *ptr, pmd_t val) |
323 | { | 246 | { |
324 | ADD_STATS(pmd_update, 1); | ||
325 | |||
326 | /* If page is not pinned, we can just update the entry | 247 | /* If page is not pinned, we can just update the entry |
327 | directly */ | 248 | directly */ |
328 | if (!xen_page_pinned(ptr)) { | 249 | if (!xen_page_pinned(ptr)) { |
@@ -330,8 +251,6 @@ void xen_set_pmd(pmd_t *ptr, pmd_t val) | |||
330 | return; | 251 | return; |
331 | } | 252 | } |
332 | 253 | ||
333 | ADD_STATS(pmd_update_pinned, 1); | ||
334 | |||
335 | xen_set_pmd_hyper(ptr, val); | 254 | xen_set_pmd_hyper(ptr, val); |
336 | } | 255 | } |
337 | 256 | ||
@@ -344,35 +263,34 @@ void set_pte_mfn(unsigned long vaddr, unsigned long mfn, pgprot_t flags) | |||
344 | set_pte_vaddr(vaddr, mfn_pte(mfn, flags)); | 263 | set_pte_vaddr(vaddr, mfn_pte(mfn, flags)); |
345 | } | 264 | } |
346 | 265 | ||
347 | void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, | 266 | static bool xen_batched_set_pte(pte_t *ptep, pte_t pteval) |
348 | pte_t *ptep, pte_t pteval) | ||
349 | { | 267 | { |
350 | if (xen_iomap_pte(pteval)) { | 268 | struct mmu_update u; |
351 | xen_set_iomap_pte(ptep, pteval); | ||
352 | goto out; | ||
353 | } | ||
354 | 269 | ||
355 | ADD_STATS(set_pte_at, 1); | 270 | if (paravirt_get_lazy_mode() != PARAVIRT_LAZY_MMU) |
356 | // ADD_STATS(set_pte_at_pinned, xen_page_pinned(ptep)); | 271 | return false; |
357 | ADD_STATS(set_pte_at_current, mm == current->mm); | ||
358 | ADD_STATS(set_pte_at_kernel, mm == &init_mm); | ||
359 | 272 | ||
360 | if (mm == current->mm || mm == &init_mm) { | 273 | xen_mc_batch(); |
361 | if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) { | ||
362 | struct multicall_space mcs; | ||
363 | mcs = xen_mc_entry(0); | ||
364 | 274 | ||
365 | MULTI_update_va_mapping(mcs.mc, addr, pteval, 0); | 275 | u.ptr = virt_to_machine(ptep).maddr | MMU_NORMAL_PT_UPDATE; |
366 | ADD_STATS(set_pte_at_batched, 1); | 276 | u.val = pte_val_ma(pteval); |
367 | xen_mc_issue(PARAVIRT_LAZY_MMU); | 277 | xen_extend_mmu_update(&u); |
368 | goto out; | 278 | |
369 | } else | 279 | xen_mc_issue(PARAVIRT_LAZY_MMU); |
370 | if (HYPERVISOR_update_va_mapping(addr, pteval, 0) == 0) | ||
371 | goto out; | ||
372 | } | ||
373 | xen_set_pte(ptep, pteval); | ||
374 | 280 | ||
375 | out: return; | 281 | return true; |
282 | } | ||
283 | |||
284 | static void xen_set_pte(pte_t *ptep, pte_t pteval) | ||
285 | { | ||
286 | if (!xen_batched_set_pte(ptep, pteval)) | ||
287 | native_set_pte(ptep, pteval); | ||
288 | } | ||
289 | |||
290 | static void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, | ||
291 | pte_t *ptep, pte_t pteval) | ||
292 | { | ||
293 | xen_set_pte(ptep, pteval); | ||
376 | } | 294 | } |
377 | 295 | ||
378 | pte_t xen_ptep_modify_prot_start(struct mm_struct *mm, | 296 | pte_t xen_ptep_modify_prot_start(struct mm_struct *mm, |
@@ -389,13 +307,10 @@ void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, | |||
389 | 307 | ||
390 | xen_mc_batch(); | 308 | xen_mc_batch(); |
391 | 309 | ||
392 | u.ptr = arbitrary_virt_to_machine(ptep).maddr | MMU_PT_UPDATE_PRESERVE_AD; | 310 | u.ptr = virt_to_machine(ptep).maddr | MMU_PT_UPDATE_PRESERVE_AD; |
393 | u.val = pte_val_ma(pte); | 311 | u.val = pte_val_ma(pte); |
394 | xen_extend_mmu_update(&u); | 312 | xen_extend_mmu_update(&u); |
395 | 313 | ||
396 | ADD_STATS(prot_commit, 1); | ||
397 | ADD_STATS(prot_commit_batched, paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU); | ||
398 | |||
399 | xen_mc_issue(PARAVIRT_LAZY_MMU); | 314 | xen_mc_issue(PARAVIRT_LAZY_MMU); |
400 | } | 315 | } |
401 | 316 | ||
@@ -463,7 +378,7 @@ static pteval_t iomap_pte(pteval_t val) | |||
463 | return val; | 378 | return val; |
464 | } | 379 | } |
465 | 380 | ||
466 | pteval_t xen_pte_val(pte_t pte) | 381 | static pteval_t xen_pte_val(pte_t pte) |
467 | { | 382 | { |
468 | pteval_t pteval = pte.pte; | 383 | pteval_t pteval = pte.pte; |
469 | 384 | ||
@@ -480,7 +395,7 @@ pteval_t xen_pte_val(pte_t pte) | |||
480 | } | 395 | } |
481 | PV_CALLEE_SAVE_REGS_THUNK(xen_pte_val); | 396 | PV_CALLEE_SAVE_REGS_THUNK(xen_pte_val); |
482 | 397 | ||
483 | pgdval_t xen_pgd_val(pgd_t pgd) | 398 | static pgdval_t xen_pgd_val(pgd_t pgd) |
484 | { | 399 | { |
485 | return pte_mfn_to_pfn(pgd.pgd); | 400 | return pte_mfn_to_pfn(pgd.pgd); |
486 | } | 401 | } |
@@ -511,7 +426,7 @@ void xen_set_pat(u64 pat) | |||
511 | WARN_ON(pat != 0x0007010600070106ull); | 426 | WARN_ON(pat != 0x0007010600070106ull); |
512 | } | 427 | } |
513 | 428 | ||
514 | pte_t xen_make_pte(pteval_t pte) | 429 | static pte_t xen_make_pte(pteval_t pte) |
515 | { | 430 | { |
516 | phys_addr_t addr = (pte & PTE_PFN_MASK); | 431 | phys_addr_t addr = (pte & PTE_PFN_MASK); |
517 | 432 | ||
@@ -581,20 +496,20 @@ pte_t xen_make_pte_debug(pteval_t pte) | |||
581 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pte_debug); | 496 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pte_debug); |
582 | #endif | 497 | #endif |
583 | 498 | ||
584 | pgd_t xen_make_pgd(pgdval_t pgd) | 499 | static pgd_t xen_make_pgd(pgdval_t pgd) |
585 | { | 500 | { |
586 | pgd = pte_pfn_to_mfn(pgd); | 501 | pgd = pte_pfn_to_mfn(pgd); |
587 | return native_make_pgd(pgd); | 502 | return native_make_pgd(pgd); |
588 | } | 503 | } |
589 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pgd); | 504 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pgd); |
590 | 505 | ||
591 | pmdval_t xen_pmd_val(pmd_t pmd) | 506 | static pmdval_t xen_pmd_val(pmd_t pmd) |
592 | { | 507 | { |
593 | return pte_mfn_to_pfn(pmd.pmd); | 508 | return pte_mfn_to_pfn(pmd.pmd); |
594 | } | 509 | } |
595 | PV_CALLEE_SAVE_REGS_THUNK(xen_pmd_val); | 510 | PV_CALLEE_SAVE_REGS_THUNK(xen_pmd_val); |
596 | 511 | ||
597 | void xen_set_pud_hyper(pud_t *ptr, pud_t val) | 512 | static void xen_set_pud_hyper(pud_t *ptr, pud_t val) |
598 | { | 513 | { |
599 | struct mmu_update u; | 514 | struct mmu_update u; |
600 | 515 | ||
@@ -607,17 +522,13 @@ void xen_set_pud_hyper(pud_t *ptr, pud_t val) | |||
607 | u.val = pud_val_ma(val); | 522 | u.val = pud_val_ma(val); |
608 | xen_extend_mmu_update(&u); | 523 | xen_extend_mmu_update(&u); |
609 | 524 | ||
610 | ADD_STATS(pud_update_batched, paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU); | ||
611 | |||
612 | xen_mc_issue(PARAVIRT_LAZY_MMU); | 525 | xen_mc_issue(PARAVIRT_LAZY_MMU); |
613 | 526 | ||
614 | preempt_enable(); | 527 | preempt_enable(); |
615 | } | 528 | } |
616 | 529 | ||
617 | void xen_set_pud(pud_t *ptr, pud_t val) | 530 | static void xen_set_pud(pud_t *ptr, pud_t val) |
618 | { | 531 | { |
619 | ADD_STATS(pud_update, 1); | ||
620 | |||
621 | /* If page is not pinned, we can just update the entry | 532 | /* If page is not pinned, we can just update the entry |
622 | directly */ | 533 | directly */ |
623 | if (!xen_page_pinned(ptr)) { | 534 | if (!xen_page_pinned(ptr)) { |
@@ -625,56 +536,28 @@ void xen_set_pud(pud_t *ptr, pud_t val) | |||
625 | return; | 536 | return; |
626 | } | 537 | } |
627 | 538 | ||
628 | ADD_STATS(pud_update_pinned, 1); | ||
629 | |||
630 | xen_set_pud_hyper(ptr, val); | 539 | xen_set_pud_hyper(ptr, val); |
631 | } | 540 | } |
632 | 541 | ||
633 | void xen_set_pte(pte_t *ptep, pte_t pte) | ||
634 | { | ||
635 | if (xen_iomap_pte(pte)) { | ||
636 | xen_set_iomap_pte(ptep, pte); | ||
637 | return; | ||
638 | } | ||
639 | |||
640 | ADD_STATS(pte_update, 1); | ||
641 | // ADD_STATS(pte_update_pinned, xen_page_pinned(ptep)); | ||
642 | ADD_STATS(pte_update_batched, paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU); | ||
643 | |||
644 | #ifdef CONFIG_X86_PAE | 542 | #ifdef CONFIG_X86_PAE |
645 | ptep->pte_high = pte.pte_high; | 543 | static void xen_set_pte_atomic(pte_t *ptep, pte_t pte) |
646 | smp_wmb(); | ||
647 | ptep->pte_low = pte.pte_low; | ||
648 | #else | ||
649 | *ptep = pte; | ||
650 | #endif | ||
651 | } | ||
652 | |||
653 | #ifdef CONFIG_X86_PAE | ||
654 | void xen_set_pte_atomic(pte_t *ptep, pte_t pte) | ||
655 | { | 544 | { |
656 | if (xen_iomap_pte(pte)) { | ||
657 | xen_set_iomap_pte(ptep, pte); | ||
658 | return; | ||
659 | } | ||
660 | |||
661 | set_64bit((u64 *)ptep, native_pte_val(pte)); | 545 | set_64bit((u64 *)ptep, native_pte_val(pte)); |
662 | } | 546 | } |
663 | 547 | ||
664 | void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 548 | static void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
665 | { | 549 | { |
666 | ptep->pte_low = 0; | 550 | if (!xen_batched_set_pte(ptep, native_make_pte(0))) |
667 | smp_wmb(); /* make sure low gets written first */ | 551 | native_pte_clear(mm, addr, ptep); |
668 | ptep->pte_high = 0; | ||
669 | } | 552 | } |
670 | 553 | ||
671 | void xen_pmd_clear(pmd_t *pmdp) | 554 | static void xen_pmd_clear(pmd_t *pmdp) |
672 | { | 555 | { |
673 | set_pmd(pmdp, __pmd(0)); | 556 | set_pmd(pmdp, __pmd(0)); |
674 | } | 557 | } |
675 | #endif /* CONFIG_X86_PAE */ | 558 | #endif /* CONFIG_X86_PAE */ |
676 | 559 | ||
677 | pmd_t xen_make_pmd(pmdval_t pmd) | 560 | static pmd_t xen_make_pmd(pmdval_t pmd) |
678 | { | 561 | { |
679 | pmd = pte_pfn_to_mfn(pmd); | 562 | pmd = pte_pfn_to_mfn(pmd); |
680 | return native_make_pmd(pmd); | 563 | return native_make_pmd(pmd); |
@@ -682,13 +565,13 @@ pmd_t xen_make_pmd(pmdval_t pmd) | |||
682 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pmd); | 565 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pmd); |
683 | 566 | ||
684 | #if PAGETABLE_LEVELS == 4 | 567 | #if PAGETABLE_LEVELS == 4 |
685 | pudval_t xen_pud_val(pud_t pud) | 568 | static pudval_t xen_pud_val(pud_t pud) |
686 | { | 569 | { |
687 | return pte_mfn_to_pfn(pud.pud); | 570 | return pte_mfn_to_pfn(pud.pud); |
688 | } | 571 | } |
689 | PV_CALLEE_SAVE_REGS_THUNK(xen_pud_val); | 572 | PV_CALLEE_SAVE_REGS_THUNK(xen_pud_val); |
690 | 573 | ||
691 | pud_t xen_make_pud(pudval_t pud) | 574 | static pud_t xen_make_pud(pudval_t pud) |
692 | { | 575 | { |
693 | pud = pte_pfn_to_mfn(pud); | 576 | pud = pte_pfn_to_mfn(pud); |
694 | 577 | ||
@@ -696,7 +579,7 @@ pud_t xen_make_pud(pudval_t pud) | |||
696 | } | 579 | } |
697 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pud); | 580 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pud); |
698 | 581 | ||
699 | pgd_t *xen_get_user_pgd(pgd_t *pgd) | 582 | static pgd_t *xen_get_user_pgd(pgd_t *pgd) |
700 | { | 583 | { |
701 | pgd_t *pgd_page = (pgd_t *)(((unsigned long)pgd) & PAGE_MASK); | 584 | pgd_t *pgd_page = (pgd_t *)(((unsigned long)pgd) & PAGE_MASK); |
702 | unsigned offset = pgd - pgd_page; | 585 | unsigned offset = pgd - pgd_page; |
@@ -728,7 +611,7 @@ static void __xen_set_pgd_hyper(pgd_t *ptr, pgd_t val) | |||
728 | * 2. It is always pinned | 611 | * 2. It is always pinned |
729 | * 3. It has no user pagetable attached to it | 612 | * 3. It has no user pagetable attached to it |
730 | */ | 613 | */ |
731 | void __init xen_set_pgd_hyper(pgd_t *ptr, pgd_t val) | 614 | static void __init xen_set_pgd_hyper(pgd_t *ptr, pgd_t val) |
732 | { | 615 | { |
733 | preempt_disable(); | 616 | preempt_disable(); |
734 | 617 | ||
@@ -741,12 +624,10 @@ void __init xen_set_pgd_hyper(pgd_t *ptr, pgd_t val) | |||
741 | preempt_enable(); | 624 | preempt_enable(); |
742 | } | 625 | } |
743 | 626 | ||
744 | void xen_set_pgd(pgd_t *ptr, pgd_t val) | 627 | static void xen_set_pgd(pgd_t *ptr, pgd_t val) |
745 | { | 628 | { |
746 | pgd_t *user_ptr = xen_get_user_pgd(ptr); | 629 | pgd_t *user_ptr = xen_get_user_pgd(ptr); |
747 | 630 | ||
748 | ADD_STATS(pgd_update, 1); | ||
749 | |||
750 | /* If page is not pinned, we can just update the entry | 631 | /* If page is not pinned, we can just update the entry |
751 | directly */ | 632 | directly */ |
752 | if (!xen_page_pinned(ptr)) { | 633 | if (!xen_page_pinned(ptr)) { |
@@ -758,9 +639,6 @@ void xen_set_pgd(pgd_t *ptr, pgd_t val) | |||
758 | return; | 639 | return; |
759 | } | 640 | } |
760 | 641 | ||
761 | ADD_STATS(pgd_update_pinned, 1); | ||
762 | ADD_STATS(pgd_update_batched, paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU); | ||
763 | |||
764 | /* If it's pinned, then we can at least batch the kernel and | 642 | /* If it's pinned, then we can at least batch the kernel and |
765 | user updates together. */ | 643 | user updates together. */ |
766 | xen_mc_batch(); | 644 | xen_mc_batch(); |
@@ -1162,14 +1040,14 @@ void xen_mm_unpin_all(void) | |||
1162 | spin_unlock(&pgd_lock); | 1040 | spin_unlock(&pgd_lock); |
1163 | } | 1041 | } |
1164 | 1042 | ||
1165 | void xen_activate_mm(struct mm_struct *prev, struct mm_struct *next) | 1043 | static void xen_activate_mm(struct mm_struct *prev, struct mm_struct *next) |
1166 | { | 1044 | { |
1167 | spin_lock(&next->page_table_lock); | 1045 | spin_lock(&next->page_table_lock); |
1168 | xen_pgd_pin(next); | 1046 | xen_pgd_pin(next); |
1169 | spin_unlock(&next->page_table_lock); | 1047 | spin_unlock(&next->page_table_lock); |
1170 | } | 1048 | } |
1171 | 1049 | ||
1172 | void xen_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm) | 1050 | static void xen_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm) |
1173 | { | 1051 | { |
1174 | spin_lock(&mm->page_table_lock); | 1052 | spin_lock(&mm->page_table_lock); |
1175 | xen_pgd_pin(mm); | 1053 | xen_pgd_pin(mm); |
@@ -1256,7 +1134,7 @@ static void xen_drop_mm_ref(struct mm_struct *mm) | |||
1256 | * pagetable because of lazy tlb flushing. This means we need need to | 1134 | * pagetable because of lazy tlb flushing. This means we need need to |
1257 | * switch all CPUs off this pagetable before we can unpin it. | 1135 | * switch all CPUs off this pagetable before we can unpin it. |
1258 | */ | 1136 | */ |
1259 | void xen_exit_mmap(struct mm_struct *mm) | 1137 | static void xen_exit_mmap(struct mm_struct *mm) |
1260 | { | 1138 | { |
1261 | get_cpu(); /* make sure we don't move around */ | 1139 | get_cpu(); /* make sure we don't move around */ |
1262 | xen_drop_mm_ref(mm); | 1140 | xen_drop_mm_ref(mm); |
@@ -2371,7 +2249,7 @@ static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token, | |||
2371 | struct remap_data *rmd = data; | 2249 | struct remap_data *rmd = data; |
2372 | pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot)); | 2250 | pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot)); |
2373 | 2251 | ||
2374 | rmd->mmu_update->ptr = arbitrary_virt_to_machine(ptep).maddr; | 2252 | rmd->mmu_update->ptr = virt_to_machine(ptep).maddr; |
2375 | rmd->mmu_update->val = pte_val_ma(pte); | 2253 | rmd->mmu_update->val = pte_val_ma(pte); |
2376 | rmd->mmu_update++; | 2254 | rmd->mmu_update++; |
2377 | 2255 | ||
@@ -2425,7 +2303,6 @@ out: | |||
2425 | EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); | 2303 | EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); |
2426 | 2304 | ||
2427 | #ifdef CONFIG_XEN_DEBUG_FS | 2305 | #ifdef CONFIG_XEN_DEBUG_FS |
2428 | |||
2429 | static int p2m_dump_open(struct inode *inode, struct file *filp) | 2306 | static int p2m_dump_open(struct inode *inode, struct file *filp) |
2430 | { | 2307 | { |
2431 | return single_open(filp, p2m_dump_show, NULL); | 2308 | return single_open(filp, p2m_dump_show, NULL); |
@@ -2437,65 +2314,4 @@ static const struct file_operations p2m_dump_fops = { | |||
2437 | .llseek = seq_lseek, | 2314 | .llseek = seq_lseek, |
2438 | .release = single_release, | 2315 | .release = single_release, |
2439 | }; | 2316 | }; |
2440 | 2317 | #endif /* CONFIG_XEN_DEBUG_FS */ | |
2441 | static struct dentry *d_mmu_debug; | ||
2442 | |||
2443 | static int __init xen_mmu_debugfs(void) | ||
2444 | { | ||
2445 | struct dentry *d_xen = xen_init_debugfs(); | ||
2446 | |||
2447 | if (d_xen == NULL) | ||
2448 | return -ENOMEM; | ||
2449 | |||
2450 | d_mmu_debug = debugfs_create_dir("mmu", d_xen); | ||
2451 | |||
2452 | debugfs_create_u8("zero_stats", 0644, d_mmu_debug, &zero_stats); | ||
2453 | |||
2454 | debugfs_create_u32("pgd_update", 0444, d_mmu_debug, &mmu_stats.pgd_update); | ||
2455 | debugfs_create_u32("pgd_update_pinned", 0444, d_mmu_debug, | ||
2456 | &mmu_stats.pgd_update_pinned); | ||
2457 | debugfs_create_u32("pgd_update_batched", 0444, d_mmu_debug, | ||
2458 | &mmu_stats.pgd_update_pinned); | ||
2459 | |||
2460 | debugfs_create_u32("pud_update", 0444, d_mmu_debug, &mmu_stats.pud_update); | ||
2461 | debugfs_create_u32("pud_update_pinned", 0444, d_mmu_debug, | ||
2462 | &mmu_stats.pud_update_pinned); | ||
2463 | debugfs_create_u32("pud_update_batched", 0444, d_mmu_debug, | ||
2464 | &mmu_stats.pud_update_pinned); | ||
2465 | |||
2466 | debugfs_create_u32("pmd_update", 0444, d_mmu_debug, &mmu_stats.pmd_update); | ||
2467 | debugfs_create_u32("pmd_update_pinned", 0444, d_mmu_debug, | ||
2468 | &mmu_stats.pmd_update_pinned); | ||
2469 | debugfs_create_u32("pmd_update_batched", 0444, d_mmu_debug, | ||
2470 | &mmu_stats.pmd_update_pinned); | ||
2471 | |||
2472 | debugfs_create_u32("pte_update", 0444, d_mmu_debug, &mmu_stats.pte_update); | ||
2473 | // debugfs_create_u32("pte_update_pinned", 0444, d_mmu_debug, | ||
2474 | // &mmu_stats.pte_update_pinned); | ||
2475 | debugfs_create_u32("pte_update_batched", 0444, d_mmu_debug, | ||
2476 | &mmu_stats.pte_update_pinned); | ||
2477 | |||
2478 | debugfs_create_u32("mmu_update", 0444, d_mmu_debug, &mmu_stats.mmu_update); | ||
2479 | debugfs_create_u32("mmu_update_extended", 0444, d_mmu_debug, | ||
2480 | &mmu_stats.mmu_update_extended); | ||
2481 | xen_debugfs_create_u32_array("mmu_update_histo", 0444, d_mmu_debug, | ||
2482 | mmu_stats.mmu_update_histo, 20); | ||
2483 | |||
2484 | debugfs_create_u32("set_pte_at", 0444, d_mmu_debug, &mmu_stats.set_pte_at); | ||
2485 | debugfs_create_u32("set_pte_at_batched", 0444, d_mmu_debug, | ||
2486 | &mmu_stats.set_pte_at_batched); | ||
2487 | debugfs_create_u32("set_pte_at_current", 0444, d_mmu_debug, | ||
2488 | &mmu_stats.set_pte_at_current); | ||
2489 | debugfs_create_u32("set_pte_at_kernel", 0444, d_mmu_debug, | ||
2490 | &mmu_stats.set_pte_at_kernel); | ||
2491 | |||
2492 | debugfs_create_u32("prot_commit", 0444, d_mmu_debug, &mmu_stats.prot_commit); | ||
2493 | debugfs_create_u32("prot_commit_batched", 0444, d_mmu_debug, | ||
2494 | &mmu_stats.prot_commit_batched); | ||
2495 | |||
2496 | debugfs_create_file("p2m", 0600, d_mmu_debug, NULL, &p2m_dump_fops); | ||
2497 | return 0; | ||
2498 | } | ||
2499 | fs_initcall(xen_mmu_debugfs); | ||
2500 | |||
2501 | #endif /* CONFIG_XEN_DEBUG_FS */ | ||
diff --git a/arch/x86/xen/mmu.h b/arch/x86/xen/mmu.h index 537bb9aab777..73809bb951b4 100644 --- a/arch/x86/xen/mmu.h +++ b/arch/x86/xen/mmu.h | |||
@@ -15,43 +15,6 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn); | |||
15 | 15 | ||
16 | void set_pte_mfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); | 16 | void set_pte_mfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); |
17 | 17 | ||
18 | |||
19 | void xen_activate_mm(struct mm_struct *prev, struct mm_struct *next); | ||
20 | void xen_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm); | ||
21 | void xen_exit_mmap(struct mm_struct *mm); | ||
22 | |||
23 | pteval_t xen_pte_val(pte_t); | ||
24 | pmdval_t xen_pmd_val(pmd_t); | ||
25 | pgdval_t xen_pgd_val(pgd_t); | ||
26 | |||
27 | pte_t xen_make_pte(pteval_t); | ||
28 | pmd_t xen_make_pmd(pmdval_t); | ||
29 | pgd_t xen_make_pgd(pgdval_t); | ||
30 | |||
31 | void xen_set_pte(pte_t *ptep, pte_t pteval); | ||
32 | void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, | ||
33 | pte_t *ptep, pte_t pteval); | ||
34 | |||
35 | #ifdef CONFIG_X86_PAE | ||
36 | void xen_set_pte_atomic(pte_t *ptep, pte_t pte); | ||
37 | void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); | ||
38 | void xen_pmd_clear(pmd_t *pmdp); | ||
39 | #endif /* CONFIG_X86_PAE */ | ||
40 | |||
41 | void xen_set_pmd(pmd_t *pmdp, pmd_t pmdval); | ||
42 | void xen_set_pud(pud_t *ptr, pud_t val); | ||
43 | void xen_set_pmd_hyper(pmd_t *pmdp, pmd_t pmdval); | ||
44 | void xen_set_pud_hyper(pud_t *ptr, pud_t val); | ||
45 | |||
46 | #if PAGETABLE_LEVELS == 4 | ||
47 | pudval_t xen_pud_val(pud_t pud); | ||
48 | pud_t xen_make_pud(pudval_t pudval); | ||
49 | void xen_set_pgd(pgd_t *pgdp, pgd_t pgd); | ||
50 | void xen_set_pgd_hyper(pgd_t *pgdp, pgd_t pgd); | ||
51 | #endif | ||
52 | |||
53 | pgd_t *xen_get_user_pgd(pgd_t *pgd); | ||
54 | |||
55 | pte_t xen_ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr, pte_t *ptep); | 18 | pte_t xen_ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr, pte_t *ptep); |
56 | void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, | 19 | void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, |
57 | pte_t *ptep, pte_t pte); | 20 | pte_t *ptep, pte_t pte); |
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index 7c275f5d0df0..5d43c1f8ada8 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig | |||
@@ -20,12 +20,6 @@ config XTENSA | |||
20 | config RWSEM_XCHGADD_ALGORITHM | 20 | config RWSEM_XCHGADD_ALGORITHM |
21 | def_bool y | 21 | def_bool y |
22 | 22 | ||
23 | config GENERIC_FIND_NEXT_BIT | ||
24 | def_bool y | ||
25 | |||
26 | config GENERIC_FIND_BIT_LE | ||
27 | def_bool y | ||
28 | |||
29 | config GENERIC_HWEIGHT | 23 | config GENERIC_HWEIGHT |
30 | def_bool y | 24 | def_bool y |
31 | 25 | ||
diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h index 528042c2951e..a6f934f37f1a 100644 --- a/arch/xtensa/include/asm/unistd.h +++ b/arch/xtensa/include/asm/unistd.h | |||
@@ -683,8 +683,10 @@ __SYSCALL(305, sys_ni_syscall, 0) | |||
683 | __SYSCALL(306, sys_eventfd, 1) | 683 | __SYSCALL(306, sys_eventfd, 1) |
684 | #define __NR_recvmmsg 307 | 684 | #define __NR_recvmmsg 307 |
685 | __SYSCALL(307, sys_recvmmsg, 5) | 685 | __SYSCALL(307, sys_recvmmsg, 5) |
686 | #define __NR_setns 308 | ||
687 | __SYSCALL(308, sys_setns, 2) | ||
686 | 688 | ||
687 | #define __NR_syscall_count 308 | 689 | #define __NR_syscall_count 309 |
688 | 690 | ||
689 | /* | 691 | /* |
690 | * sysxtensa syscall handler | 692 | * sysxtensa syscall handler |