diff options
126 files changed, 1361 insertions, 507 deletions
diff --git a/Documentation/hwmon/sysfs-interface b/Documentation/hwmon/sysfs-interface index dcbd502c8792..82def883361b 100644 --- a/Documentation/hwmon/sysfs-interface +++ b/Documentation/hwmon/sysfs-interface | |||
| @@ -353,10 +353,20 @@ power[1-*]_average Average power use | |||
| 353 | Unit: microWatt | 353 | Unit: microWatt |
| 354 | RO | 354 | RO |
| 355 | 355 | ||
| 356 | power[1-*]_average_interval Power use averaging interval | 356 | power[1-*]_average_interval Power use averaging interval. A poll |
| 357 | notification is sent to this file if the | ||
| 358 | hardware changes the averaging interval. | ||
| 357 | Unit: milliseconds | 359 | Unit: milliseconds |
| 358 | RW | 360 | RW |
| 359 | 361 | ||
| 362 | power[1-*]_average_interval_max Maximum power use averaging interval | ||
| 363 | Unit: milliseconds | ||
| 364 | RO | ||
| 365 | |||
| 366 | power[1-*]_average_interval_min Minimum power use averaging interval | ||
| 367 | Unit: milliseconds | ||
| 368 | RO | ||
| 369 | |||
| 360 | power[1-*]_average_highest Historical average maximum power use | 370 | power[1-*]_average_highest Historical average maximum power use |
| 361 | Unit: microWatt | 371 | Unit: microWatt |
| 362 | RO | 372 | RO |
| @@ -365,6 +375,18 @@ power[1-*]_average_lowest Historical average minimum power use | |||
| 365 | Unit: microWatt | 375 | Unit: microWatt |
| 366 | RO | 376 | RO |
| 367 | 377 | ||
| 378 | power[1-*]_average_max A poll notification is sent to | ||
| 379 | power[1-*]_average when power use | ||
| 380 | rises above this value. | ||
| 381 | Unit: microWatt | ||
| 382 | RW | ||
| 383 | |||
| 384 | power[1-*]_average_min A poll notification is sent to | ||
| 385 | power[1-*]_average when power use | ||
| 386 | sinks below this value. | ||
| 387 | Unit: microWatt | ||
| 388 | RW | ||
| 389 | |||
| 368 | power[1-*]_input Instantaneous power use | 390 | power[1-*]_input Instantaneous power use |
| 369 | Unit: microWatt | 391 | Unit: microWatt |
| 370 | RO | 392 | RO |
| @@ -381,6 +403,39 @@ power[1-*]_reset_history Reset input_highest, input_lowest, | |||
| 381 | average_highest and average_lowest. | 403 | average_highest and average_lowest. |
| 382 | WO | 404 | WO |
| 383 | 405 | ||
| 406 | power[1-*]_accuracy Accuracy of the power meter. | ||
| 407 | Unit: Percent | ||
| 408 | RO | ||
| 409 | |||
| 410 | power[1-*]_alarm 1 if the system is drawing more power than the | ||
| 411 | cap allows; 0 otherwise. A poll notification is | ||
| 412 | sent to this file when the power use exceeds the | ||
| 413 | cap. This file only appears if the cap is known | ||
| 414 | to be enforced by hardware. | ||
| 415 | RO | ||
| 416 | |||
| 417 | power[1-*]_cap If power use rises above this limit, the | ||
| 418 | system should take action to reduce power use. | ||
| 419 | A poll notification is sent to this file if the | ||
| 420 | cap is changed by the hardware. The *_cap | ||
| 421 | files only appear if the cap is known to be | ||
| 422 | enforced by hardware. | ||
| 423 | Unit: microWatt | ||
| 424 | RW | ||
| 425 | |||
| 426 | power[1-*]_cap_hyst Margin of hysteresis built around capping and | ||
| 427 | notification. | ||
| 428 | Unit: microWatt | ||
| 429 | RW | ||
| 430 | |||
| 431 | power[1-*]_cap_max Maximum cap that can be set. | ||
| 432 | Unit: microWatt | ||
| 433 | RO | ||
| 434 | |||
| 435 | power[1-*]_cap_min Minimum cap that can be set. | ||
| 436 | Unit: microWatt | ||
| 437 | RO | ||
| 438 | |||
| 384 | ********** | 439 | ********** |
| 385 | * Energy * | 440 | * Energy * |
| 386 | ********** | 441 | ********** |
diff --git a/Documentation/vm/hwpoison.txt b/Documentation/vm/hwpoison.txt new file mode 100644 index 000000000000..3ffadf8da61f --- /dev/null +++ b/Documentation/vm/hwpoison.txt | |||
| @@ -0,0 +1,136 @@ | |||
| 1 | What is hwpoison? | ||
| 2 | |||
| 3 | Upcoming Intel CPUs have support for recovering from some memory errors | ||
| 4 | (``MCA recovery''). This requires the OS to declare a page "poisoned", | ||
| 5 | kill the processes associated with it and avoid using it in the future. | ||
| 6 | |||
| 7 | This patchkit implements the necessary infrastructure in the VM. | ||
| 8 | |||
| 9 | To quote the overview comment: | ||
| 10 | |||
| 11 | * High level machine check handler. Handles pages reported by the | ||
| 12 | * hardware as being corrupted usually due to a 2bit ECC memory or cache | ||
| 13 | * failure. | ||
| 14 | * | ||
| 15 | * This focusses on pages detected as corrupted in the background. | ||
| 16 | * When the current CPU tries to consume corruption the currently | ||
| 17 | * running process can just be killed directly instead. This implies | ||
| 18 | * that if the error cannot be handled for some reason it's safe to | ||
| 19 | * just ignore it because no corruption has been consumed yet. Instead | ||
| 20 | * when that happens another machine check will happen. | ||
| 21 | * | ||
| 22 | * Handles page cache pages in various states. The tricky part | ||
| 23 | * here is that we can access any page asynchronous to other VM | ||
| 24 | * users, because memory failures could happen anytime and anywhere, | ||
| 25 | * possibly violating some of their assumptions. This is why this code | ||
| 26 | * has to be extremely careful. Generally it tries to use normal locking | ||
| 27 | * rules, as in get the standard locks, even if that means the | ||
| 28 | * error handling takes potentially a long time. | ||
| 29 | * | ||
| 30 | * Some of the operations here are somewhat inefficient and have non | ||
| 31 | * linear algorithmic complexity, because the data structures have not | ||
| 32 | * been optimized for this case. This is in particular the case | ||
| 33 | * for the mapping from a vma to a process. Since this case is expected | ||
| 34 | * to be rare we hope we can get away with this. | ||
| 35 | |||
| 36 | The code consists of a the high level handler in mm/memory-failure.c, | ||
| 37 | a new page poison bit and various checks in the VM to handle poisoned | ||
| 38 | pages. | ||
| 39 | |||
| 40 | The main target right now is KVM guests, but it works for all kinds | ||
| 41 | of applications. KVM support requires a recent qemu-kvm release. | ||
| 42 | |||
| 43 | For the KVM use there was need for a new signal type so that | ||
| 44 | KVM can inject the machine check into the guest with the proper | ||
| 45 | address. This in theory allows other applications to handle | ||
| 46 | memory failures too. The expection is that near all applications | ||
| 47 | won't do that, but some very specialized ones might. | ||
| 48 | |||
| 49 | --- | ||
| 50 | |||
| 51 | There are two (actually three) modi memory failure recovery can be in: | ||
| 52 | |||
| 53 | vm.memory_failure_recovery sysctl set to zero: | ||
| 54 | All memory failures cause a panic. Do not attempt recovery. | ||
| 55 | (on x86 this can be also affected by the tolerant level of the | ||
| 56 | MCE subsystem) | ||
| 57 | |||
| 58 | early kill | ||
| 59 | (can be controlled globally and per process) | ||
| 60 | Send SIGBUS to the application as soon as the error is detected | ||
| 61 | This allows applications who can process memory errors in a gentle | ||
| 62 | way (e.g. drop affected object) | ||
| 63 | This is the mode used by KVM qemu. | ||
| 64 | |||
| 65 | late kill | ||
| 66 | Send SIGBUS when the application runs into the corrupted page. | ||
| 67 | This is best for memory error unaware applications and default | ||
| 68 | Note some pages are always handled as late kill. | ||
| 69 | |||
| 70 | --- | ||
| 71 | |||
| 72 | User control: | ||
| 73 | |||
| 74 | vm.memory_failure_recovery | ||
| 75 | See sysctl.txt | ||
| 76 | |||
| 77 | vm.memory_failure_early_kill | ||
| 78 | Enable early kill mode globally | ||
| 79 | |||
| 80 | PR_MCE_KILL | ||
| 81 | Set early/late kill mode/revert to system default | ||
| 82 | arg1: PR_MCE_KILL_CLEAR: Revert to system default | ||
| 83 | arg1: PR_MCE_KILL_SET: arg2 defines thread specific mode | ||
| 84 | PR_MCE_KILL_EARLY: Early kill | ||
| 85 | PR_MCE_KILL_LATE: Late kill | ||
| 86 | PR_MCE_KILL_DEFAULT: Use system global default | ||
| 87 | PR_MCE_KILL_GET | ||
| 88 | return current mode | ||
| 89 | |||
| 90 | |||
| 91 | --- | ||
| 92 | |||
| 93 | Testing: | ||
| 94 | |||
| 95 | madvise(MADV_POISON, ....) | ||
| 96 | (as root) | ||
| 97 | Poison a page in the process for testing | ||
| 98 | |||
| 99 | |||
| 100 | hwpoison-inject module through debugfs | ||
| 101 | /sys/debug/hwpoison/corrupt-pfn | ||
| 102 | |||
| 103 | Inject hwpoison fault at PFN echoed into this file | ||
| 104 | |||
| 105 | |||
| 106 | Architecture specific MCE injector | ||
| 107 | |||
| 108 | x86 has mce-inject, mce-test | ||
| 109 | |||
| 110 | Some portable hwpoison test programs in mce-test, see blow. | ||
| 111 | |||
| 112 | --- | ||
| 113 | |||
| 114 | References: | ||
| 115 | |||
| 116 | http://halobates.de/mce-lc09-2.pdf | ||
| 117 | Overview presentation from LinuxCon 09 | ||
| 118 | |||
| 119 | git://git.kernel.org/pub/scm/utils/cpu/mce/mce-test.git | ||
| 120 | Test suite (hwpoison specific portable tests in tsrc) | ||
| 121 | |||
| 122 | git://git.kernel.org/pub/scm/utils/cpu/mce/mce-inject.git | ||
| 123 | x86 specific injector | ||
| 124 | |||
| 125 | |||
| 126 | --- | ||
| 127 | |||
| 128 | Limitations: | ||
| 129 | |||
| 130 | - Not all page types are supported and never will. Most kernel internal | ||
| 131 | objects cannot be recovered, only LRU pages for now. | ||
| 132 | - Right now hugepage support is missing. | ||
| 133 | |||
| 134 | --- | ||
| 135 | Andi Kleen, Oct 2009 | ||
| 136 | |||
diff --git a/MAINTAINERS b/MAINTAINERS index 88241154f4ce..a1a2aceca5bd 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -65,43 +65,51 @@ trivial patch so apply some common sense. | |||
| 65 | 65 | ||
| 66 | 8. Happy hacking. | 66 | 8. Happy hacking. |
| 67 | 67 | ||
| 68 | ----------------------------------- | 68 | Descriptions of section entries: |
| 69 | 69 | ||
| 70 | Maintainers List (try to look for most precise areas first) | 70 | P: Person (obsolete) |
| 71 | M: Mail patches to: FullName <address@domain> | ||
| 72 | L: Mailing list that is relevant to this area | ||
| 73 | W: Web-page with status/info | ||
| 74 | T: SCM tree type and location. Type is one of: git, hg, quilt, stgit. | ||
| 75 | S: Status, one of the following: | ||
| 76 | Supported: Someone is actually paid to look after this. | ||
| 77 | Maintained: Someone actually looks after it. | ||
| 78 | Odd Fixes: It has a maintainer but they don't have time to do | ||
| 79 | much other than throw the odd patch in. See below.. | ||
| 80 | Orphan: No current maintainer [but maybe you could take the | ||
| 81 | role as you write your new code]. | ||
| 82 | Obsolete: Old code. Something tagged obsolete generally means | ||
| 83 | it has been replaced by a better system and you | ||
| 84 | should be using that. | ||
| 85 | F: Files and directories with wildcard patterns. | ||
| 86 | A trailing slash includes all files and subdirectory files. | ||
| 87 | F: drivers/net/ all files in and below drivers/net | ||
| 88 | F: drivers/net/* all files in drivers/net, but not below | ||
| 89 | F: */net/* all files in "any top level directory"/net | ||
| 90 | One pattern per line. Multiple F: lines acceptable. | ||
| 91 | X: Files and directories that are NOT maintained, same rules as F: | ||
| 92 | Files exclusions are tested before file matches. | ||
| 93 | Can be useful for excluding a specific subdirectory, for instance: | ||
| 94 | F: net/ | ||
| 95 | X: net/ipv6/ | ||
| 96 | matches all files in and below net excluding net/ipv6/ | ||
| 97 | K: Keyword perl extended regex pattern to match content in a | ||
| 98 | patch or file. For instance: | ||
| 99 | K: of_get_profile | ||
| 100 | matches patches or files that contain "of_get_profile" | ||
| 101 | K: \b(printk|pr_(info|err))\b | ||
| 102 | matches patches or files that contain one or more of the words | ||
| 103 | printk, pr_info or pr_err | ||
| 104 | One regex pattern per line. Multiple K: lines acceptable. | ||
| 71 | 105 | ||
| 72 | Note: For the hard of thinking, this list is meant to remain in alphabetical | 106 | Note: For the hard of thinking, this list is meant to remain in alphabetical |
| 73 | order. If you could add yourselves to it in alphabetical order that would be | 107 | order. If you could add yourselves to it in alphabetical order that would be |
| 74 | so much easier [Ed] | 108 | so much easier [Ed] |
| 75 | 109 | ||
| 76 | P: Person (obsolete) | 110 | Maintainers List (try to look for most precise areas first) |
| 77 | M: Mail patches to: FullName <address@domain> | ||
| 78 | L: Mailing list that is relevant to this area | ||
| 79 | W: Web-page with status/info | ||
| 80 | T: SCM tree type and location. Type is one of: git, hg, quilt, stgit. | ||
| 81 | S: Status, one of the following: | ||
| 82 | |||
| 83 | Supported: Someone is actually paid to look after this. | ||
| 84 | Maintained: Someone actually looks after it. | ||
| 85 | Odd Fixes: It has a maintainer but they don't have time to do | ||
| 86 | much other than throw the odd patch in. See below.. | ||
| 87 | Orphan: No current maintainer [but maybe you could take the | ||
| 88 | role as you write your new code]. | ||
| 89 | Obsolete: Old code. Something tagged obsolete generally means | ||
| 90 | it has been replaced by a better system and you | ||
| 91 | should be using that. | ||
| 92 | 111 | ||
| 93 | F: Files and directories with wildcard patterns. | 112 | ----------------------------------- |
| 94 | A trailing slash includes all files and subdirectory files. | ||
| 95 | F: drivers/net/ all files in and below drivers/net | ||
| 96 | F: drivers/net/* all files in drivers/net, but not below | ||
| 97 | F: */net/* all files in "any top level directory"/net | ||
| 98 | One pattern per line. Multiple F: lines acceptable. | ||
| 99 | X: Files and directories that are NOT maintained, same rules as F: | ||
| 100 | Files exclusions are tested before file matches. | ||
| 101 | Can be useful for excluding a specific subdirectory, for instance: | ||
| 102 | F: net/ | ||
| 103 | X: net/ipv6/ | ||
| 104 | matches all files in and below net excluding net/ipv6/ | ||
| 105 | 113 | ||
| 106 | 3C505 NETWORK DRIVER | 114 | 3C505 NETWORK DRIVER |
| 107 | M: Philip Blundell <philb@gnu.org> | 115 | M: Philip Blundell <philb@gnu.org> |
| @@ -992,7 +1000,7 @@ F: drivers/net/atlx/ | |||
| 992 | 1000 | ||
| 993 | ATM | 1001 | ATM |
| 994 | M: Chas Williams <chas@cmf.nrl.navy.mil> | 1002 | M: Chas Williams <chas@cmf.nrl.navy.mil> |
| 995 | L: linux-atm-general@lists.sourceforge.net (subscribers-only) | 1003 | L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers) |
| 996 | L: netdev@vger.kernel.org | 1004 | L: netdev@vger.kernel.org |
| 997 | W: http://linux-atm.sourceforge.net | 1005 | W: http://linux-atm.sourceforge.net |
| 998 | S: Maintained | 1006 | S: Maintained |
| @@ -1480,6 +1488,7 @@ F: mm/*cgroup* | |||
| 1480 | 1488 | ||
| 1481 | CORETEMP HARDWARE MONITORING DRIVER | 1489 | CORETEMP HARDWARE MONITORING DRIVER |
| 1482 | M: Rudolf Marek <r.marek@assembler.cz> | 1490 | M: Rudolf Marek <r.marek@assembler.cz> |
| 1491 | M: Huaxu Wan <huaxu.wan@intel.com> | ||
| 1483 | L: lm-sensors@lm-sensors.org | 1492 | L: lm-sensors@lm-sensors.org |
| 1484 | S: Maintained | 1493 | S: Maintained |
| 1485 | F: Documentation/hwmon/coretemp | 1494 | F: Documentation/hwmon/coretemp |
| @@ -2151,7 +2160,7 @@ S: Supported | |||
| 2151 | F: arch/powerpc/sysdev/qe_lib/ | 2160 | F: arch/powerpc/sysdev/qe_lib/ |
| 2152 | F: arch/powerpc/include/asm/*qe.h | 2161 | F: arch/powerpc/include/asm/*qe.h |
| 2153 | 2162 | ||
| 2154 | FREESCALE USB PERIPHERIAL DRIVERS | 2163 | FREESCALE USB PERIPHERAL DRIVERS |
| 2155 | M: Li Yang <leoli@freescale.com> | 2164 | M: Li Yang <leoli@freescale.com> |
| 2156 | L: linux-usb@vger.kernel.org | 2165 | L: linux-usb@vger.kernel.org |
| 2157 | L: linuxppc-dev@ozlabs.org | 2166 | L: linuxppc-dev@ozlabs.org |
| @@ -2202,18 +2211,6 @@ F: Documentation/filesystems/caching/ | |||
| 2202 | F: fs/fscache/ | 2211 | F: fs/fscache/ |
| 2203 | F: include/linux/fscache*.h | 2212 | F: include/linux/fscache*.h |
| 2204 | 2213 | ||
| 2205 | TRACING | ||
| 2206 | M: Steven Rostedt <rostedt@goodmis.org> | ||
| 2207 | M: Frederic Weisbecker <fweisbec@gmail.com> | ||
| 2208 | M: Ingo Molnar <mingo@redhat.com> | ||
| 2209 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git tracing/core | ||
| 2210 | S: Maintained | ||
| 2211 | F: Documentation/trace/ftrace.txt | ||
| 2212 | F: arch/*/*/*/ftrace.h | ||
| 2213 | F: arch/*/kernel/ftrace.c | ||
| 2214 | F: include/*/ftrace.h include/trace/ include/linux/trace*.h | ||
| 2215 | F: kernel/trace/ | ||
| 2216 | |||
| 2217 | FUJITSU FR-V (FRV) PORT | 2214 | FUJITSU FR-V (FRV) PORT |
| 2218 | M: David Howells <dhowells@redhat.com> | 2215 | M: David Howells <dhowells@redhat.com> |
| 2219 | S: Maintained | 2216 | S: Maintained |
| @@ -2272,9 +2269,8 @@ S: Maintained | |||
| 2272 | F: include/asm-generic | 2269 | F: include/asm-generic |
| 2273 | 2270 | ||
| 2274 | GENERIC UIO DRIVER FOR PCI DEVICES | 2271 | GENERIC UIO DRIVER FOR PCI DEVICES |
| 2275 | M: Michael S. Tsirkin <mst@redhat.com> | 2272 | M: "Michael S. Tsirkin" <mst@redhat.com> |
| 2276 | L: kvm@vger.kernel.org | 2273 | L: kvm@vger.kernel.org |
| 2277 | L: linux-kernel@vger.kernel.org | ||
| 2278 | S: Supported | 2274 | S: Supported |
| 2279 | F: drivers/uio/uio_pci_generic.c | 2275 | F: drivers/uio/uio_pci_generic.c |
| 2280 | 2276 | ||
| @@ -3004,8 +3000,8 @@ F: scripts/Makefile.* | |||
| 3004 | 3000 | ||
| 3005 | KERNEL JANITORS | 3001 | KERNEL JANITORS |
| 3006 | L: kernel-janitors@vger.kernel.org | 3002 | L: kernel-janitors@vger.kernel.org |
| 3007 | W: http://www.kerneljanitors.org/ | 3003 | W: http://janitor.kernelnewbies.org/ |
| 3008 | S: Maintained | 3004 | S: Odd Fixes |
| 3009 | 3005 | ||
| 3010 | KERNEL NFSD, SUNRPC, AND LOCKD SERVERS | 3006 | KERNEL NFSD, SUNRPC, AND LOCKD SERVERS |
| 3011 | M: "J. Bruce Fields" <bfields@fieldses.org> | 3007 | M: "J. Bruce Fields" <bfields@fieldses.org> |
| @@ -3785,7 +3781,7 @@ F: drivers/video/riva/ | |||
| 3785 | F: drivers/video/nvidia/ | 3781 | F: drivers/video/nvidia/ |
| 3786 | 3782 | ||
| 3787 | OMAP SUPPORT | 3783 | OMAP SUPPORT |
| 3788 | M: "Tony Lindgren <tony@atomide.com>" <tony@atomide.com> | 3784 | M: Tony Lindgren <tony@atomide.com> |
| 3789 | L: linux-omap@vger.kernel.org | 3785 | L: linux-omap@vger.kernel.org |
| 3790 | W: http://www.muru.com/linux/omap/ | 3786 | W: http://www.muru.com/linux/omap/ |
| 3791 | W: http://linux.omap.com/ | 3787 | W: http://linux.omap.com/ |
| @@ -3890,6 +3886,15 @@ S: Maintained | |||
| 3890 | F: Documentation/i2c/busses/i2c-ocores | 3886 | F: Documentation/i2c/busses/i2c-ocores |
| 3891 | F: drivers/i2c/busses/i2c-ocores.c | 3887 | F: drivers/i2c/busses/i2c-ocores.c |
| 3892 | 3888 | ||
| 3889 | OPEN FIRMWARE AND FLATTENED DEVICE TREE | ||
| 3890 | M: Grant Likely <grant.likely@secretlab.ca> | ||
| 3891 | L: devicetree-discuss@lists.ozlabs.org | ||
| 3892 | W: http://fdt.secretlab.ca | ||
| 3893 | S: Maintained | ||
| 3894 | F: drivers/of | ||
| 3895 | F: include/linux/of*.h | ||
| 3896 | K: of_get_property | ||
| 3897 | |||
| 3893 | OPROFILE | 3898 | OPROFILE |
| 3894 | M: Robert Richter <robert.richter@amd.com> | 3899 | M: Robert Richter <robert.richter@amd.com> |
| 3895 | L: oprofile-list@lists.sf.net | 3900 | L: oprofile-list@lists.sf.net |
| @@ -4325,7 +4330,7 @@ F: drivers/video/aty/aty128fb.c | |||
| 4325 | RALINK RT2X00 WIRELESS LAN DRIVER | 4330 | RALINK RT2X00 WIRELESS LAN DRIVER |
| 4326 | P: rt2x00 project | 4331 | P: rt2x00 project |
| 4327 | L: linux-wireless@vger.kernel.org | 4332 | L: linux-wireless@vger.kernel.org |
| 4328 | L: users@rt2x00.serialmonkey.com | 4333 | L: users@rt2x00.serialmonkey.com (moderated for non-subscribers) |
| 4329 | W: http://rt2x00.serialmonkey.com/ | 4334 | W: http://rt2x00.serialmonkey.com/ |
| 4330 | S: Maintained | 4335 | S: Maintained |
| 4331 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git | 4336 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git |
| @@ -4534,12 +4539,11 @@ F: kernel/sched* | |||
| 4534 | F: include/linux/sched.h | 4539 | F: include/linux/sched.h |
| 4535 | 4540 | ||
| 4536 | SCORE ARCHITECTURE | 4541 | SCORE ARCHITECTURE |
| 4537 | P: Chen Liqin | 4542 | M: Chen Liqin <liqin.chen@sunplusct.com> |
| 4538 | M: liqin.chen@sunplusct.com | 4543 | M: Lennox Wu <lennox.wu@gmail.com> |
| 4539 | P: Lennox Wu | ||
| 4540 | M: lennox.wu@gmail.com | ||
| 4541 | W: http://www.sunplusct.com | 4544 | W: http://www.sunplusct.com |
| 4542 | S: Supported | 4545 | S: Supported |
| 4546 | F: arch/score/ | ||
| 4543 | 4547 | ||
| 4544 | SCSI CDROM DRIVER | 4548 | SCSI CDROM DRIVER |
| 4545 | M: Jens Axboe <axboe@kernel.dk> | 4549 | M: Jens Axboe <axboe@kernel.dk> |
| @@ -4612,20 +4616,20 @@ S: Maintained | |||
| 4612 | F: drivers/mmc/host/sdricoh_cs.c | 4616 | F: drivers/mmc/host/sdricoh_cs.c |
| 4613 | 4617 | ||
| 4614 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER | 4618 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER |
| 4615 | S: Orphan | 4619 | S: Orphan |
| 4616 | L: linux-mmc@vger.kernel.org | 4620 | L: linux-mmc@vger.kernel.org |
| 4617 | F: drivers/mmc/host/sdhci.* | 4621 | F: drivers/mmc/host/sdhci.* |
| 4618 | 4622 | ||
| 4619 | SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) | 4623 | SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) |
| 4620 | M: Anton Vorontsov <avorontsov@ru.mvista.com> | 4624 | M: Anton Vorontsov <avorontsov@ru.mvista.com> |
| 4621 | L: linuxppc-dev@ozlabs.org | 4625 | L: linuxppc-dev@ozlabs.org |
| 4622 | L: linux-mmc@vger.kernel.org | 4626 | L: linux-mmc@vger.kernel.org |
| 4623 | S: Maintained | 4627 | S: Maintained |
| 4624 | F: drivers/mmc/host/sdhci-of.* | 4628 | F: drivers/mmc/host/sdhci-of.* |
| 4625 | 4629 | ||
| 4626 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER | 4630 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER |
| 4627 | M: Ben Dooks <ben-linux@fluff.org> | 4631 | M: Ben Dooks <ben-linux@fluff.org> |
| 4628 | L: linux-mmc@vger.kernel.org | 4632 | L: linux-mmc@vger.kernel.org |
| 4629 | S: Maintained | 4633 | S: Maintained |
| 4630 | F: drivers/mmc/host/sdhci-s3c.c | 4634 | F: drivers/mmc/host/sdhci-s3c.c |
| 4631 | 4635 | ||
| @@ -4728,8 +4732,7 @@ F: drivers/usb/gadget/lh7a40* | |||
| 4728 | F: drivers/usb/host/ohci-lh7a40* | 4732 | F: drivers/usb/host/ohci-lh7a40* |
| 4729 | 4733 | ||
| 4730 | SIMPLE FIRMWARE INTERFACE (SFI) | 4734 | SIMPLE FIRMWARE INTERFACE (SFI) |
| 4731 | P: Len Brown | 4735 | M: Len Brown <lenb@kernel.org> |
| 4732 | M: lenb@kernel.org | ||
| 4733 | L: sfi-devel@simplefirmware.org | 4736 | L: sfi-devel@simplefirmware.org |
| 4734 | W: http://simplefirmware.org/ | 4737 | W: http://simplefirmware.org/ |
| 4735 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git | 4738 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git |
| @@ -5177,6 +5180,20 @@ L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers) | |||
| 5177 | S: Maintained | 5180 | S: Maintained |
| 5178 | F: drivers/char/tpm/ | 5181 | F: drivers/char/tpm/ |
| 5179 | 5182 | ||
| 5183 | TRACING | ||
| 5184 | M: Steven Rostedt <rostedt@goodmis.org> | ||
| 5185 | M: Frederic Weisbecker <fweisbec@gmail.com> | ||
| 5186 | M: Ingo Molnar <mingo@redhat.com> | ||
| 5187 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git tracing/core | ||
| 5188 | S: Maintained | ||
| 5189 | F: Documentation/trace/ftrace.txt | ||
| 5190 | F: arch/*/*/*/ftrace.h | ||
| 5191 | F: arch/*/kernel/ftrace.c | ||
| 5192 | F: include/*/ftrace.h | ||
| 5193 | F: include/linux/trace*.h | ||
| 5194 | F: include/trace/ | ||
| 5195 | F: kernel/trace/ | ||
| 5196 | |||
| 5180 | TRIVIAL PATCHES | 5197 | TRIVIAL PATCHES |
| 5181 | M: Jiri Kosina <trivial@kernel.org> | 5198 | M: Jiri Kosina <trivial@kernel.org> |
| 5182 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git | 5199 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git |
| @@ -5743,8 +5760,7 @@ S: Maintained | |||
| 5743 | F: drivers/scsi/wd7000.c | 5760 | F: drivers/scsi/wd7000.c |
| 5744 | 5761 | ||
| 5745 | WINBOND CIR DRIVER | 5762 | WINBOND CIR DRIVER |
| 5746 | P: David Härdeman | 5763 | M: David Härdeman <david@hardeman.nu> |
| 5747 | M: david@hardeman.nu | ||
| 5748 | S: Maintained | 5764 | S: Maintained |
| 5749 | F: drivers/input/misc/winbond-cir.c | 5765 | F: drivers/input/misc/winbond-cir.c |
| 5750 | 5766 | ||
| @@ -5801,9 +5817,7 @@ F: drivers/input/touchscreen/*wm97* | |||
| 5801 | F: include/linux/wm97xx.h | 5817 | F: include/linux/wm97xx.h |
| 5802 | 5818 | ||
| 5803 | WOLFSON MICROELECTRONICS PMIC DRIVERS | 5819 | WOLFSON MICROELECTRONICS PMIC DRIVERS |
| 5804 | P: Mark Brown | 5820 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> |
| 5805 | M: broonie@opensource.wolfsonmicro.com | ||
| 5806 | L: linux-kernel@vger.kernel.org | ||
| 5807 | T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus | 5821 | T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus |
| 5808 | W: http://opensource.wolfsonmicro.com/node/8 | 5822 | W: http://opensource.wolfsonmicro.com/node/8 |
| 5809 | S: Supported | 5823 | S: Supported |
diff --git a/arch/arm/configs/n8x0_defconfig b/arch/arm/configs/n8x0_defconfig index 8da75dede52e..264f52b5c52d 100644 --- a/arch/arm/configs/n8x0_defconfig +++ b/arch/arm/configs/n8x0_defconfig | |||
| @@ -304,7 +304,7 @@ CONFIG_ALIGNMENT_TRAP=y | |||
| 304 | CONFIG_ZBOOT_ROM_TEXT=0x10C08000 | 304 | CONFIG_ZBOOT_ROM_TEXT=0x10C08000 |
| 305 | CONFIG_ZBOOT_ROM_BSS=0x10200000 | 305 | CONFIG_ZBOOT_ROM_BSS=0x10200000 |
| 306 | # CONFIG_ZBOOT_ROM is not set | 306 | # CONFIG_ZBOOT_ROM is not set |
| 307 | CONFIG_CMDLINE="root=1f03 rootfstype=jffs2 console=ttyS0,115200n8" | 307 | CONFIG_CMDLINE="root=1f03 rootfstype=jffs2 console=ttyS2,115200n8" |
| 308 | # CONFIG_XIP_KERNEL is not set | 308 | # CONFIG_XIP_KERNEL is not set |
| 309 | # CONFIG_KEXEC is not set | 309 | # CONFIG_KEXEC is not set |
| 310 | 310 | ||
diff --git a/arch/arm/configs/u300_defconfig b/arch/arm/configs/u300_defconfig index 7d61ae6e75da..953ba0297fc4 100644 --- a/arch/arm/configs/u300_defconfig +++ b/arch/arm/configs/u300_defconfig | |||
| @@ -1,14 +1,14 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.31-rc3 | 3 | # Linux kernel version: 2.6.32-rc5 |
| 4 | # Thu Jul 16 23:36:10 2009 | 4 | # Sat Oct 17 23:32:24 2009 |
| 5 | # | 5 | # |
| 6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y |
| 8 | CONFIG_GENERIC_GPIO=y | 8 | CONFIG_GENERIC_GPIO=y |
| 9 | CONFIG_GENERIC_TIME=y | 9 | CONFIG_GENERIC_TIME=y |
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | 10 | CONFIG_GENERIC_CLOCKEVENTS=y |
| 11 | CONFIG_MMU=y | 11 | CONFIG_HAVE_TCM=y |
| 12 | CONFIG_GENERIC_HARDIRQS=y | 12 | CONFIG_GENERIC_HARDIRQS=y |
| 13 | CONFIG_STACKTRACE_SUPPORT=y | 13 | CONFIG_STACKTRACE_SUPPORT=y |
| 14 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | 14 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y |
| @@ -44,11 +44,12 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
| 44 | # | 44 | # |
| 45 | # RCU Subsystem | 45 | # RCU Subsystem |
| 46 | # | 46 | # |
| 47 | CONFIG_CLASSIC_RCU=y | 47 | CONFIG_TREE_RCU=y |
| 48 | # CONFIG_TREE_RCU is not set | 48 | # CONFIG_TREE_PREEMPT_RCU is not set |
| 49 | # CONFIG_PREEMPT_RCU is not set | 49 | # CONFIG_RCU_TRACE is not set |
| 50 | CONFIG_RCU_FANOUT=32 | ||
| 51 | # CONFIG_RCU_FANOUT_EXACT is not set | ||
| 50 | # CONFIG_TREE_RCU_TRACE is not set | 52 | # CONFIG_TREE_RCU_TRACE is not set |
| 51 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
| 52 | # CONFIG_IKCONFIG is not set | 53 | # CONFIG_IKCONFIG is not set |
| 53 | CONFIG_LOG_BUF_SHIFT=14 | 54 | CONFIG_LOG_BUF_SHIFT=14 |
| 54 | # CONFIG_GROUP_SCHED is not set | 55 | # CONFIG_GROUP_SCHED is not set |
| @@ -80,17 +81,15 @@ CONFIG_SHMEM=y | |||
| 80 | # CONFIG_AIO is not set | 81 | # CONFIG_AIO is not set |
| 81 | 82 | ||
| 82 | # | 83 | # |
| 83 | # Performance Counters | 84 | # Kernel Performance Events And Counters |
| 84 | # | 85 | # |
| 85 | # CONFIG_VM_EVENT_COUNTERS is not set | 86 | # CONFIG_VM_EVENT_COUNTERS is not set |
| 86 | CONFIG_SLUB_DEBUG=y | 87 | CONFIG_SLUB_DEBUG=y |
| 87 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 88 | CONFIG_COMPAT_BRK=y | 88 | CONFIG_COMPAT_BRK=y |
| 89 | # CONFIG_SLAB is not set | 89 | # CONFIG_SLAB is not set |
| 90 | CONFIG_SLUB=y | 90 | CONFIG_SLUB=y |
| 91 | # CONFIG_SLOB is not set | 91 | # CONFIG_SLOB is not set |
| 92 | # CONFIG_PROFILING is not set | 92 | # CONFIG_PROFILING is not set |
| 93 | # CONFIG_MARKERS is not set | ||
| 94 | CONFIG_HAVE_OPROFILE=y | 93 | CONFIG_HAVE_OPROFILE=y |
| 95 | # CONFIG_KPROBES is not set | 94 | # CONFIG_KPROBES is not set |
| 96 | CONFIG_HAVE_KPROBES=y | 95 | CONFIG_HAVE_KPROBES=y |
| @@ -133,6 +132,7 @@ CONFIG_DEFAULT_IOSCHED="deadline" | |||
| 133 | # | 132 | # |
| 134 | # System Type | 133 | # System Type |
| 135 | # | 134 | # |
| 135 | CONFIG_MMU=y | ||
| 136 | # CONFIG_ARCH_AAEC2000 is not set | 136 | # CONFIG_ARCH_AAEC2000 is not set |
| 137 | # CONFIG_ARCH_INTEGRATOR is not set | 137 | # CONFIG_ARCH_INTEGRATOR is not set |
| 138 | # CONFIG_ARCH_REALVIEW is not set | 138 | # CONFIG_ARCH_REALVIEW is not set |
| @@ -147,6 +147,7 @@ CONFIG_DEFAULT_IOSCHED="deadline" | |||
| 147 | # CONFIG_ARCH_STMP3XXX is not set | 147 | # CONFIG_ARCH_STMP3XXX is not set |
| 148 | # CONFIG_ARCH_NETX is not set | 148 | # CONFIG_ARCH_NETX is not set |
| 149 | # CONFIG_ARCH_H720X is not set | 149 | # CONFIG_ARCH_H720X is not set |
| 150 | # CONFIG_ARCH_NOMADIK is not set | ||
| 150 | # CONFIG_ARCH_IOP13XX is not set | 151 | # CONFIG_ARCH_IOP13XX is not set |
| 151 | # CONFIG_ARCH_IOP32X is not set | 152 | # CONFIG_ARCH_IOP32X is not set |
| 152 | # CONFIG_ARCH_IOP33X is not set | 153 | # CONFIG_ARCH_IOP33X is not set |
| @@ -169,11 +170,13 @@ CONFIG_DEFAULT_IOSCHED="deadline" | |||
| 169 | # CONFIG_ARCH_SA1100 is not set | 170 | # CONFIG_ARCH_SA1100 is not set |
| 170 | # CONFIG_ARCH_S3C2410 is not set | 171 | # CONFIG_ARCH_S3C2410 is not set |
| 171 | # CONFIG_ARCH_S3C64XX is not set | 172 | # CONFIG_ARCH_S3C64XX is not set |
| 173 | # CONFIG_ARCH_S5PC1XX is not set | ||
| 172 | # CONFIG_ARCH_SHARK is not set | 174 | # CONFIG_ARCH_SHARK is not set |
| 173 | # CONFIG_ARCH_LH7A40X is not set | 175 | # CONFIG_ARCH_LH7A40X is not set |
| 174 | CONFIG_ARCH_U300=y | 176 | CONFIG_ARCH_U300=y |
| 175 | # CONFIG_ARCH_DAVINCI is not set | 177 | # CONFIG_ARCH_DAVINCI is not set |
| 176 | # CONFIG_ARCH_OMAP is not set | 178 | # CONFIG_ARCH_OMAP is not set |
| 179 | # CONFIG_ARCH_BCMRING is not set | ||
| 177 | 180 | ||
| 178 | # | 181 | # |
| 179 | # ST-Ericsson AB U300/U330/U335/U365 Platform | 182 | # ST-Ericsson AB U300/U330/U335/U365 Platform |
| @@ -195,6 +198,7 @@ CONFIG_MACH_U300_BS335=y | |||
| 195 | CONFIG_MACH_U300_DUAL_RAM=y | 198 | CONFIG_MACH_U300_DUAL_RAM=y |
| 196 | CONFIG_U300_DEBUG=y | 199 | CONFIG_U300_DEBUG=y |
| 197 | # CONFIG_MACH_U300_SEMI_IS_SHARED is not set | 200 | # CONFIG_MACH_U300_SEMI_IS_SHARED is not set |
| 201 | CONFIG_MACH_U300_SPIDUMMY=y | ||
| 198 | 202 | ||
| 199 | # | 203 | # |
| 200 | # All the settings below must match the bootloader's settings | 204 | # All the settings below must match the bootloader's settings |
| @@ -207,7 +211,7 @@ CONFIG_CPU_32=y | |||
| 207 | CONFIG_CPU_ARM926T=y | 211 | CONFIG_CPU_ARM926T=y |
| 208 | CONFIG_CPU_32v5=y | 212 | CONFIG_CPU_32v5=y |
| 209 | CONFIG_CPU_ABRT_EV5TJ=y | 213 | CONFIG_CPU_ABRT_EV5TJ=y |
| 210 | CONFIG_CPU_PABRT_NOIFAR=y | 214 | CONFIG_CPU_PABRT_LEGACY=y |
| 211 | CONFIG_CPU_CACHE_VIVT=y | 215 | CONFIG_CPU_CACHE_VIVT=y |
| 212 | CONFIG_CPU_COPY_V4WB=y | 216 | CONFIG_CPU_COPY_V4WB=y |
| 213 | CONFIG_CPU_TLB_V4WBI=y | 217 | CONFIG_CPU_TLB_V4WBI=y |
| @@ -222,6 +226,7 @@ CONFIG_ARM_THUMB=y | |||
| 222 | # CONFIG_CPU_DCACHE_DISABLE is not set | 226 | # CONFIG_CPU_DCACHE_DISABLE is not set |
| 223 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set | 227 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set |
| 224 | # CONFIG_CPU_CACHE_ROUND_ROBIN is not set | 228 | # CONFIG_CPU_CACHE_ROUND_ROBIN is not set |
| 229 | CONFIG_ARM_L1_CACHE_SHIFT=5 | ||
| 225 | CONFIG_ARM_VIC=y | 230 | CONFIG_ARM_VIC=y |
| 226 | CONFIG_ARM_VIC_NR=2 | 231 | CONFIG_ARM_VIC_NR=2 |
| 227 | CONFIG_COMMON_CLKDEV=y | 232 | CONFIG_COMMON_CLKDEV=y |
| @@ -245,6 +250,8 @@ CONFIG_VMSPLIT_3G=y | |||
| 245 | # CONFIG_VMSPLIT_2G is not set | 250 | # CONFIG_VMSPLIT_2G is not set |
| 246 | # CONFIG_VMSPLIT_1G is not set | 251 | # CONFIG_VMSPLIT_1G is not set |
| 247 | CONFIG_PAGE_OFFSET=0xC0000000 | 252 | CONFIG_PAGE_OFFSET=0xC0000000 |
| 253 | # CONFIG_PREEMPT_NONE is not set | ||
| 254 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
| 248 | CONFIG_PREEMPT=y | 255 | CONFIG_PREEMPT=y |
| 249 | CONFIG_HZ=100 | 256 | CONFIG_HZ=100 |
| 250 | CONFIG_AEABI=y | 257 | CONFIG_AEABI=y |
| @@ -265,6 +272,7 @@ CONFIG_ZONE_DMA_FLAG=0 | |||
| 265 | CONFIG_VIRT_TO_BUS=y | 272 | CONFIG_VIRT_TO_BUS=y |
| 266 | CONFIG_HAVE_MLOCK=y | 273 | CONFIG_HAVE_MLOCK=y |
| 267 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 274 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
| 275 | # CONFIG_KSM is not set | ||
| 268 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | 276 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 |
| 269 | CONFIG_ALIGNMENT_TRAP=y | 277 | CONFIG_ALIGNMENT_TRAP=y |
| 270 | # CONFIG_UACCESS_WITH_MEMCPY is not set | 278 | # CONFIG_UACCESS_WITH_MEMCPY is not set |
| @@ -313,6 +321,7 @@ CONFIG_PM=y | |||
| 313 | # CONFIG_PM_DEBUG is not set | 321 | # CONFIG_PM_DEBUG is not set |
| 314 | # CONFIG_SUSPEND is not set | 322 | # CONFIG_SUSPEND is not set |
| 315 | # CONFIG_APM_EMULATION is not set | 323 | # CONFIG_APM_EMULATION is not set |
| 324 | # CONFIG_PM_RUNTIME is not set | ||
| 316 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | 325 | CONFIG_ARCH_SUSPEND_POSSIBLE=y |
| 317 | CONFIG_NET=y | 326 | CONFIG_NET=y |
| 318 | 327 | ||
| @@ -351,6 +360,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
| 351 | # CONFIG_NETFILTER is not set | 360 | # CONFIG_NETFILTER is not set |
| 352 | # CONFIG_IP_DCCP is not set | 361 | # CONFIG_IP_DCCP is not set |
| 353 | # CONFIG_IP_SCTP is not set | 362 | # CONFIG_IP_SCTP is not set |
| 363 | # CONFIG_RDS is not set | ||
| 354 | # CONFIG_TIPC is not set | 364 | # CONFIG_TIPC is not set |
| 355 | # CONFIG_ATM is not set | 365 | # CONFIG_ATM is not set |
| 356 | # CONFIG_BRIDGE is not set | 366 | # CONFIG_BRIDGE is not set |
| @@ -391,6 +401,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
| 391 | # Generic Driver Options | 401 | # Generic Driver Options |
| 392 | # | 402 | # |
| 393 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 403 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 404 | # CONFIG_DEVTMPFS is not set | ||
| 394 | CONFIG_STANDALONE=y | 405 | CONFIG_STANDALONE=y |
| 395 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 406 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
| 396 | CONFIG_FW_LOADER=y | 407 | CONFIG_FW_LOADER=y |
| @@ -402,9 +413,9 @@ CONFIG_EXTRA_FIRMWARE="" | |||
| 402 | # CONFIG_CONNECTOR is not set | 413 | # CONFIG_CONNECTOR is not set |
| 403 | CONFIG_MTD=y | 414 | CONFIG_MTD=y |
| 404 | # CONFIG_MTD_DEBUG is not set | 415 | # CONFIG_MTD_DEBUG is not set |
| 416 | # CONFIG_MTD_TESTS is not set | ||
| 405 | # CONFIG_MTD_CONCAT is not set | 417 | # CONFIG_MTD_CONCAT is not set |
| 406 | CONFIG_MTD_PARTITIONS=y | 418 | CONFIG_MTD_PARTITIONS=y |
| 407 | # CONFIG_MTD_TESTS is not set | ||
| 408 | # CONFIG_MTD_REDBOOT_PARTS is not set | 419 | # CONFIG_MTD_REDBOOT_PARTS is not set |
| 409 | CONFIG_MTD_CMDLINE_PARTS=y | 420 | CONFIG_MTD_CMDLINE_PARTS=y |
| 410 | # CONFIG_MTD_AFS_PARTS is not set | 421 | # CONFIG_MTD_AFS_PARTS is not set |
| @@ -453,6 +464,7 @@ CONFIG_MTD_CFI_I2=y | |||
| 453 | # | 464 | # |
| 454 | # CONFIG_MTD_DATAFLASH is not set | 465 | # CONFIG_MTD_DATAFLASH is not set |
| 455 | # CONFIG_MTD_M25P80 is not set | 466 | # CONFIG_MTD_M25P80 is not set |
| 467 | # CONFIG_MTD_SST25L is not set | ||
| 456 | # CONFIG_MTD_SLRAM is not set | 468 | # CONFIG_MTD_SLRAM is not set |
| 457 | # CONFIG_MTD_PHRAM is not set | 469 | # CONFIG_MTD_PHRAM is not set |
| 458 | # CONFIG_MTD_MTDRAM is not set | 470 | # CONFIG_MTD_MTDRAM is not set |
| @@ -520,6 +532,7 @@ CONFIG_HAVE_IDE=y | |||
| 520 | # CONFIG_MD is not set | 532 | # CONFIG_MD is not set |
| 521 | # CONFIG_NETDEVICES is not set | 533 | # CONFIG_NETDEVICES is not set |
| 522 | # CONFIG_ISDN is not set | 534 | # CONFIG_ISDN is not set |
| 535 | # CONFIG_PHONE is not set | ||
| 523 | 536 | ||
| 524 | # | 537 | # |
| 525 | # Input device support | 538 | # Input device support |
| @@ -540,12 +553,16 @@ CONFIG_INPUT_EVDEV=y | |||
| 540 | # Input Device Drivers | 553 | # Input Device Drivers |
| 541 | # | 554 | # |
| 542 | CONFIG_INPUT_KEYBOARD=y | 555 | CONFIG_INPUT_KEYBOARD=y |
| 556 | # CONFIG_KEYBOARD_ADP5588 is not set | ||
| 543 | # CONFIG_KEYBOARD_ATKBD is not set | 557 | # CONFIG_KEYBOARD_ATKBD is not set |
| 558 | # CONFIG_QT2160 is not set | ||
| 544 | # CONFIG_KEYBOARD_LKKBD is not set | 559 | # CONFIG_KEYBOARD_LKKBD is not set |
| 545 | # CONFIG_KEYBOARD_GPIO is not set | 560 | # CONFIG_KEYBOARD_GPIO is not set |
| 546 | # CONFIG_KEYBOARD_MATRIX is not set | 561 | # CONFIG_KEYBOARD_MATRIX is not set |
| 547 | # CONFIG_KEYBOARD_LM8323 is not set | 562 | # CONFIG_KEYBOARD_LM8323 is not set |
| 563 | # CONFIG_KEYBOARD_MAX7359 is not set | ||
| 548 | # CONFIG_KEYBOARD_NEWTON is not set | 564 | # CONFIG_KEYBOARD_NEWTON is not set |
| 565 | # CONFIG_KEYBOARD_OPENCORES is not set | ||
| 549 | # CONFIG_KEYBOARD_STOWAWAY is not set | 566 | # CONFIG_KEYBOARD_STOWAWAY is not set |
| 550 | # CONFIG_KEYBOARD_SUNKBD is not set | 567 | # CONFIG_KEYBOARD_SUNKBD is not set |
| 551 | # CONFIG_KEYBOARD_XTKBD is not set | 568 | # CONFIG_KEYBOARD_XTKBD is not set |
| @@ -597,6 +614,7 @@ CONFIG_LEGACY_PTY_COUNT=16 | |||
| 597 | # CONFIG_TCG_TPM is not set | 614 | # CONFIG_TCG_TPM is not set |
| 598 | CONFIG_I2C=y | 615 | CONFIG_I2C=y |
| 599 | CONFIG_I2C_BOARDINFO=y | 616 | CONFIG_I2C_BOARDINFO=y |
| 617 | CONFIG_I2C_COMPAT=y | ||
| 600 | # CONFIG_I2C_CHARDEV is not set | 618 | # CONFIG_I2C_CHARDEV is not set |
| 601 | CONFIG_I2C_HELPER_AUTO=y | 619 | CONFIG_I2C_HELPER_AUTO=y |
| 602 | 620 | ||
| @@ -629,9 +647,6 @@ CONFIG_I2C_STU300=y | |||
| 629 | # Miscellaneous I2C Chip support | 647 | # Miscellaneous I2C Chip support |
| 630 | # | 648 | # |
| 631 | # CONFIG_DS1682 is not set | 649 | # CONFIG_DS1682 is not set |
| 632 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 633 | # CONFIG_PCF8575 is not set | ||
| 634 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 635 | # CONFIG_SENSORS_TSL2550 is not set | 650 | # CONFIG_SENSORS_TSL2550 is not set |
| 636 | # CONFIG_I2C_DEBUG_CORE is not set | 651 | # CONFIG_I2C_DEBUG_CORE is not set |
| 637 | # CONFIG_I2C_DEBUG_ALGO is not set | 652 | # CONFIG_I2C_DEBUG_ALGO is not set |
| @@ -653,16 +668,21 @@ CONFIG_SPI_PL022=y | |||
| 653 | # | 668 | # |
| 654 | # CONFIG_SPI_SPIDEV is not set | 669 | # CONFIG_SPI_SPIDEV is not set |
| 655 | # CONFIG_SPI_TLE62X0 is not set | 670 | # CONFIG_SPI_TLE62X0 is not set |
| 671 | |||
| 672 | # | ||
| 673 | # PPS support | ||
| 674 | # | ||
| 675 | # CONFIG_PPS is not set | ||
| 656 | # CONFIG_W1 is not set | 676 | # CONFIG_W1 is not set |
| 657 | CONFIG_POWER_SUPPLY=y | 677 | CONFIG_POWER_SUPPLY=y |
| 658 | # CONFIG_POWER_SUPPLY_DEBUG is not set | 678 | # CONFIG_POWER_SUPPLY_DEBUG is not set |
| 659 | # CONFIG_PDA_POWER is not set | 679 | # CONFIG_PDA_POWER is not set |
| 660 | # CONFIG_BATTERY_DS2760 is not set | 680 | # CONFIG_BATTERY_DS2760 is not set |
| 681 | # CONFIG_BATTERY_DS2782 is not set | ||
| 661 | # CONFIG_BATTERY_BQ27x00 is not set | 682 | # CONFIG_BATTERY_BQ27x00 is not set |
| 662 | # CONFIG_BATTERY_MAX17040 is not set | 683 | # CONFIG_BATTERY_MAX17040 is not set |
| 663 | # CONFIG_HWMON is not set | 684 | # CONFIG_HWMON is not set |
| 664 | # CONFIG_THERMAL is not set | 685 | # CONFIG_THERMAL is not set |
| 665 | # CONFIG_THERMAL_HWMON is not set | ||
| 666 | CONFIG_WATCHDOG=y | 686 | CONFIG_WATCHDOG=y |
| 667 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 687 | # CONFIG_WATCHDOG_NOWAYOUT is not set |
| 668 | 688 | ||
| @@ -690,10 +710,24 @@ CONFIG_SSB_POSSIBLE=y | |||
| 690 | # CONFIG_MFD_TC6387XB is not set | 710 | # CONFIG_MFD_TC6387XB is not set |
| 691 | # CONFIG_PMIC_DA903X is not set | 711 | # CONFIG_PMIC_DA903X is not set |
| 692 | # CONFIG_MFD_WM8400 is not set | 712 | # CONFIG_MFD_WM8400 is not set |
| 713 | # CONFIG_MFD_WM831X is not set | ||
| 693 | # CONFIG_MFD_WM8350_I2C is not set | 714 | # CONFIG_MFD_WM8350_I2C is not set |
| 694 | # CONFIG_MFD_PCF50633 is not set | 715 | # CONFIG_MFD_PCF50633 is not set |
| 716 | # CONFIG_MFD_MC13783 is not set | ||
| 695 | CONFIG_AB3100_CORE=y | 717 | CONFIG_AB3100_CORE=y |
| 718 | CONFIG_AB3100_OTP=y | ||
| 696 | # CONFIG_EZX_PCAP is not set | 719 | # CONFIG_EZX_PCAP is not set |
| 720 | CONFIG_REGULATOR=y | ||
| 721 | # CONFIG_REGULATOR_DEBUG is not set | ||
| 722 | # CONFIG_REGULATOR_FIXED_VOLTAGE is not set | ||
| 723 | # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set | ||
| 724 | # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set | ||
| 725 | # CONFIG_REGULATOR_BQ24022 is not set | ||
| 726 | # CONFIG_REGULATOR_MAX1586 is not set | ||
| 727 | # CONFIG_REGULATOR_LP3971 is not set | ||
| 728 | CONFIG_REGULATOR_AB3100=y | ||
| 729 | # CONFIG_REGULATOR_TPS65023 is not set | ||
| 730 | # CONFIG_REGULATOR_TPS6507X is not set | ||
| 697 | # CONFIG_MEDIA_SUPPORT is not set | 731 | # CONFIG_MEDIA_SUPPORT is not set |
| 698 | 732 | ||
| 699 | # | 733 | # |
| @@ -792,9 +826,10 @@ CONFIG_MMC_BLOCK_BOUNCE=y | |||
| 792 | # | 826 | # |
| 793 | CONFIG_MMC_ARMMMCI=y | 827 | CONFIG_MMC_ARMMMCI=y |
| 794 | # CONFIG_MMC_SDHCI is not set | 828 | # CONFIG_MMC_SDHCI is not set |
| 829 | # CONFIG_MMC_AT91 is not set | ||
| 830 | # CONFIG_MMC_ATMELMCI is not set | ||
| 795 | # CONFIG_MMC_SPI is not set | 831 | # CONFIG_MMC_SPI is not set |
| 796 | # CONFIG_MEMSTICK is not set | 832 | # CONFIG_MEMSTICK is not set |
| 797 | # CONFIG_ACCESSIBILITY is not set | ||
| 798 | CONFIG_NEW_LEDS=y | 833 | CONFIG_NEW_LEDS=y |
| 799 | CONFIG_LEDS_CLASS=y | 834 | CONFIG_LEDS_CLASS=y |
| 800 | 835 | ||
| @@ -820,10 +855,10 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y | |||
| 820 | # | 855 | # |
| 821 | # iptables trigger is under Netfilter config (LED target) | 856 | # iptables trigger is under Netfilter config (LED target) |
| 822 | # | 857 | # |
| 858 | # CONFIG_ACCESSIBILITY is not set | ||
| 823 | CONFIG_RTC_LIB=y | 859 | CONFIG_RTC_LIB=y |
| 824 | CONFIG_RTC_CLASS=y | 860 | CONFIG_RTC_CLASS=y |
| 825 | CONFIG_RTC_HCTOSYS=y | 861 | # CONFIG_RTC_HCTOSYS is not set |
| 826 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 827 | # CONFIG_RTC_DEBUG is not set | 862 | # CONFIG_RTC_DEBUG is not set |
| 828 | 863 | ||
| 829 | # | 864 | # |
| @@ -863,6 +898,7 @@ CONFIG_RTC_INTF_DEV=y | |||
| 863 | # CONFIG_RTC_DRV_R9701 is not set | 898 | # CONFIG_RTC_DRV_R9701 is not set |
| 864 | # CONFIG_RTC_DRV_RS5C348 is not set | 899 | # CONFIG_RTC_DRV_RS5C348 is not set |
| 865 | # CONFIG_RTC_DRV_DS3234 is not set | 900 | # CONFIG_RTC_DRV_DS3234 is not set |
| 901 | # CONFIG_RTC_DRV_PCF2123 is not set | ||
| 866 | 902 | ||
| 867 | # | 903 | # |
| 868 | # Platform RTC drivers | 904 | # Platform RTC drivers |
| @@ -878,27 +914,25 @@ CONFIG_RTC_INTF_DEV=y | |||
| 878 | # CONFIG_RTC_DRV_M48T59 is not set | 914 | # CONFIG_RTC_DRV_M48T59 is not set |
| 879 | # CONFIG_RTC_DRV_BQ4802 is not set | 915 | # CONFIG_RTC_DRV_BQ4802 is not set |
| 880 | # CONFIG_RTC_DRV_V3020 is not set | 916 | # CONFIG_RTC_DRV_V3020 is not set |
| 917 | CONFIG_RTC_DRV_AB3100=y | ||
| 881 | 918 | ||
| 882 | # | 919 | # |
| 883 | # on-CPU RTC drivers | 920 | # on-CPU RTC drivers |
| 884 | # | 921 | # |
| 885 | # CONFIG_RTC_DRV_PL030 is not set | 922 | # CONFIG_RTC_DRV_PL030 is not set |
| 886 | # CONFIG_RTC_DRV_PL031 is not set | 923 | # CONFIG_RTC_DRV_PL031 is not set |
| 924 | CONFIG_RTC_DRV_COH901331=y | ||
| 887 | CONFIG_DMADEVICES=y | 925 | CONFIG_DMADEVICES=y |
| 888 | 926 | ||
| 889 | # | 927 | # |
| 890 | # DMA Devices | 928 | # DMA Devices |
| 891 | # | 929 | # |
| 892 | # CONFIG_AUXDISPLAY is not set | 930 | # CONFIG_AUXDISPLAY is not set |
| 893 | CONFIG_REGULATOR=y | ||
| 894 | # CONFIG_REGULATOR_DEBUG is not set | ||
| 895 | # CONFIG_REGULATOR_FIXED_VOLTAGE is not set | ||
| 896 | # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set | ||
| 897 | # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set | ||
| 898 | # CONFIG_REGULATOR_BQ24022 is not set | ||
| 899 | # CONFIG_REGULATOR_MAX1586 is not set | ||
| 900 | # CONFIG_REGULATOR_LP3971 is not set | ||
| 901 | # CONFIG_UIO is not set | 931 | # CONFIG_UIO is not set |
| 932 | |||
| 933 | # | ||
| 934 | # TI VLYNQ | ||
| 935 | # | ||
| 902 | # CONFIG_STAGING is not set | 936 | # CONFIG_STAGING is not set |
| 903 | 937 | ||
| 904 | # | 938 | # |
| @@ -913,6 +947,7 @@ CONFIG_REGULATOR=y | |||
| 913 | # CONFIG_XFS_FS is not set | 947 | # CONFIG_XFS_FS is not set |
| 914 | # CONFIG_OCFS2_FS is not set | 948 | # CONFIG_OCFS2_FS is not set |
| 915 | # CONFIG_BTRFS_FS is not set | 949 | # CONFIG_BTRFS_FS is not set |
| 950 | # CONFIG_NILFS2_FS is not set | ||
| 916 | CONFIG_FILE_LOCKING=y | 951 | CONFIG_FILE_LOCKING=y |
| 917 | CONFIG_FSNOTIFY=y | 952 | CONFIG_FSNOTIFY=y |
| 918 | # CONFIG_DNOTIFY is not set | 953 | # CONFIG_DNOTIFY is not set |
| @@ -975,7 +1010,6 @@ CONFIG_MISC_FILESYSTEMS=y | |||
| 975 | # CONFIG_ROMFS_FS is not set | 1010 | # CONFIG_ROMFS_FS is not set |
| 976 | # CONFIG_SYSV_FS is not set | 1011 | # CONFIG_SYSV_FS is not set |
| 977 | # CONFIG_UFS_FS is not set | 1012 | # CONFIG_UFS_FS is not set |
| 978 | # CONFIG_NILFS2_FS is not set | ||
| 979 | # CONFIG_NETWORK_FILESYSTEMS is not set | 1013 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 980 | 1014 | ||
| 981 | # | 1015 | # |
| @@ -1033,6 +1067,7 @@ CONFIG_ENABLE_WARN_DEPRECATED=y | |||
| 1033 | CONFIG_ENABLE_MUST_CHECK=y | 1067 | CONFIG_ENABLE_MUST_CHECK=y |
| 1034 | CONFIG_FRAME_WARN=1024 | 1068 | CONFIG_FRAME_WARN=1024 |
| 1035 | # CONFIG_MAGIC_SYSRQ is not set | 1069 | # CONFIG_MAGIC_SYSRQ is not set |
| 1070 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 1036 | # CONFIG_UNUSED_SYMBOLS is not set | 1071 | # CONFIG_UNUSED_SYMBOLS is not set |
| 1037 | # CONFIG_DEBUG_FS is not set | 1072 | # CONFIG_DEBUG_FS is not set |
| 1038 | # CONFIG_HEADERS_CHECK is not set | 1073 | # CONFIG_HEADERS_CHECK is not set |
| @@ -1066,11 +1101,13 @@ CONFIG_DEBUG_INFO=y | |||
| 1066 | # CONFIG_DEBUG_LIST is not set | 1101 | # CONFIG_DEBUG_LIST is not set |
| 1067 | # CONFIG_DEBUG_SG is not set | 1102 | # CONFIG_DEBUG_SG is not set |
| 1068 | # CONFIG_DEBUG_NOTIFIERS is not set | 1103 | # CONFIG_DEBUG_NOTIFIERS is not set |
| 1104 | # CONFIG_DEBUG_CREDENTIALS is not set | ||
| 1069 | # CONFIG_BOOT_PRINTK_DELAY is not set | 1105 | # CONFIG_BOOT_PRINTK_DELAY is not set |
| 1070 | # CONFIG_RCU_TORTURE_TEST is not set | 1106 | # CONFIG_RCU_TORTURE_TEST is not set |
| 1071 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | 1107 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set |
| 1072 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1108 | # CONFIG_BACKTRACE_SELF_TEST is not set |
| 1073 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | 1109 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set |
| 1110 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set | ||
| 1074 | # CONFIG_FAULT_INJECTION is not set | 1111 | # CONFIG_FAULT_INJECTION is not set |
| 1075 | # CONFIG_LATENCYTOP is not set | 1112 | # CONFIG_LATENCYTOP is not set |
| 1076 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set | 1113 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set |
| @@ -1121,6 +1158,7 @@ CONFIG_GENERIC_FIND_LAST_BIT=y | |||
| 1121 | # CONFIG_CRC32 is not set | 1158 | # CONFIG_CRC32 is not set |
| 1122 | # CONFIG_CRC7 is not set | 1159 | # CONFIG_CRC7 is not set |
| 1123 | # CONFIG_LIBCRC32C is not set | 1160 | # CONFIG_LIBCRC32C is not set |
| 1161 | CONFIG_GENERIC_ALLOCATOR=y | ||
| 1124 | CONFIG_HAS_IOMEM=y | 1162 | CONFIG_HAS_IOMEM=y |
| 1125 | CONFIG_HAS_IOPORT=y | 1163 | CONFIG_HAS_IOPORT=y |
| 1126 | CONFIG_HAS_DMA=y | 1164 | CONFIG_HAS_DMA=y |
diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index c3b911ee9151..6aac3f5bb2f3 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h | |||
| @@ -98,6 +98,9 @@ extern int elf_check_arch(const struct elf32_hdr *); | |||
| 98 | extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int); | 98 | extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int); |
| 99 | #define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk) | 99 | #define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk) |
| 100 | 100 | ||
| 101 | int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); | ||
| 102 | #define ELF_CORE_COPY_TASK_REGS dump_task_regs | ||
| 103 | |||
| 101 | #define USE_ELF_CORE_DUMP | 104 | #define USE_ELF_CORE_DUMP |
| 102 | #define ELF_EXEC_PAGESIZE 4096 | 105 | #define ELF_EXEC_PAGESIZE 4096 |
| 103 | 106 | ||
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index a45ab5dd8255..c2f1605de359 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -350,7 +350,7 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm) | |||
| 350 | if (tlb_flag(TLB_WB)) | 350 | if (tlb_flag(TLB_WB)) |
| 351 | dsb(); | 351 | dsb(); |
| 352 | 352 | ||
| 353 | if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) { | 353 | if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) { |
| 354 | if (tlb_flag(TLB_V3_FULL)) | 354 | if (tlb_flag(TLB_V3_FULL)) |
| 355 | asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (zero) : "cc"); | 355 | asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (zero) : "cc"); |
| 356 | if (tlb_flag(TLB_V4_U_FULL)) | 356 | if (tlb_flag(TLB_V4_U_FULL)) |
| @@ -360,6 +360,7 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm) | |||
| 360 | if (tlb_flag(TLB_V4_I_FULL)) | 360 | if (tlb_flag(TLB_V4_I_FULL)) |
| 361 | asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc"); | 361 | asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc"); |
| 362 | } | 362 | } |
| 363 | put_cpu(); | ||
| 363 | 364 | ||
| 364 | if (tlb_flag(TLB_V6_U_ASID)) | 365 | if (tlb_flag(TLB_V6_U_ASID)) |
| 365 | asm("mcr p15, 0, %0, c8, c7, 2" : : "r" (asid) : "cc"); | 366 | asm("mcr p15, 0, %0, c8, c7, 2" : : "r" (asid) : "cc"); |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 322410be573c..0022b4d57f8b 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
| @@ -608,33 +608,33 @@ call_fpe: | |||
| 608 | THUMB( add pc, r8 ) | 608 | THUMB( add pc, r8 ) |
| 609 | nop | 609 | nop |
| 610 | 610 | ||
| 611 | W(mov) pc, lr @ CP#0 | 611 | movw_pc lr @ CP#0 |
| 612 | W(b) do_fpe @ CP#1 (FPE) | 612 | W(b) do_fpe @ CP#1 (FPE) |
| 613 | W(b) do_fpe @ CP#2 (FPE) | 613 | W(b) do_fpe @ CP#2 (FPE) |
| 614 | W(mov) pc, lr @ CP#3 | 614 | movw_pc lr @ CP#3 |
| 615 | #ifdef CONFIG_CRUNCH | 615 | #ifdef CONFIG_CRUNCH |
| 616 | b crunch_task_enable @ CP#4 (MaverickCrunch) | 616 | b crunch_task_enable @ CP#4 (MaverickCrunch) |
| 617 | b crunch_task_enable @ CP#5 (MaverickCrunch) | 617 | b crunch_task_enable @ CP#5 (MaverickCrunch) |
| 618 | b crunch_task_enable @ CP#6 (MaverickCrunch) | 618 | b crunch_task_enable @ CP#6 (MaverickCrunch) |
| 619 | #else | 619 | #else |
| 620 | W(mov) pc, lr @ CP#4 | 620 | movw_pc lr @ CP#4 |
| 621 | W(mov) pc, lr @ CP#5 | 621 | movw_pc lr @ CP#5 |
| 622 | W(mov) pc, lr @ CP#6 | 622 | movw_pc lr @ CP#6 |
| 623 | #endif | 623 | #endif |
| 624 | W(mov) pc, lr @ CP#7 | 624 | movw_pc lr @ CP#7 |
| 625 | W(mov) pc, lr @ CP#8 | 625 | movw_pc lr @ CP#8 |
| 626 | W(mov) pc, lr @ CP#9 | 626 | movw_pc lr @ CP#9 |
| 627 | #ifdef CONFIG_VFP | 627 | #ifdef CONFIG_VFP |
| 628 | W(b) do_vfp @ CP#10 (VFP) | 628 | W(b) do_vfp @ CP#10 (VFP) |
| 629 | W(b) do_vfp @ CP#11 (VFP) | 629 | W(b) do_vfp @ CP#11 (VFP) |
| 630 | #else | 630 | #else |
| 631 | W(mov) pc, lr @ CP#10 (VFP) | 631 | movw_pc lr @ CP#10 (VFP) |
| 632 | W(mov) pc, lr @ CP#11 (VFP) | 632 | movw_pc lr @ CP#11 (VFP) |
| 633 | #endif | 633 | #endif |
| 634 | W(mov) pc, lr @ CP#12 | 634 | movw_pc lr @ CP#12 |
| 635 | W(mov) pc, lr @ CP#13 | 635 | movw_pc lr @ CP#13 |
| 636 | W(mov) pc, lr @ CP#14 (Debug) | 636 | movw_pc lr @ CP#14 (Debug) |
| 637 | W(mov) pc, lr @ CP#15 (Control) | 637 | movw_pc lr @ CP#15 (Control) |
| 638 | 638 | ||
| 639 | #ifdef CONFIG_NEON | 639 | #ifdef CONFIG_NEON |
| 640 | .align 6 | 640 | .align 6 |
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index ac34c0d9384b..7e9ed1eea40a 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S | |||
| @@ -110,6 +110,13 @@ | |||
| 110 | mov \rd, sp, lsr #13 | 110 | mov \rd, sp, lsr #13 |
| 111 | mov \rd, \rd, lsl #13 | 111 | mov \rd, \rd, lsl #13 |
| 112 | .endm | 112 | .endm |
| 113 | |||
| 114 | @ | ||
| 115 | @ 32-bit wide "mov pc, reg" | ||
| 116 | @ | ||
| 117 | .macro movw_pc, reg | ||
| 118 | mov pc, \reg | ||
| 119 | .endm | ||
| 113 | #else /* CONFIG_THUMB2_KERNEL */ | 120 | #else /* CONFIG_THUMB2_KERNEL */ |
| 114 | .macro svc_exit, rpsr | 121 | .macro svc_exit, rpsr |
| 115 | clrex @ clear the exclusive monitor | 122 | clrex @ clear the exclusive monitor |
| @@ -146,6 +153,14 @@ | |||
| 146 | lsr \rd, \rd, #13 | 153 | lsr \rd, \rd, #13 |
| 147 | mov \rd, \rd, lsl #13 | 154 | mov \rd, \rd, lsl #13 |
| 148 | .endm | 155 | .endm |
| 156 | |||
| 157 | @ | ||
| 158 | @ 32-bit wide "mov pc, reg" | ||
| 159 | @ | ||
| 160 | .macro movw_pc, reg | ||
| 161 | mov pc, \reg | ||
| 162 | nop | ||
| 163 | .endm | ||
| 149 | #endif /* !CONFIG_THUMB2_KERNEL */ | 164 | #endif /* !CONFIG_THUMB2_KERNEL */ |
| 150 | 165 | ||
| 151 | /* | 166 | /* |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 790fbee92ec5..0d96d0171c05 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
| @@ -328,6 +328,15 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, | |||
| 328 | } | 328 | } |
| 329 | 329 | ||
| 330 | /* | 330 | /* |
| 331 | * Fill in the task's elfregs structure for a core dump. | ||
| 332 | */ | ||
| 333 | int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs) | ||
| 334 | { | ||
| 335 | elf_core_copy_regs(elfregs, task_pt_regs(t)); | ||
| 336 | return 1; | ||
| 337 | } | ||
| 338 | |||
| 339 | /* | ||
| 331 | * fill in the fpe structure for a core dump... | 340 | * fill in the fpe structure for a core dump... |
| 332 | */ | 341 | */ |
| 333 | int dump_fpu (struct pt_regs *regs, struct user_fp *fp) | 342 | int dump_fpu (struct pt_regs *regs, struct user_fp *fp) |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index d581cff80c4c..332b784050b2 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
| @@ -838,7 +838,7 @@ static void __init at91_add_device_rtt(void) | |||
| 838 | * Watchdog | 838 | * Watchdog |
| 839 | * -------------------------------------------------------------------- */ | 839 | * -------------------------------------------------------------------- */ |
| 840 | 840 | ||
| 841 | #if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) | 841 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) |
| 842 | static struct platform_device at91sam9g45_wdt_device = { | 842 | static struct platform_device at91sam9g45_wdt_device = { |
| 843 | .name = "at91_wdt", | 843 | .name = "at91_wdt", |
| 844 | .id = -1, | 844 | .id = -1, |
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index f95dc160c34b..b4357c388d2e 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c | |||
| @@ -206,7 +206,6 @@ static void ep93xx_gpio_ab_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
| 206 | for (i = 0; i < 8; i++) { | 206 | for (i = 0; i < 8; i++) { |
| 207 | if (status & (1 << i)) { | 207 | if (status & (1 << i)) { |
| 208 | int gpio_irq = gpio_to_irq(EP93XX_GPIO_LINE_B(0)) + i; | 208 | int gpio_irq = gpio_to_irq(EP93XX_GPIO_LINE_B(0)) + i; |
| 209 | desc = irq_desc + gpio_irq; | ||
| 210 | generic_handle_irq(gpio_irq); | 209 | generic_handle_irq(gpio_irq); |
| 211 | } | 210 | } |
| 212 | } | 211 | } |
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index ca71cf1a72a0..a4a7be308000 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c | |||
| @@ -112,7 +112,7 @@ static void __init edb93xx_register_i2c(void) | |||
| 112 | ARRAY_SIZE(edb93xxa_i2c_board_info)); | 112 | ARRAY_SIZE(edb93xxa_i2c_board_info)); |
| 113 | } else if (machine_is_edb9307() || machine_is_edb9312() || | 113 | } else if (machine_is_edb9307() || machine_is_edb9312() || |
| 114 | machine_is_edb9315()) { | 114 | machine_is_edb9315()) { |
| 115 | ep93xx_register_i2c(&edb93xx_i2c_gpio_data | 115 | ep93xx_register_i2c(&edb93xx_i2c_gpio_data, |
| 116 | edb93xx_i2c_board_info, | 116 | edb93xx_i2c_board_info, |
| 117 | ARRAY_SIZE(edb93xx_i2c_board_info)); | 117 | ARRAY_SIZE(edb93xx_i2c_board_info)); |
| 118 | } | 118 | } |
diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index a3ec33fd79d4..469fd968d517 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h | |||
| @@ -17,7 +17,6 @@ struct ep93xx_eth_data | |||
| 17 | 17 | ||
| 18 | void ep93xx_map_io(void); | 18 | void ep93xx_map_io(void); |
| 19 | void ep93xx_init_irq(void); | 19 | void ep93xx_init_irq(void); |
| 20 | void ep93xx_init_time(unsigned long); | ||
| 21 | 20 | ||
| 22 | /* EP93xx System Controller software locked register write */ | 21 | /* EP93xx System Controller software locked register write */ |
| 23 | void ep93xx_syscon_swlocked_write(unsigned int val, void __iomem *reg); | 22 | void ep93xx_syscon_swlocked_write(unsigned int val, void __iomem *reg); |
diff --git a/arch/arm/mach-mx2/clock_imx27.c b/arch/arm/mach-mx2/clock_imx27.c index 4089951acb47..ff5e33298914 100644 --- a/arch/arm/mach-mx2/clock_imx27.c +++ b/arch/arm/mach-mx2/clock_imx27.c | |||
| @@ -638,9 +638,9 @@ static struct clk_lookup lookups[] = { | |||
| 638 | _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk) | 638 | _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk) |
| 639 | _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk) | 639 | _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk) |
| 640 | _REGISTER_CLOCK("mxc-mmc.2", NULL, sdhc3_clk) | 640 | _REGISTER_CLOCK("mxc-mmc.2", NULL, sdhc3_clk) |
| 641 | _REGISTER_CLOCK(NULL, "cspi1", cspi1_clk) | 641 | _REGISTER_CLOCK("spi_imx.0", NULL, cspi1_clk) |
| 642 | _REGISTER_CLOCK(NULL, "cspi2", cspi2_clk) | 642 | _REGISTER_CLOCK("spi_imx.1", NULL, cspi2_clk) |
| 643 | _REGISTER_CLOCK(NULL, "cspi3", cspi3_clk) | 643 | _REGISTER_CLOCK("spi_imx.2", NULL, cspi3_clk) |
| 644 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) | 644 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) |
| 645 | _REGISTER_CLOCK(NULL, "csi", csi_clk) | 645 | _REGISTER_CLOCK(NULL, "csi", csi_clk) |
| 646 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk) | 646 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk) |
| @@ -665,7 +665,7 @@ static struct clk_lookup lookups[] = { | |||
| 665 | _REGISTER_CLOCK(NULL, "sahara2", sahara2_clk) | 665 | _REGISTER_CLOCK(NULL, "sahara2", sahara2_clk) |
| 666 | _REGISTER_CLOCK(NULL, "ata", ata_clk) | 666 | _REGISTER_CLOCK(NULL, "ata", ata_clk) |
| 667 | _REGISTER_CLOCK(NULL, "mstick", mstick_clk) | 667 | _REGISTER_CLOCK(NULL, "mstick", mstick_clk) |
| 668 | _REGISTER_CLOCK(NULL, "wdog", wdog_clk) | 668 | _REGISTER_CLOCK("imx-wdt.0", NULL, wdog_clk) |
| 669 | _REGISTER_CLOCK(NULL, "gpio", gpio_clk) | 669 | _REGISTER_CLOCK(NULL, "gpio", gpio_clk) |
| 670 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk) | 670 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk) |
| 671 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk) | 671 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk) |
diff --git a/arch/arm/mach-mx2/pcm038.c b/arch/arm/mach-mx2/pcm038.c index ee65dda584cf..906d59b0a7aa 100644 --- a/arch/arm/mach-mx2/pcm038.c +++ b/arch/arm/mach-mx2/pcm038.c | |||
| @@ -23,6 +23,10 @@ | |||
| 23 | #include <linux/mtd/plat-ram.h> | 23 | #include <linux/mtd/plat-ram.h> |
| 24 | #include <linux/mtd/physmap.h> | 24 | #include <linux/mtd/physmap.h> |
| 25 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
| 26 | #include <linux/regulator/machine.h> | ||
| 27 | #include <linux/mfd/mc13783.h> | ||
| 28 | #include <linux/spi/spi.h> | ||
| 29 | #include <linux/irq.h> | ||
| 26 | 30 | ||
| 27 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
| 28 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
| @@ -35,6 +39,7 @@ | |||
| 35 | #include <mach/iomux.h> | 39 | #include <mach/iomux.h> |
| 36 | #include <mach/imx-uart.h> | 40 | #include <mach/imx-uart.h> |
| 37 | #include <mach/mxc_nand.h> | 41 | #include <mach/mxc_nand.h> |
| 42 | #include <mach/spi.h> | ||
| 38 | 43 | ||
| 39 | #include "devices.h" | 44 | #include "devices.h" |
| 40 | 45 | ||
| @@ -78,8 +83,6 @@ static int pcm038_pins[] = { | |||
| 78 | PC6_PF_I2C2_SCL, | 83 | PC6_PF_I2C2_SCL, |
| 79 | /* SPI1 */ | 84 | /* SPI1 */ |
| 80 | PD25_PF_CSPI1_RDY, | 85 | PD25_PF_CSPI1_RDY, |
| 81 | PD27_PF_CSPI1_SS1, | ||
| 82 | PD28_PF_CSPI1_SS0, | ||
| 83 | PD29_PF_CSPI1_SCLK, | 86 | PD29_PF_CSPI1_SCLK, |
| 84 | PD30_PF_CSPI1_MISO, | 87 | PD30_PF_CSPI1_MISO, |
| 85 | PD31_PF_CSPI1_MOSI, | 88 | PD31_PF_CSPI1_MOSI, |
| @@ -196,6 +199,86 @@ static struct i2c_board_info pcm038_i2c_devices[] = { | |||
| 196 | } | 199 | } |
| 197 | }; | 200 | }; |
| 198 | 201 | ||
| 202 | static int pcm038_spi_cs[] = {GPIO_PORTD + 28}; | ||
| 203 | |||
| 204 | static struct spi_imx_master pcm038_spi_0_data = { | ||
| 205 | .chipselect = pcm038_spi_cs, | ||
| 206 | .num_chipselect = ARRAY_SIZE(pcm038_spi_cs), | ||
| 207 | }; | ||
| 208 | |||
| 209 | static struct regulator_consumer_supply sdhc1_consumers[] = { | ||
| 210 | { | ||
| 211 | .dev = &mxc_sdhc_device1.dev, | ||
| 212 | .supply = "sdhc_vcc", | ||
| 213 | }, | ||
| 214 | }; | ||
| 215 | |||
| 216 | static struct regulator_init_data sdhc1_data = { | ||
| 217 | .constraints = { | ||
| 218 | .min_uV = 3000000, | ||
| 219 | .max_uV = 3400000, | ||
| 220 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
| 221 | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, | ||
| 222 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
| 223 | REGULATOR_MODE_FAST, | ||
| 224 | .always_on = 0, | ||
| 225 | .boot_on = 0, | ||
| 226 | }, | ||
| 227 | .num_consumer_supplies = ARRAY_SIZE(sdhc1_consumers), | ||
| 228 | .consumer_supplies = sdhc1_consumers, | ||
| 229 | }; | ||
| 230 | |||
| 231 | static struct regulator_consumer_supply cam_consumers[] = { | ||
| 232 | { | ||
| 233 | .dev = NULL, | ||
| 234 | .supply = "imx_cam_vcc", | ||
| 235 | }, | ||
| 236 | }; | ||
| 237 | |||
| 238 | static struct regulator_init_data cam_data = { | ||
| 239 | .constraints = { | ||
| 240 | .min_uV = 3000000, | ||
| 241 | .max_uV = 3400000, | ||
| 242 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
| 243 | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, | ||
| 244 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
| 245 | REGULATOR_MODE_FAST, | ||
| 246 | .always_on = 0, | ||
| 247 | .boot_on = 0, | ||
| 248 | }, | ||
| 249 | .num_consumer_supplies = ARRAY_SIZE(cam_consumers), | ||
| 250 | .consumer_supplies = cam_consumers, | ||
| 251 | }; | ||
| 252 | |||
| 253 | struct mc13783_regulator_init_data pcm038_regulators[] = { | ||
| 254 | { | ||
| 255 | .id = MC13783_REGU_VCAM, | ||
| 256 | .init_data = &cam_data, | ||
| 257 | }, { | ||
| 258 | .id = MC13783_REGU_VMMC1, | ||
| 259 | .init_data = &sdhc1_data, | ||
| 260 | }, | ||
| 261 | }; | ||
| 262 | |||
| 263 | static struct mc13783_platform_data pcm038_pmic = { | ||
| 264 | .regulators = pcm038_regulators, | ||
| 265 | .num_regulators = ARRAY_SIZE(pcm038_regulators), | ||
| 266 | .flags = MC13783_USE_ADC | MC13783_USE_REGULATOR | | ||
| 267 | MC13783_USE_TOUCHSCREEN, | ||
| 268 | }; | ||
| 269 | |||
| 270 | static struct spi_board_info pcm038_spi_board_info[] __initdata = { | ||
| 271 | { | ||
| 272 | .modalias = "mc13783", | ||
| 273 | .irq = IRQ_GPIOB(23), | ||
| 274 | .max_speed_hz = 300000, | ||
| 275 | .bus_num = 0, | ||
| 276 | .chip_select = 0, | ||
| 277 | .platform_data = &pcm038_pmic, | ||
| 278 | .mode = SPI_CS_HIGH, | ||
| 279 | } | ||
| 280 | }; | ||
| 281 | |||
| 199 | static void __init pcm038_init(void) | 282 | static void __init pcm038_init(void) |
| 200 | { | 283 | { |
| 201 | mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins), | 284 | mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins), |
| @@ -219,6 +302,15 @@ static void __init pcm038_init(void) | |||
| 219 | /* PE18 for user-LED D40 */ | 302 | /* PE18 for user-LED D40 */ |
| 220 | mxc_gpio_mode(GPIO_PORTE | 18 | GPIO_GPIO | GPIO_OUT); | 303 | mxc_gpio_mode(GPIO_PORTE | 18 | GPIO_GPIO | GPIO_OUT); |
| 221 | 304 | ||
| 305 | mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT); | ||
| 306 | |||
| 307 | /* MC13783 IRQ */ | ||
| 308 | mxc_gpio_mode(GPIO_PORTB | 23 | GPIO_GPIO | GPIO_IN); | ||
| 309 | |||
| 310 | mxc_register_device(&mxc_spi_device0, &pcm038_spi_0_data); | ||
| 311 | spi_register_board_info(pcm038_spi_board_info, | ||
| 312 | ARRAY_SIZE(pcm038_spi_board_info)); | ||
| 313 | |||
| 222 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | 314 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); |
| 223 | 315 | ||
| 224 | #ifdef CONFIG_MACH_PCM970_BASEBOARD | 316 | #ifdef CONFIG_MACH_PCM970_BASEBOARD |
diff --git a/arch/arm/mach-mx2/pcm970-baseboard.c b/arch/arm/mach-mx2/pcm970-baseboard.c index c261f59b0b4c..3cb7f457e5d0 100644 --- a/arch/arm/mach-mx2/pcm970-baseboard.c +++ b/arch/arm/mach-mx2/pcm970-baseboard.c | |||
| @@ -39,7 +39,6 @@ static int pcm970_pins[] = { | |||
| 39 | PB7_PF_SD2_D3, | 39 | PB7_PF_SD2_D3, |
| 40 | PB8_PF_SD2_CMD, | 40 | PB8_PF_SD2_CMD, |
| 41 | PB9_PF_SD2_CLK, | 41 | PB9_PF_SD2_CLK, |
| 42 | GPIO_PORTC | 28 | GPIO_GPIO | GPIO_IN, /* card detect */ | ||
| 43 | /* display */ | 42 | /* display */ |
| 44 | PA5_PF_LSCLK, | 43 | PA5_PF_LSCLK, |
| 45 | PA6_PF_LD0, | 44 | PA6_PF_LD0, |
| @@ -228,6 +227,7 @@ void __init pcm970_baseboard_init(void) | |||
| 228 | "PCM970"); | 227 | "PCM970"); |
| 229 | 228 | ||
| 230 | mxc_register_device(&mxc_fb_device, &pcm038_fb_data); | 229 | mxc_register_device(&mxc_fb_device, &pcm038_fb_data); |
| 230 | mxc_gpio_mode(GPIO_PORTC | 28 | GPIO_GPIO | GPIO_IN); | ||
| 231 | mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata); | 231 | mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata); |
| 232 | platform_device_register(&pcm970_sja1000); | 232 | platform_device_register(&pcm970_sja1000); |
| 233 | } | 233 | } |
diff --git a/arch/arm/mach-mx25/devices.c b/arch/arm/mach-mx25/devices.c index eb12de1da42d..63511de3a559 100644 --- a/arch/arm/mach-mx25/devices.c +++ b/arch/arm/mach-mx25/devices.c | |||
| @@ -1,4 +1,23 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2009 Sascha Hauer, <kernel@pengutronix.de> | ||
| 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; either version 2 | ||
| 7 | * of the License, or (at your option) any later version. | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program; if not, write to the Free Software | ||
| 15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
| 16 | * Boston, MA 02110-1301, USA. | ||
| 17 | */ | ||
| 18 | |||
| 1 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 20 | #include <linux/dma-mapping.h> | ||
| 2 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
| 3 | #include <mach/mx25.h> | 22 | #include <mach/mx25.h> |
| 4 | #include <mach/irqs.h> | 23 | #include <mach/irqs.h> |
diff --git a/arch/arm/mach-mx25/mx25pdk.c b/arch/arm/mach-mx25/mx25pdk.c index 92aa4fd19d99..d23ae571c03f 100644 --- a/arch/arm/mach-mx25/mx25pdk.c +++ b/arch/arm/mach-mx25/mx25pdk.c | |||
| @@ -1,3 +1,21 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2009 Sascha Hauer, <kernel@pengutronix.de> | ||
| 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; either version 2 | ||
| 7 | * of the License, or (at your option) any later version. | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program; if not, write to the Free Software | ||
| 15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
| 16 | * Boston, MA 02110-1301, USA. | ||
| 17 | */ | ||
| 18 | |||
| 1 | #include <linux/types.h> | 19 | #include <linux/types.h> |
| 2 | #include <linux/init.h> | 20 | #include <linux/init.h> |
| 3 | #include <linux/clk.h> | 21 | #include <linux/clk.h> |
| @@ -23,19 +41,12 @@ static struct imxuart_platform_data uart_pdata = { | |||
| 23 | .flags = IMXUART_HAVE_RTSCTS, | 41 | .flags = IMXUART_HAVE_RTSCTS, |
| 24 | }; | 42 | }; |
| 25 | 43 | ||
| 26 | static struct mxc_nand_platform_data nand_board_info = { | ||
| 27 | .width = 1, | ||
| 28 | .hw_ecc = 1, | ||
| 29 | }; | ||
| 30 | |||
| 31 | static void __init mx25pdk_init(void) | 44 | static void __init mx25pdk_init(void) |
| 32 | { | 45 | { |
| 33 | mxc_register_device(&mxc_uart_device0, &uart_pdata); | 46 | mxc_register_device(&mxc_uart_device0, &uart_pdata); |
| 34 | mxc_register_device(&mxc_usbh2, NULL); | 47 | mxc_register_device(&mxc_usbh2, NULL); |
| 35 | mxc_register_device(&mxc_nand_device, &nand_board_info); | ||
| 36 | } | 48 | } |
| 37 | 49 | ||
| 38 | |||
| 39 | static void __init mx25pdk_timer_init(void) | 50 | static void __init mx25pdk_timer_init(void) |
| 40 | { | 51 | { |
| 41 | mx25_clocks_init(26000000); | 52 | mx25_clocks_init(26000000); |
diff --git a/arch/arm/mach-mx3/clock-imx35.c b/arch/arm/mach-mx3/clock-imx35.c index fe5c4217322e..c595260ec1f9 100644 --- a/arch/arm/mach-mx3/clock-imx35.c +++ b/arch/arm/mach-mx3/clock-imx35.c | |||
| @@ -443,7 +443,7 @@ static struct clk_lookup lookups[] = { | |||
| 443 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usbotg_clk) | 443 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usbotg_clk) |
| 444 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usbotg_clk) | 444 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usbotg_clk) |
| 445 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usbotg_clk) | 445 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usbotg_clk) |
| 446 | _REGISTER_CLOCK("mxc_wdt.0", NULL, wdog_clk) | 446 | _REGISTER_CLOCK("imx-wdt.0", NULL, wdog_clk) |
| 447 | _REGISTER_CLOCK(NULL, "max", max_clk) | 447 | _REGISTER_CLOCK(NULL, "max", max_clk) |
| 448 | _REGISTER_CLOCK(NULL, "admux", admux_clk) | 448 | _REGISTER_CLOCK(NULL, "admux", admux_clk) |
| 449 | _REGISTER_CLOCK(NULL, "csi", csi_clk) | 449 | _REGISTER_CLOCK(NULL, "csi", csi_clk) |
diff --git a/arch/arm/mach-mx3/clock.c b/arch/arm/mach-mx3/clock.c index 06bd6180bfc3..b2a3bcf8266e 100644 --- a/arch/arm/mach-mx3/clock.c +++ b/arch/arm/mach-mx3/clock.c | |||
| @@ -530,7 +530,7 @@ static struct clk_lookup lookups[] = { | |||
| 530 | _REGISTER_CLOCK("spi_imx.2", NULL, cspi3_clk) | 530 | _REGISTER_CLOCK("spi_imx.2", NULL, cspi3_clk) |
| 531 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) | 531 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) |
| 532 | _REGISTER_CLOCK(NULL, "pwm", pwm_clk) | 532 | _REGISTER_CLOCK(NULL, "pwm", pwm_clk) |
| 533 | _REGISTER_CLOCK(NULL, "wdog", wdog_clk) | 533 | _REGISTER_CLOCK("imx-wdt.0", NULL, wdog_clk) |
| 534 | _REGISTER_CLOCK(NULL, "rtc", rtc_clk) | 534 | _REGISTER_CLOCK(NULL, "rtc", rtc_clk) |
| 535 | _REGISTER_CLOCK(NULL, "epit", epit1_clk) | 535 | _REGISTER_CLOCK(NULL, "epit", epit1_clk) |
| 536 | _REGISTER_CLOCK(NULL, "epit", epit2_clk) | 536 | _REGISTER_CLOCK(NULL, "epit", epit2_clk) |
diff --git a/arch/arm/mach-mx3/devices.c b/arch/arm/mach-mx3/devices.c index 8a577f367250..e6abe181b967 100644 --- a/arch/arm/mach-mx3/devices.c +++ b/arch/arm/mach-mx3/devices.c | |||
| @@ -459,7 +459,7 @@ struct platform_device mxc_usbh2 = { | |||
| 459 | * SPI master controller | 459 | * SPI master controller |
| 460 | * 3 channels | 460 | * 3 channels |
| 461 | */ | 461 | */ |
| 462 | static struct resource imx_spi_0_resources[] = { | 462 | static struct resource mxc_spi_0_resources[] = { |
| 463 | { | 463 | { |
| 464 | .start = CSPI1_BASE_ADDR, | 464 | .start = CSPI1_BASE_ADDR, |
| 465 | .end = CSPI1_BASE_ADDR + SZ_4K - 1, | 465 | .end = CSPI1_BASE_ADDR + SZ_4K - 1, |
| @@ -471,7 +471,7 @@ static struct resource imx_spi_0_resources[] = { | |||
| 471 | }, | 471 | }, |
| 472 | }; | 472 | }; |
| 473 | 473 | ||
| 474 | static struct resource imx_spi_1_resources[] = { | 474 | static struct resource mxc_spi_1_resources[] = { |
| 475 | { | 475 | { |
| 476 | .start = CSPI2_BASE_ADDR, | 476 | .start = CSPI2_BASE_ADDR, |
| 477 | .end = CSPI2_BASE_ADDR + SZ_4K - 1, | 477 | .end = CSPI2_BASE_ADDR + SZ_4K - 1, |
| @@ -483,7 +483,7 @@ static struct resource imx_spi_1_resources[] = { | |||
| 483 | }, | 483 | }, |
| 484 | }; | 484 | }; |
| 485 | 485 | ||
| 486 | static struct resource imx_spi_2_resources[] = { | 486 | static struct resource mxc_spi_2_resources[] = { |
| 487 | { | 487 | { |
| 488 | .start = CSPI3_BASE_ADDR, | 488 | .start = CSPI3_BASE_ADDR, |
| 489 | .end = CSPI3_BASE_ADDR + SZ_4K - 1, | 489 | .end = CSPI3_BASE_ADDR + SZ_4K - 1, |
| @@ -495,25 +495,25 @@ static struct resource imx_spi_2_resources[] = { | |||
| 495 | }, | 495 | }, |
| 496 | }; | 496 | }; |
| 497 | 497 | ||
| 498 | struct platform_device imx_spi_device0 = { | 498 | struct platform_device mxc_spi_device0 = { |
| 499 | .name = "spi_imx", | 499 | .name = "spi_imx", |
| 500 | .id = 0, | 500 | .id = 0, |
| 501 | .num_resources = ARRAY_SIZE(imx_spi_0_resources), | 501 | .num_resources = ARRAY_SIZE(mxc_spi_0_resources), |
| 502 | .resource = imx_spi_0_resources, | 502 | .resource = mxc_spi_0_resources, |
| 503 | }; | 503 | }; |
| 504 | 504 | ||
| 505 | struct platform_device imx_spi_device1 = { | 505 | struct platform_device mxc_spi_device1 = { |
| 506 | .name = "spi_imx", | 506 | .name = "spi_imx", |
| 507 | .id = 1, | 507 | .id = 1, |
| 508 | .num_resources = ARRAY_SIZE(imx_spi_1_resources), | 508 | .num_resources = ARRAY_SIZE(mxc_spi_1_resources), |
| 509 | .resource = imx_spi_1_resources, | 509 | .resource = mxc_spi_1_resources, |
| 510 | }; | 510 | }; |
| 511 | 511 | ||
| 512 | struct platform_device imx_spi_device2 = { | 512 | struct platform_device mxc_spi_device2 = { |
| 513 | .name = "spi_imx", | 513 | .name = "spi_imx", |
| 514 | .id = 2, | 514 | .id = 2, |
| 515 | .num_resources = ARRAY_SIZE(imx_spi_2_resources), | 515 | .num_resources = ARRAY_SIZE(mxc_spi_2_resources), |
| 516 | .resource = imx_spi_2_resources, | 516 | .resource = mxc_spi_2_resources, |
| 517 | }; | 517 | }; |
| 518 | 518 | ||
| 519 | #ifdef CONFIG_ARCH_MX35 | 519 | #ifdef CONFIG_ARCH_MX35 |
diff --git a/arch/arm/mach-mx3/devices.h b/arch/arm/mach-mx3/devices.h index 79f2be45d139..ab87419dc9a0 100644 --- a/arch/arm/mach-mx3/devices.h +++ b/arch/arm/mach-mx3/devices.h | |||
| @@ -20,7 +20,7 @@ extern struct platform_device mxc_otg_host; | |||
| 20 | extern struct platform_device mxc_usbh1; | 20 | extern struct platform_device mxc_usbh1; |
| 21 | extern struct platform_device mxc_usbh2; | 21 | extern struct platform_device mxc_usbh2; |
| 22 | extern struct platform_device mxc_rnga_device; | 22 | extern struct platform_device mxc_rnga_device; |
| 23 | extern struct platform_device imx_spi_device0; | 23 | extern struct platform_device mxc_spi_device0; |
| 24 | extern struct platform_device imx_spi_device1; | 24 | extern struct platform_device mxc_spi_device1; |
| 25 | extern struct platform_device imx_spi_device2; | 25 | extern struct platform_device mxc_spi_device2; |
| 26 | 26 | ||
diff --git a/arch/arm/mach-mx3/mm.c b/arch/arm/mach-mx3/mm.c index ad5a1122d765..bedf5b8d976a 100644 --- a/arch/arm/mach-mx3/mm.c +++ b/arch/arm/mach-mx3/mm.c | |||
| @@ -81,6 +81,7 @@ void __init mx31_map_io(void) | |||
| 81 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | 81 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | #ifdef CONFIG_ARCH_MX35 | ||
| 84 | void __init mx35_map_io(void) | 85 | void __init mx35_map_io(void) |
| 85 | { | 86 | { |
| 86 | mxc_set_cpu_type(MXC_CPU_MX35); | 87 | mxc_set_cpu_type(MXC_CPU_MX35); |
| @@ -89,6 +90,7 @@ void __init mx35_map_io(void) | |||
| 89 | 90 | ||
| 90 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | 91 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); |
| 91 | } | 92 | } |
| 93 | #endif | ||
| 92 | 94 | ||
| 93 | void __init mx31_init_irq(void) | 95 | void __init mx31_init_irq(void) |
| 94 | { | 96 | { |
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index 42920f9c1a11..8ad5cc3e83e3 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
| @@ -219,6 +219,10 @@ static struct platform_device *ams_delta_devices[] __initdata = { | |||
| 219 | 219 | ||
| 220 | static void __init ams_delta_init(void) | 220 | static void __init ams_delta_init(void) |
| 221 | { | 221 | { |
| 222 | /* mux pins for uarts */ | ||
| 223 | omap_cfg_reg(UART1_TX); | ||
| 224 | omap_cfg_reg(UART1_RTS); | ||
| 225 | |||
| 222 | iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc)); | 226 | iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc)); |
| 223 | 227 | ||
| 224 | omap_board_config = ams_delta_config; | 228 | omap_board_config = ams_delta_config; |
| @@ -231,6 +235,8 @@ static void __init ams_delta_init(void) | |||
| 231 | 235 | ||
| 232 | omap_usb_init(&ams_delta_usb_config); | 236 | omap_usb_init(&ams_delta_usb_config); |
| 233 | platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices)); | 237 | platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices)); |
| 238 | |||
| 239 | omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1); | ||
| 234 | } | 240 | } |
| 235 | 241 | ||
| 236 | static struct plat_serial8250_port ams_delta_modem_ports[] = { | 242 | static struct plat_serial8250_port ams_delta_modem_ports[] = { |
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index fb47239da72f..6c8a41f20e51 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c | |||
| @@ -64,6 +64,14 @@ static void __init omap_generic_init(void) | |||
| 64 | { | 64 | { |
| 65 | #ifdef CONFIG_ARCH_OMAP15XX | 65 | #ifdef CONFIG_ARCH_OMAP15XX |
| 66 | if (cpu_is_omap15xx()) { | 66 | if (cpu_is_omap15xx()) { |
| 67 | /* mux pins for uarts */ | ||
| 68 | omap_cfg_reg(UART1_TX); | ||
| 69 | omap_cfg_reg(UART1_RTS); | ||
| 70 | omap_cfg_reg(UART2_TX); | ||
| 71 | omap_cfg_reg(UART2_RTS); | ||
| 72 | omap_cfg_reg(UART3_TX); | ||
| 73 | omap_cfg_reg(UART3_RX); | ||
| 74 | |||
| 67 | omap_usb_init(&generic1510_usb_config); | 75 | omap_usb_init(&generic1510_usb_config); |
| 68 | } | 76 | } |
| 69 | #endif | 77 | #endif |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index cc2abbb2d0f4..cd6c39514826 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
| @@ -376,6 +376,26 @@ static void __init innovator_init(void) | |||
| 376 | { | 376 | { |
| 377 | #ifdef CONFIG_ARCH_OMAP15XX | 377 | #ifdef CONFIG_ARCH_OMAP15XX |
| 378 | if (cpu_is_omap1510()) { | 378 | if (cpu_is_omap1510()) { |
| 379 | unsigned char reg; | ||
| 380 | |||
| 381 | /* mux pins for uarts */ | ||
| 382 | omap_cfg_reg(UART1_TX); | ||
| 383 | omap_cfg_reg(UART1_RTS); | ||
| 384 | omap_cfg_reg(UART2_TX); | ||
| 385 | omap_cfg_reg(UART2_RTS); | ||
| 386 | omap_cfg_reg(UART3_TX); | ||
| 387 | omap_cfg_reg(UART3_RX); | ||
| 388 | |||
| 389 | reg = fpga_read(OMAP1510_FPGA_POWER); | ||
| 390 | reg |= OMAP1510_FPGA_PCR_COM1_EN; | ||
| 391 | fpga_write(reg, OMAP1510_FPGA_POWER); | ||
| 392 | udelay(10); | ||
| 393 | |||
| 394 | reg = fpga_read(OMAP1510_FPGA_POWER); | ||
| 395 | reg |= OMAP1510_FPGA_PCR_COM2_EN; | ||
| 396 | fpga_write(reg, OMAP1510_FPGA_POWER); | ||
| 397 | udelay(10); | ||
| 398 | |||
| 379 | platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices)); | 399 | platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices)); |
| 380 | spi_register_board_info(innovator1510_boardinfo, | 400 | spi_register_board_info(innovator1510_boardinfo, |
| 381 | ARRAY_SIZE(innovator1510_boardinfo)); | 401 | ARRAY_SIZE(innovator1510_boardinfo)); |
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 90dd0431b0dc..4de258420f39 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c | |||
| @@ -342,6 +342,14 @@ static void __init palmte_misc_gpio_setup(void) | |||
| 342 | 342 | ||
| 343 | static void __init omap_palmte_init(void) | 343 | static void __init omap_palmte_init(void) |
| 344 | { | 344 | { |
| 345 | /* mux pins for uarts */ | ||
| 346 | omap_cfg_reg(UART1_TX); | ||
| 347 | omap_cfg_reg(UART1_RTS); | ||
| 348 | omap_cfg_reg(UART2_TX); | ||
| 349 | omap_cfg_reg(UART2_RTS); | ||
| 350 | omap_cfg_reg(UART3_TX); | ||
| 351 | omap_cfg_reg(UART3_RX); | ||
| 352 | |||
| 345 | omap_board_config = palmte_config; | 353 | omap_board_config = palmte_config; |
| 346 | omap_board_config_size = ARRAY_SIZE(palmte_config); | 354 | omap_board_config_size = ARRAY_SIZE(palmte_config); |
| 347 | 355 | ||
diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index 8256139891ff..d972cf941b76 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c | |||
| @@ -289,6 +289,14 @@ static void __init omap_mpu_wdt_mode(int mode) { | |||
| 289 | 289 | ||
| 290 | static void __init omap_palmtt_init(void) | 290 | static void __init omap_palmtt_init(void) |
| 291 | { | 291 | { |
| 292 | /* mux pins for uarts */ | ||
| 293 | omap_cfg_reg(UART1_TX); | ||
| 294 | omap_cfg_reg(UART1_RTS); | ||
| 295 | omap_cfg_reg(UART2_TX); | ||
| 296 | omap_cfg_reg(UART2_RTS); | ||
| 297 | omap_cfg_reg(UART3_TX); | ||
| 298 | omap_cfg_reg(UART3_RX); | ||
| 299 | |||
| 292 | omap_mpu_wdt_mode(0); | 300 | omap_mpu_wdt_mode(0); |
| 293 | 301 | ||
| 294 | omap_board_config = palmtt_config; | 302 | omap_board_config = palmtt_config; |
diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index 81b6bde1c5a3..986bd4df0e97 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c | |||
| @@ -307,6 +307,14 @@ palmz71_gpio_setup(int early) | |||
| 307 | static void __init | 307 | static void __init |
| 308 | omap_palmz71_init(void) | 308 | omap_palmz71_init(void) |
| 309 | { | 309 | { |
| 310 | /* mux pins for uarts */ | ||
| 311 | omap_cfg_reg(UART1_TX); | ||
| 312 | omap_cfg_reg(UART1_RTS); | ||
| 313 | omap_cfg_reg(UART2_TX); | ||
| 314 | omap_cfg_reg(UART2_RTS); | ||
| 315 | omap_cfg_reg(UART3_TX); | ||
| 316 | omap_cfg_reg(UART3_RX); | ||
| 317 | |||
| 310 | palmz71_gpio_setup(1); | 318 | palmz71_gpio_setup(1); |
| 311 | omap_mpu_wdt_mode(0); | 319 | omap_mpu_wdt_mode(0); |
| 312 | 320 | ||
diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 02c85ca2e1df..056ae64e0f55 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c | |||
| @@ -377,6 +377,14 @@ static struct omap_board_config_kernel sx1_config[] __initdata = { | |||
| 377 | 377 | ||
| 378 | static void __init omap_sx1_init(void) | 378 | static void __init omap_sx1_init(void) |
| 379 | { | 379 | { |
| 380 | /* mux pins for uarts */ | ||
| 381 | omap_cfg_reg(UART1_TX); | ||
| 382 | omap_cfg_reg(UART1_RTS); | ||
| 383 | omap_cfg_reg(UART2_TX); | ||
| 384 | omap_cfg_reg(UART2_RTS); | ||
| 385 | omap_cfg_reg(UART3_TX); | ||
| 386 | omap_cfg_reg(UART3_RX); | ||
| 387 | |||
| 380 | platform_add_devices(sx1_devices, ARRAY_SIZE(sx1_devices)); | 388 | platform_add_devices(sx1_devices, ARRAY_SIZE(sx1_devices)); |
| 381 | 389 | ||
| 382 | omap_board_config = sx1_config; | 390 | omap_board_config = sx1_config; |
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index c06e7a553472..07b07522d5bf 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
| @@ -152,6 +152,14 @@ static void __init voiceblue_init_irq(void) | |||
| 152 | 152 | ||
| 153 | static void __init voiceblue_init(void) | 153 | static void __init voiceblue_init(void) |
| 154 | { | 154 | { |
| 155 | /* mux pins for uarts */ | ||
| 156 | omap_cfg_reg(UART1_TX); | ||
| 157 | omap_cfg_reg(UART1_RTS); | ||
| 158 | omap_cfg_reg(UART2_TX); | ||
| 159 | omap_cfg_reg(UART2_RTS); | ||
| 160 | omap_cfg_reg(UART3_TX); | ||
| 161 | omap_cfg_reg(UART3_RX); | ||
| 162 | |||
| 155 | /* Watchdog */ | 163 | /* Watchdog */ |
| 156 | gpio_request(0, "Watchdog"); | 164 | gpio_request(0, "Watchdog"); |
| 157 | /* smc91x reset */ | 165 | /* smc91x reset */ |
diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index d496e50fec40..d23979bc0fd5 100644 --- a/arch/arm/mach-omap1/serial.c +++ b/arch/arm/mach-omap1/serial.c | |||
| @@ -131,8 +131,6 @@ void __init omap_serial_init(void) | |||
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { | 133 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { |
| 134 | unsigned char reg; | ||
| 135 | |||
| 136 | switch (i) { | 134 | switch (i) { |
| 137 | case 0: | 135 | case 0: |
| 138 | uart1_ck = clk_get(NULL, "uart1_ck"); | 136 | uart1_ck = clk_get(NULL, "uart1_ck"); |
| @@ -143,16 +141,6 @@ void __init omap_serial_init(void) | |||
| 143 | if (cpu_is_omap15xx()) | 141 | if (cpu_is_omap15xx()) |
| 144 | clk_set_rate(uart1_ck, 12000000); | 142 | clk_set_rate(uart1_ck, 12000000); |
| 145 | } | 143 | } |
| 146 | if (cpu_is_omap15xx()) { | ||
| 147 | omap_cfg_reg(UART1_TX); | ||
| 148 | omap_cfg_reg(UART1_RTS); | ||
| 149 | if (machine_is_omap_innovator()) { | ||
| 150 | reg = fpga_read(OMAP1510_FPGA_POWER); | ||
| 151 | reg |= OMAP1510_FPGA_PCR_COM1_EN; | ||
| 152 | fpga_write(reg, OMAP1510_FPGA_POWER); | ||
| 153 | udelay(10); | ||
| 154 | } | ||
| 155 | } | ||
| 156 | break; | 144 | break; |
| 157 | case 1: | 145 | case 1: |
| 158 | uart2_ck = clk_get(NULL, "uart2_ck"); | 146 | uart2_ck = clk_get(NULL, "uart2_ck"); |
| @@ -165,16 +153,6 @@ void __init omap_serial_init(void) | |||
| 165 | else | 153 | else |
| 166 | clk_set_rate(uart2_ck, 48000000); | 154 | clk_set_rate(uart2_ck, 48000000); |
| 167 | } | 155 | } |
| 168 | if (cpu_is_omap15xx()) { | ||
| 169 | omap_cfg_reg(UART2_TX); | ||
| 170 | omap_cfg_reg(UART2_RTS); | ||
| 171 | if (machine_is_omap_innovator()) { | ||
| 172 | reg = fpga_read(OMAP1510_FPGA_POWER); | ||
| 173 | reg |= OMAP1510_FPGA_PCR_COM2_EN; | ||
| 174 | fpga_write(reg, OMAP1510_FPGA_POWER); | ||
| 175 | udelay(10); | ||
| 176 | } | ||
| 177 | } | ||
| 178 | break; | 156 | break; |
| 179 | case 2: | 157 | case 2: |
| 180 | uart3_ck = clk_get(NULL, "uart3_ck"); | 158 | uart3_ck = clk_get(NULL, "uart3_ck"); |
| @@ -185,10 +163,6 @@ void __init omap_serial_init(void) | |||
| 185 | if (cpu_is_omap15xx()) | 163 | if (cpu_is_omap15xx()) |
| 186 | clk_set_rate(uart3_ck, 12000000); | 164 | clk_set_rate(uart3_ck, 12000000); |
| 187 | } | 165 | } |
| 188 | if (cpu_is_omap15xx()) { | ||
| 189 | omap_cfg_reg(UART3_TX); | ||
| 190 | omap_cfg_reg(UART3_RX); | ||
| 191 | } | ||
| 192 | break; | 166 | break; |
| 193 | } | 167 | } |
| 194 | omap_serial_reset(&serial_platform_data[i]); | 168 | omap_serial_reset(&serial_platform_data[i]); |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 75b1c7efae7e..aad194f61a33 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
| @@ -73,9 +73,21 @@ config MACH_OMAP_3430SDP | |||
| 73 | bool "OMAP 3430 SDP board" | 73 | bool "OMAP 3430 SDP board" |
| 74 | depends on ARCH_OMAP3 && ARCH_OMAP34XX | 74 | depends on ARCH_OMAP3 && ARCH_OMAP34XX |
| 75 | 75 | ||
| 76 | config MACH_NOKIA_N800 | ||
| 77 | bool | ||
| 78 | |||
| 79 | config MACH_NOKIA_N810 | ||
| 80 | bool | ||
| 81 | |||
| 82 | config MACH_NOKIA_N810_WIMAX | ||
| 83 | bool | ||
| 84 | |||
| 76 | config MACH_NOKIA_N8X0 | 85 | config MACH_NOKIA_N8X0 |
| 77 | bool "Nokia N800/N810" | 86 | bool "Nokia N800/N810" |
| 78 | depends on ARCH_OMAP2420 | 87 | depends on ARCH_OMAP2420 |
| 88 | select MACH_NOKIA_N800 | ||
| 89 | select MACH_NOKIA_N810 | ||
| 90 | select MACH_NOKIA_N810_WIMAX | ||
| 79 | 91 | ||
| 80 | config MACH_NOKIA_RX51 | 92 | config MACH_NOKIA_RX51 |
| 81 | bool "Nokia RX-51 board" | 93 | bool "Nokia RX-51 board" |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index efaf053eba85..0acb5560229c 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
| 18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
| 19 | #include <linux/input.h> | 19 | #include <linux/input.h> |
| 20 | #include <linux/input/matrix_keypad.h> | ||
| 20 | #include <linux/spi/spi.h> | 21 | #include <linux/spi/spi.h> |
| 21 | #include <linux/spi/ads7846.h> | 22 | #include <linux/spi/ads7846.h> |
| 22 | #include <linux/i2c/twl4030.h> | 23 | #include <linux/i2c/twl4030.h> |
| @@ -38,7 +39,6 @@ | |||
| 38 | #include <mach/gpmc.h> | 39 | #include <mach/gpmc.h> |
| 39 | 40 | ||
| 40 | #include <mach/control.h> | 41 | #include <mach/control.h> |
| 41 | #include <mach/keypad.h> | ||
| 42 | #include <mach/gpmc-smc91x.h> | 42 | #include <mach/gpmc-smc91x.h> |
| 43 | 43 | ||
| 44 | #include "sdram-qimonda-hyb18m512160af-6.h" | 44 | #include "sdram-qimonda-hyb18m512160af-6.h" |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index eb37c40ea83a..609a5a4a7e29 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
| @@ -58,6 +58,8 @@ static void __init gic_init_irq(void) | |||
| 58 | 58 | ||
| 59 | static void __init omap_4430sdp_init_irq(void) | 59 | static void __init omap_4430sdp_init_irq(void) |
| 60 | { | 60 | { |
| 61 | omap_board_config = sdp4430_config; | ||
| 62 | omap_board_config_size = ARRAY_SIZE(sdp4430_config); | ||
| 61 | omap2_init_common_hw(NULL, NULL); | 63 | omap2_init_common_hw(NULL, NULL); |
| 62 | #ifdef CONFIG_OMAP_32K_TIMER | 64 | #ifdef CONFIG_OMAP_32K_TIMER |
| 63 | omap2_gp_clockevent_set_gptimer(1); | 65 | omap2_gp_clockevent_set_gptimer(1); |
| @@ -70,8 +72,6 @@ static void __init omap_4430sdp_init_irq(void) | |||
| 70 | static void __init omap_4430sdp_init(void) | 72 | static void __init omap_4430sdp_init(void) |
| 71 | { | 73 | { |
| 72 | platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); | 74 | platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); |
| 73 | omap_board_config = sdp4430_config; | ||
| 74 | omap_board_config_size = ARRAY_SIZE(sdp4430_config); | ||
| 75 | omap_serial_init(); | 75 | omap_serial_init(); |
| 76 | } | 76 | } |
| 77 | 77 | ||
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index d110a7fdfbd8..d57ec2f4d0a9 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/input.h> | 18 | #include <linux/input.h> |
| 19 | #include <linux/input/matrix_keypad.h> | ||
| 19 | #include <linux/gpio_keys.h> | 20 | #include <linux/gpio_keys.h> |
| 20 | #include <linux/workqueue.h> | 21 | #include <linux/workqueue.h> |
| 21 | #include <linux/err.h> | 22 | #include <linux/err.h> |
| @@ -41,7 +42,6 @@ | |||
| 41 | #include <asm/delay.h> | 42 | #include <asm/delay.h> |
| 42 | #include <mach/control.h> | 43 | #include <mach/control.h> |
| 43 | #include <mach/usb.h> | 44 | #include <mach/usb.h> |
| 44 | #include <mach/keypad.h> | ||
| 45 | 45 | ||
| 46 | #include "mmc-twl4030.h" | 46 | #include "mmc-twl4030.h" |
| 47 | 47 | ||
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index e4ec0c591216..4c4d7f8dbd72 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/clk.h> | 20 | #include <linux/clk.h> |
| 21 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
| 22 | #include <linux/input.h> | 22 | #include <linux/input.h> |
| 23 | #include <linux/input/matrix_keypad.h> | ||
| 23 | #include <linux/leds.h> | 24 | #include <linux/leds.h> |
| 24 | 25 | ||
| 25 | #include <linux/spi/spi.h> | 26 | #include <linux/spi/spi.h> |
| @@ -37,7 +38,6 @@ | |||
| 37 | #include <mach/usb.h> | 38 | #include <mach/usb.h> |
| 38 | #include <mach/common.h> | 39 | #include <mach/common.h> |
| 39 | #include <mach/mcspi.h> | 40 | #include <mach/mcspi.h> |
| 40 | #include <mach/keypad.h> | ||
| 41 | 41 | ||
| 42 | #include "sdram-micron-mt46h32m32lf-6.h" | 42 | #include "sdram-micron-mt46h32m32lf-6.h" |
| 43 | #include "mmc-twl4030.h" | 43 | #include "mmc-twl4030.h" |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 7f6bf8772af7..5326e0d61597 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/i2c/twl4030.h> | 27 | #include <linux/i2c/twl4030.h> |
| 28 | #include <linux/leds.h> | 28 | #include <linux/leds.h> |
| 29 | #include <linux/input.h> | 29 | #include <linux/input.h> |
| 30 | #include <linux/input/matrix_keypad.h> | ||
| 30 | #include <linux/gpio_keys.h> | 31 | #include <linux/gpio_keys.h> |
| 31 | 32 | ||
| 32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| @@ -39,7 +40,6 @@ | |||
| 39 | #include <mach/hardware.h> | 40 | #include <mach/hardware.h> |
| 40 | #include <mach/mcspi.h> | 41 | #include <mach/mcspi.h> |
| 41 | #include <mach/usb.h> | 42 | #include <mach/usb.h> |
| 42 | #include <mach/keypad.h> | ||
| 43 | #include <mach/mux.h> | 43 | #include <mach/mux.h> |
| 44 | 44 | ||
| 45 | #include "sdram-micron-mt46h32m32lf-6.h" | 45 | #include "sdram-micron-mt46h32m32lf-6.h" |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index 2b0eb1ba5d7f..e34d96a825e3 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
| 14 | #include <linux/input.h> | 14 | #include <linux/input.h> |
| 15 | #include <linux/input/matrix_keypad.h> | ||
| 15 | #include <linux/spi/spi.h> | 16 | #include <linux/spi/spi.h> |
| 16 | #include <linux/i2c.h> | 17 | #include <linux/i2c.h> |
| 17 | #include <linux/i2c/twl4030.h> | 18 | #include <linux/i2c/twl4030.h> |
| @@ -27,7 +28,6 @@ | |||
| 27 | #include <mach/common.h> | 28 | #include <mach/common.h> |
| 28 | #include <mach/dma.h> | 29 | #include <mach/dma.h> |
| 29 | #include <mach/gpmc.h> | 30 | #include <mach/gpmc.h> |
| 30 | #include <mach/keypad.h> | ||
| 31 | #include <mach/onenand.h> | 31 | #include <mach/onenand.h> |
| 32 | #include <mach/gpmc-smc91x.h> | 32 | #include <mach/gpmc-smc91x.h> |
| 33 | 33 | ||
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index f9196c3b1a7b..78869a9a1cc2 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | #include <mach/mux.h> | 26 | #include <mach/mux.h> |
| 27 | #include <mach/board.h> | 27 | #include <mach/board.h> |
| 28 | #include <mach/common.h> | 28 | #include <mach/common.h> |
| 29 | #include <mach/keypad.h> | ||
| 30 | #include <mach/dma.h> | 29 | #include <mach/dma.h> |
| 31 | #include <mach/gpmc.h> | 30 | #include <mach/gpmc.h> |
| 32 | #include <mach/usb.h> | 31 | #include <mach/usb.h> |
diff --git a/arch/arm/mach-omap2/board-zoom2.c b/arch/arm/mach-omap2/board-zoom2.c index fd3369d5e5cb..ea00486a5e53 100644 --- a/arch/arm/mach-omap2/board-zoom2.c +++ b/arch/arm/mach-omap2/board-zoom2.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 15 | #include <linux/input.h> | 15 | #include <linux/input.h> |
| 16 | #include <linux/input/matrix_keypad.h> | ||
| 16 | #include <linux/gpio.h> | 17 | #include <linux/gpio.h> |
| 17 | #include <linux/i2c/twl4030.h> | 18 | #include <linux/i2c/twl4030.h> |
| 18 | #include <linux/regulator/machine.h> | 19 | #include <linux/regulator/machine.h> |
| @@ -22,7 +23,6 @@ | |||
| 22 | 23 | ||
| 23 | #include <mach/common.h> | 24 | #include <mach/common.h> |
| 24 | #include <mach/usb.h> | 25 | #include <mach/usb.h> |
| 25 | #include <mach/keypad.h> | ||
| 26 | 26 | ||
| 27 | #include "mmc-twl4030.h" | 27 | #include "mmc-twl4030.h" |
| 28 | #include "sdram-micron-mt46h32m32lf-6.h" | 28 | #include "sdram-micron-mt46h32m32lf-6.h" |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index e3a3bad1d84f..56be87d13edb 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -302,7 +302,9 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, | |||
| 302 | pwrdm_init(powerdomains_omap); | 302 | pwrdm_init(powerdomains_omap); |
| 303 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); | 303 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); |
| 304 | omap2_clk_init(); | 304 | omap2_clk_init(); |
| 305 | #endif | ||
| 305 | omap_serial_early_init(); | 306 | omap_serial_early_init(); |
| 307 | #ifndef CONFIG_ARCH_OMAP4 | ||
| 306 | omap_hwmod_late_init(); | 308 | omap_hwmod_late_init(); |
| 307 | omap_pm_if_init(); | 309 | omap_pm_if_init(); |
| 308 | omap2_sdrc_init(sdrc_cs0, sdrc_cs1); | 310 | omap2_sdrc_init(sdrc_cs0, sdrc_cs1); |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 378c2f618358..89463190923a 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -639,14 +639,15 @@ static void __init prcm_setup_regs(void) | |||
| 639 | prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, | 639 | prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, |
| 640 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); | 640 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); |
| 641 | 641 | ||
| 642 | /* Enable GPIO wakeups in PER */ | 642 | /* Enable wakeups in PER */ |
| 643 | prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 | | 643 | prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 | |
| 644 | OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 | | 644 | OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 | |
| 645 | OMAP3430_EN_GPIO6, OMAP3430_PER_MOD, PM_WKEN); | 645 | OMAP3430_EN_GPIO6 | OMAP3430_EN_UART3, |
| 646 | OMAP3430_PER_MOD, PM_WKEN); | ||
| 646 | /* and allow them to wake up MPU */ | 647 | /* and allow them to wake up MPU */ |
| 647 | prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 | | 648 | prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 | |
| 648 | OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 | | 649 | OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 | |
| 649 | OMAP3430_GRPSEL_GPIO6, | 650 | OMAP3430_GRPSEL_GPIO6 | OMAP3430_EN_UART3, |
| 650 | OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); | 651 | OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); |
| 651 | 652 | ||
| 652 | /* Don't attach IVA interrupts */ | 653 | /* Don't attach IVA interrupts */ |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index ae2186892c85..54dfeb5d5667 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
| @@ -109,16 +109,6 @@ static struct plat_serial8250_port serial_platform_data2[] = { | |||
| 109 | .regshift = 2, | 109 | .regshift = 2, |
| 110 | .uartclk = OMAP24XX_BASE_BAUD * 16, | 110 | .uartclk = OMAP24XX_BASE_BAUD * 16, |
| 111 | }, { | 111 | }, { |
| 112 | #ifdef CONFIG_ARCH_OMAP4 | ||
| 113 | .membase = OMAP2_IO_ADDRESS(OMAP_UART4_BASE), | ||
| 114 | .mapbase = OMAP_UART4_BASE, | ||
| 115 | .irq = 70, | ||
| 116 | .flags = UPF_BOOT_AUTOCONF, | ||
| 117 | .iotype = UPIO_MEM, | ||
| 118 | .regshift = 2, | ||
| 119 | .uartclk = OMAP24XX_BASE_BAUD * 16, | ||
| 120 | }, { | ||
| 121 | #endif | ||
| 122 | .flags = 0 | 112 | .flags = 0 |
| 123 | } | 113 | } |
| 124 | }; | 114 | }; |
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c index aac2cda60e09..102916f1e465 100644 --- a/arch/arm/mach-pxa/cm-x300.c +++ b/arch/arm/mach-pxa/cm-x300.c | |||
| @@ -43,10 +43,10 @@ | |||
| 43 | 43 | ||
| 44 | #define CM_X300_ETH_PHYS 0x08000010 | 44 | #define CM_X300_ETH_PHYS 0x08000010 |
| 45 | 45 | ||
| 46 | #define GPIO82_MMC2_IRQ (82) | 46 | #define GPIO82_MMC_IRQ (82) |
| 47 | #define GPIO85_MMC2_WP (85) | 47 | #define GPIO85_MMC_WP (85) |
| 48 | 48 | ||
| 49 | #define CM_X300_MMC2_IRQ IRQ_GPIO(GPIO82_MMC2_IRQ) | 49 | #define CM_X300_MMC_IRQ IRQ_GPIO(GPIO82_MMC_IRQ) |
| 50 | 50 | ||
| 51 | #define GPIO95_RTC_CS (95) | 51 | #define GPIO95_RTC_CS (95) |
| 52 | #define GPIO96_RTC_WR (96) | 52 | #define GPIO96_RTC_WR (96) |
| @@ -292,37 +292,37 @@ static inline void cm_x300_init_nand(void) {} | |||
| 292 | #endif | 292 | #endif |
| 293 | 293 | ||
| 294 | #if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE) | 294 | #if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE) |
| 295 | /* The first MMC slot of CM-X300 is hardwired to Libertas card and has | 295 | static struct pxamci_platform_data cm_x300_mci_platform_data = { |
| 296 | .detect_delay = 20, | ||
| 297 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | ||
| 298 | .gpio_card_detect = GPIO82_MMC_IRQ, | ||
| 299 | .gpio_card_ro = GPIO85_MMC_WP, | ||
| 300 | .gpio_power = -1, | ||
| 301 | }; | ||
| 302 | |||
| 303 | /* The second MMC slot of CM-X300 is hardwired to Libertas card and has | ||
| 296 | no detection/ro pins */ | 304 | no detection/ro pins */ |
| 297 | static int cm_x300_mci_init(struct device *dev, | 305 | static int cm_x300_mci2_init(struct device *dev, |
| 298 | irq_handler_t cm_x300_detect_int, | 306 | irq_handler_t cm_x300_detect_int, |
| 299 | void *data) | 307 | void *data) |
| 300 | { | 308 | { |
| 301 | return 0; | 309 | return 0; |
| 302 | } | 310 | } |
| 303 | 311 | ||
| 304 | static void cm_x300_mci_exit(struct device *dev, void *data) | 312 | static void cm_x300_mci2_exit(struct device *dev, void *data) |
| 305 | { | 313 | { |
| 306 | } | 314 | } |
| 307 | 315 | ||
| 308 | static struct pxamci_platform_data cm_x300_mci_platform_data = { | 316 | static struct pxamci_platform_data cm_x300_mci2_platform_data = { |
| 309 | .detect_delay = 20, | 317 | .detect_delay = 20, |
| 310 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | 318 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, |
| 311 | .init = cm_x300_mci_init, | 319 | .init = cm_x300_mci2_init, |
| 312 | .exit = cm_x300_mci_exit, | 320 | .exit = cm_x300_mci2_exit, |
| 313 | .gpio_card_detect = -1, | 321 | .gpio_card_detect = -1, |
| 314 | .gpio_card_ro = -1, | 322 | .gpio_card_ro = -1, |
| 315 | .gpio_power = -1, | 323 | .gpio_power = -1, |
| 316 | }; | 324 | }; |
| 317 | 325 | ||
| 318 | static struct pxamci_platform_data cm_x300_mci2_platform_data = { | ||
| 319 | .detect_delay = 20, | ||
| 320 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | ||
| 321 | .gpio_card_detect = GPIO82_MMC2_IRQ, | ||
| 322 | .gpio_card_ro = GPIO85_MMC2_WP, | ||
| 323 | .gpio_power = -1, | ||
| 324 | }; | ||
| 325 | |||
| 326 | static void __init cm_x300_init_mmc(void) | 326 | static void __init cm_x300_init_mmc(void) |
| 327 | { | 327 | { |
| 328 | pxa_set_mci_info(&cm_x300_mci_platform_data); | 328 | pxa_set_mci_info(&cm_x300_mci_platform_data); |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index ee8d6038ce82..82ff5733e4dc 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/gpio_keys.h> | ||
| 18 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
| 19 | #include <linux/leds.h> | 20 | #include <linux/leds.h> |
| 20 | #include <linux/mtd/physmap.h> | 21 | #include <linux/mtd/physmap.h> |
| @@ -375,6 +376,43 @@ static struct platform_device spitzkbd_device = { | |||
| 375 | }; | 376 | }; |
| 376 | 377 | ||
| 377 | 378 | ||
| 379 | static struct gpio_keys_button spitz_gpio_keys[] = { | ||
| 380 | { | ||
| 381 | .type = EV_PWR, | ||
| 382 | .code = KEY_SUSPEND, | ||
| 383 | .gpio = SPITZ_GPIO_ON_KEY, | ||
| 384 | .desc = "On/Off", | ||
| 385 | .wakeup = 1, | ||
| 386 | }, | ||
| 387 | /* Two buttons detecting the lid state */ | ||
| 388 | { | ||
| 389 | .type = EV_SW, | ||
| 390 | .code = 0, | ||
| 391 | .gpio = SPITZ_GPIO_SWA, | ||
| 392 | .desc = "Display Down", | ||
| 393 | }, | ||
| 394 | { | ||
| 395 | .type = EV_SW, | ||
| 396 | .code = 1, | ||
| 397 | .gpio = SPITZ_GPIO_SWB, | ||
| 398 | .desc = "Lid Closed", | ||
| 399 | }, | ||
| 400 | }; | ||
| 401 | |||
| 402 | static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = { | ||
| 403 | .buttons = spitz_gpio_keys, | ||
| 404 | .nbuttons = ARRAY_SIZE(spitz_gpio_keys), | ||
| 405 | }; | ||
| 406 | |||
| 407 | static struct platform_device spitz_gpio_keys_device = { | ||
| 408 | .name = "gpio-keys", | ||
| 409 | .id = -1, | ||
| 410 | .dev = { | ||
| 411 | .platform_data = &spitz_gpio_keys_platform_data, | ||
| 412 | }, | ||
| 413 | }; | ||
| 414 | |||
| 415 | |||
| 378 | /* | 416 | /* |
| 379 | * Spitz LEDs | 417 | * Spitz LEDs |
| 380 | */ | 418 | */ |
| @@ -689,6 +727,7 @@ static struct platform_device sharpsl_rom_device = { | |||
| 689 | static struct platform_device *devices[] __initdata = { | 727 | static struct platform_device *devices[] __initdata = { |
| 690 | &spitzscoop_device, | 728 | &spitzscoop_device, |
| 691 | &spitzkbd_device, | 729 | &spitzkbd_device, |
| 730 | &spitz_gpio_keys_device, | ||
| 692 | &spitzled_device, | 731 | &spitzled_device, |
| 693 | &sharpsl_nand_device, | 732 | &sharpsl_nand_device, |
| 694 | &sharpsl_rom_device, | 733 | &sharpsl_rom_device, |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index e993140edd88..9264d814cd7a 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -122,10 +122,7 @@ config CPU_ARM920T | |||
| 122 | select CPU_TLB_V4WBI if MMU | 122 | select CPU_TLB_V4WBI if MMU |
| 123 | help | 123 | help |
| 124 | The ARM920T is licensed to be produced by numerous vendors, | 124 | The ARM920T is licensed to be produced by numerous vendors, |
| 125 | and is used in the Maverick EP9312 and the Samsung S3C2410. | 125 | and is used in the Cirrus EP93xx and the Samsung S3C2410. |
| 126 | |||
| 127 | More information on the Maverick EP9312 at | ||
| 128 | <http://linuxdevices.com/products/PD2382866068.html>. | ||
| 129 | 126 | ||
| 130 | Say Y if you want support for the ARM920T processor. | 127 | Say Y if you want support for the ARM920T processor. |
| 131 | Otherwise, say N. | 128 | Otherwise, say N. |
diff --git a/arch/arm/oprofile/op_model_v6.c b/arch/arm/oprofile/op_model_v6.c index fe581383d3e2..f7d2ec5ee9a1 100644 --- a/arch/arm/oprofile/op_model_v6.c +++ b/arch/arm/oprofile/op_model_v6.c | |||
| @@ -33,6 +33,9 @@ static int irqs[] = { | |||
| 33 | #ifdef CONFIG_ARCH_OMAP2 | 33 | #ifdef CONFIG_ARCH_OMAP2 |
| 34 | 3, | 34 | 3, |
| 35 | #endif | 35 | #endif |
| 36 | #ifdef CONFIG_ARCH_BCMRING | ||
| 37 | IRQ_PMUIRQ, /* for BCMRING, ARM PMU interrupt is 43 */ | ||
| 38 | #endif | ||
| 36 | }; | 39 | }; |
| 37 | 40 | ||
| 38 | static void armv6_pmu_stop(void) | 41 | static void armv6_pmu_stop(void) |
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index 0eb676d7e807..b53125f41293 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
| @@ -978,6 +978,14 @@ void omap_stop_dma(int lch) | |||
| 978 | { | 978 | { |
| 979 | u32 l; | 979 | u32 l; |
| 980 | 980 | ||
| 981 | /* Disable all interrupts on the channel */ | ||
| 982 | if (cpu_class_is_omap1()) | ||
| 983 | dma_write(0, CICR(lch)); | ||
| 984 | |||
| 985 | l = dma_read(CCR(lch)); | ||
| 986 | l &= ~OMAP_DMA_CCR_EN; | ||
| 987 | dma_write(l, CCR(lch)); | ||
| 988 | |||
| 981 | if (!omap_dma_in_1510_mode() && dma_chan[lch].next_lch != -1) { | 989 | if (!omap_dma_in_1510_mode() && dma_chan[lch].next_lch != -1) { |
| 982 | int next_lch, cur_lch = lch; | 990 | int next_lch, cur_lch = lch; |
| 983 | char dma_chan_link_map[OMAP_DMA4_LOGICAL_DMA_CH_COUNT]; | 991 | char dma_chan_link_map[OMAP_DMA4_LOGICAL_DMA_CH_COUNT]; |
| @@ -995,18 +1003,8 @@ void omap_stop_dma(int lch) | |||
| 995 | next_lch = dma_chan[cur_lch].next_lch; | 1003 | next_lch = dma_chan[cur_lch].next_lch; |
| 996 | cur_lch = next_lch; | 1004 | cur_lch = next_lch; |
| 997 | } while (next_lch != -1); | 1005 | } while (next_lch != -1); |
| 998 | |||
| 999 | return; | ||
| 1000 | } | 1006 | } |
| 1001 | 1007 | ||
| 1002 | /* Disable all interrupts on the channel */ | ||
| 1003 | if (cpu_class_is_omap1()) | ||
| 1004 | dma_write(0, CICR(lch)); | ||
| 1005 | |||
| 1006 | l = dma_read(CCR(lch)); | ||
| 1007 | l &= ~OMAP_DMA_CCR_EN; | ||
| 1008 | dma_write(l, CCR(lch)); | ||
| 1009 | |||
| 1010 | dma_chan[lch].flags &= ~OMAP_DMA_ACTIVE; | 1008 | dma_chan[lch].flags &= ~OMAP_DMA_ACTIVE; |
| 1011 | } | 1009 | } |
| 1012 | EXPORT_SYMBOL(omap_stop_dma); | 1010 | EXPORT_SYMBOL(omap_stop_dma); |
diff --git a/arch/arm/plat-omap/include/mach/keypad.h b/arch/arm/plat-omap/include/mach/keypad.h index d91b9be334ff..3ae52ccc793c 100644 --- a/arch/arm/plat-omap/include/mach/keypad.h +++ b/arch/arm/plat-omap/include/mach/keypad.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | #ifndef ASMARM_ARCH_KEYPAD_H | 10 | #ifndef ASMARM_ARCH_KEYPAD_H |
| 11 | #define ASMARM_ARCH_KEYPAD_H | 11 | #define ASMARM_ARCH_KEYPAD_H |
| 12 | 12 | ||
| 13 | #include <linux/input/matrix_keypad.h> | 13 | #warning: Please update the board to use matrix_keypad.h instead |
| 14 | 14 | ||
| 15 | struct omap_kp_platform_data { | 15 | struct omap_kp_platform_data { |
| 16 | int rows; | 16 | int rows; |
| @@ -37,6 +37,9 @@ struct omap_kp_platform_data { | |||
| 37 | 37 | ||
| 38 | #define KEY_PERSISTENT 0x00800000 | 38 | #define KEY_PERSISTENT 0x00800000 |
| 39 | #define KEYNUM_MASK 0x00EFFFFF | 39 | #define KEYNUM_MASK 0x00EFFFFF |
| 40 | #define KEY(col, row, val) (((col) << 28) | ((row) << 24) | (val)) | ||
| 41 | #define PERSISTENT_KEY(col, row) (((col) << 28) | ((row) << 24) | \ | ||
| 42 | KEY_PERSISTENT) | ||
| 40 | 43 | ||
| 41 | #endif | 44 | #endif |
| 42 | 45 | ||
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c index 4b6012707307..94584f167a82 100644 --- a/arch/arm/plat-omap/iommu.c +++ b/arch/arm/plat-omap/iommu.c | |||
| @@ -664,7 +664,7 @@ static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da) | |||
| 664 | nent = 1; /* for the next L1 entry */ | 664 | nent = 1; /* for the next L1 entry */ |
| 665 | } else { | 665 | } else { |
| 666 | bytes = IOPGD_SIZE; | 666 | bytes = IOPGD_SIZE; |
| 667 | if (*iopgd & IOPGD_SUPER) { | 667 | if ((*iopgd & IOPGD_SUPER) == IOPGD_SUPER) { |
| 668 | nent *= 16; | 668 | nent *= 16; |
| 669 | /* rewind to the 1st entry */ | 669 | /* rewind to the 1st entry */ |
| 670 | iopgd = (u32 *)((u32)iopgd & IOSUPER_MASK); | 670 | iopgd = (u32 *)((u32)iopgd & IOSUPER_MASK); |
diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c index 6b0a2b6fed6a..0974c0ecc594 100644 --- a/arch/frv/kernel/signal.c +++ b/arch/frv/kernel/signal.c | |||
| @@ -527,7 +527,7 @@ static void do_signal(void) | |||
| 527 | 527 | ||
| 528 | no_signal: | 528 | no_signal: |
| 529 | /* Did we come from a system call? */ | 529 | /* Did we come from a system call? */ |
| 530 | if (__frame->syscallno >= 0) { | 530 | if (__frame->syscallno != -1) { |
| 531 | /* Restart the system call - no handlers present */ | 531 | /* Restart the system call - no handlers present */ |
| 532 | switch (__frame->gr8) { | 532 | switch (__frame->gr8) { |
| 533 | case -ERESTARTNOHAND: | 533 | case -ERESTARTNOHAND: |
diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld index 0f6ec455a2b1..03c0683636b6 100644 --- a/arch/x86/boot/setup.ld +++ b/arch/x86/boot/setup.ld | |||
| @@ -53,6 +53,9 @@ SECTIONS | |||
| 53 | 53 | ||
| 54 | /DISCARD/ : { *(.note*) } | 54 | /DISCARD/ : { *(.note*) } |
| 55 | 55 | ||
| 56 | /* | ||
| 57 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 58 | */ | ||
| 56 | . = ASSERT(_end <= 0x8000, "Setup too big!"); | 59 | . = ASSERT(_end <= 0x8000, "Setup too big!"); |
| 57 | . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!"); | 60 | . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!"); |
| 58 | /* Necessary for the very-old-loader check to work... */ | 61 | /* Necessary for the very-old-loader check to work... */ |
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index 25a92842dd99..d823c245f63b 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h | |||
| @@ -143,6 +143,7 @@ extern unsigned long node_remap_size[]; | |||
| 143 | | 1*SD_BALANCE_FORK \ | 143 | | 1*SD_BALANCE_FORK \ |
| 144 | | 0*SD_BALANCE_WAKE \ | 144 | | 0*SD_BALANCE_WAKE \ |
| 145 | | 1*SD_WAKE_AFFINE \ | 145 | | 1*SD_WAKE_AFFINE \ |
| 146 | | 1*SD_PREFER_LOCAL \ | ||
| 146 | | 0*SD_SHARE_CPUPOWER \ | 147 | | 0*SD_SHARE_CPUPOWER \ |
| 147 | | 0*SD_POWERSAVINGS_BALANCE \ | 148 | | 0*SD_POWERSAVINGS_BALANCE \ |
| 148 | | 0*SD_SHARE_PKG_RESOURCES \ | 149 | | 0*SD_SHARE_PKG_RESOURCES \ |
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 04eb6c958b9d..d1414af98559 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | #include <asm/types.h> | 19 | #include <asm/types.h> |
| 20 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
| 21 | #include <asm/uv/uv_mmrs.h> | 21 | #include <asm/uv/uv_mmrs.h> |
| 22 | #include <asm/irq_vectors.h> | ||
| 23 | #include <asm/io_apic.h> | ||
| 22 | 24 | ||
| 23 | 25 | ||
| 24 | /* | 26 | /* |
| @@ -114,7 +116,7 @@ | |||
| 114 | /* | 116 | /* |
| 115 | * The largest possible NASID of a C or M brick (+ 2) | 117 | * The largest possible NASID of a C or M brick (+ 2) |
| 116 | */ | 118 | */ |
| 117 | #define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_NODES * 2) | 119 | #define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_BLADES * 2) |
| 118 | 120 | ||
| 119 | struct uv_scir_s { | 121 | struct uv_scir_s { |
| 120 | struct timer_list timer; | 122 | struct timer_list timer; |
| @@ -230,6 +232,20 @@ static inline unsigned long uv_gpa(void *v) | |||
| 230 | return uv_soc_phys_ram_to_gpa(__pa(v)); | 232 | return uv_soc_phys_ram_to_gpa(__pa(v)); |
| 231 | } | 233 | } |
| 232 | 234 | ||
| 235 | /* gnode -> pnode */ | ||
| 236 | static inline unsigned long uv_gpa_to_gnode(unsigned long gpa) | ||
| 237 | { | ||
| 238 | return gpa >> uv_hub_info->m_val; | ||
| 239 | } | ||
| 240 | |||
| 241 | /* gpa -> pnode */ | ||
| 242 | static inline int uv_gpa_to_pnode(unsigned long gpa) | ||
| 243 | { | ||
| 244 | unsigned long n_mask = (1UL << uv_hub_info->n_val) - 1; | ||
| 245 | |||
| 246 | return uv_gpa_to_gnode(gpa) & n_mask; | ||
| 247 | } | ||
| 248 | |||
| 233 | /* pnode, offset --> socket virtual */ | 249 | /* pnode, offset --> socket virtual */ |
| 234 | static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) | 250 | static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) |
| 235 | { | 251 | { |
| @@ -421,9 +437,14 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) | |||
| 421 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) | 437 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) |
| 422 | { | 438 | { |
| 423 | unsigned long val; | 439 | unsigned long val; |
| 440 | unsigned long dmode = dest_Fixed; | ||
| 441 | |||
| 442 | if (vector == NMI_VECTOR) | ||
| 443 | dmode = dest_NMI; | ||
| 424 | 444 | ||
| 425 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | | 445 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | |
| 426 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | | 446 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | |
| 447 | (dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | | ||
| 427 | (vector << UVH_IPI_INT_VECTOR_SHFT); | 448 | (vector << UVH_IPI_INT_VECTOR_SHFT); |
| 428 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); | 449 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); |
| 429 | } | 450 | } |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S b/arch/x86/kernel/acpi/realmode/wakeup.lds.S index 7da00b799cda..060fff8f5c5b 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.lds.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S | |||
| @@ -57,5 +57,8 @@ SECTIONS | |||
| 57 | *(.note*) | 57 | *(.note*) |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | /* | ||
| 61 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 62 | */ | ||
| 60 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); | 63 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); |
| 61 | } | 64 | } |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f5f5886a6b53..326c25477d3d 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -352,14 +352,14 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) | |||
| 352 | 352 | ||
| 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { | 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { |
| 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); | 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); |
| 355 | if (alias.s.base == 0) { | 355 | if (alias.s.enable && alias.s.base == 0) { |
| 356 | *size = (1UL << alias.s.m_alias); | 356 | *size = (1UL << alias.s.m_alias); |
| 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); | 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); |
| 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; | 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; |
| 359 | return; | 359 | return; |
| 360 | } | 360 | } |
| 361 | } | 361 | } |
| 362 | BUG(); | 362 | *base = *size = 0; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | enum map_type {map_wb, map_uc}; | 365 | enum map_type {map_wb, map_uc}; |
| @@ -619,12 +619,12 @@ void __init uv_system_init(void) | |||
| 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; | 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; |
| 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; | 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; |
| 621 | uv_cpu_hub_info(cpu)->m_val = m_val; | 621 | uv_cpu_hub_info(cpu)->m_val = m_val; |
| 622 | uv_cpu_hub_info(cpu)->n_val = m_val; | 622 | uv_cpu_hub_info(cpu)->n_val = n_val; |
| 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; | 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; |
| 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; | 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; |
| 625 | uv_cpu_hub_info(cpu)->pnode = pnode; | 625 | uv_cpu_hub_info(cpu)->pnode = pnode; |
| 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; | 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; |
| 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; | 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1UL << (m_val + n_val)) - 1; |
| 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; | 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; |
| 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; | 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; |
| 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; | 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index b1598a9436d0..721a77ca8115 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -1214,7 +1214,8 @@ static int __cpuinit mce_cap_init(void) | |||
| 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); | 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); |
| 1215 | 1215 | ||
| 1216 | b = cap & MCG_BANKCNT_MASK; | 1216 | b = cap & MCG_BANKCNT_MASK; |
| 1217 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | 1217 | if (!banks) |
| 1218 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | ||
| 1218 | 1219 | ||
| 1219 | if (b > MAX_NR_BANKS) { | 1220 | if (b > MAX_NR_BANKS) { |
| 1220 | printk(KERN_WARNING | 1221 | printk(KERN_WARNING |
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 503c1f2e8835..1740c85e24bb 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -23,8 +23,6 @@ | |||
| 23 | static struct bau_control **uv_bau_table_bases __read_mostly; | 23 | static struct bau_control **uv_bau_table_bases __read_mostly; |
| 24 | static int uv_bau_retry_limit __read_mostly; | 24 | static int uv_bau_retry_limit __read_mostly; |
| 25 | 25 | ||
| 26 | /* position of pnode (which is nasid>>1): */ | ||
| 27 | static int uv_nshift __read_mostly; | ||
| 28 | /* base pnode in this partition */ | 26 | /* base pnode in this partition */ |
| 29 | static int uv_partition_base_pnode __read_mostly; | 27 | static int uv_partition_base_pnode __read_mostly; |
| 30 | 28 | ||
| @@ -723,7 +721,7 @@ uv_activation_descriptor_init(int node, int pnode) | |||
| 723 | BUG_ON(!adp); | 721 | BUG_ON(!adp); |
| 724 | 722 | ||
| 725 | pa = uv_gpa(adp); /* need the real nasid*/ | 723 | pa = uv_gpa(adp); /* need the real nasid*/ |
| 726 | n = pa >> uv_nshift; | 724 | n = uv_gpa_to_pnode(pa); |
| 727 | m = pa & uv_mmask; | 725 | m = pa & uv_mmask; |
| 728 | 726 | ||
| 729 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, | 727 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, |
| @@ -778,7 +776,7 @@ uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp) | |||
| 778 | * need the pnode of where the memory was really allocated | 776 | * need the pnode of where the memory was really allocated |
| 779 | */ | 777 | */ |
| 780 | pa = uv_gpa(pqp); | 778 | pa = uv_gpa(pqp); |
| 781 | pn = pa >> uv_nshift; | 779 | pn = uv_gpa_to_pnode(pa); |
| 782 | uv_write_global_mmr64(pnode, | 780 | uv_write_global_mmr64(pnode, |
| 783 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, | 781 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, |
| 784 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | | 782 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | |
| @@ -843,8 +841,7 @@ static int __init uv_bau_init(void) | |||
| 843 | GFP_KERNEL, cpu_to_node(cur_cpu)); | 841 | GFP_KERNEL, cpu_to_node(cur_cpu)); |
| 844 | 842 | ||
| 845 | uv_bau_retry_limit = 1; | 843 | uv_bau_retry_limit = 1; |
| 846 | uv_nshift = uv_hub_info->n_val; | 844 | uv_mmask = (1UL << uv_hub_info->m_val) - 1; |
| 847 | uv_mmask = (1UL << uv_hub_info->n_val) - 1; | ||
| 848 | nblades = uv_num_possible_blades(); | 845 | nblades = uv_num_possible_blades(); |
| 849 | 846 | ||
| 850 | uv_bau_table_bases = (struct bau_control **) | 847 | uv_bau_table_bases = (struct bau_control **) |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 92929fb3f9fa..3c68fe2d46cf 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -305,6 +305,9 @@ SECTIONS | |||
| 305 | 305 | ||
| 306 | 306 | ||
| 307 | #ifdef CONFIG_X86_32 | 307 | #ifdef CONFIG_X86_32 |
| 308 | /* | ||
| 309 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 310 | */ | ||
| 308 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), | 311 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), |
| 309 | "kernel image bigger than KERNEL_IMAGE_SIZE"); | 312 | "kernel image bigger than KERNEL_IMAGE_SIZE"); |
| 310 | #else | 313 | #else |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index edda9ea7c626..bd112c8c7bcd 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
| @@ -949,7 +949,7 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev) | |||
| 949 | lo->lo_state = Lo_unbound; | 949 | lo->lo_state = Lo_unbound; |
| 950 | /* This is safe: open() is still holding a reference. */ | 950 | /* This is safe: open() is still holding a reference. */ |
| 951 | module_put(THIS_MODULE); | 951 | module_put(THIS_MODULE); |
| 952 | if (max_part > 0) | 952 | if (max_part > 0 && bdev) |
| 953 | ioctl_by_bdev(bdev, BLKRRPART, 0); | 953 | ioctl_by_bdev(bdev, BLKRRPART, 0); |
| 954 | mutex_unlock(&lo->lo_ctl_mutex); | 954 | mutex_unlock(&lo->lo_ctl_mutex); |
| 955 | /* | 955 | /* |
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index ad41f19b8e3f..12fdd3987a36 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -76,8 +76,11 @@ static void cpuidle_idle_call(void) | |||
| 76 | #endif | 76 | #endif |
| 77 | /* ask the governor for the next state */ | 77 | /* ask the governor for the next state */ |
| 78 | next_state = cpuidle_curr_governor->select(dev); | 78 | next_state = cpuidle_curr_governor->select(dev); |
| 79 | if (need_resched()) | 79 | if (need_resched()) { |
| 80 | local_irq_enable(); | ||
| 80 | return; | 81 | return; |
| 82 | } | ||
| 83 | |||
| 81 | target_state = &dev->states[next_state]; | 84 | target_state = &dev->states[next_state]; |
| 82 | 85 | ||
| 83 | /* enter the state and update stats */ | 86 | /* enter the state and update stats */ |
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c index d335086f4a26..77a9579d7167 100644 --- a/drivers/edac/i5000_edac.c +++ b/drivers/edac/i5000_edac.c | |||
| @@ -1173,7 +1173,7 @@ static void i5000_get_mc_regs(struct mem_ctl_info *mci) | |||
| 1173 | pci_read_config_word(pvt->branch_1, where, | 1173 | pci_read_config_word(pvt->branch_1, where, |
| 1174 | &pvt->b1_mtr[slot_row]); | 1174 | &pvt->b1_mtr[slot_row]); |
| 1175 | debugf2("MTR%d where=0x%x B1 value=0x%x\n", slot_row, | 1175 | debugf2("MTR%d where=0x%x B1 value=0x%x\n", slot_row, |
| 1176 | where, pvt->b0_mtr[slot_row]); | 1176 | where, pvt->b1_mtr[slot_row]); |
| 1177 | } else { | 1177 | } else { |
| 1178 | pvt->b1_mtr[slot_row] = 0; | 1178 | pvt->b1_mtr[slot_row] = 0; |
| 1179 | } | 1179 | } |
| @@ -1232,7 +1232,7 @@ static int i5000_init_csrows(struct mem_ctl_info *mci) | |||
| 1232 | struct csrow_info *p_csrow; | 1232 | struct csrow_info *p_csrow; |
| 1233 | int empty, channel_count; | 1233 | int empty, channel_count; |
| 1234 | int max_csrows; | 1234 | int max_csrows; |
| 1235 | int mtr; | 1235 | int mtr, mtr1; |
| 1236 | int csrow_megs; | 1236 | int csrow_megs; |
| 1237 | int channel; | 1237 | int channel; |
| 1238 | int csrow; | 1238 | int csrow; |
| @@ -1251,9 +1251,10 @@ static int i5000_init_csrows(struct mem_ctl_info *mci) | |||
| 1251 | 1251 | ||
| 1252 | /* use branch 0 for the basis */ | 1252 | /* use branch 0 for the basis */ |
| 1253 | mtr = pvt->b0_mtr[csrow >> 1]; | 1253 | mtr = pvt->b0_mtr[csrow >> 1]; |
| 1254 | mtr1 = pvt->b1_mtr[csrow >> 1]; | ||
| 1254 | 1255 | ||
| 1255 | /* if no DIMMS on this row, continue */ | 1256 | /* if no DIMMS on this row, continue */ |
| 1256 | if (!MTR_DIMMS_PRESENT(mtr)) | 1257 | if (!MTR_DIMMS_PRESENT(mtr) && !MTR_DIMMS_PRESENT(mtr1)) |
| 1257 | continue; | 1258 | continue; |
| 1258 | 1259 | ||
| 1259 | /* FAKE OUT VALUES, FIXME */ | 1260 | /* FAKE OUT VALUES, FIXME */ |
diff --git a/drivers/edac/i5400_edac.c b/drivers/edac/i5400_edac.c index b08b6d8e2dc7..f99d10655ed4 100644 --- a/drivers/edac/i5400_edac.c +++ b/drivers/edac/i5400_edac.c | |||
| @@ -46,9 +46,10 @@ | |||
| 46 | /* Limits for i5400 */ | 46 | /* Limits for i5400 */ |
| 47 | #define NUM_MTRS_PER_BRANCH 4 | 47 | #define NUM_MTRS_PER_BRANCH 4 |
| 48 | #define CHANNELS_PER_BRANCH 2 | 48 | #define CHANNELS_PER_BRANCH 2 |
| 49 | #define MAX_DIMMS_PER_CHANNEL NUM_MTRS_PER_BRANCH | ||
| 49 | #define MAX_CHANNELS 4 | 50 | #define MAX_CHANNELS 4 |
| 50 | #define MAX_DIMMS (MAX_CHANNELS * 4) /* Up to 4 DIMM's per channel */ | 51 | /* max possible csrows per channel */ |
| 51 | #define MAX_CSROWS (MAX_DIMMS * 2) /* max possible csrows per channel */ | 52 | #define MAX_CSROWS (MAX_DIMMS_PER_CHANNEL) |
| 52 | 53 | ||
| 53 | /* Device 16, | 54 | /* Device 16, |
| 54 | * Function 0: System Address | 55 | * Function 0: System Address |
| @@ -331,7 +332,6 @@ static const struct i5400_dev_info i5400_devs[] = { | |||
| 331 | 332 | ||
| 332 | struct i5400_dimm_info { | 333 | struct i5400_dimm_info { |
| 333 | int megabytes; /* size, 0 means not present */ | 334 | int megabytes; /* size, 0 means not present */ |
| 334 | int dual_rank; | ||
| 335 | }; | 335 | }; |
| 336 | 336 | ||
| 337 | /* driver private data structure */ | 337 | /* driver private data structure */ |
| @@ -849,11 +849,9 @@ static int determine_mtr(struct i5400_pvt *pvt, int csrow, int channel) | |||
| 849 | int n; | 849 | int n; |
| 850 | 850 | ||
| 851 | /* There is one MTR for each slot pair of FB-DIMMs, | 851 | /* There is one MTR for each slot pair of FB-DIMMs, |
| 852 | Each slot may have one or two ranks (2 csrows), | ||
| 853 | Each slot pair may be at branch 0 or branch 1. | 852 | Each slot pair may be at branch 0 or branch 1. |
| 854 | So, csrow should be divided by eight | ||
| 855 | */ | 853 | */ |
| 856 | n = csrow >> 3; | 854 | n = csrow; |
| 857 | 855 | ||
| 858 | if (n >= NUM_MTRS_PER_BRANCH) { | 856 | if (n >= NUM_MTRS_PER_BRANCH) { |
| 859 | debugf0("ERROR: trying to access an invalid csrow: %d\n", | 857 | debugf0("ERROR: trying to access an invalid csrow: %d\n", |
| @@ -905,25 +903,22 @@ static void handle_channel(struct i5400_pvt *pvt, int csrow, int channel, | |||
| 905 | amb_present_reg = determine_amb_present_reg(pvt, channel); | 903 | amb_present_reg = determine_amb_present_reg(pvt, channel); |
| 906 | 904 | ||
| 907 | /* Determine if there is a DIMM present in this DIMM slot */ | 905 | /* Determine if there is a DIMM present in this DIMM slot */ |
| 908 | if (amb_present_reg & (1 << (csrow >> 1))) { | 906 | if (amb_present_reg & (1 << csrow)) { |
| 909 | dinfo->dual_rank = MTR_DIMM_RANK(mtr); | 907 | /* Start with the number of bits for a Bank |
| 910 | 908 | * on the DRAM */ | |
| 911 | if (!((dinfo->dual_rank == 0) && | 909 | addrBits = MTR_DRAM_BANKS_ADDR_BITS(mtr); |
| 912 | ((csrow & 0x1) == 0x1))) { | 910 | /* Add thenumber of ROW bits */ |
| 913 | /* Start with the number of bits for a Bank | 911 | addrBits += MTR_DIMM_ROWS_ADDR_BITS(mtr); |
| 914 | * on the DRAM */ | 912 | /* add the number of COLUMN bits */ |
| 915 | addrBits = MTR_DRAM_BANKS_ADDR_BITS(mtr); | 913 | addrBits += MTR_DIMM_COLS_ADDR_BITS(mtr); |
| 916 | /* Add thenumber of ROW bits */ | 914 | /* add the number of RANK bits */ |
| 917 | addrBits += MTR_DIMM_ROWS_ADDR_BITS(mtr); | 915 | addrBits += MTR_DIMM_RANK(mtr); |
| 918 | /* add the number of COLUMN bits */ | 916 | |
| 919 | addrBits += MTR_DIMM_COLS_ADDR_BITS(mtr); | 917 | addrBits += 6; /* add 64 bits per DIMM */ |
| 920 | 918 | addrBits -= 20; /* divide by 2^^20 */ | |
| 921 | addrBits += 6; /* add 64 bits per DIMM */ | 919 | addrBits -= 3; /* 8 bits per bytes */ |
| 922 | addrBits -= 20; /* divide by 2^^20 */ | 920 | |
| 923 | addrBits -= 3; /* 8 bits per bytes */ | 921 | dinfo->megabytes = 1 << addrBits; |
| 924 | |||
| 925 | dinfo->megabytes = 1 << addrBits; | ||
| 926 | } | ||
| 927 | } | 922 | } |
| 928 | } | 923 | } |
| 929 | } | 924 | } |
| @@ -951,12 +946,12 @@ static void calculate_dimm_size(struct i5400_pvt *pvt) | |||
| 951 | return; | 946 | return; |
| 952 | } | 947 | } |
| 953 | 948 | ||
| 954 | /* Scan all the actual CSROWS (which is # of DIMMS * 2) | 949 | /* Scan all the actual CSROWS |
| 955 | * and calculate the information for each DIMM | 950 | * and calculate the information for each DIMM |
| 956 | * Start with the highest csrow first, to display it first | 951 | * Start with the highest csrow first, to display it first |
| 957 | * and work toward the 0th csrow | 952 | * and work toward the 0th csrow |
| 958 | */ | 953 | */ |
| 959 | max_csrows = pvt->maxdimmperch * 2; | 954 | max_csrows = pvt->maxdimmperch; |
| 960 | for (csrow = max_csrows - 1; csrow >= 0; csrow--) { | 955 | for (csrow = max_csrows - 1; csrow >= 0; csrow--) { |
| 961 | 956 | ||
| 962 | /* on an odd csrow, first output a 'boundary' marker, | 957 | /* on an odd csrow, first output a 'boundary' marker, |
| @@ -1064,7 +1059,7 @@ static void i5400_get_mc_regs(struct mem_ctl_info *mci) | |||
| 1064 | 1059 | ||
| 1065 | /* Get the set of MTR[0-3] regs by each branch */ | 1060 | /* Get the set of MTR[0-3] regs by each branch */ |
| 1066 | for (slot_row = 0; slot_row < NUM_MTRS_PER_BRANCH; slot_row++) { | 1061 | for (slot_row = 0; slot_row < NUM_MTRS_PER_BRANCH; slot_row++) { |
| 1067 | int where = MTR0 + (slot_row * sizeof(u32)); | 1062 | int where = MTR0 + (slot_row * sizeof(u16)); |
| 1068 | 1063 | ||
| 1069 | /* Branch 0 set of MTR registers */ | 1064 | /* Branch 0 set of MTR registers */ |
| 1070 | pci_read_config_word(pvt->branch_0, where, | 1065 | pci_read_config_word(pvt->branch_0, where, |
| @@ -1146,7 +1141,7 @@ static int i5400_init_csrows(struct mem_ctl_info *mci) | |||
| 1146 | pvt = mci->pvt_info; | 1141 | pvt = mci->pvt_info; |
| 1147 | 1142 | ||
| 1148 | channel_count = pvt->maxch; | 1143 | channel_count = pvt->maxch; |
| 1149 | max_csrows = pvt->maxdimmperch * 2; | 1144 | max_csrows = pvt->maxdimmperch; |
| 1150 | 1145 | ||
| 1151 | empty = 1; /* Assume NO memory */ | 1146 | empty = 1; /* Assume NO memory */ |
| 1152 | 1147 | ||
| @@ -1215,28 +1210,6 @@ static void i5400_enable_error_reporting(struct mem_ctl_info *mci) | |||
| 1215 | } | 1210 | } |
| 1216 | 1211 | ||
| 1217 | /* | 1212 | /* |
| 1218 | * i5400_get_dimm_and_channel_counts(pdev, &num_csrows, &num_channels) | ||
| 1219 | * | ||
| 1220 | * ask the device how many channels are present and how many CSROWS | ||
| 1221 | * as well | ||
| 1222 | */ | ||
| 1223 | static void i5400_get_dimm_and_channel_counts(struct pci_dev *pdev, | ||
| 1224 | int *num_dimms_per_channel, | ||
| 1225 | int *num_channels) | ||
| 1226 | { | ||
| 1227 | u8 value; | ||
| 1228 | |||
| 1229 | /* Need to retrieve just how many channels and dimms per channel are | ||
| 1230 | * supported on this memory controller | ||
| 1231 | */ | ||
| 1232 | pci_read_config_byte(pdev, MAXDIMMPERCH, &value); | ||
| 1233 | *num_dimms_per_channel = (int)value * 2; | ||
| 1234 | |||
| 1235 | pci_read_config_byte(pdev, MAXCH, &value); | ||
| 1236 | *num_channels = (int)value; | ||
| 1237 | } | ||
| 1238 | |||
| 1239 | /* | ||
| 1240 | * i5400_probe1 Probe for ONE instance of device to see if it is | 1213 | * i5400_probe1 Probe for ONE instance of device to see if it is |
| 1241 | * present. | 1214 | * present. |
| 1242 | * return: | 1215 | * return: |
| @@ -1263,22 +1236,16 @@ static int i5400_probe1(struct pci_dev *pdev, int dev_idx) | |||
| 1263 | if (PCI_FUNC(pdev->devfn) != 0) | 1236 | if (PCI_FUNC(pdev->devfn) != 0) |
| 1264 | return -ENODEV; | 1237 | return -ENODEV; |
| 1265 | 1238 | ||
| 1266 | /* Ask the devices for the number of CSROWS and CHANNELS so | 1239 | /* As we don't have a motherboard identification routine to determine |
| 1267 | * that we can calculate the memory resources, etc | ||
| 1268 | * | ||
| 1269 | * The Chipset will report what it can handle which will be greater | ||
| 1270 | * or equal to what the motherboard manufacturer will implement. | ||
| 1271 | * | ||
| 1272 | * As we don't have a motherboard identification routine to determine | ||
| 1273 | * actual number of slots/dimms per channel, we thus utilize the | 1240 | * actual number of slots/dimms per channel, we thus utilize the |
| 1274 | * resource as specified by the chipset. Thus, we might have | 1241 | * resource as specified by the chipset. Thus, we might have |
| 1275 | * have more DIMMs per channel than actually on the mobo, but this | 1242 | * have more DIMMs per channel than actually on the mobo, but this |
| 1276 | * allows the driver to support upto the chipset max, without | 1243 | * allows the driver to support upto the chipset max, without |
| 1277 | * some fancy mobo determination. | 1244 | * some fancy mobo determination. |
| 1278 | */ | 1245 | */ |
| 1279 | i5400_get_dimm_and_channel_counts(pdev, &num_dimms_per_channel, | 1246 | num_dimms_per_channel = MAX_DIMMS_PER_CHANNEL; |
| 1280 | &num_channels); | 1247 | num_channels = MAX_CHANNELS; |
| 1281 | num_csrows = num_dimms_per_channel * 2; | 1248 | num_csrows = num_dimms_per_channel; |
| 1282 | 1249 | ||
| 1283 | debugf0("MC: %s(): Number of - Channels= %d DIMMS= %d CSROWS= %d\n", | 1250 | debugf0("MC: %s(): Number of - Channels= %d DIMMS= %d CSROWS= %d\n", |
| 1284 | __func__, num_channels, num_dimms_per_channel, num_csrows); | 1251 | __func__, num_channels, num_dimms_per_channel, num_csrows); |
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index 157f6504f25e..cf27402af97b 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
| @@ -26,7 +26,9 @@ | |||
| 26 | #include "mpc85xx_edac.h" | 26 | #include "mpc85xx_edac.h" |
| 27 | 27 | ||
| 28 | static int edac_dev_idx; | 28 | static int edac_dev_idx; |
| 29 | #ifdef CONFIG_PCI | ||
| 29 | static int edac_pci_idx; | 30 | static int edac_pci_idx; |
| 31 | #endif | ||
| 30 | static int edac_mc_idx; | 32 | static int edac_mc_idx; |
| 31 | 33 | ||
| 32 | static u32 orig_ddr_err_disable; | 34 | static u32 orig_ddr_err_disable; |
diff --git a/drivers/gpio/twl4030-gpio.c b/drivers/gpio/twl4030-gpio.c index afad14792141..49384a7c5492 100644 --- a/drivers/gpio/twl4030-gpio.c +++ b/drivers/gpio/twl4030-gpio.c | |||
| @@ -460,7 +460,8 @@ no_irqs: | |||
| 460 | return ret; | 460 | return ret; |
| 461 | } | 461 | } |
| 462 | 462 | ||
| 463 | static int __devexit gpio_twl4030_remove(struct platform_device *pdev) | 463 | /* Cannot use __devexit as gpio_twl4030_probe() calls us */ |
| 464 | static int gpio_twl4030_remove(struct platform_device *pdev) | ||
| 464 | { | 465 | { |
| 465 | struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data; | 466 | struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data; |
| 466 | int status; | 467 | int status; |
| @@ -493,7 +494,7 @@ static struct platform_driver gpio_twl4030_driver = { | |||
| 493 | .driver.name = "twl4030_gpio", | 494 | .driver.name = "twl4030_gpio", |
| 494 | .driver.owner = THIS_MODULE, | 495 | .driver.owner = THIS_MODULE, |
| 495 | .probe = gpio_twl4030_probe, | 496 | .probe = gpio_twl4030_probe, |
| 496 | .remove = __devexit_p(gpio_twl4030_remove), | 497 | .remove = gpio_twl4030_remove, |
| 497 | }; | 498 | }; |
| 498 | 499 | ||
| 499 | static int __init gpio_twl4030_init(void) | 500 | static int __init gpio_twl4030_init(void) |
diff --git a/drivers/hwmon/dme1737.c b/drivers/hwmon/dme1737.c index 2c2cb1ec94c5..27d62574284f 100644 --- a/drivers/hwmon/dme1737.c +++ b/drivers/hwmon/dme1737.c | |||
| @@ -572,7 +572,7 @@ static struct dme1737_data *dme1737_update_device(struct device *dev) | |||
| 572 | 572 | ||
| 573 | /* Sample register contents every 1 sec */ | 573 | /* Sample register contents every 1 sec */ |
| 574 | if (time_after(jiffies, data->last_update + HZ) || !data->valid) { | 574 | if (time_after(jiffies, data->last_update + HZ) || !data->valid) { |
| 575 | if (data->type != sch5027) { | 575 | if (data->type == dme1737) { |
| 576 | data->vid = dme1737_read(data, DME1737_REG_VID) & | 576 | data->vid = dme1737_read(data, DME1737_REG_VID) & |
| 577 | 0x3f; | 577 | 0x3f; |
| 578 | } | 578 | } |
| @@ -1621,9 +1621,6 @@ static struct attribute *dme1737_misc_attr[] = { | |||
| 1621 | &sensor_dev_attr_zone1_auto_point1_temp_hyst.dev_attr.attr, | 1621 | &sensor_dev_attr_zone1_auto_point1_temp_hyst.dev_attr.attr, |
| 1622 | &sensor_dev_attr_zone2_auto_point1_temp_hyst.dev_attr.attr, | 1622 | &sensor_dev_attr_zone2_auto_point1_temp_hyst.dev_attr.attr, |
| 1623 | &sensor_dev_attr_zone3_auto_point1_temp_hyst.dev_attr.attr, | 1623 | &sensor_dev_attr_zone3_auto_point1_temp_hyst.dev_attr.attr, |
| 1624 | /* Misc */ | ||
| 1625 | &dev_attr_vrm.attr, | ||
| 1626 | &dev_attr_cpu0_vid.attr, | ||
| 1627 | NULL | 1624 | NULL |
| 1628 | }; | 1625 | }; |
| 1629 | 1626 | ||
| @@ -1631,6 +1628,18 @@ static const struct attribute_group dme1737_misc_group = { | |||
| 1631 | .attrs = dme1737_misc_attr, | 1628 | .attrs = dme1737_misc_attr, |
| 1632 | }; | 1629 | }; |
| 1633 | 1630 | ||
| 1631 | /* The following struct holds VID-related attributes. Their creation | ||
| 1632 | depends on the chip type which is determined during module load. */ | ||
| 1633 | static struct attribute *dme1737_vid_attr[] = { | ||
| 1634 | &dev_attr_vrm.attr, | ||
| 1635 | &dev_attr_cpu0_vid.attr, | ||
| 1636 | NULL | ||
| 1637 | }; | ||
| 1638 | |||
| 1639 | static const struct attribute_group dme1737_vid_group = { | ||
| 1640 | .attrs = dme1737_vid_attr, | ||
| 1641 | }; | ||
| 1642 | |||
| 1634 | /* The following structs hold the PWM attributes, some of which are optional. | 1643 | /* The following structs hold the PWM attributes, some of which are optional. |
| 1635 | * Their creation depends on the chip configuration which is determined during | 1644 | * Their creation depends on the chip configuration which is determined during |
| 1636 | * module load. */ | 1645 | * module load. */ |
| @@ -1902,6 +1911,9 @@ static void dme1737_remove_files(struct device *dev) | |||
| 1902 | if (data->type != sch5027) { | 1911 | if (data->type != sch5027) { |
| 1903 | sysfs_remove_group(&dev->kobj, &dme1737_misc_group); | 1912 | sysfs_remove_group(&dev->kobj, &dme1737_misc_group); |
| 1904 | } | 1913 | } |
| 1914 | if (data->type == dme1737) { | ||
| 1915 | sysfs_remove_group(&dev->kobj, &dme1737_vid_group); | ||
| 1916 | } | ||
| 1905 | 1917 | ||
| 1906 | sysfs_remove_group(&dev->kobj, &dme1737_group); | 1918 | sysfs_remove_group(&dev->kobj, &dme1737_group); |
| 1907 | 1919 | ||
| @@ -1933,6 +1945,13 @@ static int dme1737_create_files(struct device *dev) | |||
| 1933 | goto exit_remove; | 1945 | goto exit_remove; |
| 1934 | } | 1946 | } |
| 1935 | 1947 | ||
| 1948 | /* Create VID-related sysfs attributes */ | ||
| 1949 | if ((data->type == dme1737) && | ||
| 1950 | (err = sysfs_create_group(&dev->kobj, | ||
| 1951 | &dme1737_vid_group))) { | ||
| 1952 | goto exit_remove; | ||
| 1953 | } | ||
| 1954 | |||
| 1936 | /* Create fan sysfs attributes */ | 1955 | /* Create fan sysfs attributes */ |
| 1937 | for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { | 1956 | for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { |
| 1938 | if (data->has_fan & (1 << ix)) { | 1957 | if (data->has_fan & (1 << ix)) { |
| @@ -2127,7 +2146,7 @@ static int dme1737_init_device(struct device *dev) | |||
| 2127 | data->pwm_acz[2] = 4; /* pwm3 -> zone3 */ | 2146 | data->pwm_acz[2] = 4; /* pwm3 -> zone3 */ |
| 2128 | 2147 | ||
| 2129 | /* Set VRM */ | 2148 | /* Set VRM */ |
| 2130 | if (data->type != sch5027) { | 2149 | if (data->type == dme1737) { |
| 2131 | data->vrm = vid_which_vrm(); | 2150 | data->vrm = vid_which_vrm(); |
| 2132 | } | 2151 | } |
| 2133 | 2152 | ||
diff --git a/drivers/hwmon/fschmd.c b/drivers/hwmon/fschmd.c index 2a7a85a6dc36..da1b1f9488af 100644 --- a/drivers/hwmon/fschmd.c +++ b/drivers/hwmon/fschmd.c | |||
| @@ -819,7 +819,7 @@ static int watchdog_release(struct inode *inode, struct file *filp) | |||
| 819 | static ssize_t watchdog_write(struct file *filp, const char __user *buf, | 819 | static ssize_t watchdog_write(struct file *filp, const char __user *buf, |
| 820 | size_t count, loff_t *offset) | 820 | size_t count, loff_t *offset) |
| 821 | { | 821 | { |
| 822 | size_t ret; | 822 | int ret; |
| 823 | struct fschmd_data *data = filp->private_data; | 823 | struct fschmd_data *data = filp->private_data; |
| 824 | 824 | ||
| 825 | if (count) { | 825 | if (count) { |
diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c index 6679854c85b0..be475e844c2a 100644 --- a/drivers/hwmon/hp_accel.c +++ b/drivers/hwmon/hp_accel.c | |||
| @@ -197,11 +197,13 @@ static struct dmi_system_id lis3lv02d_dmi_ids[] = { | |||
| 197 | AXIS_DMI_MATCH("HP2133", "HP 2133", xy_rotated_left), | 197 | AXIS_DMI_MATCH("HP2133", "HP 2133", xy_rotated_left), |
| 198 | AXIS_DMI_MATCH("HP2140", "HP 2140", xy_swap_inverted), | 198 | AXIS_DMI_MATCH("HP2140", "HP 2140", xy_swap_inverted), |
| 199 | AXIS_DMI_MATCH("NC653x", "HP Compaq 653", xy_rotated_left_usd), | 199 | AXIS_DMI_MATCH("NC653x", "HP Compaq 653", xy_rotated_left_usd), |
| 200 | AXIS_DMI_MATCH("NC673x", "HP Compaq 673", xy_rotated_left_usd), | 200 | AXIS_DMI_MATCH("NC6730b", "HP Compaq 6730b", xy_rotated_left_usd), |
| 201 | AXIS_DMI_MATCH("NC6730s", "HP Compaq 6730s", xy_swap), | ||
| 201 | AXIS_DMI_MATCH("NC651xx", "HP Compaq 651", xy_rotated_right), | 202 | AXIS_DMI_MATCH("NC651xx", "HP Compaq 651", xy_rotated_right), |
| 202 | AXIS_DMI_MATCH("NC6710x", "HP Compaq 6710", xy_swap_yz_inverted), | 203 | AXIS_DMI_MATCH("NC6710x", "HP Compaq 6710", xy_swap_yz_inverted), |
| 203 | AXIS_DMI_MATCH("NC6715x", "HP Compaq 6715", y_inverted), | 204 | AXIS_DMI_MATCH("NC6715x", "HP Compaq 6715", y_inverted), |
| 204 | AXIS_DMI_MATCH("NC693xx", "HP EliteBook 693", xy_rotated_right), | 205 | AXIS_DMI_MATCH("NC693xx", "HP EliteBook 693", xy_rotated_right), |
| 206 | AXIS_DMI_MATCH("NC693xx", "HP EliteBook 853", xy_swap), | ||
| 205 | /* Intel-based HP Pavilion dv5 */ | 207 | /* Intel-based HP Pavilion dv5 */ |
| 206 | AXIS_DMI_MATCH2("HPDV5_I", | 208 | AXIS_DMI_MATCH2("HPDV5_I", |
| 207 | PRODUCT_NAME, "HP Pavilion dv5", | 209 | PRODUCT_NAME, "HP Pavilion dv5", |
| @@ -214,6 +216,7 @@ static struct dmi_system_id lis3lv02d_dmi_ids[] = { | |||
| 214 | y_inverted), | 216 | y_inverted), |
| 215 | AXIS_DMI_MATCH("DV7", "HP Pavilion dv7", x_inverted), | 217 | AXIS_DMI_MATCH("DV7", "HP Pavilion dv7", x_inverted), |
| 216 | AXIS_DMI_MATCH("HP8710", "HP Compaq 8710", y_inverted), | 218 | AXIS_DMI_MATCH("HP8710", "HP Compaq 8710", y_inverted), |
| 219 | AXIS_DMI_MATCH("HDX18", "HP HDX 18", x_inverted), | ||
| 217 | { NULL, } | 220 | { NULL, } |
| 218 | /* Laptop models without axis info (yet): | 221 | /* Laptop models without axis info (yet): |
| 219 | * "NC6910" "HP Compaq 6910" | 222 | * "NC6910" "HP Compaq 6910" |
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index ffeb2a10e1a7..a3749cb0f181 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
| @@ -1028,12 +1028,11 @@ static int __init it87_find(unsigned short *address, | |||
| 1028 | chip_type, *address, sio_data->revision); | 1028 | chip_type, *address, sio_data->revision); |
| 1029 | 1029 | ||
| 1030 | /* Read GPIO config and VID value from LDN 7 (GPIO) */ | 1030 | /* Read GPIO config and VID value from LDN 7 (GPIO) */ |
| 1031 | if (chip_type != IT8705F_DEVID) { | 1031 | if (sio_data->type != it87) { |
| 1032 | int reg; | 1032 | int reg; |
| 1033 | 1033 | ||
| 1034 | superio_select(GPIO); | 1034 | superio_select(GPIO); |
| 1035 | if ((chip_type == it8718) || | 1035 | if (sio_data->type == it8718 || sio_data->type == it8720) |
| 1036 | (chip_type == it8720)) | ||
| 1037 | sio_data->vid_value = superio_inb(IT87_SIO_VID_REG); | 1036 | sio_data->vid_value = superio_inb(IT87_SIO_VID_REG); |
| 1038 | 1037 | ||
| 1039 | reg = superio_inb(IT87_SIO_PINX2_REG); | 1038 | reg = superio_inb(IT87_SIO_PINX2_REG); |
diff --git a/drivers/mfd/twl4030-core.c b/drivers/mfd/twl4030-core.c index e832e975da60..a1c47ee95c0e 100644 --- a/drivers/mfd/twl4030-core.c +++ b/drivers/mfd/twl4030-core.c | |||
| @@ -795,7 +795,7 @@ twl4030_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 795 | twl->client = i2c_new_dummy(client->adapter, | 795 | twl->client = i2c_new_dummy(client->adapter, |
| 796 | twl->address); | 796 | twl->address); |
| 797 | if (!twl->client) { | 797 | if (!twl->client) { |
| 798 | dev_err(&twl->client->dev, | 798 | dev_err(&client->dev, |
| 799 | "can't attach client %d\n", i); | 799 | "can't attach client %d\n", i); |
| 800 | status = -ENOMEM; | 800 | status = -ENOMEM; |
| 801 | goto fail; | 801 | goto fail; |
diff --git a/drivers/mfd/wm831x-irq.c b/drivers/mfd/wm831x-irq.c index d3015dfb9134..ac056ea6b66e 100644 --- a/drivers/mfd/wm831x-irq.c +++ b/drivers/mfd/wm831x-irq.c | |||
| @@ -507,6 +507,8 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq) | |||
| 507 | { | 507 | { |
| 508 | int i, ret; | 508 | int i, ret; |
| 509 | 509 | ||
| 510 | mutex_init(&wm831x->irq_lock); | ||
| 511 | |||
| 510 | if (!irq) { | 512 | if (!irq) { |
| 511 | dev_warn(wm831x->dev, | 513 | dev_warn(wm831x->dev, |
| 512 | "No interrupt specified - functionality limited\n"); | 514 | "No interrupt specified - functionality limited\n"); |
| @@ -521,7 +523,6 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq) | |||
| 521 | } | 523 | } |
| 522 | 524 | ||
| 523 | wm831x->irq = irq; | 525 | wm831x->irq = irq; |
| 524 | mutex_init(&wm831x->irq_lock); | ||
| 525 | INIT_WORK(&wm831x->irq_work, wm831x_irq_worker); | 526 | INIT_WORK(&wm831x->irq_work, wm831x_irq_worker); |
| 526 | 527 | ||
| 527 | /* Mask the individual interrupt sources */ | 528 | /* Mask the individual interrupt sources */ |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 4487cc097911..0aecaaebef3d 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -2013,7 +2013,7 @@ static struct platform_driver omap_hsmmc_driver = { | |||
| 2013 | static int __init omap_hsmmc_init(void) | 2013 | static int __init omap_hsmmc_init(void) |
| 2014 | { | 2014 | { |
| 2015 | /* Register the MMC driver */ | 2015 | /* Register the MMC driver */ |
| 2016 | return platform_driver_register(&omap_hsmmc_driver); | 2016 | return platform_driver_probe(&omap_hsmmc_driver, omap_hsmmc_probe); |
| 2017 | } | 2017 | } |
| 2018 | 2018 | ||
| 2019 | static void __exit omap_hsmmc_cleanup(void) | 2019 | static void __exit omap_hsmmc_cleanup(void) |
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c index e1f7d0a78b9d..14cec04c34f9 100644 --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <linux/log2.h> | 42 | #include <linux/log2.h> |
| 43 | #include <linux/kthread.h> | 43 | #include <linux/kthread.h> |
| 44 | #include <linux/reboot.h> | 44 | #include <linux/reboot.h> |
| 45 | #include <linux/kernel.h> | ||
| 45 | #include "ubi.h" | 46 | #include "ubi.h" |
| 46 | 47 | ||
| 47 | /* Maximum length of the 'mtd=' parameter */ | 48 | /* Maximum length of the 'mtd=' parameter */ |
| @@ -1257,7 +1258,7 @@ static int __init bytes_str_to_int(const char *str) | |||
| 1257 | unsigned long result; | 1258 | unsigned long result; |
| 1258 | 1259 | ||
| 1259 | result = simple_strtoul(str, &endp, 0); | 1260 | result = simple_strtoul(str, &endp, 0); |
| 1260 | if (str == endp || result < 0) { | 1261 | if (str == endp || result >= INT_MAX) { |
| 1261 | printk(KERN_ERR "UBI error: incorrect bytes count: \"%s\"\n", | 1262 | printk(KERN_ERR "UBI error: incorrect bytes count: \"%s\"\n", |
| 1262 | str); | 1263 | str); |
| 1263 | return -EINVAL; | 1264 | return -EINVAL; |
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index e7161adc419d..90af61a2c3e4 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
| @@ -794,16 +794,15 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
| 794 | * number. | 794 | * number. |
| 795 | */ | 795 | */ |
| 796 | image_seq = be32_to_cpu(ech->image_seq); | 796 | image_seq = be32_to_cpu(ech->image_seq); |
| 797 | if (!si->image_seq_set) { | 797 | if (!ubi->image_seq && image_seq) |
| 798 | ubi->image_seq = image_seq; | 798 | ubi->image_seq = image_seq; |
| 799 | si->image_seq_set = 1; | 799 | if (ubi->image_seq && image_seq && |
| 800 | } else if (ubi->image_seq && ubi->image_seq != image_seq) { | 800 | ubi->image_seq != image_seq) { |
| 801 | ubi_err("bad image sequence number %d in PEB %d, " | 801 | ubi_err("bad image sequence number %d in PEB %d, " |
| 802 | "expected %d", image_seq, pnum, ubi->image_seq); | 802 | "expected %d", image_seq, pnum, ubi->image_seq); |
| 803 | ubi_dbg_dump_ec_hdr(ech); | 803 | ubi_dbg_dump_ec_hdr(ech); |
| 804 | return -EINVAL; | 804 | return -EINVAL; |
| 805 | } | 805 | } |
| 806 | |||
| 807 | } | 806 | } |
| 808 | 807 | ||
| 809 | /* OK, we've done with the EC header, let's look at the VID header */ | 808 | /* OK, we've done with the EC header, let's look at the VID header */ |
diff --git a/drivers/mtd/ubi/scan.h b/drivers/mtd/ubi/scan.h index bab31695dace..ff179ad7ca55 100644 --- a/drivers/mtd/ubi/scan.h +++ b/drivers/mtd/ubi/scan.h | |||
| @@ -103,7 +103,6 @@ struct ubi_scan_volume { | |||
| 103 | * @ec_sum: a temporary variable used when calculating @mean_ec | 103 | * @ec_sum: a temporary variable used when calculating @mean_ec |
| 104 | * @ec_count: a temporary variable used when calculating @mean_ec | 104 | * @ec_count: a temporary variable used when calculating @mean_ec |
| 105 | * @corr_count: count of corrupted PEBs | 105 | * @corr_count: count of corrupted PEBs |
| 106 | * @image_seq_set: indicates @ubi->image_seq is known | ||
| 107 | * | 106 | * |
| 108 | * This data structure contains the result of scanning and may be used by other | 107 | * This data structure contains the result of scanning and may be used by other |
| 109 | * UBI sub-systems to build final UBI data structures, further error-recovery | 108 | * UBI sub-systems to build final UBI data structures, further error-recovery |
| @@ -127,7 +126,6 @@ struct ubi_scan_info { | |||
| 127 | uint64_t ec_sum; | 126 | uint64_t ec_sum; |
| 128 | int ec_count; | 127 | int ec_count; |
| 129 | int corr_count; | 128 | int corr_count; |
| 130 | int image_seq_set; | ||
| 131 | }; | 129 | }; |
| 132 | 130 | ||
| 133 | struct ubi_device; | 131 | struct ubi_device; |
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index 4a110b7b2673..6c4a4fc83630 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c | |||
| @@ -1463,7 +1463,9 @@ int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, cisdata_t | |||
| 1463 | return -ENOMEM; | 1463 | return -ENOMEM; |
| 1464 | } | 1464 | } |
| 1465 | tuple.DesiredTuple = code; | 1465 | tuple.DesiredTuple = code; |
| 1466 | tuple.Attributes = TUPLE_RETURN_COMMON; | 1466 | tuple.Attributes = 0; |
| 1467 | if (function == BIND_FN_ALL) | ||
| 1468 | tuple.Attributes = TUPLE_RETURN_COMMON; | ||
| 1467 | ret = pccard_get_first_tuple(s, function, &tuple); | 1469 | ret = pccard_get_first_tuple(s, function, &tuple); |
| 1468 | if (ret != 0) | 1470 | if (ret != 0) |
| 1469 | goto done; | 1471 | goto done; |
| @@ -1490,7 +1492,7 @@ EXPORT_SYMBOL(pccard_read_tuple); | |||
| 1490 | 1492 | ||
| 1491 | ======================================================================*/ | 1493 | ======================================================================*/ |
| 1492 | 1494 | ||
| 1493 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, unsigned int *info) | 1495 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info) |
| 1494 | { | 1496 | { |
| 1495 | tuple_t *tuple; | 1497 | tuple_t *tuple; |
| 1496 | cisparse_t *p; | 1498 | cisparse_t *p; |
| @@ -1515,30 +1517,30 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, unsigned | |||
| 1515 | count = reserved = 0; | 1517 | count = reserved = 0; |
| 1516 | tuple->DesiredTuple = RETURN_FIRST_TUPLE; | 1518 | tuple->DesiredTuple = RETURN_FIRST_TUPLE; |
| 1517 | tuple->Attributes = TUPLE_RETURN_COMMON; | 1519 | tuple->Attributes = TUPLE_RETURN_COMMON; |
| 1518 | ret = pccard_get_first_tuple(s, function, tuple); | 1520 | ret = pccard_get_first_tuple(s, BIND_FN_ALL, tuple); |
| 1519 | if (ret != 0) | 1521 | if (ret != 0) |
| 1520 | goto done; | 1522 | goto done; |
| 1521 | 1523 | ||
| 1522 | /* First tuple should be DEVICE; we should really have either that | 1524 | /* First tuple should be DEVICE; we should really have either that |
| 1523 | or a CFTABLE_ENTRY of some sort */ | 1525 | or a CFTABLE_ENTRY of some sort */ |
| 1524 | if ((tuple->TupleCode == CISTPL_DEVICE) || | 1526 | if ((tuple->TupleCode == CISTPL_DEVICE) || |
| 1525 | (pccard_read_tuple(s, function, CISTPL_CFTABLE_ENTRY, p) == 0) || | 1527 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY, p) == 0) || |
| 1526 | (pccard_read_tuple(s, function, CISTPL_CFTABLE_ENTRY_CB, p) == 0)) | 1528 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY_CB, p) == 0)) |
| 1527 | dev_ok++; | 1529 | dev_ok++; |
| 1528 | 1530 | ||
| 1529 | /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2 | 1531 | /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2 |
| 1530 | tuple, for card identification. Certain old D-Link and Linksys | 1532 | tuple, for card identification. Certain old D-Link and Linksys |
| 1531 | cards have only a broken VERS_2 tuple; hence the bogus test. */ | 1533 | cards have only a broken VERS_2 tuple; hence the bogus test. */ |
| 1532 | if ((pccard_read_tuple(s, function, CISTPL_MANFID, p) == 0) || | 1534 | if ((pccard_read_tuple(s, BIND_FN_ALL, CISTPL_MANFID, p) == 0) || |
| 1533 | (pccard_read_tuple(s, function, CISTPL_VERS_1, p) == 0) || | 1535 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_1, p) == 0) || |
| 1534 | (pccard_read_tuple(s, function, CISTPL_VERS_2, p) != -ENOSPC)) | 1536 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_2, p) != -ENOSPC)) |
| 1535 | ident_ok++; | 1537 | ident_ok++; |
| 1536 | 1538 | ||
| 1537 | if (!dev_ok && !ident_ok) | 1539 | if (!dev_ok && !ident_ok) |
| 1538 | goto done; | 1540 | goto done; |
| 1539 | 1541 | ||
| 1540 | for (count = 1; count < MAX_TUPLES; count++) { | 1542 | for (count = 1; count < MAX_TUPLES; count++) { |
| 1541 | ret = pccard_get_next_tuple(s, function, tuple); | 1543 | ret = pccard_get_next_tuple(s, BIND_FN_ALL, tuple); |
| 1542 | if (ret != 0) | 1544 | if (ret != 0) |
| 1543 | break; | 1545 | break; |
| 1544 | if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) || | 1546 | if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) || |
diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h index 79615e6d540b..1f4098f1354d 100644 --- a/drivers/pcmcia/cs_internal.h +++ b/drivers/pcmcia/cs_internal.h | |||
| @@ -197,8 +197,7 @@ int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, | |||
| 197 | cisdata_t code, void *parse); | 197 | cisdata_t code, void *parse); |
| 198 | int pcmcia_replace_cis(struct pcmcia_socket *s, | 198 | int pcmcia_replace_cis(struct pcmcia_socket *s, |
| 199 | const u8 *data, const size_t len); | 199 | const u8 *data, const size_t len); |
| 200 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, | 200 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count); |
| 201 | unsigned int *count); | ||
| 202 | 201 | ||
| 203 | /* rsrc_mgr.c */ | 202 | /* rsrc_mgr.c */ |
| 204 | int pcmcia_validate_mem(struct pcmcia_socket *s); | 203 | int pcmcia_validate_mem(struct pcmcia_socket *s); |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 9f300d3cb125..f5b7079f13d3 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -547,7 +547,7 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev) | |||
| 547 | if (!vers1) | 547 | if (!vers1) |
| 548 | return -ENOMEM; | 548 | return -ENOMEM; |
| 549 | 549 | ||
| 550 | if (!pccard_read_tuple(p_dev->socket, p_dev->func, | 550 | if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, |
| 551 | CISTPL_MANFID, &manf_id)) { | 551 | CISTPL_MANFID, &manf_id)) { |
| 552 | p_dev->manf_id = manf_id.manf; | 552 | p_dev->manf_id = manf_id.manf; |
| 553 | p_dev->card_id = manf_id.card; | 553 | p_dev->card_id = manf_id.card; |
| @@ -581,9 +581,9 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev) | |||
| 581 | kfree(devgeo); | 581 | kfree(devgeo); |
| 582 | } | 582 | } |
| 583 | 583 | ||
| 584 | if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1, | 584 | if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, CISTPL_VERS_1, |
| 585 | vers1)) { | 585 | vers1)) { |
| 586 | for (i=0; i < vers1->ns; i++) { | 586 | for (i = 0; i < min_t(unsigned int, 4, vers1->ns); i++) { |
| 587 | char *tmp; | 587 | char *tmp; |
| 588 | unsigned int length; | 588 | unsigned int length; |
| 589 | 589 | ||
| @@ -733,7 +733,7 @@ static int pcmcia_card_add(struct pcmcia_socket *s) | |||
| 733 | return -EAGAIN; /* try again, but later... */ | 733 | return -EAGAIN; /* try again, but later... */ |
| 734 | } | 734 | } |
| 735 | 735 | ||
| 736 | ret = pccard_validate_cis(s, BIND_FN_ALL, &no_chains); | 736 | ret = pccard_validate_cis(s, &no_chains); |
| 737 | if (ret || !no_chains) { | 737 | if (ret || !no_chains) { |
| 738 | ds_dev_dbg(0, &s->dev, "invalid CIS or invalid resources\n"); | 738 | ds_dev_dbg(0, &s->dev, "invalid CIS or invalid resources\n"); |
| 739 | return -ENODEV; | 739 | return -ENODEV; |
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index b906abe26ad0..a4aacb830b80 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c | |||
| @@ -1053,8 +1053,8 @@ static int i365_set_io_map(u_short sock, struct pccard_io_map *io) | |||
| 1053 | u_char map, ioctl; | 1053 | u_char map, ioctl; |
| 1054 | 1054 | ||
| 1055 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " | 1055 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " |
| 1056 | "%#x-%#x)\n", sock, io->map, io->flags, | 1056 | "%#llx-%#llx)\n", sock, io->map, io->flags, io->speed, |
| 1057 | io->speed, io->start, io->stop); | 1057 | (unsigned long long)io->start, (unsigned long long)io->stop); |
| 1058 | map = io->map; | 1058 | map = io->map; |
| 1059 | if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || | 1059 | if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || |
| 1060 | (io->stop < io->start)) return -EINVAL; | 1060 | (io->stop < io->start)) return -EINVAL; |
diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c index d1d89c4491ad..7dfbee1dcd76 100644 --- a/drivers/pcmcia/m32r_cfc.c +++ b/drivers/pcmcia/m32r_cfc.c | |||
| @@ -537,8 +537,9 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io) | |||
| 537 | u_char map; | 537 | u_char map; |
| 538 | 538 | ||
| 539 | debug(3, "m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, " | 539 | debug(3, "m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, " |
| 540 | "%#lx-%#lx)\n", sock, io->map, io->flags, | 540 | "%#llx-%#llx)\n", sock, io->map, io->flags, |
| 541 | io->speed, io->start, io->stop); | 541 | io->speed, (unsigned long long)io->start, |
| 542 | (unsigned long long)io->stop); | ||
| 542 | map = io->map; | 543 | map = io->map; |
| 543 | 544 | ||
| 544 | return 0; | 545 | return 0; |
| @@ -554,8 +555,9 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem) | |||
| 554 | pcc_socket_t *t = &socket[sock]; | 555 | pcc_socket_t *t = &socket[sock]; |
| 555 | 556 | ||
| 556 | debug(3, "m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, " | 557 | debug(3, "m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, " |
| 557 | "%#lx, %#x)\n", sock, map, mem->flags, | 558 | "%#llx, %#x)\n", sock, map, mem->flags, |
| 558 | mem->speed, mem->static_start, mem->card_start); | 559 | mem->speed, (unsigned long long)mem->static_start, |
| 560 | mem->card_start); | ||
| 559 | 561 | ||
| 560 | /* | 562 | /* |
| 561 | * sanity check | 563 | * sanity check |
diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c index a0655839c8d3..c6524f99ccc3 100644 --- a/drivers/pcmcia/m32r_pcc.c +++ b/drivers/pcmcia/m32r_pcc.c | |||
| @@ -492,8 +492,9 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io) | |||
| 492 | u_char map; | 492 | u_char map; |
| 493 | 493 | ||
| 494 | debug(3, "m32r-pcc: SetIOMap(%d, %d, %#2.2x, %d ns, " | 494 | debug(3, "m32r-pcc: SetIOMap(%d, %d, %#2.2x, %d ns, " |
| 495 | "%#x-%#x)\n", sock, io->map, io->flags, | 495 | "%#llx-%#llx)\n", sock, io->map, io->flags, |
| 496 | io->speed, io->start, io->stop); | 496 | io->speed, (unsigned long long)io->start, |
| 497 | (unsigned long long)io->stop); | ||
| 497 | map = io->map; | 498 | map = io->map; |
| 498 | 499 | ||
| 499 | return 0; | 500 | return 0; |
| @@ -515,8 +516,9 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem) | |||
| 515 | #endif | 516 | #endif |
| 516 | 517 | ||
| 517 | debug(3, "m32r-pcc: SetMemMap(%d, %d, %#2.2x, %d ns, " | 518 | debug(3, "m32r-pcc: SetMemMap(%d, %d, %#2.2x, %d ns, " |
| 518 | "%#lx, %#x)\n", sock, map, mem->flags, | 519 | "%#llx, %#x)\n", sock, map, mem->flags, |
| 519 | mem->speed, mem->static_start, mem->card_start); | 520 | mem->speed, (unsigned long long)mem->static_start, |
| 521 | mem->card_start); | ||
| 520 | 522 | ||
| 521 | /* | 523 | /* |
| 522 | * sanity check | 524 | * sanity check |
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index c69f2c4fe520..403559ba49dd 100644 --- a/drivers/pcmcia/m8xx_pcmcia.c +++ b/drivers/pcmcia/m8xx_pcmcia.c | |||
| @@ -975,8 +975,9 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io) | |||
| 975 | #define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start) | 975 | #define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start) |
| 976 | 976 | ||
| 977 | dprintk("SetIOMap(%d, %d, %#2.2x, %d ns, " | 977 | dprintk("SetIOMap(%d, %d, %#2.2x, %d ns, " |
| 978 | "%#4.4x-%#4.4x)\n", lsock, io->map, io->flags, | 978 | "%#4.4llx-%#4.4llx)\n", lsock, io->map, io->flags, |
| 979 | io->speed, io->start, io->stop); | 979 | io->speed, (unsigned long long)io->start, |
| 980 | (unsigned long long)io->stop); | ||
| 980 | 981 | ||
| 981 | if ((io->map >= PCMCIA_IO_WIN_NO) || (io->start > 0xffff) | 982 | if ((io->map >= PCMCIA_IO_WIN_NO) || (io->start > 0xffff) |
| 982 | || (io->stop > 0xffff) || (io->stop < io->start)) | 983 | || (io->stop > 0xffff) || (io->stop < io->start)) |
| @@ -1055,8 +1056,9 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock, | |||
| 1055 | pcmconf8xx_t *pcmcia = s->pcmcia; | 1056 | pcmconf8xx_t *pcmcia = s->pcmcia; |
| 1056 | 1057 | ||
| 1057 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " | 1058 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " |
| 1058 | "%#5.5lx, %#5.5x)\n", lsock, mem->map, mem->flags, | 1059 | "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags, |
| 1059 | mem->speed, mem->static_start, mem->card_start); | 1060 | mem->speed, (unsigned long long)mem->static_start, |
| 1061 | mem->card_start); | ||
| 1060 | 1062 | ||
| 1061 | if ((mem->map >= PCMCIA_MEM_WIN_NO) | 1063 | if ((mem->map >= PCMCIA_MEM_WIN_NO) |
| 1062 | // || ((mem->s) >= PCMCIA_MEM_WIN_SIZE) | 1064 | // || ((mem->s) >= PCMCIA_MEM_WIN_SIZE) |
| @@ -1107,8 +1109,9 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock, | |||
| 1107 | } | 1109 | } |
| 1108 | 1110 | ||
| 1109 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " | 1111 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " |
| 1110 | "%#5.5lx, %#5.5x)\n", lsock, mem->map, mem->flags, | 1112 | "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags, |
| 1111 | mem->speed, mem->static_start, mem->card_start); | 1113 | mem->speed, (unsigned long long)mem->static_start, |
| 1114 | mem->card_start); | ||
| 1112 | 1115 | ||
| 1113 | /* copy the struct and modify the copy */ | 1116 | /* copy the struct and modify the copy */ |
| 1114 | 1117 | ||
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 32c44040c1e8..30cf71d2ee23 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
| @@ -881,7 +881,7 @@ static int ds_ioctl(struct inode * inode, struct file * file, | |||
| 881 | mutex_lock(&s->skt_mutex); | 881 | mutex_lock(&s->skt_mutex); |
| 882 | pcmcia_validate_mem(s); | 882 | pcmcia_validate_mem(s); |
| 883 | mutex_unlock(&s->skt_mutex); | 883 | mutex_unlock(&s->skt_mutex); |
| 884 | ret = pccard_validate_cis(s, BIND_FN_ALL, &buf->cisinfo.Chains); | 884 | ret = pccard_validate_cis(s, &buf->cisinfo.Chains); |
| 885 | break; | 885 | break; |
| 886 | case DS_SUSPEND_CARD: | 886 | case DS_SUSPEND_CARD: |
| 887 | ret = pcmcia_suspend_card(s); | 887 | ret = pcmcia_suspend_card(s); |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 1c39d3438f20..70a33468bcd0 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
| @@ -641,6 +641,12 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, | |||
| 641 | if ((ret = pci_enable_device(dev))) | 641 | if ((ret = pci_enable_device(dev))) |
| 642 | goto err_out_free_mem; | 642 | goto err_out_free_mem; |
| 643 | 643 | ||
| 644 | if (!pci_resource_start(dev, 0)) { | ||
| 645 | printk(KERN_INFO "pd6729: refusing to load the driver " | ||
| 646 | "as the io_base is 0.\n"); | ||
| 647 | goto err_out_free_mem; | ||
| 648 | } | ||
| 649 | |||
| 644 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " | 650 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " |
| 645 | "at 0x%llx on irq %d\n", | 651 | "at 0x%llx on irq %d\n", |
| 646 | (unsigned long long)pci_resource_start(dev, 0), dev->irq); | 652 | (unsigned long long)pci_resource_start(dev, 0), dev->irq); |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 9ca22c7aafb2..7039f3cf5b77 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
| @@ -206,6 +206,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
| 206 | /* First, what does a floating port look like? */ | 206 | /* First, what does a floating port look like? */ |
| 207 | b = kzalloc(256, GFP_KERNEL); | 207 | b = kzalloc(256, GFP_KERNEL); |
| 208 | if (!b) { | 208 | if (!b) { |
| 209 | printk("\n"); | ||
| 209 | dev_printk(KERN_ERR, &s->dev, | 210 | dev_printk(KERN_ERR, &s->dev, |
| 210 | "do_io_probe: unable to kmalloc 256 bytes"); | 211 | "do_io_probe: unable to kmalloc 256 bytes"); |
| 211 | return; | 212 | return; |
| @@ -275,7 +276,7 @@ static int readable(struct pcmcia_socket *s, struct resource *res, | |||
| 275 | s->cis_mem.res = res; | 276 | s->cis_mem.res = res; |
| 276 | s->cis_virt = ioremap(res->start, s->map_size); | 277 | s->cis_virt = ioremap(res->start, s->map_size); |
| 277 | if (s->cis_virt) { | 278 | if (s->cis_virt) { |
| 278 | ret = pccard_validate_cis(s, BIND_FN_ALL, count); | 279 | ret = pccard_validate_cis(s, count); |
| 279 | /* invalidate mapping and CIS cache */ | 280 | /* invalidate mapping and CIS cache */ |
| 280 | iounmap(s->cis_virt); | 281 | iounmap(s->cis_virt); |
| 281 | s->cis_virt = NULL; | 282 | s->cis_virt = NULL; |
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index 163cf98e2386..ef7e9e58782b 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c | |||
| @@ -336,8 +336,9 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m | |||
| 336 | struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); | 336 | struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); |
| 337 | unsigned short speed = map->speed; | 337 | unsigned short speed = map->speed; |
| 338 | 338 | ||
| 339 | debug(skt, 2, "map %u speed %u start 0x%08x stop 0x%08x\n", | 339 | debug(skt, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n", |
| 340 | map->map, map->speed, map->start, map->stop); | 340 | map->map, map->speed, (unsigned long long)map->start, |
| 341 | (unsigned long long)map->stop); | ||
| 341 | debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", | 342 | debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", |
| 342 | (map->flags==0)?"<NONE>":"", | 343 | (map->flags==0)?"<NONE>":"", |
| 343 | (map->flags&MAP_ACTIVE)?"ACTIVE ":"", | 344 | (map->flags&MAP_ACTIVE)?"ACTIVE ":"", |
diff --git a/drivers/pcmcia/socket_sysfs.c b/drivers/pcmcia/socket_sysfs.c index ff9a3bb3c88d..78d5aab542f7 100644 --- a/drivers/pcmcia/socket_sysfs.c +++ b/drivers/pcmcia/socket_sysfs.c | |||
| @@ -300,7 +300,7 @@ static ssize_t pccard_show_cis(struct kobject *kobj, | |||
| 300 | 300 | ||
| 301 | if (!(s->state & SOCKET_PRESENT)) | 301 | if (!(s->state & SOCKET_PRESENT)) |
| 302 | return -ENODEV; | 302 | return -ENODEV; |
| 303 | if (pccard_validate_cis(s, BIND_FN_ALL, &chains)) | 303 | if (pccard_validate_cis(s, &chains)) |
| 304 | return -EIO; | 304 | return -EIO; |
| 305 | if (!chains) | 305 | if (!chains) |
| 306 | return -ENODATA; | 306 | return -ENODATA; |
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 582413fcb62f..6918849d511e 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c | |||
| @@ -732,8 +732,8 @@ static int tcic_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io) | |||
| 732 | u_short base, len, ioctl; | 732 | u_short base, len, ioctl; |
| 733 | 733 | ||
| 734 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " | 734 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " |
| 735 | "%#x-%#x)\n", psock, io->map, io->flags, | 735 | "%#llx-%#llx)\n", psock, io->map, io->flags, io->speed, |
| 736 | io->speed, io->start, io->stop); | 736 | (unsigned long long)io->start, (unsigned long long)io->stop); |
| 737 | if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || | 737 | if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || |
| 738 | (io->stop < io->start)) return -EINVAL; | 738 | (io->stop < io->start)) return -EINVAL; |
| 739 | tcic_setw(TCIC_ADDR+2, TCIC_ADR2_INDREG | (psock << TCIC_SS_SHFT)); | 739 | tcic_setw(TCIC_ADDR+2, TCIC_ADR2_INDREG | (psock << TCIC_SS_SHFT)); |
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index e7108e75653d..42e8550cd2b6 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c | |||
| @@ -1561,11 +1561,16 @@ enum pci_board_num_t { | |||
| 1561 | pbn_exar_XR17C152, | 1561 | pbn_exar_XR17C152, |
| 1562 | pbn_exar_XR17C154, | 1562 | pbn_exar_XR17C154, |
| 1563 | pbn_exar_XR17C158, | 1563 | pbn_exar_XR17C158, |
| 1564 | pbn_exar_ibm_saturn, | ||
| 1564 | pbn_pasemi_1682M, | 1565 | pbn_pasemi_1682M, |
| 1565 | pbn_ni8430_2, | 1566 | pbn_ni8430_2, |
| 1566 | pbn_ni8430_4, | 1567 | pbn_ni8430_4, |
| 1567 | pbn_ni8430_8, | 1568 | pbn_ni8430_8, |
| 1568 | pbn_ni8430_16, | 1569 | pbn_ni8430_16, |
| 1570 | pbn_ADDIDATA_PCIe_1_3906250, | ||
| 1571 | pbn_ADDIDATA_PCIe_2_3906250, | ||
| 1572 | pbn_ADDIDATA_PCIe_4_3906250, | ||
| 1573 | pbn_ADDIDATA_PCIe_8_3906250, | ||
| 1569 | }; | 1574 | }; |
| 1570 | 1575 | ||
| 1571 | /* | 1576 | /* |
| @@ -2146,6 +2151,13 @@ static struct pciserial_board pci_boards[] __devinitdata = { | |||
| 2146 | .base_baud = 921600, | 2151 | .base_baud = 921600, |
| 2147 | .uart_offset = 0x200, | 2152 | .uart_offset = 0x200, |
| 2148 | }, | 2153 | }, |
| 2154 | [pbn_exar_ibm_saturn] = { | ||
| 2155 | .flags = FL_BASE0, | ||
| 2156 | .num_ports = 1, | ||
| 2157 | .base_baud = 921600, | ||
| 2158 | .uart_offset = 0x200, | ||
| 2159 | }, | ||
| 2160 | |||
| 2149 | /* | 2161 | /* |
| 2150 | * PA Semi PWRficient PA6T-1682M on-chip UART | 2162 | * PA Semi PWRficient PA6T-1682M on-chip UART |
| 2151 | */ | 2163 | */ |
| @@ -2185,6 +2197,37 @@ static struct pciserial_board pci_boards[] __devinitdata = { | |||
| 2185 | .uart_offset = 0x10, | 2197 | .uart_offset = 0x10, |
| 2186 | .first_offset = 0x800, | 2198 | .first_offset = 0x800, |
| 2187 | }, | 2199 | }, |
| 2200 | /* | ||
| 2201 | * ADDI-DATA GmbH PCI-Express communication cards <info@addi-data.com> | ||
| 2202 | */ | ||
| 2203 | [pbn_ADDIDATA_PCIe_1_3906250] = { | ||
| 2204 | .flags = FL_BASE0, | ||
| 2205 | .num_ports = 1, | ||
| 2206 | .base_baud = 3906250, | ||
| 2207 | .uart_offset = 0x200, | ||
| 2208 | .first_offset = 0x1000, | ||
| 2209 | }, | ||
| 2210 | [pbn_ADDIDATA_PCIe_2_3906250] = { | ||
| 2211 | .flags = FL_BASE0, | ||
| 2212 | .num_ports = 2, | ||
| 2213 | .base_baud = 3906250, | ||
| 2214 | .uart_offset = 0x200, | ||
| 2215 | .first_offset = 0x1000, | ||
| 2216 | }, | ||
| 2217 | [pbn_ADDIDATA_PCIe_4_3906250] = { | ||
| 2218 | .flags = FL_BASE0, | ||
| 2219 | .num_ports = 4, | ||
| 2220 | .base_baud = 3906250, | ||
| 2221 | .uart_offset = 0x200, | ||
| 2222 | .first_offset = 0x1000, | ||
| 2223 | }, | ||
| 2224 | [pbn_ADDIDATA_PCIe_8_3906250] = { | ||
| 2225 | .flags = FL_BASE0, | ||
| 2226 | .num_ports = 8, | ||
| 2227 | .base_baud = 3906250, | ||
| 2228 | .uart_offset = 0x200, | ||
| 2229 | .first_offset = 0x1000, | ||
| 2230 | }, | ||
| 2188 | }; | 2231 | }; |
| 2189 | 2232 | ||
| 2190 | static const struct pci_device_id softmodem_blacklist[] = { | 2233 | static const struct pci_device_id softmodem_blacklist[] = { |
| @@ -2649,6 +2692,9 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
| 2649 | PCI_SUBVENDOR_ID_CONNECT_TECH, | 2692 | PCI_SUBVENDOR_ID_CONNECT_TECH, |
| 2650 | PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0, | 2693 | PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0, |
| 2651 | pbn_b0_8_1843200_200 }, | 2694 | pbn_b0_8_1843200_200 }, |
| 2695 | { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C152, | ||
| 2696 | PCI_VENDOR_ID_IBM, PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT, | ||
| 2697 | 0, 0, pbn_exar_ibm_saturn }, | ||
| 2652 | 2698 | ||
| 2653 | { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530, | 2699 | { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530, |
| 2654 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 2700 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
| @@ -3556,6 +3602,38 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
| 3556 | 0, | 3602 | 0, |
| 3557 | pbn_b0_8_115200 }, | 3603 | pbn_b0_8_115200 }, |
| 3558 | 3604 | ||
| 3605 | { PCI_VENDOR_ID_ADDIDATA, | ||
| 3606 | PCI_DEVICE_ID_ADDIDATA_APCIe7500, | ||
| 3607 | PCI_ANY_ID, | ||
| 3608 | PCI_ANY_ID, | ||
| 3609 | 0, | ||
| 3610 | 0, | ||
| 3611 | pbn_ADDIDATA_PCIe_4_3906250 }, | ||
| 3612 | |||
| 3613 | { PCI_VENDOR_ID_ADDIDATA, | ||
| 3614 | PCI_DEVICE_ID_ADDIDATA_APCIe7420, | ||
| 3615 | PCI_ANY_ID, | ||
| 3616 | PCI_ANY_ID, | ||
| 3617 | 0, | ||
| 3618 | 0, | ||
| 3619 | pbn_ADDIDATA_PCIe_2_3906250 }, | ||
| 3620 | |||
| 3621 | { PCI_VENDOR_ID_ADDIDATA, | ||
| 3622 | PCI_DEVICE_ID_ADDIDATA_APCIe7300, | ||
| 3623 | PCI_ANY_ID, | ||
| 3624 | PCI_ANY_ID, | ||
| 3625 | 0, | ||
| 3626 | 0, | ||
| 3627 | pbn_ADDIDATA_PCIe_1_3906250 }, | ||
| 3628 | |||
| 3629 | { PCI_VENDOR_ID_ADDIDATA, | ||
| 3630 | PCI_DEVICE_ID_ADDIDATA_APCIe7800, | ||
| 3631 | PCI_ANY_ID, | ||
| 3632 | PCI_ANY_ID, | ||
| 3633 | 0, | ||
| 3634 | 0, | ||
| 3635 | pbn_ADDIDATA_PCIe_8_3906250 }, | ||
| 3636 | |||
| 3559 | { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, | 3637 | { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, |
| 3560 | PCI_VENDOR_ID_IBM, 0x0299, | 3638 | PCI_VENDOR_ID_IBM, 0x0299, |
| 3561 | 0, 0, pbn_b0_bt_2_115200 }, | 3639 | 0, 0, pbn_b0_bt_2_115200 }, |
diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c index 3551c5cb7094..9d948bccafaf 100644 --- a/drivers/serial/atmel_serial.c +++ b/drivers/serial/atmel_serial.c | |||
| @@ -1531,7 +1531,7 @@ static int __devinit atmel_serial_probe(struct platform_device *pdev) | |||
| 1531 | void *data; | 1531 | void *data; |
| 1532 | int ret; | 1532 | int ret; |
| 1533 | 1533 | ||
| 1534 | BUILD_BUG_ON(!is_power_of_2(ATMEL_SERIAL_RINGSIZE)); | 1534 | BUILD_BUG_ON(ATMEL_SERIAL_RINGSIZE & (ATMEL_SERIAL_RINGSIZE - 1)); |
| 1535 | 1535 | ||
| 1536 | port = &atmel_ports[pdev->id]; | 1536 | port = &atmel_ports[pdev->id]; |
| 1537 | port->backup_imr = 0; | 1537 | port->backup_imr = 0; |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 33351312327f..a18e3c5dd82e 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -223,6 +223,7 @@ config USB_OTG | |||
| 223 | config USB_GADGET_PXA25X | 223 | config USB_GADGET_PXA25X |
| 224 | boolean "PXA 25x or IXP 4xx" | 224 | boolean "PXA 25x or IXP 4xx" |
| 225 | depends on (ARCH_PXA && PXA25x) || ARCH_IXP4XX | 225 | depends on (ARCH_PXA && PXA25x) || ARCH_IXP4XX |
| 226 | select USB_OTG_UTILS | ||
| 226 | help | 227 | help |
| 227 | Intel's PXA 25x series XScale ARM-5TE processors include | 228 | Intel's PXA 25x series XScale ARM-5TE processors include |
| 228 | an integrated full speed USB 1.1 device controller. The | 229 | an integrated full speed USB 1.1 device controller. The |
diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c index 9b9d6395bad3..052f214ea6f0 100644 --- a/fs/hfs/btree.c +++ b/fs/hfs/btree.c | |||
| @@ -58,6 +58,11 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke | |||
| 58 | } | 58 | } |
| 59 | unlock_new_inode(tree->inode); | 59 | unlock_new_inode(tree->inode); |
| 60 | 60 | ||
| 61 | if (!HFS_I(tree->inode)->first_blocks) { | ||
| 62 | printk(KERN_ERR "hfs: invalid btree extent records (0 size).\n"); | ||
| 63 | goto free_inode; | ||
| 64 | } | ||
| 65 | |||
| 61 | mapping = tree->inode->i_mapping; | 66 | mapping = tree->inode->i_mapping; |
| 62 | page = read_mapping_page(mapping, 0, NULL); | 67 | page = read_mapping_page(mapping, 0, NULL); |
| 63 | if (IS_ERR(page)) | 68 | if (IS_ERR(page)) |
diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index 175d08eacc86..bed78ac8f6d1 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c | |||
| @@ -99,6 +99,10 @@ int hfsplus_read_wrapper(struct super_block *sb) | |||
| 99 | 99 | ||
| 100 | if (hfsplus_get_last_session(sb, &part_start, &part_size)) | 100 | if (hfsplus_get_last_session(sb, &part_start, &part_size)) |
| 101 | return -EINVAL; | 101 | return -EINVAL; |
| 102 | if ((u64)part_start + part_size > 0x100000000ULL) { | ||
| 103 | pr_err("hfs: volumes larger than 2TB are not supported yet\n"); | ||
| 104 | return -EINVAL; | ||
| 105 | } | ||
| 102 | while (1) { | 106 | while (1) { |
| 103 | bh = sb_bread512(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, vhdr); | 107 | bh = sb_bread512(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, vhdr); |
| 104 | if (!bh) | 108 | if (!bh) |
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c index c7bff4f603ff..a65239cfd97e 100644 --- a/fs/proc/meminfo.c +++ b/fs/proc/meminfo.c | |||
| @@ -99,7 +99,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v) | |||
| 99 | "VmallocUsed: %8lu kB\n" | 99 | "VmallocUsed: %8lu kB\n" |
| 100 | "VmallocChunk: %8lu kB\n" | 100 | "VmallocChunk: %8lu kB\n" |
| 101 | #ifdef CONFIG_MEMORY_FAILURE | 101 | #ifdef CONFIG_MEMORY_FAILURE |
| 102 | "HardwareCorrupted: %8lu kB\n" | 102 | "HardwareCorrupted: %5lu kB\n" |
| 103 | #endif | 103 | #endif |
| 104 | , | 104 | , |
| 105 | K(i.totalram), | 105 | K(i.totalram), |
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 4e4276b956e8..5d1a3b98a6e6 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
| @@ -876,7 +876,6 @@ xfs_dqrele_inode( | |||
| 876 | ip->i_gdquot = NULL; | 876 | ip->i_gdquot = NULL; |
| 877 | } | 877 | } |
| 878 | xfs_iput(ip, XFS_ILOCK_EXCL); | 878 | xfs_iput(ip, XFS_ILOCK_EXCL); |
| 879 | IRELE(ip); | ||
| 880 | 879 | ||
| 881 | return 0; | 880 | return 0; |
| 882 | } | 881 | } |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 44717eb47639..79a2340d83cd 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
| @@ -291,8 +291,15 @@ struct global_attr { | |||
| 291 | int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu); | 291 | int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu); |
| 292 | int cpufreq_update_policy(unsigned int cpu); | 292 | int cpufreq_update_policy(unsigned int cpu); |
| 293 | 293 | ||
| 294 | #ifdef CONFIG_CPU_FREQ | ||
| 294 | /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */ | 295 | /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */ |
| 295 | unsigned int cpufreq_get(unsigned int cpu); | 296 | unsigned int cpufreq_get(unsigned int cpu); |
| 297 | #else | ||
| 298 | static inline unsigned int cpufreq_get(unsigned int cpu) | ||
| 299 | { | ||
| 300 | return 0; | ||
| 301 | } | ||
| 302 | #endif | ||
| 296 | 303 | ||
| 297 | /* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */ | 304 | /* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */ |
| 298 | #ifdef CONFIG_CPU_FREQ | 305 | #ifdef CONFIG_CPU_FREQ |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 86257a412732..b0f0f3851cd4 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -482,6 +482,9 @@ | |||
| 482 | #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361 | 482 | #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361 |
| 483 | #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL 0x252 | 483 | #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL 0x252 |
| 484 | 484 | ||
| 485 | #define PCI_SUBVENDOR_ID_IBM 0x1014 | ||
| 486 | #define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT 0x03d4 | ||
| 487 | |||
| 485 | #define PCI_VENDOR_ID_UNISYS 0x1018 | 488 | #define PCI_VENDOR_ID_UNISYS 0x1018 |
| 486 | #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C | 489 | #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C |
| 487 | 490 | ||
| @@ -2160,6 +2163,10 @@ | |||
| 2160 | #define PCI_DEVICE_ID_ADDIDATA_APCI7420_3 0x700D | 2163 | #define PCI_DEVICE_ID_ADDIDATA_APCI7420_3 0x700D |
| 2161 | #define PCI_DEVICE_ID_ADDIDATA_APCI7300_3 0x700E | 2164 | #define PCI_DEVICE_ID_ADDIDATA_APCI7300_3 0x700E |
| 2162 | #define PCI_DEVICE_ID_ADDIDATA_APCI7800_3 0x700F | 2165 | #define PCI_DEVICE_ID_ADDIDATA_APCI7800_3 0x700F |
| 2166 | #define PCI_DEVICE_ID_ADDIDATA_APCIe7300 0x7010 | ||
| 2167 | #define PCI_DEVICE_ID_ADDIDATA_APCIe7420 0x7011 | ||
| 2168 | #define PCI_DEVICE_ID_ADDIDATA_APCIe7500 0x7012 | ||
| 2169 | #define PCI_DEVICE_ID_ADDIDATA_APCIe7800 0x7013 | ||
| 2163 | 2170 | ||
| 2164 | #define PCI_VENDOR_ID_PDC 0x15e9 | 2171 | #define PCI_VENDOR_ID_PDC 0x15e9 |
| 2165 | 2172 | ||
diff --git a/include/linux/prctl.h b/include/linux/prctl.h index 931150566ade..a3baeb2c2161 100644 --- a/include/linux/prctl.h +++ b/include/linux/prctl.h | |||
| @@ -88,6 +88,18 @@ | |||
| 88 | #define PR_TASK_PERF_EVENTS_DISABLE 31 | 88 | #define PR_TASK_PERF_EVENTS_DISABLE 31 |
| 89 | #define PR_TASK_PERF_EVENTS_ENABLE 32 | 89 | #define PR_TASK_PERF_EVENTS_ENABLE 32 |
| 90 | 90 | ||
| 91 | /* | ||
| 92 | * Set early/late kill mode for hwpoison memory corruption. | ||
| 93 | * This influences when the process gets killed on a memory corruption. | ||
| 94 | */ | ||
| 91 | #define PR_MCE_KILL 33 | 95 | #define PR_MCE_KILL 33 |
| 96 | # define PR_MCE_KILL_CLEAR 0 | ||
| 97 | # define PR_MCE_KILL_SET 1 | ||
| 98 | |||
| 99 | # define PR_MCE_KILL_LATE 0 | ||
| 100 | # define PR_MCE_KILL_EARLY 1 | ||
| 101 | # define PR_MCE_KILL_DEFAULT 2 | ||
| 102 | |||
| 103 | #define PR_MCE_KILL_GET 34 | ||
| 92 | 104 | ||
| 93 | #endif /* _LINUX_PRCTL_H */ | 105 | #endif /* _LINUX_PRCTL_H */ |
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index 46e9ab3ee6e1..9642c6bcb399 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h | |||
| @@ -76,11 +76,7 @@ static inline void __rcu_read_unlock_bh(void) | |||
| 76 | 76 | ||
| 77 | extern void call_rcu_sched(struct rcu_head *head, | 77 | extern void call_rcu_sched(struct rcu_head *head, |
| 78 | void (*func)(struct rcu_head *rcu)); | 78 | void (*func)(struct rcu_head *rcu)); |
| 79 | 79 | extern void synchronize_rcu_expedited(void); | |
| 80 | static inline void synchronize_rcu_expedited(void) | ||
| 81 | { | ||
| 82 | synchronize_sched_expedited(); | ||
| 83 | } | ||
| 84 | 80 | ||
| 85 | static inline void synchronize_rcu_bh_expedited(void) | 81 | static inline void synchronize_rcu_bh_expedited(void) |
| 86 | { | 82 | { |
diff --git a/include/linux/string.h b/include/linux/string.h index 489019ef1694..b8508868d5ad 100644 --- a/include/linux/string.h +++ b/include/linux/string.h | |||
| @@ -62,7 +62,7 @@ extern char * strnchr(const char *, size_t, int); | |||
| 62 | #ifndef __HAVE_ARCH_STRRCHR | 62 | #ifndef __HAVE_ARCH_STRRCHR |
| 63 | extern char * strrchr(const char *,int); | 63 | extern char * strrchr(const char *,int); |
| 64 | #endif | 64 | #endif |
| 65 | extern char * strstrip(char *); | 65 | extern char * __must_check strstrip(char *); |
| 66 | #ifndef __HAVE_ARCH_STRSTR | 66 | #ifndef __HAVE_ARCH_STRSTR |
| 67 | extern char * strstr(const char *,const char *); | 67 | extern char * strstr(const char *,const char *); |
| 68 | #endif | 68 | #endif |
diff --git a/include/linux/topology.h b/include/linux/topology.h index fc0bf3edeb67..57e63579bfdd 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h | |||
| @@ -129,7 +129,7 @@ int arch_update_cpu_topology(void); | |||
| 129 | | 1*SD_BALANCE_FORK \ | 129 | | 1*SD_BALANCE_FORK \ |
| 130 | | 0*SD_BALANCE_WAKE \ | 130 | | 0*SD_BALANCE_WAKE \ |
| 131 | | 1*SD_WAKE_AFFINE \ | 131 | | 1*SD_WAKE_AFFINE \ |
| 132 | | 1*SD_PREFER_LOCAL \ | 132 | | 0*SD_PREFER_LOCAL \ |
| 133 | | 0*SD_SHARE_CPUPOWER \ | 133 | | 0*SD_SHARE_CPUPOWER \ |
| 134 | | 1*SD_SHARE_PKG_RESOURCES \ | 134 | | 1*SD_SHARE_PKG_RESOURCES \ |
| 135 | | 0*SD_SERIALIZE \ | 135 | | 0*SD_SERIALIZE \ |
| @@ -162,7 +162,7 @@ int arch_update_cpu_topology(void); | |||
| 162 | | 1*SD_BALANCE_FORK \ | 162 | | 1*SD_BALANCE_FORK \ |
| 163 | | 0*SD_BALANCE_WAKE \ | 163 | | 0*SD_BALANCE_WAKE \ |
| 164 | | 1*SD_WAKE_AFFINE \ | 164 | | 1*SD_WAKE_AFFINE \ |
| 165 | | 1*SD_PREFER_LOCAL \ | 165 | | 0*SD_PREFER_LOCAL \ |
| 166 | | 0*SD_SHARE_CPUPOWER \ | 166 | | 0*SD_SHARE_CPUPOWER \ |
| 167 | | 0*SD_SHARE_PKG_RESOURCES \ | 167 | | 0*SD_SHARE_PKG_RESOURCES \ |
| 168 | | 0*SD_SERIALIZE \ | 168 | | 0*SD_SERIALIZE \ |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index ca83b73fba19..0249f4be9b5c 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -1710,14 +1710,13 @@ static ssize_t cgroup_write_X64(struct cgroup *cgrp, struct cftype *cft, | |||
| 1710 | return -EFAULT; | 1710 | return -EFAULT; |
| 1711 | 1711 | ||
| 1712 | buffer[nbytes] = 0; /* nul-terminate */ | 1712 | buffer[nbytes] = 0; /* nul-terminate */ |
| 1713 | strstrip(buffer); | ||
| 1714 | if (cft->write_u64) { | 1713 | if (cft->write_u64) { |
| 1715 | u64 val = simple_strtoull(buffer, &end, 0); | 1714 | u64 val = simple_strtoull(strstrip(buffer), &end, 0); |
| 1716 | if (*end) | 1715 | if (*end) |
| 1717 | return -EINVAL; | 1716 | return -EINVAL; |
| 1718 | retval = cft->write_u64(cgrp, cft, val); | 1717 | retval = cft->write_u64(cgrp, cft, val); |
| 1719 | } else { | 1718 | } else { |
| 1720 | s64 val = simple_strtoll(buffer, &end, 0); | 1719 | s64 val = simple_strtoll(strstrip(buffer), &end, 0); |
| 1721 | if (*end) | 1720 | if (*end) |
| 1722 | return -EINVAL; | 1721 | return -EINVAL; |
| 1723 | retval = cft->write_s64(cgrp, cft, val); | 1722 | retval = cft->write_s64(cgrp, cft, val); |
| @@ -1753,8 +1752,7 @@ static ssize_t cgroup_write_string(struct cgroup *cgrp, struct cftype *cft, | |||
| 1753 | } | 1752 | } |
| 1754 | 1753 | ||
| 1755 | buffer[nbytes] = 0; /* nul-terminate */ | 1754 | buffer[nbytes] = 0; /* nul-terminate */ |
| 1756 | strstrip(buffer); | 1755 | retval = cft->write_string(cgrp, cft, strstrip(buffer)); |
| 1757 | retval = cft->write_string(cgrp, cft, buffer); | ||
| 1758 | if (!retval) | 1756 | if (!retval) |
| 1759 | retval = nbytes; | 1757 | retval = nbytes; |
| 1760 | out: | 1758 | out: |
diff --git a/kernel/exit.c b/kernel/exit.c index e61891f80123..f7864ac2ecc1 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -359,10 +359,8 @@ void __set_special_pids(struct pid *pid) | |||
| 359 | { | 359 | { |
| 360 | struct task_struct *curr = current->group_leader; | 360 | struct task_struct *curr = current->group_leader; |
| 361 | 361 | ||
| 362 | if (task_session(curr) != pid) { | 362 | if (task_session(curr) != pid) |
| 363 | change_pid(curr, PIDTYPE_SID, pid); | 363 | change_pid(curr, PIDTYPE_SID, pid); |
| 364 | proc_sid_connector(curr); | ||
| 365 | } | ||
| 366 | 364 | ||
| 367 | if (task_pgrp(curr) != pid) | 365 | if (task_pgrp(curr) != pid) |
| 368 | change_pid(curr, PIDTYPE_PGID, pid); | 366 | change_pid(curr, PIDTYPE_PGID, pid); |
diff --git a/kernel/futex.c b/kernel/futex.c index 4949d336d88d..642f3bbaacc7 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -150,7 +150,8 @@ static struct futex_hash_bucket *hash_futex(union futex_key *key) | |||
| 150 | */ | 150 | */ |
| 151 | static inline int match_futex(union futex_key *key1, union futex_key *key2) | 151 | static inline int match_futex(union futex_key *key1, union futex_key *key2) |
| 152 | { | 152 | { |
| 153 | return (key1->both.word == key2->both.word | 153 | return (key1 && key2 |
| 154 | && key1->both.word == key2->both.word | ||
| 154 | && key1->both.ptr == key2->both.ptr | 155 | && key1->both.ptr == key2->both.ptr |
| 155 | && key1->both.offset == key2->both.offset); | 156 | && key1->both.offset == key2->both.offset); |
| 156 | } | 157 | } |
| @@ -1028,7 +1029,6 @@ static inline | |||
| 1028 | void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, | 1029 | void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, |
| 1029 | struct futex_hash_bucket *hb) | 1030 | struct futex_hash_bucket *hb) |
| 1030 | { | 1031 | { |
| 1031 | drop_futex_key_refs(&q->key); | ||
| 1032 | get_futex_key_refs(key); | 1032 | get_futex_key_refs(key); |
| 1033 | q->key = *key; | 1033 | q->key = *key; |
| 1034 | 1034 | ||
| @@ -1226,6 +1226,7 @@ retry_private: | |||
| 1226 | */ | 1226 | */ |
| 1227 | if (ret == 1) { | 1227 | if (ret == 1) { |
| 1228 | WARN_ON(pi_state); | 1228 | WARN_ON(pi_state); |
| 1229 | drop_count++; | ||
| 1229 | task_count++; | 1230 | task_count++; |
| 1230 | ret = get_futex_value_locked(&curval2, uaddr2); | 1231 | ret = get_futex_value_locked(&curval2, uaddr2); |
| 1231 | if (!ret) | 1232 | if (!ret) |
| @@ -1304,6 +1305,7 @@ retry_private: | |||
| 1304 | if (ret == 1) { | 1305 | if (ret == 1) { |
| 1305 | /* We got the lock. */ | 1306 | /* We got the lock. */ |
| 1306 | requeue_pi_wake_futex(this, &key2, hb2); | 1307 | requeue_pi_wake_futex(this, &key2, hb2); |
| 1308 | drop_count++; | ||
| 1307 | continue; | 1309 | continue; |
| 1308 | } else if (ret) { | 1310 | } else if (ret) { |
| 1309 | /* -EDEADLK */ | 1311 | /* -EDEADLK */ |
| @@ -1791,6 +1793,7 @@ static int futex_wait(u32 __user *uaddr, int fshared, | |||
| 1791 | current->timer_slack_ns); | 1793 | current->timer_slack_ns); |
| 1792 | } | 1794 | } |
| 1793 | 1795 | ||
| 1796 | retry: | ||
| 1794 | /* Prepare to wait on uaddr. */ | 1797 | /* Prepare to wait on uaddr. */ |
| 1795 | ret = futex_wait_setup(uaddr, val, fshared, &q, &hb); | 1798 | ret = futex_wait_setup(uaddr, val, fshared, &q, &hb); |
| 1796 | if (ret) | 1799 | if (ret) |
| @@ -1808,9 +1811,14 @@ static int futex_wait(u32 __user *uaddr, int fshared, | |||
| 1808 | goto out_put_key; | 1811 | goto out_put_key; |
| 1809 | 1812 | ||
| 1810 | /* | 1813 | /* |
| 1811 | * We expect signal_pending(current), but another thread may | 1814 | * We expect signal_pending(current), but we might be the |
| 1812 | * have handled it for us already. | 1815 | * victim of a spurious wakeup as well. |
| 1813 | */ | 1816 | */ |
| 1817 | if (!signal_pending(current)) { | ||
| 1818 | put_futex_key(fshared, &q.key); | ||
| 1819 | goto retry; | ||
| 1820 | } | ||
| 1821 | |||
| 1814 | ret = -ERESTARTSYS; | 1822 | ret = -ERESTARTSYS; |
| 1815 | if (!abs_time) | 1823 | if (!abs_time) |
| 1816 | goto out_put_key; | 1824 | goto out_put_key; |
| @@ -2118,9 +2126,11 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb, | |||
| 2118 | */ | 2126 | */ |
| 2119 | plist_del(&q->list, &q->list.plist); | 2127 | plist_del(&q->list, &q->list.plist); |
| 2120 | 2128 | ||
| 2129 | /* Handle spurious wakeups gracefully */ | ||
| 2130 | ret = -EAGAIN; | ||
| 2121 | if (timeout && !timeout->task) | 2131 | if (timeout && !timeout->task) |
| 2122 | ret = -ETIMEDOUT; | 2132 | ret = -ETIMEDOUT; |
| 2123 | else | 2133 | else if (signal_pending(current)) |
| 2124 | ret = -ERESTARTNOINTR; | 2134 | ret = -ERESTARTNOINTR; |
| 2125 | } | 2135 | } |
| 2126 | return ret; | 2136 | return ret; |
| @@ -2198,6 +2208,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, int fshared, | |||
| 2198 | debug_rt_mutex_init_waiter(&rt_waiter); | 2208 | debug_rt_mutex_init_waiter(&rt_waiter); |
| 2199 | rt_waiter.task = NULL; | 2209 | rt_waiter.task = NULL; |
| 2200 | 2210 | ||
| 2211 | retry: | ||
| 2201 | key2 = FUTEX_KEY_INIT; | 2212 | key2 = FUTEX_KEY_INIT; |
| 2202 | ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE); | 2213 | ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE); |
| 2203 | if (unlikely(ret != 0)) | 2214 | if (unlikely(ret != 0)) |
| @@ -2292,6 +2303,9 @@ out_put_keys: | |||
| 2292 | out_key2: | 2303 | out_key2: |
| 2293 | put_futex_key(fshared, &key2); | 2304 | put_futex_key(fshared, &key2); |
| 2294 | 2305 | ||
| 2306 | /* Spurious wakeup ? */ | ||
| 2307 | if (ret == -EAGAIN) | ||
| 2308 | goto retry; | ||
| 2295 | out: | 2309 | out: |
| 2296 | if (to) { | 2310 | if (to) { |
| 2297 | hrtimer_cancel(&to->timer); | 2311 | hrtimer_cancel(&to->timer); |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 9d0b5c665883..afb7ef3dbc44 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
| @@ -1355,7 +1355,7 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) | |||
| 1355 | u64 interrupts, freq; | 1355 | u64 interrupts, freq; |
| 1356 | 1356 | ||
| 1357 | spin_lock(&ctx->lock); | 1357 | spin_lock(&ctx->lock); |
| 1358 | list_for_each_entry(event, &ctx->group_list, group_entry) { | 1358 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { |
| 1359 | if (event->state != PERF_EVENT_STATE_ACTIVE) | 1359 | if (event->state != PERF_EVENT_STATE_ACTIVE) |
| 1360 | continue; | 1360 | continue; |
| 1361 | 1361 | ||
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 705f02ac7433..0536125b0497 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
| @@ -913,7 +913,20 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp) | |||
| 913 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 913 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
| 914 | break; | 914 | break; |
| 915 | } | 915 | } |
| 916 | rcu_preempt_offline_tasks(rsp, rnp, rdp); | 916 | |
| 917 | /* | ||
| 918 | * If there was a task blocking the current grace period, | ||
| 919 | * and if all CPUs have checked in, we need to propagate | ||
| 920 | * the quiescent state up the rcu_node hierarchy. But that | ||
| 921 | * is inconvenient at the moment due to deadlock issues if | ||
| 922 | * this should end the current grace period. So set the | ||
| 923 | * offlined CPU's bit in ->qsmask in order to force the | ||
| 924 | * next force_quiescent_state() invocation to clean up this | ||
| 925 | * mess in a deadlock-free manner. | ||
| 926 | */ | ||
| 927 | if (rcu_preempt_offline_tasks(rsp, rnp, rdp) && !rnp->qsmask) | ||
| 928 | rnp->qsmask |= mask; | ||
| 929 | |||
| 917 | mask = rnp->grpmask; | 930 | mask = rnp->grpmask; |
| 918 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 931 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
| 919 | rnp = rnp->parent; | 932 | rnp = rnp->parent; |
| @@ -958,7 +971,7 @@ static void rcu_offline_cpu(int cpu) | |||
| 958 | * Invoke any RCU callbacks that have made it to the end of their grace | 971 | * Invoke any RCU callbacks that have made it to the end of their grace |
| 959 | * period. Thottle as specified by rdp->blimit. | 972 | * period. Thottle as specified by rdp->blimit. |
| 960 | */ | 973 | */ |
| 961 | static void rcu_do_batch(struct rcu_data *rdp) | 974 | static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp) |
| 962 | { | 975 | { |
| 963 | unsigned long flags; | 976 | unsigned long flags; |
| 964 | struct rcu_head *next, *list, **tail; | 977 | struct rcu_head *next, *list, **tail; |
| @@ -1011,6 +1024,13 @@ static void rcu_do_batch(struct rcu_data *rdp) | |||
| 1011 | if (rdp->blimit == LONG_MAX && rdp->qlen <= qlowmark) | 1024 | if (rdp->blimit == LONG_MAX && rdp->qlen <= qlowmark) |
| 1012 | rdp->blimit = blimit; | 1025 | rdp->blimit = blimit; |
| 1013 | 1026 | ||
| 1027 | /* Reset ->qlen_last_fqs_check trigger if enough CBs have drained. */ | ||
| 1028 | if (rdp->qlen == 0 && rdp->qlen_last_fqs_check != 0) { | ||
| 1029 | rdp->qlen_last_fqs_check = 0; | ||
| 1030 | rdp->n_force_qs_snap = rsp->n_force_qs; | ||
| 1031 | } else if (rdp->qlen < rdp->qlen_last_fqs_check - qhimark) | ||
| 1032 | rdp->qlen_last_fqs_check = rdp->qlen; | ||
| 1033 | |||
| 1014 | local_irq_restore(flags); | 1034 | local_irq_restore(flags); |
| 1015 | 1035 | ||
| 1016 | /* Re-raise the RCU softirq if there are callbacks remaining. */ | 1036 | /* Re-raise the RCU softirq if there are callbacks remaining. */ |
| @@ -1224,7 +1244,7 @@ __rcu_process_callbacks(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 1224 | } | 1244 | } |
| 1225 | 1245 | ||
| 1226 | /* If there are callbacks ready, invoke them. */ | 1246 | /* If there are callbacks ready, invoke them. */ |
| 1227 | rcu_do_batch(rdp); | 1247 | rcu_do_batch(rsp, rdp); |
| 1228 | } | 1248 | } |
| 1229 | 1249 | ||
| 1230 | /* | 1250 | /* |
| @@ -1288,10 +1308,20 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), | |||
| 1288 | rcu_start_gp(rsp, nestflag); /* releases rnp_root->lock. */ | 1308 | rcu_start_gp(rsp, nestflag); /* releases rnp_root->lock. */ |
| 1289 | } | 1309 | } |
| 1290 | 1310 | ||
| 1291 | /* Force the grace period if too many callbacks or too long waiting. */ | 1311 | /* |
| 1292 | if (unlikely(++rdp->qlen > qhimark)) { | 1312 | * Force the grace period if too many callbacks or too long waiting. |
| 1313 | * Enforce hysteresis, and don't invoke force_quiescent_state() | ||
| 1314 | * if some other CPU has recently done so. Also, don't bother | ||
| 1315 | * invoking force_quiescent_state() if the newly enqueued callback | ||
| 1316 | * is the only one waiting for a grace period to complete. | ||
| 1317 | */ | ||
| 1318 | if (unlikely(++rdp->qlen > rdp->qlen_last_fqs_check + qhimark)) { | ||
| 1293 | rdp->blimit = LONG_MAX; | 1319 | rdp->blimit = LONG_MAX; |
| 1294 | force_quiescent_state(rsp, 0); | 1320 | if (rsp->n_force_qs == rdp->n_force_qs_snap && |
| 1321 | *rdp->nxttail[RCU_DONE_TAIL] != head) | ||
| 1322 | force_quiescent_state(rsp, 0); | ||
| 1323 | rdp->n_force_qs_snap = rsp->n_force_qs; | ||
| 1324 | rdp->qlen_last_fqs_check = rdp->qlen; | ||
| 1295 | } else if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0) | 1325 | } else if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0) |
| 1296 | force_quiescent_state(rsp, 1); | 1326 | force_quiescent_state(rsp, 1); |
| 1297 | local_irq_restore(flags); | 1327 | local_irq_restore(flags); |
| @@ -1523,6 +1553,8 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptable) | |||
| 1523 | rdp->beenonline = 1; /* We have now been online. */ | 1553 | rdp->beenonline = 1; /* We have now been online. */ |
| 1524 | rdp->preemptable = preemptable; | 1554 | rdp->preemptable = preemptable; |
| 1525 | rdp->passed_quiesc_completed = lastcomp - 1; | 1555 | rdp->passed_quiesc_completed = lastcomp - 1; |
| 1556 | rdp->qlen_last_fqs_check = 0; | ||
| 1557 | rdp->n_force_qs_snap = rsp->n_force_qs; | ||
| 1526 | rdp->blimit = blimit; | 1558 | rdp->blimit = blimit; |
| 1527 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 1559 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
| 1528 | 1560 | ||
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index b40ac5706040..1823c6e20609 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
| @@ -167,6 +167,10 @@ struct rcu_data { | |||
| 167 | struct rcu_head *nxtlist; | 167 | struct rcu_head *nxtlist; |
| 168 | struct rcu_head **nxttail[RCU_NEXT_SIZE]; | 168 | struct rcu_head **nxttail[RCU_NEXT_SIZE]; |
| 169 | long qlen; /* # of queued callbacks */ | 169 | long qlen; /* # of queued callbacks */ |
| 170 | long qlen_last_fqs_check; | ||
| 171 | /* qlen at last check for QS forcing */ | ||
| 172 | unsigned long n_force_qs_snap; | ||
| 173 | /* did other CPU force QS recently? */ | ||
| 170 | long blimit; /* Upper limit on a processed batch */ | 174 | long blimit; /* Upper limit on a processed batch */ |
| 171 | 175 | ||
| 172 | #ifdef CONFIG_NO_HZ | 176 | #ifdef CONFIG_NO_HZ |
| @@ -302,9 +306,9 @@ static void rcu_print_task_stall(struct rcu_node *rnp); | |||
| 302 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 306 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ |
| 303 | static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp); | 307 | static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp); |
| 304 | #ifdef CONFIG_HOTPLUG_CPU | 308 | #ifdef CONFIG_HOTPLUG_CPU |
| 305 | static void rcu_preempt_offline_tasks(struct rcu_state *rsp, | 309 | static int rcu_preempt_offline_tasks(struct rcu_state *rsp, |
| 306 | struct rcu_node *rnp, | 310 | struct rcu_node *rnp, |
| 307 | struct rcu_data *rdp); | 311 | struct rcu_data *rdp); |
| 308 | static void rcu_preempt_offline_cpu(int cpu); | 312 | static void rcu_preempt_offline_cpu(int cpu); |
| 309 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | 313 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ |
| 310 | static void rcu_preempt_check_callbacks(int cpu); | 314 | static void rcu_preempt_check_callbacks(int cpu); |
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index c0cb783aa16a..ef2a58c2b9d5 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
| @@ -304,21 +304,25 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) | |||
| 304 | * parent is to remove the need for rcu_read_unlock_special() to | 304 | * parent is to remove the need for rcu_read_unlock_special() to |
| 305 | * make more than two attempts to acquire the target rcu_node's lock. | 305 | * make more than two attempts to acquire the target rcu_node's lock. |
| 306 | * | 306 | * |
| 307 | * Returns 1 if there was previously a task blocking the current grace | ||
| 308 | * period on the specified rcu_node structure. | ||
| 309 | * | ||
| 307 | * The caller must hold rnp->lock with irqs disabled. | 310 | * The caller must hold rnp->lock with irqs disabled. |
| 308 | */ | 311 | */ |
| 309 | static void rcu_preempt_offline_tasks(struct rcu_state *rsp, | 312 | static int rcu_preempt_offline_tasks(struct rcu_state *rsp, |
| 310 | struct rcu_node *rnp, | 313 | struct rcu_node *rnp, |
| 311 | struct rcu_data *rdp) | 314 | struct rcu_data *rdp) |
| 312 | { | 315 | { |
| 313 | int i; | 316 | int i; |
| 314 | struct list_head *lp; | 317 | struct list_head *lp; |
| 315 | struct list_head *lp_root; | 318 | struct list_head *lp_root; |
| 319 | int retval = rcu_preempted_readers(rnp); | ||
| 316 | struct rcu_node *rnp_root = rcu_get_root(rsp); | 320 | struct rcu_node *rnp_root = rcu_get_root(rsp); |
| 317 | struct task_struct *tp; | 321 | struct task_struct *tp; |
| 318 | 322 | ||
| 319 | if (rnp == rnp_root) { | 323 | if (rnp == rnp_root) { |
| 320 | WARN_ONCE(1, "Last CPU thought to be offlined?"); | 324 | WARN_ONCE(1, "Last CPU thought to be offlined?"); |
| 321 | return; /* Shouldn't happen: at least one CPU online. */ | 325 | return 0; /* Shouldn't happen: at least one CPU online. */ |
| 322 | } | 326 | } |
| 323 | WARN_ON_ONCE(rnp != rdp->mynode && | 327 | WARN_ON_ONCE(rnp != rdp->mynode && |
| 324 | (!list_empty(&rnp->blocked_tasks[0]) || | 328 | (!list_empty(&rnp->blocked_tasks[0]) || |
| @@ -342,6 +346,8 @@ static void rcu_preempt_offline_tasks(struct rcu_state *rsp, | |||
| 342 | spin_unlock(&rnp_root->lock); /* irqs remain disabled */ | 346 | spin_unlock(&rnp_root->lock); /* irqs remain disabled */ |
| 343 | } | 347 | } |
| 344 | } | 348 | } |
| 349 | |||
| 350 | return retval; | ||
| 345 | } | 351 | } |
| 346 | 352 | ||
| 347 | /* | 353 | /* |
| @@ -393,6 +399,17 @@ void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
| 393 | EXPORT_SYMBOL_GPL(call_rcu); | 399 | EXPORT_SYMBOL_GPL(call_rcu); |
| 394 | 400 | ||
| 395 | /* | 401 | /* |
| 402 | * Wait for an rcu-preempt grace period. We are supposed to expedite the | ||
| 403 | * grace period, but this is the crude slow compatability hack, so just | ||
| 404 | * invoke synchronize_rcu(). | ||
| 405 | */ | ||
| 406 | void synchronize_rcu_expedited(void) | ||
| 407 | { | ||
| 408 | synchronize_rcu(); | ||
| 409 | } | ||
| 410 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | ||
| 411 | |||
| 412 | /* | ||
| 396 | * Check to see if there is any immediate preemptable-RCU-related work | 413 | * Check to see if there is any immediate preemptable-RCU-related work |
| 397 | * to be done. | 414 | * to be done. |
| 398 | */ | 415 | */ |
| @@ -521,12 +538,15 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) | |||
| 521 | 538 | ||
| 522 | /* | 539 | /* |
| 523 | * Because preemptable RCU does not exist, it never needs to migrate | 540 | * Because preemptable RCU does not exist, it never needs to migrate |
| 524 | * tasks that were blocked within RCU read-side critical sections. | 541 | * tasks that were blocked within RCU read-side critical sections, and |
| 542 | * such non-existent tasks cannot possibly have been blocking the current | ||
| 543 | * grace period. | ||
| 525 | */ | 544 | */ |
| 526 | static void rcu_preempt_offline_tasks(struct rcu_state *rsp, | 545 | static int rcu_preempt_offline_tasks(struct rcu_state *rsp, |
| 527 | struct rcu_node *rnp, | 546 | struct rcu_node *rnp, |
| 528 | struct rcu_data *rdp) | 547 | struct rcu_data *rdp) |
| 529 | { | 548 | { |
| 549 | return 0; | ||
| 530 | } | 550 | } |
| 531 | 551 | ||
| 532 | /* | 552 | /* |
| @@ -565,6 +585,16 @@ void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
| 565 | EXPORT_SYMBOL_GPL(call_rcu); | 585 | EXPORT_SYMBOL_GPL(call_rcu); |
| 566 | 586 | ||
| 567 | /* | 587 | /* |
| 588 | * Wait for an rcu-preempt grace period, but make it happen quickly. | ||
| 589 | * But because preemptable RCU does not exist, map to rcu-sched. | ||
| 590 | */ | ||
| 591 | void synchronize_rcu_expedited(void) | ||
| 592 | { | ||
| 593 | synchronize_sched_expedited(); | ||
| 594 | } | ||
| 595 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | ||
| 596 | |||
| 597 | /* | ||
| 568 | * Because preemptable RCU does not exist, it never has any work to do. | 598 | * Because preemptable RCU does not exist, it never has any work to do. |
| 569 | */ | 599 | */ |
| 570 | static int rcu_preempt_pending(int cpu) | 600 | static int rcu_preempt_pending(int cpu) |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 4e777b47eeda..c32c3e643daa 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -861,12 +861,21 @@ wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se); | |||
| 861 | static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) | 861 | static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) |
| 862 | { | 862 | { |
| 863 | struct sched_entity *se = __pick_next_entity(cfs_rq); | 863 | struct sched_entity *se = __pick_next_entity(cfs_rq); |
| 864 | struct sched_entity *buddy; | ||
| 864 | 865 | ||
| 865 | if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, se) < 1) | 866 | if (cfs_rq->next) { |
| 866 | return cfs_rq->next; | 867 | buddy = cfs_rq->next; |
| 868 | cfs_rq->next = NULL; | ||
| 869 | if (wakeup_preempt_entity(buddy, se) < 1) | ||
| 870 | return buddy; | ||
| 871 | } | ||
| 867 | 872 | ||
| 868 | if (cfs_rq->last && wakeup_preempt_entity(cfs_rq->last, se) < 1) | 873 | if (cfs_rq->last) { |
| 869 | return cfs_rq->last; | 874 | buddy = cfs_rq->last; |
| 875 | cfs_rq->last = NULL; | ||
| 876 | if (wakeup_preempt_entity(buddy, se) < 1) | ||
| 877 | return buddy; | ||
| 878 | } | ||
| 870 | 879 | ||
| 871 | return se; | 880 | return se; |
| 872 | } | 881 | } |
| @@ -1654,16 +1663,6 @@ static struct task_struct *pick_next_task_fair(struct rq *rq) | |||
| 1654 | 1663 | ||
| 1655 | do { | 1664 | do { |
| 1656 | se = pick_next_entity(cfs_rq); | 1665 | se = pick_next_entity(cfs_rq); |
| 1657 | /* | ||
| 1658 | * If se was a buddy, clear it so that it will have to earn | ||
| 1659 | * the favour again. | ||
| 1660 | * | ||
| 1661 | * If se was not a buddy, clear the buddies because neither | ||
| 1662 | * was elegible to run, let them earn it again. | ||
| 1663 | * | ||
| 1664 | * IOW. unconditionally clear buddies. | ||
| 1665 | */ | ||
| 1666 | __clear_buddies(cfs_rq, NULL); | ||
| 1667 | set_next_entity(cfs_rq, se); | 1666 | set_next_entity(cfs_rq, se); |
| 1668 | cfs_rq = group_cfs_rq(se); | 1667 | cfs_rq = group_cfs_rq(se); |
| 1669 | } while (cfs_rq); | 1668 | } while (cfs_rq); |
diff --git a/kernel/sys.c b/kernel/sys.c index 255475d163e0..ce17760d9c51 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -1110,6 +1110,8 @@ SYSCALL_DEFINE0(setsid) | |||
| 1110 | err = session; | 1110 | err = session; |
| 1111 | out: | 1111 | out: |
| 1112 | write_unlock_irq(&tasklist_lock); | 1112 | write_unlock_irq(&tasklist_lock); |
| 1113 | if (err > 0) | ||
| 1114 | proc_sid_connector(group_leader); | ||
| 1113 | return err; | 1115 | return err; |
| 1114 | } | 1116 | } |
| 1115 | 1117 | ||
| @@ -1546,24 +1548,37 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, | |||
| 1546 | if (arg4 | arg5) | 1548 | if (arg4 | arg5) |
| 1547 | return -EINVAL; | 1549 | return -EINVAL; |
| 1548 | switch (arg2) { | 1550 | switch (arg2) { |
| 1549 | case 0: | 1551 | case PR_MCE_KILL_CLEAR: |
| 1550 | if (arg3 != 0) | 1552 | if (arg3 != 0) |
| 1551 | return -EINVAL; | 1553 | return -EINVAL; |
| 1552 | current->flags &= ~PF_MCE_PROCESS; | 1554 | current->flags &= ~PF_MCE_PROCESS; |
| 1553 | break; | 1555 | break; |
| 1554 | case 1: | 1556 | case PR_MCE_KILL_SET: |
| 1555 | current->flags |= PF_MCE_PROCESS; | 1557 | current->flags |= PF_MCE_PROCESS; |
| 1556 | if (arg3 != 0) | 1558 | if (arg3 == PR_MCE_KILL_EARLY) |
| 1557 | current->flags |= PF_MCE_EARLY; | 1559 | current->flags |= PF_MCE_EARLY; |
| 1558 | else | 1560 | else if (arg3 == PR_MCE_KILL_LATE) |
| 1559 | current->flags &= ~PF_MCE_EARLY; | 1561 | current->flags &= ~PF_MCE_EARLY; |
| 1562 | else if (arg3 == PR_MCE_KILL_DEFAULT) | ||
| 1563 | current->flags &= | ||
| 1564 | ~(PF_MCE_EARLY|PF_MCE_PROCESS); | ||
| 1565 | else | ||
| 1566 | return -EINVAL; | ||
| 1560 | break; | 1567 | break; |
| 1561 | default: | 1568 | default: |
| 1562 | return -EINVAL; | 1569 | return -EINVAL; |
| 1563 | } | 1570 | } |
| 1564 | error = 0; | 1571 | error = 0; |
| 1565 | break; | 1572 | break; |
| 1566 | 1573 | case PR_MCE_KILL_GET: | |
| 1574 | if (arg2 | arg3 | arg4 | arg5) | ||
| 1575 | return -EINVAL; | ||
| 1576 | if (current->flags & PF_MCE_PROCESS) | ||
| 1577 | error = (current->flags & PF_MCE_EARLY) ? | ||
| 1578 | PR_MCE_KILL_EARLY : PR_MCE_KILL_LATE; | ||
| 1579 | else | ||
| 1580 | error = PR_MCE_KILL_DEFAULT; | ||
| 1581 | break; | ||
| 1567 | default: | 1582 | default: |
| 1568 | error = -EINVAL; | 1583 | error = -EINVAL; |
| 1569 | break; | 1584 | break; |
diff --git a/kernel/sysctl_check.c b/kernel/sysctl_check.c index b38423ca711a..b6e7aaea4604 100644 --- a/kernel/sysctl_check.c +++ b/kernel/sysctl_check.c | |||
| @@ -1521,7 +1521,7 @@ int sysctl_check_table(struct nsproxy *namespaces, struct ctl_table *table) | |||
| 1521 | if (!table->ctl_name && table->strategy) | 1521 | if (!table->ctl_name && table->strategy) |
| 1522 | set_fail(&fail, table, "Strategy without ctl_name"); | 1522 | set_fail(&fail, table, "Strategy without ctl_name"); |
| 1523 | #endif | 1523 | #endif |
| 1524 | #ifdef CONFIG_PROC_FS | 1524 | #ifdef CONFIG_PROC_SYSCTL |
| 1525 | if (table->procname && !table->proc_handler) | 1525 | if (table->procname && !table->proc_handler) |
| 1526 | set_fail(&fail, table, "No proc_handler"); | 1526 | set_fail(&fail, table, "No proc_handler"); |
| 1527 | #endif | 1527 | #endif |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 47cdd7e76f2b..12328147132c 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -685,21 +685,38 @@ EXPORT_SYMBOL(schedule_delayed_work_on); | |||
| 685 | int schedule_on_each_cpu(work_func_t func) | 685 | int schedule_on_each_cpu(work_func_t func) |
| 686 | { | 686 | { |
| 687 | int cpu; | 687 | int cpu; |
| 688 | int orig = -1; | ||
| 688 | struct work_struct *works; | 689 | struct work_struct *works; |
| 689 | 690 | ||
| 690 | works = alloc_percpu(struct work_struct); | 691 | works = alloc_percpu(struct work_struct); |
| 691 | if (!works) | 692 | if (!works) |
| 692 | return -ENOMEM; | 693 | return -ENOMEM; |
| 693 | 694 | ||
| 695 | /* | ||
| 696 | * when running in keventd don't schedule a work item on itself. | ||
| 697 | * Can just call directly because the work queue is already bound. | ||
| 698 | * This also is faster. | ||
| 699 | * Make this a generic parameter for other workqueues? | ||
| 700 | */ | ||
| 701 | if (current_is_keventd()) { | ||
| 702 | orig = raw_smp_processor_id(); | ||
| 703 | INIT_WORK(per_cpu_ptr(works, orig), func); | ||
| 704 | func(per_cpu_ptr(works, orig)); | ||
| 705 | } | ||
| 706 | |||
| 694 | get_online_cpus(); | 707 | get_online_cpus(); |
| 695 | for_each_online_cpu(cpu) { | 708 | for_each_online_cpu(cpu) { |
| 696 | struct work_struct *work = per_cpu_ptr(works, cpu); | 709 | struct work_struct *work = per_cpu_ptr(works, cpu); |
| 697 | 710 | ||
| 711 | if (cpu == orig) | ||
| 712 | continue; | ||
| 698 | INIT_WORK(work, func); | 713 | INIT_WORK(work, func); |
| 699 | schedule_work_on(cpu, work); | 714 | schedule_work_on(cpu, work); |
| 700 | } | 715 | } |
| 701 | for_each_online_cpu(cpu) | 716 | for_each_online_cpu(cpu) { |
| 702 | flush_work(per_cpu_ptr(works, cpu)); | 717 | if (cpu != orig) |
| 718 | flush_work(per_cpu_ptr(works, cpu)); | ||
| 719 | } | ||
| 703 | put_online_cpus(); | 720 | put_online_cpus(); |
| 704 | free_percpu(works); | 721 | free_percpu(works); |
| 705 | return 0; | 722 | return 0; |
diff --git a/mm/Kconfig b/mm/Kconfig index 7ca3777bdede..fd3386242cf0 100644 --- a/mm/Kconfig +++ b/mm/Kconfig | |||
| @@ -67,7 +67,7 @@ config DISCONTIGMEM | |||
| 67 | 67 | ||
| 68 | config SPARSEMEM | 68 | config SPARSEMEM |
| 69 | def_bool y | 69 | def_bool y |
| 70 | depends on SPARSEMEM_MANUAL | 70 | depends on (!SELECT_MEMORY_MODEL && ARCH_SPARSEMEM_ENABLE) || SPARSEMEM_MANUAL |
| 71 | 71 | ||
| 72 | config FLATMEM | 72 | config FLATMEM |
| 73 | def_bool y | 73 | def_bool y |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 729d4b15b645..dacc64183874 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/mm.h> | 35 | #include <linux/mm.h> |
| 36 | #include <linux/page-flags.h> | 36 | #include <linux/page-flags.h> |
| 37 | #include <linux/sched.h> | 37 | #include <linux/sched.h> |
| 38 | #include <linux/ksm.h> | ||
| 38 | #include <linux/rmap.h> | 39 | #include <linux/rmap.h> |
| 39 | #include <linux/pagemap.h> | 40 | #include <linux/pagemap.h> |
| 40 | #include <linux/swap.h> | 41 | #include <linux/swap.h> |
| @@ -370,9 +371,6 @@ static int me_pagecache_clean(struct page *p, unsigned long pfn) | |||
| 370 | int ret = FAILED; | 371 | int ret = FAILED; |
| 371 | struct address_space *mapping; | 372 | struct address_space *mapping; |
| 372 | 373 | ||
| 373 | if (!isolate_lru_page(p)) | ||
| 374 | page_cache_release(p); | ||
| 375 | |||
| 376 | /* | 374 | /* |
| 377 | * For anonymous pages we're done the only reference left | 375 | * For anonymous pages we're done the only reference left |
| 378 | * should be the one m_f() holds. | 376 | * should be the one m_f() holds. |
| @@ -498,30 +496,18 @@ static int me_pagecache_dirty(struct page *p, unsigned long pfn) | |||
| 498 | */ | 496 | */ |
| 499 | static int me_swapcache_dirty(struct page *p, unsigned long pfn) | 497 | static int me_swapcache_dirty(struct page *p, unsigned long pfn) |
| 500 | { | 498 | { |
| 501 | int ret = FAILED; | ||
| 502 | |||
| 503 | ClearPageDirty(p); | 499 | ClearPageDirty(p); |
| 504 | /* Trigger EIO in shmem: */ | 500 | /* Trigger EIO in shmem: */ |
| 505 | ClearPageUptodate(p); | 501 | ClearPageUptodate(p); |
| 506 | 502 | ||
| 507 | if (!isolate_lru_page(p)) { | 503 | return DELAYED; |
| 508 | page_cache_release(p); | ||
| 509 | ret = DELAYED; | ||
| 510 | } | ||
| 511 | |||
| 512 | return ret; | ||
| 513 | } | 504 | } |
| 514 | 505 | ||
| 515 | static int me_swapcache_clean(struct page *p, unsigned long pfn) | 506 | static int me_swapcache_clean(struct page *p, unsigned long pfn) |
| 516 | { | 507 | { |
| 517 | int ret = FAILED; | ||
| 518 | |||
| 519 | if (!isolate_lru_page(p)) { | ||
| 520 | page_cache_release(p); | ||
| 521 | ret = RECOVERED; | ||
| 522 | } | ||
| 523 | delete_from_swap_cache(p); | 508 | delete_from_swap_cache(p); |
| 524 | return ret; | 509 | |
| 510 | return RECOVERED; | ||
| 525 | } | 511 | } |
| 526 | 512 | ||
| 527 | /* | 513 | /* |
| @@ -611,8 +597,6 @@ static struct page_state { | |||
| 611 | { 0, 0, "unknown page state", me_unknown }, | 597 | { 0, 0, "unknown page state", me_unknown }, |
| 612 | }; | 598 | }; |
| 613 | 599 | ||
| 614 | #undef lru | ||
| 615 | |||
| 616 | static void action_result(unsigned long pfn, char *msg, int result) | 600 | static void action_result(unsigned long pfn, char *msg, int result) |
| 617 | { | 601 | { |
| 618 | struct page *page = NULL; | 602 | struct page *page = NULL; |
| @@ -629,13 +613,16 @@ static int page_action(struct page_state *ps, struct page *p, | |||
| 629 | unsigned long pfn, int ref) | 613 | unsigned long pfn, int ref) |
| 630 | { | 614 | { |
| 631 | int result; | 615 | int result; |
| 616 | int count; | ||
| 632 | 617 | ||
| 633 | result = ps->action(p, pfn); | 618 | result = ps->action(p, pfn); |
| 634 | action_result(pfn, ps->msg, result); | 619 | action_result(pfn, ps->msg, result); |
| 635 | if (page_count(p) != 1 + ref) | 620 | |
| 621 | count = page_count(p) - 1 - ref; | ||
| 622 | if (count != 0) | ||
| 636 | printk(KERN_ERR | 623 | printk(KERN_ERR |
| 637 | "MCE %#lx: %s page still referenced by %d users\n", | 624 | "MCE %#lx: %s page still referenced by %d users\n", |
| 638 | pfn, ps->msg, page_count(p) - 1); | 625 | pfn, ps->msg, count); |
| 639 | 626 | ||
| 640 | /* Could do more checks here if page looks ok */ | 627 | /* Could do more checks here if page looks ok */ |
| 641 | /* | 628 | /* |
| @@ -661,12 +648,9 @@ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, | |||
| 661 | int i; | 648 | int i; |
| 662 | int kill = 1; | 649 | int kill = 1; |
| 663 | 650 | ||
| 664 | if (PageReserved(p) || PageCompound(p) || PageSlab(p)) | 651 | if (PageReserved(p) || PageCompound(p) || PageSlab(p) || PageKsm(p)) |
| 665 | return; | 652 | return; |
| 666 | 653 | ||
| 667 | if (!PageLRU(p)) | ||
| 668 | lru_add_drain_all(); | ||
| 669 | |||
| 670 | /* | 654 | /* |
| 671 | * This check implies we don't kill processes if their pages | 655 | * This check implies we don't kill processes if their pages |
| 672 | * are in the swap cache early. Those are always late kills. | 656 | * are in the swap cache early. Those are always late kills. |
| @@ -738,6 +722,7 @@ static void hwpoison_user_mappings(struct page *p, unsigned long pfn, | |||
| 738 | 722 | ||
| 739 | int __memory_failure(unsigned long pfn, int trapno, int ref) | 723 | int __memory_failure(unsigned long pfn, int trapno, int ref) |
| 740 | { | 724 | { |
| 725 | unsigned long lru_flag; | ||
| 741 | struct page_state *ps; | 726 | struct page_state *ps; |
| 742 | struct page *p; | 727 | struct page *p; |
| 743 | int res; | 728 | int res; |
| @@ -775,6 +760,24 @@ int __memory_failure(unsigned long pfn, int trapno, int ref) | |||
| 775 | } | 760 | } |
| 776 | 761 | ||
| 777 | /* | 762 | /* |
| 763 | * We ignore non-LRU pages for good reasons. | ||
| 764 | * - PG_locked is only well defined for LRU pages and a few others | ||
| 765 | * - to avoid races with __set_page_locked() | ||
| 766 | * - to avoid races with __SetPageSlab*() (and more non-atomic ops) | ||
| 767 | * The check (unnecessarily) ignores LRU pages being isolated and | ||
| 768 | * walked by the page reclaim code, however that's not a big loss. | ||
| 769 | */ | ||
| 770 | if (!PageLRU(p)) | ||
| 771 | lru_add_drain_all(); | ||
| 772 | lru_flag = p->flags & lru; | ||
| 773 | if (isolate_lru_page(p)) { | ||
| 774 | action_result(pfn, "non LRU", IGNORED); | ||
| 775 | put_page(p); | ||
| 776 | return -EBUSY; | ||
| 777 | } | ||
| 778 | page_cache_release(p); | ||
| 779 | |||
| 780 | /* | ||
| 778 | * Lock the page and wait for writeback to finish. | 781 | * Lock the page and wait for writeback to finish. |
| 779 | * It's very difficult to mess with pages currently under IO | 782 | * It's very difficult to mess with pages currently under IO |
| 780 | * and in many cases impossible, so we just avoid it here. | 783 | * and in many cases impossible, so we just avoid it here. |
| @@ -790,7 +793,7 @@ int __memory_failure(unsigned long pfn, int trapno, int ref) | |||
| 790 | /* | 793 | /* |
| 791 | * Torn down by someone else? | 794 | * Torn down by someone else? |
| 792 | */ | 795 | */ |
| 793 | if (PageLRU(p) && !PageSwapCache(p) && p->mapping == NULL) { | 796 | if ((lru_flag & lru) && !PageSwapCache(p) && p->mapping == NULL) { |
| 794 | action_result(pfn, "already truncated LRU", IGNORED); | 797 | action_result(pfn, "already truncated LRU", IGNORED); |
| 795 | res = 0; | 798 | res = 0; |
| 796 | goto out; | 799 | goto out; |
| @@ -798,7 +801,7 @@ int __memory_failure(unsigned long pfn, int trapno, int ref) | |||
| 798 | 801 | ||
| 799 | res = -EBUSY; | 802 | res = -EBUSY; |
| 800 | for (ps = error_states;; ps++) { | 803 | for (ps = error_states;; ps++) { |
| 801 | if ((p->flags & ps->mask) == ps->res) { | 804 | if (((p->flags | lru_flag)& ps->mask) == ps->res) { |
| 802 | res = page_action(ps, p, pfn, ref); | 805 | res = page_action(ps, p, pfn, ref); |
| 803 | break; | 806 | break; |
| 804 | } | 807 | } |
diff --git a/mm/memory.c b/mm/memory.c index 7e91b5f9f690..6ab19dd4a199 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -641,6 +641,7 @@ static int copy_pte_range(struct mm_struct *dst_mm, struct mm_struct *src_mm, | |||
| 641 | pmd_t *dst_pmd, pmd_t *src_pmd, struct vm_area_struct *vma, | 641 | pmd_t *dst_pmd, pmd_t *src_pmd, struct vm_area_struct *vma, |
| 642 | unsigned long addr, unsigned long end) | 642 | unsigned long addr, unsigned long end) |
| 643 | { | 643 | { |
| 644 | pte_t *orig_src_pte, *orig_dst_pte; | ||
| 644 | pte_t *src_pte, *dst_pte; | 645 | pte_t *src_pte, *dst_pte; |
| 645 | spinlock_t *src_ptl, *dst_ptl; | 646 | spinlock_t *src_ptl, *dst_ptl; |
| 646 | int progress = 0; | 647 | int progress = 0; |
| @@ -654,6 +655,8 @@ again: | |||
| 654 | src_pte = pte_offset_map_nested(src_pmd, addr); | 655 | src_pte = pte_offset_map_nested(src_pmd, addr); |
| 655 | src_ptl = pte_lockptr(src_mm, src_pmd); | 656 | src_ptl = pte_lockptr(src_mm, src_pmd); |
| 656 | spin_lock_nested(src_ptl, SINGLE_DEPTH_NESTING); | 657 | spin_lock_nested(src_ptl, SINGLE_DEPTH_NESTING); |
| 658 | orig_src_pte = src_pte; | ||
| 659 | orig_dst_pte = dst_pte; | ||
| 657 | arch_enter_lazy_mmu_mode(); | 660 | arch_enter_lazy_mmu_mode(); |
| 658 | 661 | ||
| 659 | do { | 662 | do { |
| @@ -677,9 +680,9 @@ again: | |||
| 677 | 680 | ||
| 678 | arch_leave_lazy_mmu_mode(); | 681 | arch_leave_lazy_mmu_mode(); |
| 679 | spin_unlock(src_ptl); | 682 | spin_unlock(src_ptl); |
| 680 | pte_unmap_nested(src_pte - 1); | 683 | pte_unmap_nested(orig_src_pte); |
| 681 | add_mm_rss(dst_mm, rss[0], rss[1]); | 684 | add_mm_rss(dst_mm, rss[0], rss[1]); |
| 682 | pte_unmap_unlock(dst_pte - 1, dst_ptl); | 685 | pte_unmap_unlock(orig_dst_pte, dst_ptl); |
| 683 | cond_resched(); | 686 | cond_resched(); |
| 684 | if (addr != end) | 687 | if (addr != end) |
| 685 | goto again; | 688 | goto again; |
| @@ -1820,10 +1823,10 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, | |||
| 1820 | token = pmd_pgtable(*pmd); | 1823 | token = pmd_pgtable(*pmd); |
| 1821 | 1824 | ||
| 1822 | do { | 1825 | do { |
| 1823 | err = fn(pte, token, addr, data); | 1826 | err = fn(pte++, token, addr, data); |
| 1824 | if (err) | 1827 | if (err) |
| 1825 | break; | 1828 | break; |
| 1826 | } while (pte++, addr += PAGE_SIZE, addr != end); | 1829 | } while (addr += PAGE_SIZE, addr != end); |
| 1827 | 1830 | ||
| 1828 | arch_leave_lazy_mmu_mode(); | 1831 | arch_leave_lazy_mmu_mode(); |
| 1829 | 1832 | ||
| @@ -2539,7 +2542,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2539 | } else if (PageHWPoison(page)) { | 2542 | } else if (PageHWPoison(page)) { |
| 2540 | ret = VM_FAULT_HWPOISON; | 2543 | ret = VM_FAULT_HWPOISON; |
| 2541 | delayacct_clear_flag(DELAYACCT_PF_SWAPIN); | 2544 | delayacct_clear_flag(DELAYACCT_PF_SWAPIN); |
| 2542 | goto out; | 2545 | goto out_release; |
| 2543 | } | 2546 | } |
| 2544 | 2547 | ||
| 2545 | lock_page(page); | 2548 | lock_page(page); |
| @@ -2611,6 +2614,7 @@ out_nomap: | |||
| 2611 | pte_unmap_unlock(page_table, ptl); | 2614 | pte_unmap_unlock(page_table, ptl); |
| 2612 | out_page: | 2615 | out_page: |
| 2613 | unlock_page(page); | 2616 | unlock_page(page); |
| 2617 | out_release: | ||
| 2614 | page_cache_release(page); | 2618 | page_cache_release(page); |
| 2615 | return ret; | 2619 | return ret; |
| 2616 | } | 2620 | } |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 7dd9d9f80694..4545d5944243 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -1024,7 +1024,7 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
| 1024 | 1024 | ||
| 1025 | err = migrate_prep(); | 1025 | err = migrate_prep(); |
| 1026 | if (err) | 1026 | if (err) |
| 1027 | return err; | 1027 | goto mpol_out; |
| 1028 | } | 1028 | } |
| 1029 | { | 1029 | { |
| 1030 | NODEMASK_SCRATCH(scratch); | 1030 | NODEMASK_SCRATCH(scratch); |
| @@ -1039,10 +1039,9 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
| 1039 | err = -ENOMEM; | 1039 | err = -ENOMEM; |
| 1040 | NODEMASK_SCRATCH_FREE(scratch); | 1040 | NODEMASK_SCRATCH_FREE(scratch); |
| 1041 | } | 1041 | } |
| 1042 | if (err) { | 1042 | if (err) |
| 1043 | mpol_put(new); | 1043 | goto mpol_out; |
| 1044 | return err; | 1044 | |
| 1045 | } | ||
| 1046 | vma = check_range(mm, start, end, nmask, | 1045 | vma = check_range(mm, start, end, nmask, |
| 1047 | flags | MPOL_MF_INVERT, &pagelist); | 1046 | flags | MPOL_MF_INVERT, &pagelist); |
| 1048 | 1047 | ||
| @@ -1058,9 +1057,11 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
| 1058 | 1057 | ||
| 1059 | if (!err && nr_failed && (flags & MPOL_MF_STRICT)) | 1058 | if (!err && nr_failed && (flags & MPOL_MF_STRICT)) |
| 1060 | err = -EIO; | 1059 | err = -EIO; |
| 1061 | } | 1060 | } else |
| 1061 | putback_lru_pages(&pagelist); | ||
| 1062 | 1062 | ||
| 1063 | up_write(&mm->mmap_sem); | 1063 | up_write(&mm->mmap_sem); |
| 1064 | mpol_out: | ||
| 1064 | mpol_put(new); | 1065 | mpol_put(new); |
| 1065 | return err; | 1066 | return err; |
| 1066 | } | 1067 | } |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index bf720550b44d..cdcedf661616 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -2183,7 +2183,7 @@ void show_free_areas(void) | |||
| 2183 | printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" | 2183 | printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" |
| 2184 | " active_file:%lu inactive_file:%lu isolated_file:%lu\n" | 2184 | " active_file:%lu inactive_file:%lu isolated_file:%lu\n" |
| 2185 | " unevictable:%lu" | 2185 | " unevictable:%lu" |
| 2186 | " dirty:%lu writeback:%lu unstable:%lu buffer:%lu\n" | 2186 | " dirty:%lu writeback:%lu unstable:%lu\n" |
| 2187 | " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" | 2187 | " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" |
| 2188 | " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n", | 2188 | " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n", |
| 2189 | global_page_state(NR_ACTIVE_ANON), | 2189 | global_page_state(NR_ACTIVE_ANON), |
| @@ -2196,7 +2196,6 @@ void show_free_areas(void) | |||
| 2196 | global_page_state(NR_FILE_DIRTY), | 2196 | global_page_state(NR_FILE_DIRTY), |
| 2197 | global_page_state(NR_WRITEBACK), | 2197 | global_page_state(NR_WRITEBACK), |
| 2198 | global_page_state(NR_UNSTABLE_NFS), | 2198 | global_page_state(NR_UNSTABLE_NFS), |
| 2199 | nr_blockdev_pages(), | ||
| 2200 | global_page_state(NR_FREE_PAGES), | 2199 | global_page_state(NR_FREE_PAGES), |
| 2201 | global_page_state(NR_SLAB_RECLAIMABLE), | 2200 | global_page_state(NR_SLAB_RECLAIMABLE), |
| 2202 | global_page_state(NR_SLAB_UNRECLAIMABLE), | 2201 | global_page_state(NR_SLAB_UNRECLAIMABLE), |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 64e438898832..777af57fd8c8 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -544,6 +544,16 @@ redo: | |||
| 544 | */ | 544 | */ |
| 545 | lru = LRU_UNEVICTABLE; | 545 | lru = LRU_UNEVICTABLE; |
| 546 | add_page_to_unevictable_list(page); | 546 | add_page_to_unevictable_list(page); |
| 547 | /* | ||
| 548 | * When racing with an mlock clearing (page is | ||
| 549 | * unlocked), make sure that if the other thread does | ||
| 550 | * not observe our setting of PG_lru and fails | ||
| 551 | * isolation, we see PG_mlocked cleared below and move | ||
| 552 | * the page back to the evictable list. | ||
| 553 | * | ||
| 554 | * The other side is TestClearPageMlocked(). | ||
| 555 | */ | ||
| 556 | smp_mb(); | ||
| 547 | } | 557 | } |
| 548 | 558 | ||
| 549 | /* | 559 | /* |
| @@ -1088,7 +1098,7 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, | |||
| 1088 | int lumpy_reclaim = 0; | 1098 | int lumpy_reclaim = 0; |
| 1089 | 1099 | ||
| 1090 | while (unlikely(too_many_isolated(zone, file, sc))) { | 1100 | while (unlikely(too_many_isolated(zone, file, sc))) { |
| 1091 | congestion_wait(WRITE, HZ/10); | 1101 | congestion_wait(BLK_RW_ASYNC, HZ/10); |
| 1092 | 1102 | ||
| 1093 | /* We are about to die and free our memory. Return now. */ | 1103 | /* We are about to die and free our memory. Return now. */ |
| 1094 | if (fatal_signal_pending(current)) | 1104 | if (fatal_signal_pending(current)) |
| @@ -1356,7 +1366,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
| 1356 | * IO, plus JVM can create lots of anon VM_EXEC pages, | 1366 | * IO, plus JVM can create lots of anon VM_EXEC pages, |
| 1357 | * so we ignore them here. | 1367 | * so we ignore them here. |
| 1358 | */ | 1368 | */ |
| 1359 | if ((vm_flags & VM_EXEC) && !PageAnon(page)) { | 1369 | if ((vm_flags & VM_EXEC) && page_is_file_cache(page)) { |
| 1360 | list_add(&page->lru, &l_active); | 1370 | list_add(&page->lru, &l_active); |
| 1361 | continue; | 1371 | continue; |
| 1362 | } | 1372 | } |
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 87bbb8bce9bf..bc4114f1ab30 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # (c) 2001, Dave Jones. <davej@redhat.com> (the file handling bit) | 2 | # (c) 2001, Dave Jones. <davej@redhat.com> (the file handling bit) |
| 3 | # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) | 3 | # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) |
| 4 | # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite) | 4 | # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite) |
| 5 | # (c) 2008, Andy Whitcroft <apw@canonical.com> | 5 | # (c) 2008,2009, Andy Whitcroft <apw@canonical.com> |
| 6 | # Licensed under the terms of the GNU GPL License version 2 | 6 | # Licensed under the terms of the GNU GPL License version 2 |
| 7 | 7 | ||
| 8 | use strict; | 8 | use strict; |
| @@ -10,7 +10,7 @@ use strict; | |||
| 10 | my $P = $0; | 10 | my $P = $0; |
| 11 | $P =~ s@.*/@@g; | 11 | $P =~ s@.*/@@g; |
| 12 | 12 | ||
| 13 | my $V = '0.29'; | 13 | my $V = '0.30'; |
| 14 | 14 | ||
| 15 | use Getopt::Long qw(:config no_auto_abbrev); | 15 | use Getopt::Long qw(:config no_auto_abbrev); |
| 16 | 16 | ||
| @@ -130,7 +130,10 @@ if ($tree) { | |||
| 130 | 130 | ||
| 131 | my $emitted_corrupt = 0; | 131 | my $emitted_corrupt = 0; |
| 132 | 132 | ||
| 133 | our $Ident = qr{[A-Za-z_][A-Za-z\d_]*}; | 133 | our $Ident = qr{ |
| 134 | [A-Za-z_][A-Za-z\d_]* | ||
| 135 | (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* | ||
| 136 | }x; | ||
| 134 | our $Storage = qr{extern|static|asmlinkage}; | 137 | our $Storage = qr{extern|static|asmlinkage}; |
| 135 | our $Sparse = qr{ | 138 | our $Sparse = qr{ |
| 136 | __user| | 139 | __user| |
| @@ -997,23 +1000,25 @@ sub annotate_values { | |||
| 997 | 1000 | ||
| 998 | sub possible { | 1001 | sub possible { |
| 999 | my ($possible, $line) = @_; | 1002 | my ($possible, $line) = @_; |
| 1000 | 1003 | my $notPermitted = qr{(?: | |
| 1001 | print "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); | ||
| 1002 | if ($possible !~ /(?: | ||
| 1003 | ^(?: | 1004 | ^(?: |
| 1004 | $Modifier| | 1005 | $Modifier| |
| 1005 | $Storage| | 1006 | $Storage| |
| 1006 | $Type| | 1007 | $Type| |
| 1007 | DEFINE_\S+| | 1008 | DEFINE_\S+ |
| 1009 | )$| | ||
| 1010 | ^(?: | ||
| 1008 | goto| | 1011 | goto| |
| 1009 | return| | 1012 | return| |
| 1010 | case| | 1013 | case| |
| 1011 | else| | 1014 | else| |
| 1012 | asm|__asm__| | 1015 | asm|__asm__| |
| 1013 | do | 1016 | do |
| 1014 | )$| | 1017 | )(?:\s|$)| |
| 1015 | ^(?:typedef|struct|enum)\b | 1018 | ^(?:typedef|struct|enum)\b |
| 1016 | )/x) { | 1019 | )}x; |
| 1020 | warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); | ||
| 1021 | if ($possible !~ $notPermitted) { | ||
| 1017 | # Check for modifiers. | 1022 | # Check for modifiers. |
| 1018 | $possible =~ s/\s*$Storage\s*//g; | 1023 | $possible =~ s/\s*$Storage\s*//g; |
| 1019 | $possible =~ s/\s*$Sparse\s*//g; | 1024 | $possible =~ s/\s*$Sparse\s*//g; |
| @@ -1022,8 +1027,10 @@ sub possible { | |||
| 1022 | } elsif ($possible =~ /\s/) { | 1027 | } elsif ($possible =~ /\s/) { |
| 1023 | $possible =~ s/\s*$Type\s*//g; | 1028 | $possible =~ s/\s*$Type\s*//g; |
| 1024 | for my $modifier (split(' ', $possible)) { | 1029 | for my $modifier (split(' ', $possible)) { |
| 1025 | warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); | 1030 | if ($modifier !~ $notPermitted) { |
| 1026 | push(@modifierList, $modifier); | 1031 | warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); |
| 1032 | push(@modifierList, $modifier); | ||
| 1033 | } | ||
| 1027 | } | 1034 | } |
| 1028 | 1035 | ||
| 1029 | } else { | 1036 | } else { |
| @@ -1138,6 +1145,7 @@ sub process { | |||
| 1138 | # suppression flags | 1145 | # suppression flags |
| 1139 | my %suppress_ifbraces; | 1146 | my %suppress_ifbraces; |
| 1140 | my %suppress_whiletrailers; | 1147 | my %suppress_whiletrailers; |
| 1148 | my %suppress_export; | ||
| 1141 | 1149 | ||
| 1142 | # Pre-scan the patch sanitizing the lines. | 1150 | # Pre-scan the patch sanitizing the lines. |
| 1143 | # Pre-scan the patch looking for any __setup documentation. | 1151 | # Pre-scan the patch looking for any __setup documentation. |
| @@ -1230,7 +1238,6 @@ sub process { | |||
| 1230 | $linenr++; | 1238 | $linenr++; |
| 1231 | 1239 | ||
| 1232 | my $rawline = $rawlines[$linenr - 1]; | 1240 | my $rawline = $rawlines[$linenr - 1]; |
| 1233 | my $hunk_line = ($realcnt != 0); | ||
| 1234 | 1241 | ||
| 1235 | #extract the line range in the file after the patch is applied | 1242 | #extract the line range in the file after the patch is applied |
| 1236 | if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { | 1243 | if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { |
| @@ -1247,6 +1254,7 @@ sub process { | |||
| 1247 | 1254 | ||
| 1248 | %suppress_ifbraces = (); | 1255 | %suppress_ifbraces = (); |
| 1249 | %suppress_whiletrailers = (); | 1256 | %suppress_whiletrailers = (); |
| 1257 | %suppress_export = (); | ||
| 1250 | next; | 1258 | next; |
| 1251 | 1259 | ||
| 1252 | # track the line number as we move through the hunk, note that | 1260 | # track the line number as we move through the hunk, note that |
| @@ -1270,6 +1278,8 @@ sub process { | |||
| 1270 | $realcnt--; | 1278 | $realcnt--; |
| 1271 | } | 1279 | } |
| 1272 | 1280 | ||
| 1281 | my $hunk_line = ($realcnt != 0); | ||
| 1282 | |||
| 1273 | #make up the handle for any error we report on this line | 1283 | #make up the handle for any error we report on this line |
| 1274 | $prefix = "$filename:$realline: " if ($emacs && $file); | 1284 | $prefix = "$filename:$realline: " if ($emacs && $file); |
| 1275 | $prefix = "$filename:$linenr: " if ($emacs && !$file); | 1285 | $prefix = "$filename:$linenr: " if ($emacs && !$file); |
| @@ -1420,13 +1430,22 @@ sub process { | |||
| 1420 | } | 1430 | } |
| 1421 | 1431 | ||
| 1422 | # Check for potential 'bare' types | 1432 | # Check for potential 'bare' types |
| 1423 | my ($stat, $cond, $line_nr_next, $remain_next, $off_next); | 1433 | my ($stat, $cond, $line_nr_next, $remain_next, $off_next, |
| 1434 | $realline_next); | ||
| 1424 | if ($realcnt && $line =~ /.\s*\S/) { | 1435 | if ($realcnt && $line =~ /.\s*\S/) { |
| 1425 | ($stat, $cond, $line_nr_next, $remain_next, $off_next) = | 1436 | ($stat, $cond, $line_nr_next, $remain_next, $off_next) = |
| 1426 | ctx_statement_block($linenr, $realcnt, 0); | 1437 | ctx_statement_block($linenr, $realcnt, 0); |
| 1427 | $stat =~ s/\n./\n /g; | 1438 | $stat =~ s/\n./\n /g; |
| 1428 | $cond =~ s/\n./\n /g; | 1439 | $cond =~ s/\n./\n /g; |
| 1429 | 1440 | ||
| 1441 | # Find the real next line. | ||
| 1442 | $realline_next = $line_nr_next; | ||
| 1443 | if (defined $realline_next && | ||
| 1444 | (!defined $lines[$realline_next - 1] || | ||
| 1445 | substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { | ||
| 1446 | $realline_next++; | ||
| 1447 | } | ||
| 1448 | |||
| 1430 | my $s = $stat; | 1449 | my $s = $stat; |
| 1431 | $s =~ s/{.*$//s; | 1450 | $s =~ s/{.*$//s; |
| 1432 | 1451 | ||
| @@ -1661,8 +1680,8 @@ sub process { | |||
| 1661 | } | 1680 | } |
| 1662 | 1681 | ||
| 1663 | # check for initialisation to aggregates open brace on the next line | 1682 | # check for initialisation to aggregates open brace on the next line |
| 1664 | if ($prevline =~ /$Declare\s*$Ident\s*=\s*$/ && | 1683 | if ($line =~ /^.\s*{/ && |
| 1665 | $line =~ /^.\s*{/) { | 1684 | $prevline =~ /(?:^|[^=])=\s*$/) { |
| 1666 | ERROR("that open brace { should be on the previous line\n" . $hereprev); | 1685 | ERROR("that open brace { should be on the previous line\n" . $hereprev); |
| 1667 | } | 1686 | } |
| 1668 | 1687 | ||
| @@ -1687,21 +1706,40 @@ sub process { | |||
| 1687 | $line =~ s@//.*@@; | 1706 | $line =~ s@//.*@@; |
| 1688 | $opline =~ s@//.*@@; | 1707 | $opline =~ s@//.*@@; |
| 1689 | 1708 | ||
| 1690 | #EXPORT_SYMBOL should immediately follow its function closing }. | 1709 | # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider |
| 1691 | if (($line =~ /EXPORT_SYMBOL.*\((.*)\)/) || | 1710 | # the whole statement. |
| 1692 | ($line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { | 1711 | #print "APW <$lines[$realline_next - 1]>\n"; |
| 1712 | if (defined $realline_next && | ||
| 1713 | exists $lines[$realline_next - 1] && | ||
| 1714 | !defined $suppress_export{$realline_next} && | ||
| 1715 | ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || | ||
| 1716 | $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { | ||
| 1693 | my $name = $1; | 1717 | my $name = $1; |
| 1694 | if ($prevline !~ /(?: | 1718 | if ($stat !~ /(?: |
| 1695 | ^.}| | 1719 | \n.}\s*$| |
| 1696 | ^.DEFINE_$Ident\(\Q$name\E\)| | 1720 | ^.DEFINE_$Ident\(\Q$name\E\)| |
| 1697 | ^.DECLARE_$Ident\(\Q$name\E\)| | 1721 | ^.DECLARE_$Ident\(\Q$name\E\)| |
| 1698 | ^.LIST_HEAD\(\Q$name\E\)| | 1722 | ^.LIST_HEAD\(\Q$name\E\)| |
| 1699 | ^.$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| | 1723 | ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| |
| 1700 | \b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=|\[) | 1724 | \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() |
| 1701 | )/x) { | 1725 | )/x) { |
| 1702 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); | 1726 | #print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; |
| 1727 | $suppress_export{$realline_next} = 2; | ||
| 1728 | } else { | ||
| 1729 | $suppress_export{$realline_next} = 1; | ||
| 1703 | } | 1730 | } |
| 1704 | } | 1731 | } |
| 1732 | if (!defined $suppress_export{$linenr} && | ||
| 1733 | $prevline =~ /^.\s*$/ && | ||
| 1734 | ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || | ||
| 1735 | $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { | ||
| 1736 | #print "FOO B <$lines[$linenr - 1]>\n"; | ||
| 1737 | $suppress_export{$linenr} = 2; | ||
| 1738 | } | ||
| 1739 | if (defined $suppress_export{$linenr} && | ||
| 1740 | $suppress_export{$linenr} == 2) { | ||
| 1741 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); | ||
| 1742 | } | ||
| 1705 | 1743 | ||
| 1706 | # check for external initialisers. | 1744 | # check for external initialisers. |
| 1707 | if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) { | 1745 | if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) { |
diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index cdb44b63342e..102b76608f35 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | use strict; | 13 | use strict; |
| 14 | 14 | ||
| 15 | my $P = $0; | 15 | my $P = $0; |
| 16 | my $V = '0.20'; | 16 | my $V = '0.21'; |
| 17 | 17 | ||
| 18 | use Getopt::Long qw(:config no_auto_abbrev); | 18 | use Getopt::Long qw(:config no_auto_abbrev); |
| 19 | 19 | ||
| @@ -37,6 +37,7 @@ my $scm = 0; | |||
| 37 | my $web = 0; | 37 | my $web = 0; |
| 38 | my $subsystem = 0; | 38 | my $subsystem = 0; |
| 39 | my $status = 0; | 39 | my $status = 0; |
| 40 | my $keywords = 1; | ||
| 40 | my $from_filename = 0; | 41 | my $from_filename = 0; |
| 41 | my $pattern_depth = 0; | 42 | my $pattern_depth = 0; |
| 42 | my $version = 0; | 43 | my $version = 0; |
| @@ -84,6 +85,7 @@ if (!GetOptions( | |||
| 84 | 'scm!' => \$scm, | 85 | 'scm!' => \$scm, |
| 85 | 'web!' => \$web, | 86 | 'web!' => \$web, |
| 86 | 'pattern-depth=i' => \$pattern_depth, | 87 | 'pattern-depth=i' => \$pattern_depth, |
| 88 | 'k|keywords!' => \$keywords, | ||
| 87 | 'f|file' => \$from_filename, | 89 | 'f|file' => \$from_filename, |
| 88 | 'v|version' => \$version, | 90 | 'v|version' => \$version, |
| 89 | 'h|help' => \$help, | 91 | 'h|help' => \$help, |
| @@ -132,6 +134,8 @@ if (!top_of_kernel_tree($lk_path)) { | |||
| 132 | ## Read MAINTAINERS for type/value pairs | 134 | ## Read MAINTAINERS for type/value pairs |
| 133 | 135 | ||
| 134 | my @typevalue = (); | 136 | my @typevalue = (); |
| 137 | my %keyword_hash; | ||
| 138 | |||
| 135 | open(MAINT, "<${lk_path}MAINTAINERS") || die "$P: Can't open MAINTAINERS\n"; | 139 | open(MAINT, "<${lk_path}MAINTAINERS") || die "$P: Can't open MAINTAINERS\n"; |
| 136 | while (<MAINT>) { | 140 | while (<MAINT>) { |
| 137 | my $line = $_; | 141 | my $line = $_; |
| @@ -149,6 +153,8 @@ while (<MAINT>) { | |||
| 149 | if ((-d $value)) { | 153 | if ((-d $value)) { |
| 150 | $value =~ s@([^/])$@$1/@; | 154 | $value =~ s@([^/])$@$1/@; |
| 151 | } | 155 | } |
| 156 | } elsif ($type eq "K") { | ||
| 157 | $keyword_hash{@typevalue} = $value; | ||
| 152 | } | 158 | } |
| 153 | push(@typevalue, "$type:$value"); | 159 | push(@typevalue, "$type:$value"); |
| 154 | } elsif (!/^(\s)*$/) { | 160 | } elsif (!/^(\s)*$/) { |
| @@ -188,6 +194,7 @@ if ($email_remove_duplicates) { | |||
| 188 | 194 | ||
| 189 | my @files = (); | 195 | my @files = (); |
| 190 | my @range = (); | 196 | my @range = (); |
| 197 | my @keyword_tvi = (); | ||
| 191 | 198 | ||
| 192 | foreach my $file (@ARGV) { | 199 | foreach my $file (@ARGV) { |
| 193 | ##if $file is a directory and it lacks a trailing slash, add one | 200 | ##if $file is a directory and it lacks a trailing slash, add one |
| @@ -198,11 +205,24 @@ foreach my $file (@ARGV) { | |||
| 198 | } | 205 | } |
| 199 | if ($from_filename) { | 206 | if ($from_filename) { |
| 200 | push(@files, $file); | 207 | push(@files, $file); |
| 208 | if (-f $file && $keywords) { | ||
| 209 | open(FILE, "<$file") or die "$P: Can't open ${file}\n"; | ||
| 210 | while (<FILE>) { | ||
| 211 | my $patch_line = $_; | ||
| 212 | foreach my $line (keys %keyword_hash) { | ||
| 213 | if ($patch_line =~ m/^.*$keyword_hash{$line}/x) { | ||
| 214 | push(@keyword_tvi, $line); | ||
| 215 | } | ||
| 216 | } | ||
| 217 | } | ||
| 218 | close(FILE); | ||
| 219 | } | ||
| 201 | } else { | 220 | } else { |
| 202 | my $file_cnt = @files; | 221 | my $file_cnt = @files; |
| 203 | my $lastfile; | 222 | my $lastfile; |
| 204 | open(PATCH, "<$file") or die "$P: Can't open ${file}\n"; | 223 | open(PATCH, "<$file") or die "$P: Can't open ${file}\n"; |
| 205 | while (<PATCH>) { | 224 | while (<PATCH>) { |
| 225 | my $patch_line = $_; | ||
| 206 | if (m/^\+\+\+\s+(\S+)/) { | 226 | if (m/^\+\+\+\s+(\S+)/) { |
| 207 | my $filename = $1; | 227 | my $filename = $1; |
| 208 | $filename =~ s@^[^/]*/@@; | 228 | $filename =~ s@^[^/]*/@@; |
| @@ -213,6 +233,12 @@ foreach my $file (@ARGV) { | |||
| 213 | if ($email_git_blame) { | 233 | if ($email_git_blame) { |
| 214 | push(@range, "$lastfile:$1:$2"); | 234 | push(@range, "$lastfile:$1:$2"); |
| 215 | } | 235 | } |
| 236 | } elsif ($keywords) { | ||
| 237 | foreach my $line (keys %keyword_hash) { | ||
| 238 | if ($patch_line =~ m/^[+-].*$keyword_hash{$line}/x) { | ||
| 239 | push(@keyword_tvi, $line); | ||
| 240 | } | ||
| 241 | } | ||
| 216 | } | 242 | } |
| 217 | } | 243 | } |
| 218 | close(PATCH); | 244 | close(PATCH); |
| @@ -286,6 +312,13 @@ foreach my $file (@files) { | |||
| 286 | } | 312 | } |
| 287 | } | 313 | } |
| 288 | 314 | ||
| 315 | if ($keywords) { | ||
| 316 | @keyword_tvi = sort_and_uniq(@keyword_tvi); | ||
| 317 | foreach my $line (@keyword_tvi) { | ||
| 318 | add_categories($line); | ||
| 319 | } | ||
| 320 | } | ||
| 321 | |||
| 289 | if ($email) { | 322 | if ($email) { |
| 290 | foreach my $chief (@penguin_chief) { | 323 | foreach my $chief (@penguin_chief) { |
| 291 | if ($chief =~ m/^(.*):(.*)/) { | 324 | if ($chief =~ m/^(.*):(.*)/) { |
| @@ -384,6 +417,7 @@ Output type options: | |||
| 384 | 417 | ||
| 385 | Other options: | 418 | Other options: |
| 386 | --pattern-depth => Number of pattern directory traversals (default: 0 (all)) | 419 | --pattern-depth => Number of pattern directory traversals (default: 0 (all)) |
| 420 | --keywords => scan patch for keywords (default: 1 (on)) | ||
| 387 | --version => show version | 421 | --version => show version |
| 388 | --help => show this help information | 422 | --help => show this help information |
| 389 | 423 | ||
| @@ -486,7 +520,6 @@ sub format_email { | |||
| 486 | } | 520 | } |
| 487 | 521 | ||
| 488 | sub find_starting_index { | 522 | sub find_starting_index { |
| 489 | |||
| 490 | my ($index) = @_; | 523 | my ($index) = @_; |
| 491 | 524 | ||
| 492 | while ($index > 0) { | 525 | while ($index > 0) { |
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 702d8fe58fbc..e8a510d935e5 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
| @@ -765,19 +765,40 @@ static void draw_wakeups(void) | |||
| 765 | if (c->Y && c->start_time <= we->time && c->end_time >= we->time) { | 765 | if (c->Y && c->start_time <= we->time && c->end_time >= we->time) { |
| 766 | if (p->pid == we->waker) { | 766 | if (p->pid == we->waker) { |
| 767 | from = c->Y; | 767 | from = c->Y; |
| 768 | task_from = c->comm; | 768 | task_from = strdup(c->comm); |
| 769 | } | 769 | } |
| 770 | if (p->pid == we->wakee) { | 770 | if (p->pid == we->wakee) { |
| 771 | to = c->Y; | 771 | to = c->Y; |
| 772 | task_to = c->comm; | 772 | task_to = strdup(c->comm); |
| 773 | } | 773 | } |
| 774 | } | 774 | } |
| 775 | c = c->next; | 775 | c = c->next; |
| 776 | } | 776 | } |
| 777 | c = p->all; | ||
| 778 | while (c) { | ||
| 779 | if (p->pid == we->waker && !from) { | ||
| 780 | from = c->Y; | ||
| 781 | task_from = strdup(c->comm); | ||
| 782 | } | ||
| 783 | if (p->pid == we->wakee && !to) { | ||
| 784 | to = c->Y; | ||
| 785 | task_to = strdup(c->comm); | ||
| 786 | } | ||
| 787 | c = c->next; | ||
| 788 | } | ||
| 777 | } | 789 | } |
| 778 | p = p->next; | 790 | p = p->next; |
| 779 | } | 791 | } |
| 780 | 792 | ||
| 793 | if (!task_from) { | ||
| 794 | task_from = malloc(40); | ||
| 795 | sprintf(task_from, "[%i]", we->waker); | ||
| 796 | } | ||
| 797 | if (!task_to) { | ||
| 798 | task_to = malloc(40); | ||
| 799 | sprintf(task_to, "[%i]", we->wakee); | ||
| 800 | } | ||
| 801 | |||
| 781 | if (we->waker == -1) | 802 | if (we->waker == -1) |
| 782 | svg_interrupt(we->time, to); | 803 | svg_interrupt(we->time, to); |
| 783 | else if (from && to && abs(from - to) == 1) | 804 | else if (from && to && abs(from - to) == 1) |
| @@ -785,6 +806,9 @@ static void draw_wakeups(void) | |||
| 785 | else | 806 | else |
| 786 | svg_partial_wakeline(we->time, from, task_from, to, task_to); | 807 | svg_partial_wakeline(we->time, from, task_from, to, task_to); |
| 787 | we = we->next; | 808 | we = we->next; |
| 809 | |||
| 810 | free(task_from); | ||
| 811 | free(task_to); | ||
| 788 | } | 812 | } |
| 789 | } | 813 | } |
| 790 | 814 | ||
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 37512e936235..a1b1d10912dc 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -686,6 +686,8 @@ static void handle_keypress(int c) | |||
| 686 | switch (c) { | 686 | switch (c) { |
| 687 | case 'd': | 687 | case 'd': |
| 688 | prompt_integer(&delay_secs, "Enter display delay"); | 688 | prompt_integer(&delay_secs, "Enter display delay"); |
| 689 | if (delay_secs < 1) | ||
| 690 | delay_secs = 1; | ||
| 689 | break; | 691 | break; |
| 690 | case 'e': | 692 | case 'e': |
| 691 | prompt_integer(&print_entries, "Enter display entries (lines)"); | 693 | prompt_integer(&print_entries, "Enter display entries (lines)"); |
diff --git a/tools/perf/util/PERF-VERSION-GEN b/tools/perf/util/PERF-VERSION-GEN index c561d1538c03..54552a00a117 100755 --- a/tools/perf/util/PERF-VERSION-GEN +++ b/tools/perf/util/PERF-VERSION-GEN | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #!/bin/sh | 1 | #!/bin/sh |
| 2 | 2 | ||
| 3 | GVF=PERF-VERSION-FILE | 3 | GVF=PERF-VERSION-FILE |
| 4 | DEF_VER=v0.0.1.PERF | 4 | DEF_VER=v0.0.2.PERF |
| 5 | 5 | ||
| 6 | LF=' | 6 | LF=' |
| 7 | ' | 7 | ' |
diff --git a/tools/perf/util/svghelper.c b/tools/perf/util/svghelper.c index 856655d8b0b8..b3637db025a2 100644 --- a/tools/perf/util/svghelper.c +++ b/tools/perf/util/svghelper.c | |||
| @@ -103,7 +103,7 @@ void open_svg(const char *filename, int cpus, int rows, u64 start, u64 end) | |||
| 103 | fprintf(svgfile, " rect.process2 { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 103 | fprintf(svgfile, " rect.process2 { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 104 | fprintf(svgfile, " rect.sample { fill:rgb( 0, 0,255); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 104 | fprintf(svgfile, " rect.sample { fill:rgb( 0, 0,255); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 105 | fprintf(svgfile, " rect.blocked { fill:rgb(255, 0, 0); fill-opacity:0.5; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 105 | fprintf(svgfile, " rect.blocked { fill:rgb(255, 0, 0); fill-opacity:0.5; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 106 | fprintf(svgfile, " rect.waiting { fill:rgb(214,214, 0); fill-opacity:0.3; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 106 | fprintf(svgfile, " rect.waiting { fill:rgb(224,214, 0); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 107 | fprintf(svgfile, " rect.WAITING { fill:rgb(255,214, 48); fill-opacity:0.6; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 107 | fprintf(svgfile, " rect.WAITING { fill:rgb(255,214, 48); fill-opacity:0.6; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 108 | fprintf(svgfile, " rect.cpu { fill:rgb(192,192,192); fill-opacity:0.2; stroke-width:0.5; stroke:rgb(128,128,128); } \n"); | 108 | fprintf(svgfile, " rect.cpu { fill:rgb(192,192,192); fill-opacity:0.2; stroke-width:0.5; stroke:rgb(128,128,128); } \n"); |
| 109 | fprintf(svgfile, " rect.pstate { fill:rgb(128,128,128); fill-opacity:0.8; stroke-width:0; } \n"); | 109 | fprintf(svgfile, " rect.pstate { fill:rgb(128,128,128); fill-opacity:0.8; stroke-width:0; } \n"); |
