diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 18:18:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 18:18:06 -0400 |
commit | d973664992d814d93db161b28c0cc9a4c7e68f42 (patch) | |
tree | 03de3a9ef1f8f0d5dcd2e3c217c4fdf334f6691e /arch | |
parent | 2d5e3e8d28a7820de1eb7b18a7c15d645bb26992 (diff) | |
parent | 9d87dd97ffcd3b5eb2bbaf0d5d93f4bfcaed3f04 (diff) |
Merge master.kernel.org:/home/rmk/linux-2.6-arm
* master.kernel.org:/home/rmk/linux-2.6-arm: (26 commits)
[ARM] pxa: fix 1c104e0e4f6ab396960c058e95e18bdedcac945b
[ARM] serial: s3c2410: platform_get_irq() may return signed unnoticed
[ARM] am79c961a: platform_get_irq() may return signed unnoticed
[ARM] Feroceon: Feroceon-specific WA-cache compatible {copy,clear}_user_page()
[ARM] Feroceon: fix function alignment in proc-feroceon.S
[ARM] Orion: catch a couple more alternative spellings of PCIe
[ARM] Orion: fix orion-ehci platform resource end addresses
[ARM] Orion: fix ->map_irq() PCIe bus number check
[ARM] Orion: fix ioremap() optimization
[ARM] feroceon: remove CONFIG_CPU_CACHE_ROUND_ROBIN check
[ARM] feroceon: remove CONFIG_CPU_DCACHE_WRITETHROUGH check
kprobes/arm: fix decoding of arithmetic immediate instructions
kprobes/arm: fix cache flush address for instruction stub
[ARM] 5022/1: Race in ARM MMCI PL18x driver, V2
[ARM] 5021/1: at91: buildfix for sam9263 + PM
[ARM] 5018/1: RealView: Fix the ARM11MPCore Oprofile compilation
[ARM] 5016/1: AT91: typo in mci configuration for at91cap at91sam9263
[ARM] 5017/1: pxa3xx: Report unsupported wakeup sources in pxa3xx_set_wake()
[ARM] 5020/1: magician: remove __devinit marker from pasic3_leds_info
[ARM] 5014/1: Cleanup reset state before entering suspend or resetting.
...
Diffstat (limited to 'arch')
25 files changed, 283 insertions, 143 deletions
diff --git a/arch/arm/configs/am200epdkit_defconfig b/arch/arm/configs/am200epdkit_defconfig index dc030cfe5009..5e68420f4680 100644 --- a/arch/arm/configs/am200epdkit_defconfig +++ b/arch/arm/configs/am200epdkit_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25-rc3 | 3 | # Linux kernel version: 2.6.25 |
4 | # Sun Mar 9 06:33:33 2008 | 4 | # Sun Apr 20 00:29:49 2008 |
5 | # | 5 | # |
6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y |
@@ -51,7 +51,8 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
51 | # CONFIG_RT_GROUP_SCHED is not set | 51 | # CONFIG_RT_GROUP_SCHED is not set |
52 | CONFIG_USER_SCHED=y | 52 | CONFIG_USER_SCHED=y |
53 | # CONFIG_CGROUP_SCHED is not set | 53 | # CONFIG_CGROUP_SCHED is not set |
54 | # CONFIG_SYSFS_DEPRECATED is not set | 54 | CONFIG_SYSFS_DEPRECATED=y |
55 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
55 | # CONFIG_RELAY is not set | 56 | # CONFIG_RELAY is not set |
56 | # CONFIG_NAMESPACES is not set | 57 | # CONFIG_NAMESPACES is not set |
57 | # CONFIG_BLK_DEV_INITRD is not set | 58 | # CONFIG_BLK_DEV_INITRD is not set |
@@ -85,6 +86,7 @@ CONFIG_SLAB=y | |||
85 | CONFIG_HAVE_OPROFILE=y | 86 | CONFIG_HAVE_OPROFILE=y |
86 | # CONFIG_KPROBES is not set | 87 | # CONFIG_KPROBES is not set |
87 | CONFIG_HAVE_KPROBES=y | 88 | CONFIG_HAVE_KPROBES=y |
89 | CONFIG_HAVE_KRETPROBES=y | ||
88 | CONFIG_PROC_PAGE_MONITOR=y | 90 | CONFIG_PROC_PAGE_MONITOR=y |
89 | CONFIG_SLABINFO=y | 91 | CONFIG_SLABINFO=y |
90 | CONFIG_RT_MUTEXES=y | 92 | CONFIG_RT_MUTEXES=y |
@@ -115,7 +117,6 @@ CONFIG_IOSCHED_NOOP=y | |||
115 | CONFIG_DEFAULT_NOOP=y | 117 | CONFIG_DEFAULT_NOOP=y |
116 | CONFIG_DEFAULT_IOSCHED="noop" | 118 | CONFIG_DEFAULT_IOSCHED="noop" |
117 | CONFIG_CLASSIC_RCU=y | 119 | CONFIG_CLASSIC_RCU=y |
118 | # CONFIG_PREEMPT_RCU is not set | ||
119 | 120 | ||
120 | # | 121 | # |
121 | # System Type | 122 | # System Type |
@@ -320,8 +321,6 @@ CONFIG_TCP_CONG_CUBIC=y | |||
320 | CONFIG_DEFAULT_TCP_CONG="cubic" | 321 | CONFIG_DEFAULT_TCP_CONG="cubic" |
321 | # CONFIG_TCP_MD5SIG is not set | 322 | # CONFIG_TCP_MD5SIG is not set |
322 | # CONFIG_IPV6 is not set | 323 | # CONFIG_IPV6 is not set |
323 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
324 | # CONFIG_INET6_TUNNEL is not set | ||
325 | # CONFIG_NETWORK_SECMARK is not set | 324 | # CONFIG_NETWORK_SECMARK is not set |
326 | # CONFIG_NETFILTER is not set | 325 | # CONFIG_NETFILTER is not set |
327 | # CONFIG_IP_DCCP is not set | 326 | # CONFIG_IP_DCCP is not set |
@@ -383,7 +382,6 @@ CONFIG_IEEE80211=m | |||
383 | CONFIG_IEEE80211_CRYPT_WEP=m | 382 | CONFIG_IEEE80211_CRYPT_WEP=m |
384 | # CONFIG_IEEE80211_CRYPT_CCMP is not set | 383 | # CONFIG_IEEE80211_CRYPT_CCMP is not set |
385 | # CONFIG_IEEE80211_CRYPT_TKIP is not set | 384 | # CONFIG_IEEE80211_CRYPT_TKIP is not set |
386 | # CONFIG_IEEE80211_SOFTMAC is not set | ||
387 | # CONFIG_RFKILL is not set | 385 | # CONFIG_RFKILL is not set |
388 | # CONFIG_NET_9P is not set | 386 | # CONFIG_NET_9P is not set |
389 | 387 | ||
@@ -503,7 +501,7 @@ CONFIG_IDE_MAX_HWIFS=2 | |||
503 | CONFIG_BLK_DEV_IDE=m | 501 | CONFIG_BLK_DEV_IDE=m |
504 | 502 | ||
505 | # | 503 | # |
506 | # Please see Documentation/ide.txt for help/info on IDE drives | 504 | # Please see Documentation/ide/ide.txt for help/info on IDE drives |
507 | # | 505 | # |
508 | # CONFIG_BLK_DEV_IDE_SATA is not set | 506 | # CONFIG_BLK_DEV_IDE_SATA is not set |
509 | CONFIG_BLK_DEV_IDEDISK=m | 507 | CONFIG_BLK_DEV_IDEDISK=m |
@@ -518,10 +516,9 @@ CONFIG_IDE_PROC_FS=y | |||
518 | # | 516 | # |
519 | # IDE chipset support/bugfixes | 517 | # IDE chipset support/bugfixes |
520 | # | 518 | # |
521 | CONFIG_IDE_GENERIC=m | ||
522 | # CONFIG_BLK_DEV_PLATFORM is not set | 519 | # CONFIG_BLK_DEV_PLATFORM is not set |
523 | # CONFIG_BLK_DEV_IDEDMA is not set | 520 | # CONFIG_BLK_DEV_IDEDMA is not set |
524 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | 521 | # CONFIG_BLK_DEV_HD_ONLY is not set |
525 | # CONFIG_BLK_DEV_HD is not set | 522 | # CONFIG_BLK_DEV_HD is not set |
526 | 523 | ||
527 | # | 524 | # |
@@ -562,6 +559,7 @@ CONFIG_NETDEV_10000=y | |||
562 | # | 559 | # |
563 | # CONFIG_WLAN_PRE80211 is not set | 560 | # CONFIG_WLAN_PRE80211 is not set |
564 | # CONFIG_WLAN_80211 is not set | 561 | # CONFIG_WLAN_80211 is not set |
562 | # CONFIG_IWLWIFI_LEDS is not set | ||
565 | # CONFIG_NET_PCMCIA is not set | 563 | # CONFIG_NET_PCMCIA is not set |
566 | # CONFIG_WAN is not set | 564 | # CONFIG_WAN is not set |
567 | # CONFIG_PPP is not set | 565 | # CONFIG_PPP is not set |
@@ -707,6 +705,8 @@ CONFIG_SSB_POSSIBLE=y | |||
707 | # | 705 | # |
708 | # CONFIG_MFD_SM501 is not set | 706 | # CONFIG_MFD_SM501 is not set |
709 | # CONFIG_MFD_ASIC3 is not set | 707 | # CONFIG_MFD_ASIC3 is not set |
708 | # CONFIG_HTC_EGPIO is not set | ||
709 | # CONFIG_HTC_PASIC3 is not set | ||
710 | 710 | ||
711 | # | 711 | # |
712 | # Multimedia devices | 712 | # Multimedia devices |
@@ -745,6 +745,7 @@ CONFIG_FB_TILEBLITTING=y | |||
745 | CONFIG_FB_PXA=y | 745 | CONFIG_FB_PXA=y |
746 | CONFIG_FB_PXA_PARAMETERS=y | 746 | CONFIG_FB_PXA_PARAMETERS=y |
747 | CONFIG_FB_MBX=m | 747 | CONFIG_FB_MBX=m |
748 | # CONFIG_FB_METRONOME is not set | ||
748 | CONFIG_FB_VIRTUAL=m | 749 | CONFIG_FB_VIRTUAL=m |
749 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 750 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
750 | 751 | ||
@@ -891,7 +892,6 @@ CONFIG_RTC_LIB=y | |||
891 | # CONFIG_JFS_FS is not set | 892 | # CONFIG_JFS_FS is not set |
892 | # CONFIG_FS_POSIX_ACL is not set | 893 | # CONFIG_FS_POSIX_ACL is not set |
893 | # CONFIG_XFS_FS is not set | 894 | # CONFIG_XFS_FS is not set |
894 | # CONFIG_GFS2_FS is not set | ||
895 | # CONFIG_OCFS2_FS is not set | 895 | # CONFIG_OCFS2_FS is not set |
896 | # CONFIG_DNOTIFY is not set | 896 | # CONFIG_DNOTIFY is not set |
897 | CONFIG_INOTIFY=y | 897 | CONFIG_INOTIFY=y |
diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c index d51bc8b60557..b4565bb133c1 100644 --- a/arch/arm/kernel/kprobes-decode.c +++ b/arch/arm/kernel/kprobes-decode.c | |||
@@ -1176,7 +1176,7 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi) | |||
1176 | * *S (bit 20) updates condition codes | 1176 | * *S (bit 20) updates condition codes |
1177 | * ADC/SBC/RSC reads the C flag | 1177 | * ADC/SBC/RSC reads the C flag |
1178 | */ | 1178 | */ |
1179 | insn &= 0xfff00ff0; /* Rn = r0, Rd = r0 */ | 1179 | insn &= 0xfff00fff; /* Rn = r0, Rd = r0 */ |
1180 | asi->insn[0] = insn; | 1180 | asi->insn[0] = insn; |
1181 | asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ | 1181 | asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ |
1182 | emulate_alu_imm_rwflags : emulate_alu_imm_rflags; | 1182 | emulate_alu_imm_rwflags : emulate_alu_imm_rflags; |
diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c index 13e371aad879..5593dd207216 100644 --- a/arch/arm/kernel/kprobes.c +++ b/arch/arm/kernel/kprobes.c | |||
@@ -66,7 +66,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) | |||
66 | return -ENOMEM; | 66 | return -ENOMEM; |
67 | for (is = 0; is < MAX_INSN_SIZE; ++is) | 67 | for (is = 0; is < MAX_INSN_SIZE; ++is) |
68 | p->ainsn.insn[is] = tmp_insn[is]; | 68 | p->ainsn.insn[is] = tmp_insn[is]; |
69 | flush_insns(&p->ainsn.insn, MAX_INSN_SIZE); | 69 | flush_insns(p->ainsn.insn, MAX_INSN_SIZE); |
70 | break; | 70 | break; |
71 | 71 | ||
72 | case INSN_GOOD_NO_SLOT: /* instruction doesn't need insn slot */ | 72 | case INSN_GOOD_NO_SLOT: /* instruction doesn't need insn slot */ |
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index f1a80d74a4b6..be526746e01e 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
@@ -246,7 +246,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
246 | } | 246 | } |
247 | 247 | ||
248 | mmc0_data = *data; | 248 | mmc0_data = *data; |
249 | at91_clock_associate("mci0_clk", &at91cap9_mmc1_device.dev, "mci_clk"); | 249 | at91_clock_associate("mci0_clk", &at91cap9_mmc0_device.dev, "mci_clk"); |
250 | platform_device_register(&at91cap9_mmc0_device); | 250 | platform_device_register(&at91cap9_mmc0_device); |
251 | } else { /* MCI1 */ | 251 | } else { /* MCI1 */ |
252 | /* CLK */ | 252 | /* CLK */ |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index b6454c525962..719667e25c98 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
@@ -308,7 +308,7 @@ 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_mmc1_device.dev, "mci_clk"); | 311 | at91_clock_associate("mci0_clk", &at91sam9263_mmc0_device.dev, "mci_clk"); |
312 | platform_device_register(&at91sam9263_mmc0_device); | 312 | platform_device_register(&at91sam9263_mmc0_device); |
313 | } else { /* MCI1 */ | 313 | } else { /* MCI1 */ |
314 | /* CLK */ | 314 | /* CLK */ |
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 39733b6992aa..aa863c157708 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c | |||
@@ -61,6 +61,15 @@ static inline void sdram_selfrefresh_enable(void) | |||
61 | #else | 61 | #else |
62 | #include <asm/arch/at91sam9_sdramc.h> | 62 | #include <asm/arch/at91sam9_sdramc.h> |
63 | 63 | ||
64 | #ifdef CONFIG_ARCH_AT91SAM9263 | ||
65 | /* | ||
66 | * FIXME either or both the SDRAM controllers (EB0, EB1) might be in use; | ||
67 | * handle those cases both here and in the Suspend-To-RAM support. | ||
68 | */ | ||
69 | #define AT91_SDRAMC AT91_SDRAMC0 | ||
70 | #warning Assuming EB1 SDRAM controller is *NOT* used | ||
71 | #endif | ||
72 | |||
64 | static u32 saved_lpr; | 73 | static u32 saved_lpr; |
65 | 74 | ||
66 | static inline void sdram_selfrefresh_enable(void) | 75 | static inline void sdram_selfrefresh_enable(void) |
@@ -75,11 +84,6 @@ static inline void sdram_selfrefresh_enable(void) | |||
75 | 84 | ||
76 | #define sdram_selfrefresh_disable() at91_sys_write(AT91_SDRAMC_LPR, saved_lpr) | 85 | #define sdram_selfrefresh_disable() at91_sys_write(AT91_SDRAMC_LPR, saved_lpr) |
77 | 86 | ||
78 | /* | ||
79 | * FIXME: The AT91SAM9263 has a second EBI controller which may have | ||
80 | * additional SDRAM. pm_slowclock.S will require a similar fix. | ||
81 | */ | ||
82 | |||
83 | #endif | 87 | #endif |
84 | 88 | ||
85 | 89 | ||
diff --git a/arch/arm/mach-orion5x/addr-map.c b/arch/arm/mach-orion5x/addr-map.c index 6b179371e0a2..9608503d67f5 100644 --- a/arch/arm/mach-orion5x/addr-map.c +++ b/arch/arm/mach-orion5x/addr-map.c | |||
@@ -19,14 +19,14 @@ | |||
19 | 19 | ||
20 | /* | 20 | /* |
21 | * The Orion has fully programable address map. There's a separate address | 21 | * The Orion has fully programable address map. There's a separate address |
22 | * map for each of the device _master_ interfaces, e.g. CPU, PCI, PCIE, USB, | 22 | * map for each of the device _master_ interfaces, e.g. CPU, PCI, PCIe, USB, |
23 | * Gigabit Ethernet, DMA/XOR engines, etc. Each interface has its own | 23 | * Gigabit Ethernet, DMA/XOR engines, etc. Each interface has its own |
24 | * address decode windows that allow it to access any of the Orion resources. | 24 | * address decode windows that allow it to access any of the Orion resources. |
25 | * | 25 | * |
26 | * CPU address decoding -- | 26 | * CPU address decoding -- |
27 | * Linux assumes that it is the boot loader that already setup the access to | 27 | * Linux assumes that it is the boot loader that already setup the access to |
28 | * DDR and internal registers. | 28 | * DDR and internal registers. |
29 | * Setup access to PCI and PCI-E IO/MEM space is issued by this file. | 29 | * Setup access to PCI and PCIe IO/MEM space is issued by this file. |
30 | * Setup access to various devices located on the device bus interface (e.g. | 30 | * Setup access to various devices located on the device bus interface (e.g. |
31 | * flashes, RTC, etc) should be issued by machine-setup.c according to | 31 | * flashes, RTC, etc) should be issued by machine-setup.c according to |
32 | * specific board population (by using orion5x_setup_*_win()). | 32 | * specific board population (by using orion5x_setup_*_win()). |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 439c7784af02..968deb58be01 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -132,7 +132,7 @@ static struct platform_device orion5x_uart = { | |||
132 | static struct resource orion5x_ehci0_resources[] = { | 132 | static struct resource orion5x_ehci0_resources[] = { |
133 | { | 133 | { |
134 | .start = ORION5X_USB0_PHYS_BASE, | 134 | .start = ORION5X_USB0_PHYS_BASE, |
135 | .end = ORION5X_USB0_PHYS_BASE + SZ_4K, | 135 | .end = ORION5X_USB0_PHYS_BASE + SZ_4K - 1, |
136 | .flags = IORESOURCE_MEM, | 136 | .flags = IORESOURCE_MEM, |
137 | }, | 137 | }, |
138 | { | 138 | { |
@@ -145,7 +145,7 @@ static struct resource orion5x_ehci0_resources[] = { | |||
145 | static struct resource orion5x_ehci1_resources[] = { | 145 | static struct resource orion5x_ehci1_resources[] = { |
146 | { | 146 | { |
147 | .start = ORION5X_USB1_PHYS_BASE, | 147 | .start = ORION5X_USB1_PHYS_BASE, |
148 | .end = ORION5X_USB1_PHYS_BASE + SZ_4K, | 148 | .end = ORION5X_USB1_PHYS_BASE + SZ_4K - 1, |
149 | .flags = IORESOURCE_MEM, | 149 | .flags = IORESOURCE_MEM, |
150 | }, | 150 | }, |
151 | { | 151 | { |
@@ -317,7 +317,7 @@ struct sys_timer orion5x_timer = { | |||
317 | ****************************************************************************/ | 317 | ****************************************************************************/ |
318 | 318 | ||
319 | /* | 319 | /* |
320 | * Identify device ID and rev from PCIE configuration header space '0'. | 320 | * Identify device ID and rev from PCIe configuration header space '0'. |
321 | */ | 321 | */ |
322 | static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | 322 | static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) |
323 | { | 323 | { |
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index f4c4c9a72a7c..14adf8d1a54a 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
@@ -33,10 +33,9 @@ struct pci_sys_data; | |||
33 | struct pci_bus; | 33 | struct pci_bus; |
34 | 34 | ||
35 | void orion5x_pcie_id(u32 *dev, u32 *rev); | 35 | void orion5x_pcie_id(u32 *dev, u32 *rev); |
36 | int orion5x_pcie_local_bus_nr(void); | ||
37 | int orion5x_pci_local_bus_nr(void); | ||
38 | int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys); | 36 | int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys); |
39 | struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys); | 37 | struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys); |
38 | int orion5x_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin); | ||
40 | 39 | ||
41 | /* | 40 | /* |
42 | * Valid GPIO pins according to MPP setup, used by machine-setup. | 41 | * Valid GPIO pins according to MPP setup, used by machine-setup. |
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index ea3141e3e3c0..44c64342dacb 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c | |||
@@ -241,14 +241,17 @@ void __init db88f5281_pci_preinit(void) | |||
241 | 241 | ||
242 | static int __init db88f5281_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 242 | static int __init db88f5281_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
243 | { | 243 | { |
244 | int irq; | ||
245 | |||
244 | /* | 246 | /* |
245 | * PCIE IRQ is connected internally (not GPIO) | 247 | * Check for devices with hard-wired IRQs. |
246 | */ | 248 | */ |
247 | if (dev->bus->number == orion5x_pcie_local_bus_nr()) | 249 | irq = orion5x_pci_map_irq(dev, slot, pin); |
248 | return IRQ_ORION5X_PCIE0_INT; | 250 | if (irq != -1) |
251 | return irq; | ||
249 | 252 | ||
250 | /* | 253 | /* |
251 | * PCI IRQs are connected via GPIOs | 254 | * PCI IRQs are connected via GPIOs. |
252 | */ | 255 | */ |
253 | switch (slot - DB88F5281_PCI_SLOT0_OFFS) { | 256 | switch (slot - DB88F5281_PCI_SLOT0_OFFS) { |
254 | case 0: | 257 | case 0: |
diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c index 058a525c2ab6..f9430f5ca9a8 100644 --- a/arch/arm/mach-orion5x/dns323-setup.c +++ b/arch/arm/mach-orion5x/dns323-setup.c | |||
@@ -43,11 +43,16 @@ | |||
43 | 43 | ||
44 | static int __init dns323_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 44 | static int __init dns323_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
45 | { | 45 | { |
46 | /* PCI-E */ | 46 | int irq; |
47 | if (dev->bus->number == orion5x_pcie_local_bus_nr()) | ||
48 | return IRQ_ORION5X_PCIE0_INT; | ||
49 | 47 | ||
50 | pr_err("%s: requested mapping for unknown bus\n", __func__); | 48 | /* |
49 | * Check for devices with hard-wired IRQs. | ||
50 | */ | ||
51 | irq = orion5x_pci_map_irq(dev, slot, pin); | ||
52 | if (irq != -1) | ||
53 | return irq; | ||
54 | |||
55 | pr_err("%s: requested mapping for unknown device\n", __func__); | ||
51 | 56 | ||
52 | return -1; | 57 | return -1; |
53 | } | 58 | } |
@@ -250,9 +255,9 @@ static void __init dns323_init(void) | |||
250 | */ | 255 | */ |
251 | orion5x_setup_dev_boot_win(DNS323_NOR_BOOT_BASE, DNS323_NOR_BOOT_SIZE); | 256 | orion5x_setup_dev_boot_win(DNS323_NOR_BOOT_BASE, DNS323_NOR_BOOT_SIZE); |
252 | 257 | ||
253 | /* DNS-323 has a Marvell 88X7042 SATA controller attached via PCIE | 258 | /* DNS-323 has a Marvell 88X7042 SATA controller attached via PCIe |
254 | * | 259 | * |
255 | * Open a special address decode windows for the PCIE WA. | 260 | * Open a special address decode windows for the PCIe WA. |
256 | */ | 261 | */ |
257 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, | 262 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, |
258 | ORION5X_PCIE_WA_SIZE); | 263 | ORION5X_PCIE_WA_SIZE); |
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index 707db4be74a6..88410862feef 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c | |||
@@ -120,13 +120,19 @@ static struct platform_device kurobox_pro_nor_flash = { | |||
120 | 120 | ||
121 | static int __init kurobox_pro_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 121 | static int __init kurobox_pro_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
122 | { | 122 | { |
123 | int irq; | ||
124 | |||
125 | /* | ||
126 | * Check for devices with hard-wired IRQs. | ||
127 | */ | ||
128 | irq = orion5x_pci_map_irq(dev, slot, pin); | ||
129 | if (irq != -1) | ||
130 | return irq; | ||
131 | |||
123 | /* | 132 | /* |
124 | * PCI isn't used on the Kuro | 133 | * PCI isn't used on the Kuro |
125 | */ | 134 | */ |
126 | if (dev->bus->number == orion5x_pcie_local_bus_nr()) | 135 | printk(KERN_ERR "kurobox_pro_pci_map_irq failed, unknown bus\n"); |
127 | return IRQ_ORION5X_PCIE0_INT; | ||
128 | else | ||
129 | printk(KERN_ERR "kurobox_pro_pci_map_irq failed, unknown bus\n"); | ||
130 | 136 | ||
131 | return -1; | 137 | return -1; |
132 | } | 138 | } |
@@ -191,7 +197,7 @@ static void __init kurobox_pro_init(void) | |||
191 | orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE, KUROBOX_PRO_NAND_SIZE); | 197 | orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE, KUROBOX_PRO_NAND_SIZE); |
192 | 198 | ||
193 | /* | 199 | /* |
194 | * Open a special address decode windows for the PCIE WA. | 200 | * Open a special address decode windows for the PCIe WA. |
195 | */ | 201 | */ |
196 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, | 202 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, |
197 | ORION5X_PCIE_WA_SIZE); | 203 | ORION5X_PCIE_WA_SIZE); |
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index fdf99fca85b3..9d5d39fa19c3 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c | |||
@@ -41,11 +41,6 @@ void __init orion5x_pcie_id(u32 *dev, u32 *rev) | |||
41 | *rev = orion_pcie_rev(PCIE_BASE); | 41 | *rev = orion_pcie_rev(PCIE_BASE); |
42 | } | 42 | } |
43 | 43 | ||
44 | int __init orion5x_pcie_local_bus_nr(void) | ||
45 | { | ||
46 | return orion_pcie_get_local_bus_nr(PCIE_BASE); | ||
47 | } | ||
48 | |||
49 | static int pcie_valid_config(int bus, int dev) | 44 | static int pcie_valid_config(int bus, int dev) |
50 | { | 45 | { |
51 | /* | 46 | /* |
@@ -269,7 +264,7 @@ static int __init pcie_setup(struct pci_sys_data *sys) | |||
269 | */ | 264 | */ |
270 | static DEFINE_SPINLOCK(orion5x_pci_lock); | 265 | static DEFINE_SPINLOCK(orion5x_pci_lock); |
271 | 266 | ||
272 | int orion5x_pci_local_bus_nr(void) | 267 | static int orion5x_pci_local_bus_nr(void) |
273 | { | 268 | { |
274 | u32 conf = orion5x_read(PCI_P2P_CONF); | 269 | u32 conf = orion5x_read(PCI_P2P_CONF); |
275 | return((conf & PCI_P2P_BUS_MASK) >> PCI_P2P_BUS_OFFS); | 270 | return((conf & PCI_P2P_BUS_MASK) >> PCI_P2P_BUS_OFFS); |
@@ -557,3 +552,16 @@ struct pci_bus __init *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys | |||
557 | 552 | ||
558 | return bus; | 553 | return bus; |
559 | } | 554 | } |
555 | |||
556 | int __init orion5x_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
557 | { | ||
558 | int bus = dev->bus->number; | ||
559 | |||
560 | /* | ||
561 | * PCIe endpoint? | ||
562 | */ | ||
563 | if (bus < orion5x_pci_local_bus_nr()) | ||
564 | return IRQ_ORION5X_PCIE0_INT; | ||
565 | |||
566 | return -1; | ||
567 | } | ||
diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index 7082fe8f83b1..81abc1003aae 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c | |||
@@ -172,11 +172,14 @@ void __init rd88f5182_pci_preinit(void) | |||
172 | 172 | ||
173 | static int __init rd88f5182_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 173 | static int __init rd88f5182_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
174 | { | 174 | { |
175 | int irq; | ||
176 | |||
175 | /* | 177 | /* |
176 | * PCI-E isn't used on the RD2 | 178 | * Check for devices with hard-wired IRQs. |
177 | */ | 179 | */ |
178 | if (dev->bus->number == orion5x_pcie_local_bus_nr()) | 180 | irq = orion5x_pci_map_irq(dev, slot, pin); |
179 | return IRQ_ORION5X_PCIE0_INT; | 181 | if (irq != -1) |
182 | return irq; | ||
180 | 183 | ||
181 | /* | 184 | /* |
182 | * PCI IRQs are connected via GPIOs | 185 | * PCI IRQs are connected via GPIOs |
@@ -257,7 +260,7 @@ static void __init rd88f5182_init(void) | |||
257 | orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE); | 260 | orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE); |
258 | 261 | ||
259 | /* | 262 | /* |
260 | * Open a special address decode windows for the PCIE WA. | 263 | * Open a special address decode windows for the PCIe WA. |
261 | */ | 264 | */ |
262 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, | 265 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, |
263 | ORION5X_PCIE_WA_SIZE); | 266 | ORION5X_PCIE_WA_SIZE); |
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 6f93668b0ed5..9afb41ee6e07 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
@@ -141,14 +141,17 @@ void __init qnap_ts209_pci_preinit(void) | |||
141 | 141 | ||
142 | static int __init qnap_ts209_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 142 | static int __init qnap_ts209_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
143 | { | 143 | { |
144 | int irq; | ||
145 | |||
144 | /* | 146 | /* |
145 | * PCIE IRQ is connected internally (not GPIO) | 147 | * Check for devices with hard-wired IRQs. |
146 | */ | 148 | */ |
147 | if (dev->bus->number == orion5x_pcie_local_bus_nr()) | 149 | irq = orion5x_pci_map_irq(dev, slot, pin); |
148 | return IRQ_ORION5X_PCIE0_INT; | 150 | if (irq != -1) |
151 | return irq; | ||
149 | 152 | ||
150 | /* | 153 | /* |
151 | * PCI IRQs are connected via GPIOs | 154 | * PCI IRQs are connected via GPIOs. |
152 | */ | 155 | */ |
153 | switch (slot - QNAP_TS209_PCI_SLOT0_OFFS) { | 156 | switch (slot - QNAP_TS209_PCI_SLOT0_OFFS) { |
154 | case 0: | 157 | case 0: |
@@ -372,7 +375,7 @@ static void __init qnap_ts209_init(void) | |||
372 | QNAP_TS209_NOR_BOOT_SIZE); | 375 | QNAP_TS209_NOR_BOOT_SIZE); |
373 | 376 | ||
374 | /* | 377 | /* |
375 | * Open a special address decode windows for the PCIE WA. | 378 | * Open a special address decode windows for the PCIe WA. |
376 | */ | 379 | */ |
377 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, | 380 | orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, |
378 | ORION5X_PCIE_WA_SIZE); | 381 | ORION5X_PCIE_WA_SIZE); |
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index 7cdcb459ea9d..6a830853aa6a 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile | |||
@@ -5,9 +5,9 @@ | |||
5 | # Common support (must be linked before board specific support) | 5 | # Common support (must be linked before board specific support) |
6 | obj-y += clock.o devices.o generic.o irq.o dma.o \ | 6 | obj-y += clock.o devices.o generic.o irq.o dma.o \ |
7 | time.o gpio.o | 7 | time.o gpio.o |
8 | obj-$(CONFIG_PXA25x) += pxa25x.o mfp-pxa2xx.o | 8 | obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa25x.o |
9 | obj-$(CONFIG_PXA27x) += pxa27x.o mfp-pxa2xx.o | 9 | obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa27x.o |
10 | obj-$(CONFIG_PXA3xx) += pxa3xx.o mfp-pxa3xx.o smemc.o | 10 | obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o |
11 | obj-$(CONFIG_CPU_PXA300) += pxa300.o | 11 | obj-$(CONFIG_CPU_PXA300) += pxa300.o |
12 | obj-$(CONFIG_CPU_PXA320) += pxa320.o | 12 | obj-$(CONFIG_CPU_PXA320) += pxa320.o |
13 | 13 | ||
diff --git a/arch/arm/mach-pxa/gumstix.c b/arch/arm/mach-pxa/gumstix.c index f01d18544133..bdf239754037 100644 --- a/arch/arm/mach-pxa/gumstix.c +++ b/arch/arm/mach-pxa/gumstix.c | |||
@@ -40,6 +40,7 @@ | |||
40 | 40 | ||
41 | #include <asm/arch/pxa-regs.h> | 41 | #include <asm/arch/pxa-regs.h> |
42 | #include <asm/arch/pxa2xx-regs.h> | 42 | #include <asm/arch/pxa2xx-regs.h> |
43 | #include <asm/arch/pxa2xx-gpio.h> | ||
43 | 44 | ||
44 | #include "generic.h" | 45 | #include "generic.h" |
45 | 46 | ||
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index d70be75bd199..badba064dc04 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c | |||
@@ -114,6 +114,14 @@ static unsigned long magician_pin_config[] = { | |||
114 | GPIO82_CIF_DD_5, | 114 | GPIO82_CIF_DD_5, |
115 | GPIO84_CIF_FV, | 115 | GPIO84_CIF_FV, |
116 | GPIO85_CIF_LV, | 116 | GPIO85_CIF_LV, |
117 | |||
118 | /* Magician specific input GPIOs */ | ||
119 | GPIO9_GPIO, /* unknown */ | ||
120 | GPIO10_GPIO, /* GSM_IRQ */ | ||
121 | GPIO13_GPIO, /* CPLD_IRQ */ | ||
122 | GPIO107_GPIO, /* DS1WM_IRQ */ | ||
123 | GPIO108_GPIO, /* GSM_READY */ | ||
124 | GPIO115_GPIO, /* nPEN_IRQ */ | ||
117 | }; | 125 | }; |
118 | 126 | ||
119 | /* | 127 | /* |
@@ -438,7 +446,7 @@ static struct pasic3_led pasic3_leds[] = { | |||
438 | 446 | ||
439 | static struct platform_device pasic3; | 447 | static struct platform_device pasic3; |
440 | 448 | ||
441 | static struct pasic3_leds_machinfo __devinit pasic3_leds_info = { | 449 | static struct pasic3_leds_machinfo pasic3_leds_info = { |
442 | .num_leds = ARRAY_SIZE(pasic3_leds), | 450 | .num_leds = ARRAY_SIZE(pasic3_leds), |
443 | .power_gpio = EGPIO_MAGICIAN_LED_POWER, | 451 | .power_gpio = EGPIO_MAGICIAN_LED_POWER, |
444 | .leds = pasic3_leds, | 452 | .leds = pasic3_leds, |
@@ -543,9 +551,28 @@ static struct platform_device power_supply = { | |||
543 | static int magician_mci_init(struct device *dev, | 551 | static int magician_mci_init(struct device *dev, |
544 | irq_handler_t detect_irq, void *data) | 552 | irq_handler_t detect_irq, void *data) |
545 | { | 553 | { |
546 | return request_irq(IRQ_MAGICIAN_SD, detect_irq, | 554 | int err; |
555 | |||
556 | err = request_irq(IRQ_MAGICIAN_SD, detect_irq, | ||
547 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, | 557 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, |
548 | "MMC card detect", data); | 558 | "MMC card detect", data); |
559 | if (err) | ||
560 | goto err_request_irq; | ||
561 | err = gpio_request(EGPIO_MAGICIAN_SD_POWER, "SD_POWER"); | ||
562 | if (err) | ||
563 | goto err_request_power; | ||
564 | err = gpio_request(EGPIO_MAGICIAN_nSD_READONLY, "nSD_READONLY"); | ||
565 | if (err) | ||
566 | goto err_request_readonly; | ||
567 | |||
568 | return 0; | ||
569 | |||
570 | err_request_readonly: | ||
571 | gpio_free(EGPIO_MAGICIAN_SD_POWER); | ||
572 | err_request_power: | ||
573 | free_irq(IRQ_MAGICIAN_SD, data); | ||
574 | err_request_irq: | ||
575 | return err; | ||
549 | } | 576 | } |
550 | 577 | ||
551 | static void magician_mci_setpower(struct device *dev, unsigned int vdd) | 578 | static void magician_mci_setpower(struct device *dev, unsigned int vdd) |
@@ -562,6 +589,8 @@ static int magician_mci_get_ro(struct device *dev) | |||
562 | 589 | ||
563 | static void magician_mci_exit(struct device *dev, void *data) | 590 | static void magician_mci_exit(struct device *dev, void *data) |
564 | { | 591 | { |
592 | gpio_free(EGPIO_MAGICIAN_nSD_READONLY); | ||
593 | gpio_free(EGPIO_MAGICIAN_SD_POWER); | ||
565 | free_irq(IRQ_MAGICIAN_SD, data); | 594 | free_irq(IRQ_MAGICIAN_SD, data); |
566 | } | 595 | } |
567 | 596 | ||
@@ -643,28 +672,42 @@ static void __init magician_init(void) | |||
643 | { | 672 | { |
644 | void __iomem *cpld; | 673 | void __iomem *cpld; |
645 | int lcd_select; | 674 | int lcd_select; |
675 | int err; | ||
676 | |||
677 | gpio_request(GPIO13_MAGICIAN_CPLD_IRQ, "CPLD_IRQ"); | ||
678 | gpio_request(GPIO107_MAGICIAN_DS1WM_IRQ, "DS1WM_IRQ"); | ||
646 | 679 | ||
647 | pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config)); | 680 | pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config)); |
648 | 681 | ||
649 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 682 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
683 | |||
684 | err = gpio_request(GPIO83_MAGICIAN_nIR_EN, "nIR_EN"); | ||
685 | if (!err) { | ||
686 | gpio_direction_output(GPIO83_MAGICIAN_nIR_EN, 1); | ||
687 | pxa_set_ficp_info(&magician_ficp_info); | ||
688 | } | ||
650 | pxa_set_i2c_info(NULL); | 689 | pxa_set_i2c_info(NULL); |
651 | pxa_set_mci_info(&magician_mci_info); | 690 | pxa_set_mci_info(&magician_mci_info); |
652 | pxa_set_ohci_info(&magician_ohci_info); | 691 | pxa_set_ohci_info(&magician_ohci_info); |
653 | pxa_set_ficp_info(&magician_ficp_info); | ||
654 | 692 | ||
655 | /* Check LCD type we have */ | 693 | /* Check LCD type we have */ |
656 | cpld = ioremap_nocache(PXA_CS3_PHYS, 0x1000); | 694 | cpld = ioremap_nocache(PXA_CS3_PHYS, 0x1000); |
657 | if (cpld) { | 695 | if (cpld) { |
658 | u8 board_id = __raw_readb(cpld+0x14); | 696 | u8 board_id = __raw_readb(cpld+0x14); |
697 | iounmap(cpld); | ||
659 | system_rev = board_id & 0x7; | 698 | system_rev = board_id & 0x7; |
660 | lcd_select = board_id & 0x8; | 699 | lcd_select = board_id & 0x8; |
661 | iounmap(cpld); | ||
662 | pr_info("LCD type: %s\n", lcd_select ? "Samsung" : "Toppoly"); | 700 | pr_info("LCD type: %s\n", lcd_select ? "Samsung" : "Toppoly"); |
663 | if (lcd_select && (system_rev < 3)) | 701 | if (lcd_select && (system_rev < 3)) { |
664 | pxa_gpio_mode(GPIO75_MAGICIAN_SAMSUNG_POWER_MD); | 702 | gpio_request(GPIO75_MAGICIAN_SAMSUNG_POWER, "SAMSUNG_POWER"); |
665 | pxa_gpio_mode(GPIO104_MAGICIAN_LCD_POWER_1_MD); | 703 | gpio_direction_output(GPIO75_MAGICIAN_SAMSUNG_POWER, 0); |
666 | pxa_gpio_mode(GPIO105_MAGICIAN_LCD_POWER_2_MD); | 704 | } |
667 | pxa_gpio_mode(GPIO106_MAGICIAN_LCD_POWER_3_MD); | 705 | gpio_request(GPIO104_MAGICIAN_LCD_POWER_1, "LCD_POWER_1"); |
706 | gpio_request(GPIO105_MAGICIAN_LCD_POWER_2, "LCD_POWER_2"); | ||
707 | gpio_request(GPIO106_MAGICIAN_LCD_POWER_3, "LCD_POWER_3"); | ||
708 | gpio_direction_output(GPIO104_MAGICIAN_LCD_POWER_1, 0); | ||
709 | gpio_direction_output(GPIO105_MAGICIAN_LCD_POWER_2, 0); | ||
710 | gpio_direction_output(GPIO106_MAGICIAN_LCD_POWER_3, 0); | ||
668 | set_pxa_fb_info(lcd_select ? &samsung_info : &toppoly_info); | 711 | set_pxa_fb_info(lcd_select ? &samsung_info : &toppoly_info); |
669 | } else | 712 | } else |
670 | pr_err("LCD detection: CPLD mapping failed\n"); | 713 | pr_err("LCD detection: CPLD mapping failed\n"); |
diff --git a/arch/arm/mach-pxa/pm.c b/arch/arm/mach-pxa/pm.c index 039194cbe477..ec1bbf333a3a 100644 --- a/arch/arm/mach-pxa/pm.c +++ b/arch/arm/mach-pxa/pm.c | |||
@@ -46,8 +46,8 @@ int pxa_pm_enter(suspend_state_t state) | |||
46 | sleep_save_checksum += sleep_save[i]; | 46 | sleep_save_checksum += sleep_save[i]; |
47 | } | 47 | } |
48 | 48 | ||
49 | /* Clear sleep reset status */ | 49 | /* Clear reset status */ |
50 | RCSR = RCSR_SMR; | 50 | RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; |
51 | 51 | ||
52 | /* *** go zzz *** */ | 52 | /* *** go zzz *** */ |
53 | pxa_cpu_pm_fns->enter(state); | 53 | pxa_cpu_pm_fns->enter(state); |
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index dde355e88fa1..b6a6f5fcc77a 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -486,6 +486,8 @@ static int pxa3xx_set_wake(unsigned int irq, unsigned int on) | |||
486 | case IRQ_MMC3: | 486 | case IRQ_MMC3: |
487 | mask = ADXER_MFP_GEN12; | 487 | mask = ADXER_MFP_GEN12; |
488 | break; | 488 | break; |
489 | default: | ||
490 | return -EINVAL; | ||
489 | } | 491 | } |
490 | 492 | ||
491 | local_irq_save(flags); | 493 | local_irq_save(flags); |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 1b8229d9c9d5..33ed048502a3 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -372,7 +372,7 @@ config CPU_FEROCEON | |||
372 | select CPU_PABRT_NOIFAR | 372 | select CPU_PABRT_NOIFAR |
373 | select CPU_CACHE_VIVT | 373 | select CPU_CACHE_VIVT |
374 | select CPU_CP15_MMU | 374 | select CPU_CP15_MMU |
375 | select CPU_COPY_V4WB if MMU | 375 | select CPU_COPY_FEROCEON if MMU |
376 | select CPU_TLB_V4WBI if MMU | 376 | select CPU_TLB_V4WBI if MMU |
377 | 377 | ||
378 | config CPU_FEROCEON_OLD_ID | 378 | config CPU_FEROCEON_OLD_ID |
@@ -523,6 +523,9 @@ config CPU_COPY_V4WT | |||
523 | config CPU_COPY_V4WB | 523 | config CPU_COPY_V4WB |
524 | bool | 524 | bool |
525 | 525 | ||
526 | config CPU_COPY_FEROCEON | ||
527 | bool | ||
528 | |||
526 | config CPU_COPY_V6 | 529 | config CPU_COPY_V6 |
527 | bool | 530 | bool |
528 | 531 | ||
@@ -658,7 +661,7 @@ config CPU_DCACHE_SIZE | |||
658 | 661 | ||
659 | config CPU_DCACHE_WRITETHROUGH | 662 | config CPU_DCACHE_WRITETHROUGH |
660 | bool "Force write through D-cache" | 663 | bool "Force write through D-cache" |
661 | depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_FEROCEON) && !CPU_DCACHE_DISABLE | 664 | depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020) && !CPU_DCACHE_DISABLE |
662 | default y if CPU_ARM925T | 665 | default y if CPU_ARM925T |
663 | help | 666 | help |
664 | Say Y here to use the data cache in writethrough mode. Unless you | 667 | Say Y here to use the data cache in writethrough mode. Unless you |
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 44536a0b995a..32b2d2d213a6 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
@@ -36,6 +36,7 @@ obj-$(CONFIG_CPU_CACHE_V7) += cache-v7.o | |||
36 | obj-$(CONFIG_CPU_COPY_V3) += copypage-v3.o | 36 | obj-$(CONFIG_CPU_COPY_V3) += copypage-v3.o |
37 | obj-$(CONFIG_CPU_COPY_V4WT) += copypage-v4wt.o | 37 | obj-$(CONFIG_CPU_COPY_V4WT) += copypage-v4wt.o |
38 | obj-$(CONFIG_CPU_COPY_V4WB) += copypage-v4wb.o | 38 | obj-$(CONFIG_CPU_COPY_V4WB) += copypage-v4wb.o |
39 | obj-$(CONFIG_CPU_COPY_FEROCEON) += copypage-feroceon.o | ||
39 | obj-$(CONFIG_CPU_COPY_V6) += copypage-v6.o context.o | 40 | obj-$(CONFIG_CPU_COPY_V6) += copypage-v6.o context.o |
40 | obj-$(CONFIG_CPU_SA1100) += copypage-v4mc.o | 41 | obj-$(CONFIG_CPU_SA1100) += copypage-v4mc.o |
41 | obj-$(CONFIG_CPU_XSCALE) += copypage-xscale.o | 42 | obj-$(CONFIG_CPU_XSCALE) += copypage-xscale.o |
diff --git a/arch/arm/mm/copypage-feroceon.S b/arch/arm/mm/copypage-feroceon.S new file mode 100644 index 000000000000..7eb0d320d240 --- /dev/null +++ b/arch/arm/mm/copypage-feroceon.S | |||
@@ -0,0 +1,95 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/copypage-feroceon.S | ||
3 | * | ||
4 | * Copyright (C) 2008 Marvell Semiconductors | ||
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 | * This handles copy_user_page and clear_user_page on Feroceon | ||
11 | * more optimally than the generic implementations. | ||
12 | */ | ||
13 | #include <linux/linkage.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <asm/asm-offsets.h> | ||
16 | |||
17 | .text | ||
18 | .align 5 | ||
19 | |||
20 | ENTRY(feroceon_copy_user_page) | ||
21 | stmfd sp!, {r4-r9, lr} | ||
22 | mov ip, #PAGE_SZ | ||
23 | 1: mov lr, r1 | ||
24 | ldmia r1!, {r2 - r9} | ||
25 | pld [lr, #32] | ||
26 | pld [lr, #64] | ||
27 | pld [lr, #96] | ||
28 | pld [lr, #128] | ||
29 | pld [lr, #160] | ||
30 | pld [lr, #192] | ||
31 | pld [lr, #224] | ||
32 | stmia r0, {r2 - r9} | ||
33 | ldmia r1!, {r2 - r9} | ||
34 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
35 | add r0, r0, #32 | ||
36 | stmia r0, {r2 - r9} | ||
37 | ldmia r1!, {r2 - r9} | ||
38 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
39 | add r0, r0, #32 | ||
40 | stmia r0, {r2 - r9} | ||
41 | ldmia r1!, {r2 - r9} | ||
42 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
43 | add r0, r0, #32 | ||
44 | stmia r0, {r2 - r9} | ||
45 | ldmia r1!, {r2 - r9} | ||
46 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
47 | add r0, r0, #32 | ||
48 | stmia r0, {r2 - r9} | ||
49 | ldmia r1!, {r2 - r9} | ||
50 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
51 | add r0, r0, #32 | ||
52 | stmia r0, {r2 - r9} | ||
53 | ldmia r1!, {r2 - r9} | ||
54 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
55 | add r0, r0, #32 | ||
56 | stmia r0, {r2 - r9} | ||
57 | ldmia r1!, {r2 - r9} | ||
58 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
59 | add r0, r0, #32 | ||
60 | stmia r0, {r2 - r9} | ||
61 | subs ip, ip, #(32 * 8) | ||
62 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
63 | add r0, r0, #32 | ||
64 | bne 1b | ||
65 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | ||
66 | ldmfd sp!, {r4-r9, pc} | ||
67 | |||
68 | .align 5 | ||
69 | |||
70 | ENTRY(feroceon_clear_user_page) | ||
71 | stmfd sp!, {r4-r7, lr} | ||
72 | mov r1, #PAGE_SZ/32 | ||
73 | mov r2, #0 | ||
74 | mov r3, #0 | ||
75 | mov r4, #0 | ||
76 | mov r5, #0 | ||
77 | mov r6, #0 | ||
78 | mov r7, #0 | ||
79 | mov ip, #0 | ||
80 | mov lr, #0 | ||
81 | 1: stmia r0, {r2-r7, ip, lr} | ||
82 | subs r1, r1, #1 | ||
83 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line | ||
84 | add r0, r0, #32 | ||
85 | bne 1b | ||
86 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | ||
87 | ldmfd sp!, {r4-r7, pc} | ||
88 | |||
89 | __INITDATA | ||
90 | |||
91 | .type feroceon_user_fns, #object | ||
92 | ENTRY(feroceon_user_fns) | ||
93 | .long feroceon_clear_user_page | ||
94 | .long feroceon_copy_user_page | ||
95 | .size feroceon_user_fns, . - feroceon_user_fns | ||
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S index 90e7594e29b1..a02c1712b52d 100644 --- a/arch/arm/mm/proc-feroceon.S +++ b/arch/arm/mm/proc-feroceon.S | |||
@@ -93,7 +93,7 @@ ENTRY(cpu_feroceon_reset) | |||
93 | * | 93 | * |
94 | * Called with IRQs disabled | 94 | * Called with IRQs disabled |
95 | */ | 95 | */ |
96 | .align 10 | 96 | .align 5 |
97 | ENTRY(cpu_feroceon_do_idle) | 97 | ENTRY(cpu_feroceon_do_idle) |
98 | mov r0, #0 | 98 | mov r0, #0 |
99 | mcr p15, 0, r0, c7, c10, 4 @ Drain write buffer | 99 | mcr p15, 0, r0, c7, c10, 4 @ Drain write buffer |
@@ -106,6 +106,7 @@ ENTRY(cpu_feroceon_do_idle) | |||
106 | * Clean and invalidate all cache entries in a particular | 106 | * Clean and invalidate all cache entries in a particular |
107 | * address space. | 107 | * address space. |
108 | */ | 108 | */ |
109 | .align 5 | ||
109 | ENTRY(feroceon_flush_user_cache_all) | 110 | ENTRY(feroceon_flush_user_cache_all) |
110 | /* FALLTHROUGH */ | 111 | /* FALLTHROUGH */ |
111 | 112 | ||
@@ -118,12 +119,8 @@ ENTRY(feroceon_flush_kern_cache_all) | |||
118 | mov r2, #VM_EXEC | 119 | mov r2, #VM_EXEC |
119 | mov ip, #0 | 120 | mov ip, #0 |
120 | __flush_whole_cache: | 121 | __flush_whole_cache: |
121 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
122 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | ||
123 | #else | ||
124 | 1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate | 122 | 1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate |
125 | bne 1b | 123 | bne 1b |
126 | #endif | ||
127 | tst r2, #VM_EXEC | 124 | tst r2, #VM_EXEC |
128 | mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache | 125 | mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache |
129 | mcrne p15, 0, ip, c7, c10, 4 @ drain WB | 126 | mcrne p15, 0, ip, c7, c10, 4 @ drain WB |
@@ -139,27 +136,19 @@ __flush_whole_cache: | |||
139 | * - end - end address (exclusive) | 136 | * - end - end address (exclusive) |
140 | * - flags - vm_flags describing address space | 137 | * - flags - vm_flags describing address space |
141 | */ | 138 | */ |
139 | .align 5 | ||
142 | ENTRY(feroceon_flush_user_cache_range) | 140 | ENTRY(feroceon_flush_user_cache_range) |
143 | mov ip, #0 | 141 | mov ip, #0 |
144 | sub r3, r1, r0 @ calculate total size | 142 | sub r3, r1, r0 @ calculate total size |
145 | cmp r3, #CACHE_DLIMIT | 143 | cmp r3, #CACHE_DLIMIT |
146 | bgt __flush_whole_cache | 144 | bgt __flush_whole_cache |
147 | 1: tst r2, #VM_EXEC | 145 | 1: tst r2, #VM_EXEC |
148 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
149 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry | ||
150 | mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry | ||
151 | add r0, r0, #CACHE_DLINESIZE | ||
152 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry | ||
153 | mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry | ||
154 | add r0, r0, #CACHE_DLINESIZE | ||
155 | #else | ||
156 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry | 146 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry |
157 | mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry | 147 | mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry |
158 | add r0, r0, #CACHE_DLINESIZE | 148 | add r0, r0, #CACHE_DLINESIZE |
159 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry | 149 | mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry |
160 | mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry | 150 | mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry |
161 | add r0, r0, #CACHE_DLINESIZE | 151 | add r0, r0, #CACHE_DLINESIZE |
162 | #endif | ||
163 | cmp r0, r1 | 152 | cmp r0, r1 |
164 | blo 1b | 153 | blo 1b |
165 | tst r2, #VM_EXEC | 154 | tst r2, #VM_EXEC |
@@ -176,6 +165,7 @@ ENTRY(feroceon_flush_user_cache_range) | |||
176 | * - start - virtual start address | 165 | * - start - virtual start address |
177 | * - end - virtual end address | 166 | * - end - virtual end address |
178 | */ | 167 | */ |
168 | .align 5 | ||
179 | ENTRY(feroceon_coherent_kern_range) | 169 | ENTRY(feroceon_coherent_kern_range) |
180 | /* FALLTHROUGH */ | 170 | /* FALLTHROUGH */ |
181 | 171 | ||
@@ -207,6 +197,7 @@ ENTRY(feroceon_coherent_user_range) | |||
207 | * | 197 | * |
208 | * - addr - page aligned address | 198 | * - addr - page aligned address |
209 | */ | 199 | */ |
200 | .align 5 | ||
210 | ENTRY(feroceon_flush_kern_dcache_page) | 201 | ENTRY(feroceon_flush_kern_dcache_page) |
211 | add r1, r0, #PAGE_SZ | 202 | add r1, r0, #PAGE_SZ |
212 | 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry | 203 | 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry |
@@ -231,13 +222,12 @@ ENTRY(feroceon_flush_kern_dcache_page) | |||
231 | * | 222 | * |
232 | * (same as v4wb) | 223 | * (same as v4wb) |
233 | */ | 224 | */ |
225 | .align 5 | ||
234 | ENTRY(feroceon_dma_inv_range) | 226 | ENTRY(feroceon_dma_inv_range) |
235 | #ifndef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
236 | tst r0, #CACHE_DLINESIZE - 1 | 227 | tst r0, #CACHE_DLINESIZE - 1 |
237 | mcrne p15, 0, r0, c7, c10, 1 @ clean D entry | 228 | mcrne p15, 0, r0, c7, c10, 1 @ clean D entry |
238 | tst r1, #CACHE_DLINESIZE - 1 | 229 | tst r1, #CACHE_DLINESIZE - 1 |
239 | mcrne p15, 0, r1, c7, c10, 1 @ clean D entry | 230 | mcrne p15, 0, r1, c7, c10, 1 @ clean D entry |
240 | #endif | ||
241 | bic r0, r0, #CACHE_DLINESIZE - 1 | 231 | bic r0, r0, #CACHE_DLINESIZE - 1 |
242 | 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry | 232 | 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry |
243 | add r0, r0, #CACHE_DLINESIZE | 233 | add r0, r0, #CACHE_DLINESIZE |
@@ -256,14 +246,13 @@ ENTRY(feroceon_dma_inv_range) | |||
256 | * | 246 | * |
257 | * (same as v4wb) | 247 | * (same as v4wb) |
258 | */ | 248 | */ |
249 | .align 5 | ||
259 | ENTRY(feroceon_dma_clean_range) | 250 | ENTRY(feroceon_dma_clean_range) |
260 | #ifndef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
261 | bic r0, r0, #CACHE_DLINESIZE - 1 | 251 | bic r0, r0, #CACHE_DLINESIZE - 1 |
262 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 252 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
263 | add r0, r0, #CACHE_DLINESIZE | 253 | add r0, r0, #CACHE_DLINESIZE |
264 | cmp r0, r1 | 254 | cmp r0, r1 |
265 | blo 1b | 255 | blo 1b |
266 | #endif | ||
267 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 256 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
268 | mov pc, lr | 257 | mov pc, lr |
269 | 258 | ||
@@ -275,14 +264,10 @@ ENTRY(feroceon_dma_clean_range) | |||
275 | * - start - virtual start address | 264 | * - start - virtual start address |
276 | * - end - virtual end address | 265 | * - end - virtual end address |
277 | */ | 266 | */ |
267 | .align 5 | ||
278 | ENTRY(feroceon_dma_flush_range) | 268 | ENTRY(feroceon_dma_flush_range) |
279 | bic r0, r0, #CACHE_DLINESIZE - 1 | 269 | bic r0, r0, #CACHE_DLINESIZE - 1 |
280 | 1: | 270 | 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry |
281 | #ifndef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
282 | mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry | ||
283 | #else | ||
284 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | ||
285 | #endif | ||
286 | add r0, r0, #CACHE_DLINESIZE | 271 | add r0, r0, #CACHE_DLINESIZE |
287 | cmp r0, r1 | 272 | cmp r0, r1 |
288 | blo 1b | 273 | blo 1b |
@@ -300,13 +285,12 @@ ENTRY(feroceon_cache_fns) | |||
300 | .long feroceon_dma_clean_range | 285 | .long feroceon_dma_clean_range |
301 | .long feroceon_dma_flush_range | 286 | .long feroceon_dma_flush_range |
302 | 287 | ||
288 | .align 5 | ||
303 | ENTRY(cpu_feroceon_dcache_clean_area) | 289 | ENTRY(cpu_feroceon_dcache_clean_area) |
304 | #ifndef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
305 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 290 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
306 | add r0, r0, #CACHE_DLINESIZE | 291 | add r0, r0, #CACHE_DLINESIZE |
307 | subs r1, r1, #CACHE_DLINESIZE | 292 | subs r1, r1, #CACHE_DLINESIZE |
308 | bhi 1b | 293 | bhi 1b |
309 | #endif | ||
310 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 294 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
311 | mov pc, lr | 295 | mov pc, lr |
312 | 296 | ||
@@ -323,13 +307,9 @@ ENTRY(cpu_feroceon_dcache_clean_area) | |||
323 | ENTRY(cpu_feroceon_switch_mm) | 307 | ENTRY(cpu_feroceon_switch_mm) |
324 | #ifdef CONFIG_MMU | 308 | #ifdef CONFIG_MMU |
325 | mov ip, #0 | 309 | mov ip, #0 |
326 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
327 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | ||
328 | #else | ||
329 | @ && 'Clean & Invalidate whole DCache' | 310 | @ && 'Clean & Invalidate whole DCache' |
330 | 1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate | 311 | 1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate |
331 | bne 1b | 312 | bne 1b |
332 | #endif | ||
333 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache | 313 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache |
334 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 314 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
335 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 315 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
@@ -362,16 +342,9 @@ ENTRY(cpu_feroceon_set_pte_ext) | |||
362 | tst r1, #L_PTE_PRESENT | L_PTE_YOUNG @ Present and Young? | 342 | tst r1, #L_PTE_PRESENT | L_PTE_YOUNG @ Present and Young? |
363 | movne r2, #0 | 343 | movne r2, #0 |
364 | 344 | ||
365 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
366 | eor r3, r2, #0x0a @ C & small page? | ||
367 | tst r3, #0x0b | ||
368 | biceq r2, r2, #4 | ||
369 | #endif | ||
370 | str r2, [r0] @ hardware version | 345 | str r2, [r0] @ hardware version |
371 | mov r0, r0 | 346 | mov r0, r0 |
372 | #ifndef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
373 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 347 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
374 | #endif | ||
375 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 348 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
376 | #endif | 349 | #endif |
377 | mov pc, lr | 350 | mov pc, lr |
@@ -387,20 +360,11 @@ __feroceon_setup: | |||
387 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 360 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
388 | #endif | 361 | #endif |
389 | 362 | ||
390 | |||
391 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | ||
392 | mov r0, #4 @ disable write-back on caches explicitly | ||
393 | mcr p15, 7, r0, c15, c0, 0 | ||
394 | #endif | ||
395 | |||
396 | adr r5, feroceon_crval | 363 | adr r5, feroceon_crval |
397 | ldmia r5, {r5, r6} | 364 | ldmia r5, {r5, r6} |
398 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 365 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
399 | bic r0, r0, r5 | 366 | bic r0, r0, r5 |
400 | orr r0, r0, r6 | 367 | orr r0, r0, r6 |
401 | #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN | ||
402 | orr r0, r0, #0x4000 @ .1.. .... .... .... | ||
403 | #endif | ||
404 | mov pc, lr | 368 | mov pc, lr |
405 | .size __feroceon_setup, . - __feroceon_setup | 369 | .size __feroceon_setup, . - __feroceon_setup |
406 | 370 | ||
@@ -476,7 +440,7 @@ __feroceon_old_id_proc_info: | |||
476 | .long cpu_feroceon_name | 440 | .long cpu_feroceon_name |
477 | .long feroceon_processor_functions | 441 | .long feroceon_processor_functions |
478 | .long v4wbi_tlb_fns | 442 | .long v4wbi_tlb_fns |
479 | .long v4wb_user_fns | 443 | .long feroceon_user_fns |
480 | .long feroceon_cache_fns | 444 | .long feroceon_cache_fns |
481 | .size __feroceon_old_id_proc_info, . - __feroceon_old_id_proc_info | 445 | .size __feroceon_old_id_proc_info, . - __feroceon_old_id_proc_info |
482 | #endif | 446 | #endif |
@@ -502,6 +466,6 @@ __feroceon_proc_info: | |||
502 | .long cpu_feroceon_name | 466 | .long cpu_feroceon_name |
503 | .long feroceon_processor_functions | 467 | .long feroceon_processor_functions |
504 | .long v4wbi_tlb_fns | 468 | .long v4wbi_tlb_fns |
505 | .long v4wb_user_fns | 469 | .long feroceon_user_fns |
506 | .long feroceon_cache_fns | 470 | .long feroceon_cache_fns |
507 | .size __feroceon_proc_info, . - __feroceon_proc_info | 471 | .size __feroceon_proc_info, . - __feroceon_proc_info |
diff --git a/arch/arm/oprofile/op_model_mpcore.c b/arch/arm/oprofile/op_model_mpcore.c index 75bae067922d..74fae6045650 100644 --- a/arch/arm/oprofile/op_model_mpcore.c +++ b/arch/arm/oprofile/op_model_mpcore.c | |||
@@ -51,7 +51,7 @@ | |||
51 | /* | 51 | /* |
52 | * MPCore SCU event monitor support | 52 | * MPCore SCU event monitor support |
53 | */ | 53 | */ |
54 | #define SCU_EVENTMONITORS_VA_BASE __io_address(REALVIEW_MPCORE_SCU_BASE + 0x10) | 54 | #define SCU_EVENTMONITORS_VA_BASE __io_address(REALVIEW_EB11MP_SCU_BASE + 0x10) |
55 | 55 | ||
56 | /* | 56 | /* |
57 | * Bitmask of used SCU counters | 57 | * Bitmask of used SCU counters |
@@ -80,7 +80,7 @@ static irqreturn_t scu_em_interrupt(int irq, void *arg) | |||
80 | struct eventmonitor __iomem *emc = SCU_EVENTMONITORS_VA_BASE; | 80 | struct eventmonitor __iomem *emc = SCU_EVENTMONITORS_VA_BASE; |
81 | unsigned int cnt; | 81 | unsigned int cnt; |
82 | 82 | ||
83 | cnt = irq - IRQ_PMU_SCU0; | 83 | cnt = irq - IRQ_EB11MP_PMU_SCU0; |
84 | oprofile_add_sample(get_irq_regs(), SCU_COUNTER(cnt)); | 84 | oprofile_add_sample(get_irq_regs(), SCU_COUNTER(cnt)); |
85 | scu_reset_counter(emc, cnt); | 85 | scu_reset_counter(emc, cnt); |
86 | 86 | ||
@@ -119,10 +119,10 @@ static int scu_start(void) | |||
119 | */ | 119 | */ |
120 | for (i = 0; i < NUM_SCU_COUNTERS; i++) { | 120 | for (i = 0; i < NUM_SCU_COUNTERS; i++) { |
121 | if (scu_em_used & (1 << i)) { | 121 | if (scu_em_used & (1 << i)) { |
122 | ret = request_irq(IRQ_PMU_SCU0 + i, scu_em_interrupt, IRQF_DISABLED, "SCU PMU", NULL); | 122 | ret = request_irq(IRQ_EB11MP_PMU_SCU0 + i, scu_em_interrupt, IRQF_DISABLED, "SCU PMU", NULL); |
123 | if (ret) { | 123 | if (ret) { |
124 | printk(KERN_ERR "oprofile: unable to request IRQ%u for SCU Event Monitor\n", | 124 | printk(KERN_ERR "oprofile: unable to request IRQ%u for SCU Event Monitor\n", |
125 | IRQ_PMU_SCU0 + i); | 125 | IRQ_EB11MP_PMU_SCU0 + i); |
126 | goto err_free_scu; | 126 | goto err_free_scu; |
127 | } | 127 | } |
128 | } | 128 | } |
@@ -153,7 +153,7 @@ static int scu_start(void) | |||
153 | 153 | ||
154 | err_free_scu: | 154 | err_free_scu: |
155 | while (i--) | 155 | while (i--) |
156 | free_irq(IRQ_PMU_SCU0 + i, NULL); | 156 | free_irq(IRQ_EB11MP_PMU_SCU0 + i, NULL); |
157 | return ret; | 157 | return ret; |
158 | } | 158 | } |
159 | 159 | ||
@@ -175,7 +175,7 @@ static void scu_stop(void) | |||
175 | for (i = 0; i < NUM_SCU_COUNTERS; i++) { | 175 | for (i = 0; i < NUM_SCU_COUNTERS; i++) { |
176 | if (scu_em_used & (1 << i)) { | 176 | if (scu_em_used & (1 << i)) { |
177 | scu_reset_counter(emc, i); | 177 | scu_reset_counter(emc, i); |
178 | free_irq(IRQ_PMU_SCU0 + i, NULL); | 178 | free_irq(IRQ_EB11MP_PMU_SCU0 + i, NULL); |
179 | } | 179 | } |
180 | } | 180 | } |
181 | } | 181 | } |
@@ -225,10 +225,10 @@ static int em_setup_ctrs(void) | |||
225 | } | 225 | } |
226 | 226 | ||
227 | static int arm11_irqs[] = { | 227 | static int arm11_irqs[] = { |
228 | [0] = IRQ_PMU_CPU0, | 228 | [0] = IRQ_EB11MP_PMU_CPU0, |
229 | [1] = IRQ_PMU_CPU1, | 229 | [1] = IRQ_EB11MP_PMU_CPU1, |
230 | [2] = IRQ_PMU_CPU2, | 230 | [2] = IRQ_EB11MP_PMU_CPU2, |
231 | [3] = IRQ_PMU_CPU3 | 231 | [3] = IRQ_EB11MP_PMU_CPU3 |
232 | }; | 232 | }; |
233 | 233 | ||
234 | static int em_start(void) | 234 | static int em_start(void) |
@@ -273,22 +273,22 @@ static int em_setup(void) | |||
273 | /* | 273 | /* |
274 | * Send SCU PMU interrupts to the "owner" CPU. | 274 | * Send SCU PMU interrupts to the "owner" CPU. |
275 | */ | 275 | */ |
276 | em_route_irq(IRQ_PMU_SCU0, 0); | 276 | em_route_irq(IRQ_EB11MP_PMU_SCU0, 0); |
277 | em_route_irq(IRQ_PMU_SCU1, 0); | 277 | em_route_irq(IRQ_EB11MP_PMU_SCU1, 0); |
278 | em_route_irq(IRQ_PMU_SCU2, 1); | 278 | em_route_irq(IRQ_EB11MP_PMU_SCU2, 1); |
279 | em_route_irq(IRQ_PMU_SCU3, 1); | 279 | em_route_irq(IRQ_EB11MP_PMU_SCU3, 1); |
280 | em_route_irq(IRQ_PMU_SCU4, 2); | 280 | em_route_irq(IRQ_EB11MP_PMU_SCU4, 2); |
281 | em_route_irq(IRQ_PMU_SCU5, 2); | 281 | em_route_irq(IRQ_EB11MP_PMU_SCU5, 2); |
282 | em_route_irq(IRQ_PMU_SCU6, 3); | 282 | em_route_irq(IRQ_EB11MP_PMU_SCU6, 3); |
283 | em_route_irq(IRQ_PMU_SCU7, 3); | 283 | em_route_irq(IRQ_EB11MP_PMU_SCU7, 3); |
284 | 284 | ||
285 | /* | 285 | /* |
286 | * Send CP15 PMU interrupts to the owner CPU. | 286 | * Send CP15 PMU interrupts to the owner CPU. |
287 | */ | 287 | */ |
288 | em_route_irq(IRQ_PMU_CPU0, 0); | 288 | em_route_irq(IRQ_EB11MP_PMU_CPU0, 0); |
289 | em_route_irq(IRQ_PMU_CPU1, 1); | 289 | em_route_irq(IRQ_EB11MP_PMU_CPU1, 1); |
290 | em_route_irq(IRQ_PMU_CPU2, 2); | 290 | em_route_irq(IRQ_EB11MP_PMU_CPU2, 2); |
291 | em_route_irq(IRQ_PMU_CPU3, 3); | 291 | em_route_irq(IRQ_EB11MP_PMU_CPU3, 3); |
292 | 292 | ||
293 | return 0; | 293 | return 0; |
294 | } | 294 | } |